

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Utilizzo dell'SDK per Ruby su un'istanza Vagrant
<a name="cookbooks-101-opsworks-s3-vagrant"></a>

**Importante**  
Il AWS OpsWorks Stacks servizio ha raggiunto la fine del ciclo di vita il 26 maggio 2024 ed è stato disabilitato sia per i clienti nuovi che per quelli esistenti. Consigliamo vivamente ai clienti di migrare i propri carichi di lavoro verso altre soluzioni il prima possibile. Se hai domande sulla migrazione, contatta il Supporto AWS Team su [AWS re:post](https://repost.aws/) o tramite Premium [AWS Support](https://aws.amazon.com/support).

Questo argomento descrive come una ricetta in esecuzione su un'istanza Vagrant può utilizzare [AWS SDK per Ruby](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/)per scaricare un file da Amazon S3. Prima di iniziare, devi prima disporre di un set di AWS credenziali, una chiave di accesso e una chiave di accesso segreta, che consentano alla ricetta di accedere ad Amazon S3.

**Importante**  
Ti consigliamo di non utilizzare credenziali dell'account root a questo scopo. Invece, crea un utente con una politica appropriata e fornisci quelle credenziali alla ricetta.   
Fai attenzione a non inserire le credenziali, nemmeno le credenziali degli utenti IAM, in una posizione accessibile al pubblico, ad esempio caricando un file contenente le credenziali in un repository pubblico o Bitbucket. GitHub Questo espone le tue credenziali e può compromettere la sicurezza del tuo account.  
 Le ricette eseguite su un' EC2 istanza EC2 Amazon possono utilizzare un approccio ancora migliore, un ruolo IAM, come descritto in[Utilizzo dell'SDK for Ruby OpsWorks su un'istanza Stacks Linux](cookbooks-101-opsworks-s3-opsworks.md).  
I contenuti distribuiti ai bucket Amazon S3 potrebbero contenere informazioni dei clienti. Per ulteriori informazioni sulla rimozione di dati sensibili, vedi [Come svuotare un bucket S3?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/empty-bucket.html) o [Come eliminare un bucket S3?](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html).

Se non disponi già di un utente appropriato, puoi crearne uno nel modo seguente. Per ulteriori informazioni, consulta [Cos'è IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/Introduction.html).

**avvertimento**  
Gli utenti IAM dispongono di credenziali a lungo termine, il che rappresenta un rischio per la sicurezza. Per ridurre questo rischio, si consiglia di fornire a questi utenti solo le autorizzazioni necessarie per eseguire l'attività e di rimuoverli quando non sono più necessari.

**Per creare un utente IAM**

1. Accedi Console di gestione AWS e apri la console IAM all'indirizzo [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/).

1. Nel riquadro di navigazione, scegli **Utenti** e, se necessario, scegli **Aggiungi utenti** per creare un nuovo utente amministrativo.

1. Nella pagina **Imposta autorizzazioni**, scegli **Allega direttamente le politiche**.

1. Digita **S3** nella casella **di ricerca Politiche di autorizzazione** per visualizzare le politiche di Amazon S3.

   **Scegli AmazonS3. ReadOnlyAccess** Se preferisci, puoi specificare una politica che conceda autorizzazioni più ampie, come **AmazonS3 FullAccess**, ma la prassi standard prevede di concedere solo le autorizzazioni necessarie. In questo caso, la ricetta non farà che scaricare un file, pertanto un accesso in sola lettura è sufficiente.

1. Scegli **Next (Successivo)**.

1. Scegli **Crea utente**.

1. Quindi crea le chiavi di accesso per il tuo utente. Per ulteriori informazioni sulla creazione di chiavi di accesso, consulta [Gestione delle chiavi di accesso per gli utenti IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html) nella *Guida per l'utente di IAM*.

A questo punto, devi fornire un file da scaricare. Questo esempio presuppone che inserirai un file denominato `myfile.txt` in un nuovo bucket S3 chiamato `cookbook_bucket`. 

**Per fornire un file per il download**

1. Creare un file denominato `myfile.txt` con il testo seguente e salvarlo in una posizione comoda sulla workstation.

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

1. Sulla [console Amazon S3](https://console.aws.amazon.com/s3/), crea un bucket denominato `cookbook_bucket` nella regione **Standard** e caricalo `myfile.txt` nel bucket.

Configurare il libro di ricette come segue.

**Per configurare il libro di ricette**

1. Creare una directory in `opsworks_cookbooks` denominata `s3bucket` e accedervi.

1. Inizializzare e configurare Test Kitchen, come descritto in [Esempio 1: installazione di pacchetti](cookbooks-101-basics-packages.md).

1. Sostituire il testo in `.kitchen.yml` con il seguente.

   ```
   ---
   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. Aggiungere due directory a `s3bucket`: `recipes` ed `environments`.

1. Crea un file di ambiente denominato `test.json` `default_attributes` nella sezione seguente, sostituendo `secret_key` i valori `access_key` and con le chiavi corrispondenti per il tuo utente. Salvare il file nella cartella `environments` del libro di ricette.

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

Hai a disposizione diversi metodi per fornire le credenziali a una ricetta in esecuzione su un'istanza. Il concetto fondamentale è limitare le possibilità di esporre accidentalmente le chiavi e compromettere la sicurezza del tuo account. Per questo motivo, non è consigliabile utilizzare valori chiave espliciti nel tuo codice. L'esempio invece colloca i valori chiave nell'oggetto nodo, che consente alla ricetta di farvi riferimento utilizzando la sintassi del nodo anziché esponendo valori letterali. Devi disporre di privilegi root per accedere all'oggetto nodo, che limita le possibilità che le chiavi possano essere esposte. Per ulteriori informazioni, consulta [Best practice per la gestione delle chiavi di accesso AWS](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html).

**Nota**  
L'esempio utilizza gli attributi nidificati, con `cookbooks_101` come primo elemento. Questa pratica limita la possibilità di un conflitto di nomi se vi sono altri attributi `access_key` o `secret_key` nell'oggetto nodo.

La ricetta seguente scarica `myfile.text` dal bucket `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 prima parte della ricetta installa l'SDK for Ruby, che è un pacchetto gem. La risorsa [gem\$1package](https://docs.chef.io/chef/resources.html#gem-package) installa gem che verranno utilizzati da ricette o altre applicazioni.

**Nota**  
Di norma la tua istanza ha due istanze di Ruby, che sono generalmente versioni diverse. Una è un'istanza dedicata che viene utilizzata dal client Chef. L'altra viene utilizzato da applicazioni e ricette in esecuzione sull'istanza. È importante comprendere questa distinzione quando si installano pacchetti gem, perché per installare gem sono disponibili due risorse, [gem\$1package](https://docs.chef.io/chef/resources.html#gem-package) e [chef\$1gem](https://docs.chef.io/chef/resources.html#chef-gem). Se le applicazioni o le ricette utilizzano il pacchetto gem, installarlo con `gem_package`. `chef_gem` è solo per i pacchetti gem utilizzati dal client Chef.

Il resto della ricetta è una risorsa [ruby\$1block](https://docs.chef.io/chef/resources.html#ruby-block), contenente il codice Ruby che scarica il file. Potresti pensare che, poiché una ricetta è un'applicazione Ruby, puoi inserire il codice direttamente nella ricetta. Tuttavia, un'esecuzione di Chef compila tutto questo codice prima dell'esecuzione di qualunque risorsa. Se inserisci il codice di esempio direttamente nella ricetta, Ruby cercherà di risolvere l'istruzione `require 'aws-sdk'` prima di eseguire la risorsa `gem_package`. Poiché l'SDK for Ruby non è ancora stato installato, la compilazione avrà esito negativo.

Il codice in una risorsa `ruby_block` non viene compilato finché tale risorsa non viene eseguita. In questo esempio, la `ruby_block` risorsa viene eseguita dopo che la `gem_package` risorsa ha terminato l'installazione dell'SDK for Ruby, quindi il codice verrà eseguito correttamente.

Il codice in `ruby_block` funziona come segue. 

1. Crea un nuovo oggetto [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), che fornisce l'interfaccia di servizio.

   Le chiavi segrete e di accesso vengono specificate facendo riferimento ai valori memorizzati nell'oggetto nodo.

1. Chiama l'associazione `bucket.objects` dell'oggetto `S3`, che restituisce un oggetto [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) denominato `myfile` che rappresenta `myfile.txt`.

1. Utilizza `Dir.chdir` per impostare la directory di lavoro su `/tmp`.

1. Apre un file denominato `myfile.txt`, scrive i contenuti di `myfile` nel file e chiude il file.

**Per eseguire la ricetta**

1. Creare un file denominato `default.rb` con la ricetta di esempio e salvarlo nella directory `recipes`.

1. Esegui `kitchen converge`.

1. Eseguire `kitchen login` per accedere all'istanza, quindi eseguire `ls /tmp`. Dovrebbe essere possibile vedere `myfile.txt`, insieme a diversi file e directory di Test Kitchen.

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

   È inoltre possibile eseguire `cat /tmp/myfile.txt` per verificare che il contenuto del file sia corretto.

Al termine dell'operazione, eseguire `kitchen destroy` per terminare l'istanza.