Uso de SDK para Ruby en una instancia de Vagrant - AWS OpsWorks

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Uso de SDK para Ruby en una instancia de Vagrant

importante

El AWS OpsWorks Stacks servicio llegó al final de su vida útil el 26 de mayo de 2024 y se ha desactivado tanto para los clientes nuevos como para los actuales. Recomendamos encarecidamente a los clientes que migren sus cargas de trabajo a otras soluciones lo antes posible. Si tienes preguntas sobre la migración, ponte en contacto con el AWS Support equipo en AWS Re:post o a través de Premium AWS Support.

En este tema se describe cómo una receta que se ejecuta en una instancia de Vagrant puede utilizar AWS SDK for Ruby para descargar un archivo de Amazon S3. Antes de empezar, debe disponer de un conjunto de AWS credenciales (una clave de acceso y una clave de acceso secreta) que permitan a la receta acceder a Amazon S3.

importante

Recomendamos encarecidamente que no utilice las credenciales de la cuenta raíz con este fin. En su lugar, cree un usuario con una política adecuada y proporciónele esas credenciales a la receta.

Tenga cuidado de no colocar las credenciales (ni siquiera las de usuario de IAM) en una ubicación de acceso público, por ejemplo, cargando un archivo que contenga las credenciales en un repositorio público o de Bitbucket. GitHub Si lo hiciera, expone las credenciales y podría poner en peligro la seguridad de su cuenta.

Las recetas que se ejecutan en una instancia de EC2Amazon EC2 pueden utilizar un enfoque mejor, un rol de IAM, tal y como se describe en Uso del SDK para Ruby en una instancia AWS OpsWorks de Stacks Linux.

El contenido entregado a los buckets de Amazon S3 puede contener contenido del cliente. Para obtener más información sobre la eliminación de información confidencial, consulte ¿Cómo puedo vaciar un bucket de S3? o ¿Cómo elimino un bucket de S3?.

Si aún no tiene un usuario adecuado, puede crear uno tal y como se indica a continuación. Para obtener más información, consulte Qué es IAM.

aviso

Los usuarios de IAM tienen credenciales de larga duración, lo que supone un riesgo para la seguridad. Para ayudar a mitigar este riesgo, le recomendamos que brinde a estos usuarios únicamente los permisos que necesitan para realizar la tarea y que los elimine cuando ya no los necesiten.

Para crear un usuario de IAM
  1. Inicie sesión en la consola de IAM AWS Management Console y ábrala en https://console.aws.amazon.com/iam/.

  2. En el panel de navegación, seleccione Usuarios y, si fuera necesario, elija Añadir usuarios para crear un nuevo usuario administrativo.

  3. En la página Establecer permisos, seleccione Asociar políticas existentes directamente.

  4. Introduzca S3 en el cuadro de búsqueda Políticas de permisos para ver las políticas de Amazon S3.

    Elija Amazon ReadOnlyAccess S3. Si lo prefiere, puede especificar una política que conceda permisos más amplios, como AmazonS3 FullAccess, pero la práctica habitual es conceder solo los permisos necesarios. En este caso, la receta solo descargará un archivo, por lo que el acceso de solo lectura es suficiente.

  5. Elija Siguiente.

  6. Seleccione la opción Crear usuario.

  7. A continuación, cree claves de acceso para su usuario. Para obtener más información sobre la creación de claves de acceso, consulte Administración de las claves de acceso de los usuarios de IAM en la Guía del usuario de IAM

A continuación, debe indicar el archivo que se va a descargar. Este ejemplo presupone que guardará el archivo llamado myfile.txt en el bucket de S3 cookbook_bucket que acaba de crear.

Para indicar el archivo que se va a descargar
  1. Cree un archivo llamado myfile.txt con el siguiente texto y guárdelo en una ubicación apropiada de la estación de trabajo.

    This is the file that you just downloaded from Amazon S3.
  2. En la consola de Amazon S3, cree un bucket llamado cookbook_bucket en la región Estándar y cargue myfile.txt en el bucket.

Configure el libro de recetas tal y como se indica a continuación.

Para configurar el libro de recetas
  1. Cree un directorio dentro de opsworks_cookbooks llamado s3bucket y ábralo.

  2. Inicialice y configure Test Kitchen tal y como se describe en Ejemplo 1: Instalación de paquetes.

  3. Sustituya el texto de .kitchen.yml por lo siguiente.

    --- 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. Añada dos directorios a s3bucket: recipes y environments.

  5. Cree un archivo de entorno llamado test.json con la siguiente sección default_attributes. Para ello, sustituya los valores access_key y secret_key por las claves correspondientes del usuario. Guarde el archivo en la carpeta environments del libro de recetas.

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

Son varias las formas de proporcionar credenciales a una receta que se ejecuta en una instancia. Lo fundamental es limitar las posibilidades de exponer accidentalmente las claves y de comprometer la seguridad de la cuenta. Por este motivo, no se recomienda utilizar valores de clave explícitos en el código. El ejemplo, por el contrario, guarda los valores de clave en el objeto de nodo, lo que permite que receta haga referencia a ellos mediante la utilización de la sintaxis de nodos en lugar de exponer los valores literales. Debe tener privilegios raíz para obtener acceso al objeto de nodo, que limita la posibilidad de exposición de las claves. Para obtener más información, consulte Prácticas recomendadas para administrar las claves de acceso de AWS.

nota

Observe que el ejemplo utiliza atributos anidados, siendo cookbooks_101 el primer elemento. Esta práctica limita la posibilidad de un conflicto de nombres si el objeto de nodo incluye otros atributos access_key o secret_key.

La siguiente receta descarga myfile.text del 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 primera parte de la receta instala SDK para Ruby, un paquete de gemas. El recurso gem_package instala las gemas que utilizarán las recetas u otras aplicaciones.

nota

La instancia incluye normalmente dos instancias de Ruby, que suelen ser diferentes versiones. Una es una instancia dedicada que utiliza el cliente de Chef. La otra la utilizan las aplicaciones y recetas que se ejecutan en la instancia. Es importante comprender esta distinción a la hora de instalar paquetes de gemas, ya que existen dos recursos para instalarlas: gem_package y chef_gem. Si las aplicaciones o recetas utilizan el paquete de gemas, instálelo con gem_package, chef_gem solo es para los paquetes de gemas que utiliza el cliente de Chef.

El resto de la receta es un recurso ruby_block que contiene el código de Ruby que descarga el archivo. Es posible que crea que, como una receta es una aplicación de Ruby, puede incluir el código directamente en ella. Sin embargo, una ejecución de Chef compila todo ese código antes de ejecutar cualquier recurso. Si inserta el código de ejemplo directamente en la receta, Ruby intentará resolver la declaración require 'aws-sdk' antes de ejecutar el recurso gem_package. Como SDK para Ruby todavía no se ha instalado, la compilación devolverá un error.

El código de un recurso ruby_block no se compila hasta que ese recurso no se ejecuta. En este ejemplo, el recurso ruby_block se ejecuta una vez que el recurso gem_package ha terminado de instalar SDK para Ruby, por lo que el código se ejecutará correctamente.

El código de ruby_block funciona de la siguiente forma.

  1. Crea un nuevo objeto Aws::S3, que proporciona la interfaz de servicio.

    La clave de acceso y la secreta se especifican haciendo referencia a los valores almacenados en el objeto de nodo.

  2. Llama a la asociación bucket.objects del objeto de S3, que devuelve un objeto Aws::S3::Object denominado myfile que representa myfile.txt.

  3. Utiliza Dir.chdir para establecer el directorio de trabajo en /tmp.

  4. Abre un archivo llamado myfile.txt, escribe el contenido de myfile en él y, a continuación, lo cierra.

Para ejecutar la receta
  1. Cree un archivo llamado default.rb con la receta de ejemplo y guárdelo en el directorio recipes.

  2. Ejecute kitchen converge.

  3. Ejecute kitchen login para iniciar sesión en la instancia y, a continuación, ejecute ls /tmp. Debería ver myfile.txt, además de varios archivos y directorios de Test Kitchen.

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

    También puede ejecutar cat /tmp/myfile.txt para verificar que el contenido del archivo es correcto.

Cuando haya terminado, ejecute kitchen destroy para terminar la instancia.