

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Utilisation du SDK pour Ruby sur une instance Vagrant
<a name="cookbooks-101-opsworks-s3-vagrant"></a>

**Important**  
Le AWS OpsWorks Stacks service a pris fin le 26 mai 2024 et a été désactivé tant pour les nouveaux clients que pour les clients existants. Nous recommandons vivement aux clients de migrer leurs charges de travail vers d'autres solutions dès que possible. Si vous avez des questions sur la migration, contactez l' AWS Support équipe sur [AWS Re:Post](https://repost.aws/) ou via le [AWS Support](https://aws.amazon.com/support) Premium.

Cette rubrique décrit comment une recette exécutée sur une instance Vagrant peut utiliser le [AWS SDK pour Ruby](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/)pour télécharger un fichier depuis Amazon S3. Avant de commencer, vous devez disposer d'un ensemble d' AWS informations d'identification (une clé d'accès et une clé d'accès secrète) qui permettent à la recette d'accéder à Amazon S3.

**Important**  
Nous vous déconseillons vivement d'utiliser les informations d'identification du compte racine dans cette optique. Créez plutôt un utilisateur doté d'une politique appropriée et fournissez ces informations d'identification à la recette.   
Veillez à ne pas placer les informations d'identification, même les informations d'identification utilisateur IAM, dans un emplacement accessible au public, par exemple en téléchargeant un fichier contenant les informations d'identification dans un référentiel public ou Bitbucket. GitHub Vous risqueriez d'exposer vos informations d'identification et de compromettre la sécurité de votre compte.  
 Les recettes exécutées sur une EC2 instance EC2 Amazon peuvent utiliser une approche encore meilleure, un rôle IAM, comme décrit dans[Utilisation du SDK pour Ruby sur OpsWorks une instance Stacks Linux](cookbooks-101-opsworks-s3-opsworks.md).  
Le contenu livré aux compartiments Amazon S3 peut contenir du contenu client. Pour plus d'informations sur la suppression de données sensibles, consultez [How Do I Empty an S3 Bucket?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/empty-bucket.html) (Comment puis-je vider un compartiment S3 ?) ou [How Do I Delete an S3 Bucket?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html) (Comment supprimer un compartiment S3 ?).

Si vous n'avez pas encore d'utilisateur approprié, vous pouvez en créer un comme suit. Pour plus d'informations, consultez [Qu'est-ce qu'IAM ?](https://docs.aws.amazon.com/IAM/latest/UserGuide/Introduction.html)

**Avertissement**  
Les utilisateurs IAM disposent d’informations d’identification à long terme, ce qui présente un risque de sécurité. Pour atténuer ce risque, nous vous recommandons de ne fournir à ces utilisateurs que les autorisations dont ils ont besoin pour effectuer la tâche et de supprimer ces autorisations lorsqu’elles ne sont plus nécessaires.

**Pour créer un utilisateur IAM**

1. Connectez-vous à la console IAM AWS Management Console et ouvrez-la à [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)l'adresse.

1. Dans le volet de navigation, sélectionnez **Utilisateurs** et, si nécessaire, choisissez **Ajouter des utilisateurs** pour créer un nouvel utilisateur administratif.

1. Sur la page **Définir les autorisations**, choisissez **Joindre directement les politiques**.

1. Tapez **S3** dans le champ de recherche des **politiques d'autorisation** pour afficher les politiques Amazon S3.

   Choisissez **Amazon S3 ReadOnlyAccess**. Si vous préférez, vous pouvez définir une politique qui accorde des autorisations plus étendues, comme **AmazonS3 FullAccess**, mais la pratique standard consiste à n'accorder que les autorisations requises. Dans ce cas, la recette ne fera que télécharger un fichier, un accès en lecture seule est donc suffisant.

1. Choisissez **Suivant**.

1. Sélectionnez **Créer un utilisateur**

1. Créez ensuite des clés d'accès pour votre utilisateur. Pour de plus amples informations sur la création de clés d'accès, veuillez consulter [Gestion des clés d'accès pour les utilisateurs IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html) dans le *Guide de l'utilisateur IAM*.

Vous devez ensuite fournir un fichier à télécharger. Cet exemple suppose que vous placiez un fichier nommé `myfile.txt` dans un compartiment S3 nouvellement créé nommé `cookbook_bucket`. 

**Pour fournir un fichier à télécharger**

1. Créez un fichier nommé `myfile.txt` avec le texte suivant et enregistrez-le dans un emplacement approprié sur votre ordinateur.

   ```
   This is the file that you just downloaded from Amazon S3.
   ```

1. Sur la [console Amazon S3](https://console.aws.amazon.com/s3/), créez un compartiment nommé `cookbook_bucket` dans la région **Standard** et chargez-le `myfile.txt` dans le compartiment.

Configurez le livre de recettes comme suit.

**Pour configurer le livre de recettes**

1. Créez un répertoire dans `opsworks_cookbooks`, nommé `s3bucket` et accédez à celui-ci.

1. Initialisez et configurez Test Kitchen, comme décrit dans [Exemple 1 : Installation des packages](cookbooks-101-basics-packages.md).

1. Remplacez le texte dans `.kitchen.yml` par ce qui suit.

   ```
   ---
   driver:
     name: vagrant
   
   provisioner:
     name: chef_solo
     environments_path: ./environments
   
   platforms:
     - name: ubuntu-14.04
   
   suites:
     - name: s3bucket
       provisioner:
         solo_rb:
           environment: test
       run_list:
         - recipe[s3bucket::default]
       attributes:
   ```

1. Ajoutez deux répertoires à `s3bucket` : `recipes` et `environments`.

1. Créez un fichier d'environnement nommé `test.json` dans la `default_attributes` section suivante, en remplaçant les `secret_key` valeurs `access_key` et par les clés correspondantes pour votre utilisateur. Enregistrez le fichier dans le dossier `environments` du livre de recettes.

   ```
   {
     "default_attributes" : {
       "cookbooks_101" : {
         "access_key": "AKIAIOSFODNN7EXAMPLE",
         "secret_key" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
       }
     },
     "chef_type" : "environment",
     "json_class" : "Chef::Environment"
   }
   ```

Vous pouvez saisir vos informations d'identification de plusieurs façons pour une recette exécutée sur une instance. Le plus important est de limiter les risques d'exposition accidentelle des clés et de compromission de la sécurité de votre compte. C'est pourquoi il n'est pas recommandé d'utiliser des valeurs de clé explicites dans votre code. Dans le cas présent, nous mettons les valeurs de clé dans l'objet de nœud, ce qui permet à la recette de les référencer en utilisant la syntaxe du nœud au lieu d'exposer les valeurs littérales. Vous devez disposer de privilèges racine pour accéder à l'objet de nœud, ce qui limite les risques d'exposition des clés. Pour plus d'informations, consultez [Bonnes pratiques en matière de gestion des clés d'accès AWS](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html).

**Note**  
Notez que l'exemple utilise les attributs imbriqués, avec `cookbooks_101` comme premier élément. Cette pratique limite les risques de conflit de noms s'il y a d'autres attributs `access_key` ou `secret_key` dans l'objet de nœud.

La recette suivante télécharge `myfile.text` à partir du compartiment `cookbook_bucket`.

```
gem_package "aws-sdk ~> 3" do
  action :install
end

ruby_block "download-object" do
  block do
    require 'aws-sdk'

    s3 = Aws::S3::Client.new(
          :access_key_id => "#{node['cookbooks_101']['access_key']}",
          :secret_access_key => "#{node['cookbooks_101']['secret_key']}")

    myfile = s3.bucket['cookbook_bucket'].objects['myfile.txt']
    Dir.chdir("/tmp")
    File.open("myfile.txt", "w") do |f|
      f.write(myfile.read)
      f.close
    end
  end
  action :run
end
```

La première partie de la recette installe le SDK pour Ruby, qui est un package gem. La ressource [gem\$1package](https://docs.chef.io/chef/resources.html#gem-package) installe des gems qui seront utilisées par les recettes ou par d'autres applications.

**Note**  
Votre instance a généralement deux instances Ruby correspondant la plupart du temps à des versions différentes. La première est une instance dédiée qui est utilisée par le client Chef. La deuxième est utilisée par les applications et les recettes exécutées sur l'instance. Il est important de comprendre cette distinction lors de l'installation des packages de gems, car deux ressources permettent d'installer des gems, [gem\$1package](https://docs.chef.io/chef/resources.html#gem-package) et [chef\$1gem](https://docs.chef.io/chef/resources.html#chef-gem). Si des applications ou des recettes utilisent le package gem, installez-le avec `gem_package` ; `chef_gem` est uniquement destiné aux packages GEM utilisés par le client Chef.

Le reste de la recette est une ressource [ruby\$1block](https://docs.chef.io/chef/resources.html#ruby-block) qui contient le code Ruby destiné à télécharger le fichier. Vous pourriez penser que dans la mesure où une recette est une application Ruby, vous pouvez placer le code dans la recette directement. Toutefois, une exécution de Chef compile tout ce code avant l'exécution de n'importe quelle ressource. Si vous mettez l'exemple de code directement dans la recette, Ruby tente de résoudre l'instruction `require 'aws-sdk'` avant d'exécuter la ressource `gem_package`. Le SDK pour Ruby n'étant pas encore installé, la compilation échouera.

Le code d'une ressource `ruby_block` n'est pas compilé tant que cette ressource n'a pas été exécutée. Dans cet exemple, la `ruby_block` ressource est exécutée une fois qu'elle a fini d'installer le SDK pour Ruby, de sorte que le code s'exécute correctement. `gem_package`

Le code du `ruby_block` fonctionne comme suit. 

1. Crée un nouvel objet [https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3.html](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3.html), qui fournit l'interface de service.

   Les clés d'accès et secrètes sont spécifiées en référençant les valeurs stockées dans l'objet de nœud.

1. Appelle l’association `bucket.objects` de l’objet `S3`, qui retourne un objet [https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Object.html](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Object.html) nommé `myfile` qui représente `myfile.txt`.

1. Utilise `Dir.chdir` pour définir le répertoire de travail sur `/tmp`.

1. Ouvre un fichier nommé `myfile.txt`, écrit le contenu de `myfile` dans le fichier, puis ferme le fichier.

**Pour exécuter la recette**

1. Créez un fichier nommé `default.rb` avec l'exemple de recette et enregistrez-le dans le répertoire `recipes`.

1. Exécutez `kitchen converge`.

1. Exécutez `kitchen login`, puis connectez-vous à l'instance et exécutez `ls /tmp`. Vous devriez voir `myfile.txt`, ainsi que plusieurs répertoires et fichiers Test Kitchen.

   ```
   vagrant@s3bucket-ubuntu-1204:~$ ls /tmp
   install.sh  kitchen  myfile.txt  stderr
   ```

   Vous pouvez également exécuter `cat /tmp/myfile.txt` afin de vérifier que le contenu du fichier est correct.

Une fois que vous avez terminé, exécutez `kitchen destroy` pour résilier l'instance.