ec2 east aws amazon-ec2 amazon-web-services ec2-ami ec2-api-tools

amazon-ec2 - east - billing amazon ec2



¿Cómo pasar las variables de entorno al iniciar mediante programación un nuevo Amazon EC2 desde la imagen? (3)

DESCARGO DE RESPONSABILIDAD: No soy administrador de sistemas

Utilizo un cubo S3 seguro que significa un cubo al que solo tiene acceso la instancia que está iniciando. Puede configurar un rol de IAM que se parece a:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::some-secure-bucket/*" } ] }

Luego puede cargar su archivo .env en ese .env (almacenarlo encriptado). Luego, para acceder a él en su instancia de EC2, puede usar las herramientas cli de AWS:

sudo apt-get install -y python-pip (for aws s3 CLI library) sudo pip install awscli aws s3 cp --region us-east-1 s3://some-secure-bucket/.some-dot-env-file output_file_path

Puede bajar este archivo cuando se ejecuta el código o, opcionalmente, hacer que ocurra en el arranque colocando el comando cp mencionado anteriormente en un script de inicio ubicado en algún lugar como /etc/init.d/download_credentials.sh

Creo que esta es una muy buena opción para descargar cosas que todas las instancias que usan una AMI necesitan como credenciales. Sin embargo, si desea especificar metadatos por instancia, solo implementé el uso de etiquetas que creo que funcionan bien. Para hacer esto, modifique el rol IAM anterior con algo más como:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::some-secure-bucket/*" }, { "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:DescribeTags" ], "Resource": "*" } ] }

Luego instale ec2-api-tools

sudo sed -i.dist ''s,universe$,universe multiverse,'' /etc/apt/sources.list sudo apt-get update sudo apt-get install -y ec2-api-tools

Y ahora debería poder obtener metadatos por instancia a través de etiquetas, como el "Nombre" de su instancia:

ec2-describe-tags --filter resource-id="$(ec2metadata --instance-id)" --filter "key=Name" | cut -f5

Nota: apesto en bash, así que estoy eliminando el nombre en ruby, ¡pero puedes usar tr para eliminar la nueva línea si te gusta!

Estoy utilizando RunInstance () de la API de Java de AWS para iniciar una nueva instancia de EC2 desde mi imagen AMI personalizada. ¿Cómo transfiero las variables de entorno al nuevo EC2 INSTANCE, como la url de la base de datos, las credenciales de AWS, etc.?


También puede usar la recuperación de metadatos de la instancia como se explica en http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html

Desde el documento anterior, la siguiente solicitud GET recuperaría los datos del usuario para una instancia si lo ejecuta desde dentro de la instancia:

GET http://169.254.169.254/latest/user-data

De esta manera, los datos del usuario se pueden recuperar dinámicamente incluso después de que la instancia ya se haya iniciado y esté en ejecución.


http://alestic.com/2009/06/ec2-user-data-scripts explica cómo hacer esto con los datos de usuario. Para obtener más información sobre el uso de Java, consulte el lanzamiento de AmazonEC2 con userdata .

Tenga en cuenta que he visto mencionar que esto no funciona con Windows, solo Unix.

[actualizar] más datos sobre cómo configurar las variables de entorno aquí: https://forums.aws.amazon.com/message.jspa?messageID=139744

[después de muchas pruebas] para mí, hacer eco de las variables de entorno en / etc / environment funciona mejor, así:

reservation = connection.run_instances(image_id = image_id, key_name = keypair, instance_type = ''m1.small'', security_groups = [''default''], user_data = ''''''#!/bin/sh/necho export foozle=barzle >> /etc/environment/n'''''')

luego al iniciar sesión:

ubuntu@ip-10-190-81-29:~$ echo $foozle barzle