Utilizzo dell'SDK per Ruby su un'istanza Vagrant - AWS OpsWorks

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

Importante

AWS OpsWorks Stacksnon accetta più nuovi clienti. I clienti esistenti potranno utilizzare la OpsWorks console, l'API, la CLI e CloudFormation le risorse normalmente fino al 26 maggio 2024, momento in cui verranno interrotte. Per prepararti a questa transizione, ti consigliamo di trasferire i tuoi stack a il prima AWS Systems Manager possibile. Per ulteriori informazioni, consultare AWS OpsWorks StacksDomande frequenti sulla fine del ciclo di vita e Migrazione AWS OpsWorks Stacks delle applicazioni su AWS Systems Manager Application Manager.

Questo argomento descrive come una ricetta in esecuzione su un'istanza Vagrant può utilizzare AWS SDK for Rubyper 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'istanza EC2Amazon EC2 possono utilizzare un approccio ancora migliore, un ruolo IAM, come descritto in. Utilizzo dell'SDK for Ruby AWS OpsWorks su un'istanza Stacks Linux

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? o Come eliminare un bucket S3?.

Se non disponi già di un utente appropriato, puoi crearne uno nel modo seguente. Per ulteriori informazioni, consulta Cos'è IAM.

avvertimento

Gli utenti IAM dispongono di credenziali a lungo termine, il che rappresenta un rischio per la sicurezza. Per contribuire a mitigare questo rischio, ti consigliamo 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 alla AWS Management Console e apri la console IAM all'indirizzo https://console.aws.amazon.com/iam/.

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

  3. Nella pagina Imposta autorizzazioni, scegli Allega direttamente le politiche.

  4. 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.

  5. Seleziona Avanti.

  6. Scegli Crea utente

  7. 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 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.
  2. Sulla console Amazon 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.

  2. Inizializzare e configurare Test Kitchen, come descritto in Esempio 1: installazione di pacchetti.

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

  5. 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.

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_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_package e 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_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 Aws::S3, che fornisce l'interfaccia di servizio.

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

  2. Chiama l'associazione bucket.objects dell'oggetto S3, che restituisce un oggetto Aws::S3::Object denominato myfile che rappresenta myfile.txt.

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

  4. 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.

  2. Esegui kitchen converge.

  3. 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.