services prices paga capacidad aws amazon-s3 amazon-web-services amazon-cloudformation cloud-init

amazon-s3 - prices - amazon web services free



¿Cómo puedo(de forma segura) descargar un activo privado S3 en una nueva instancia EC2 con cloudinit? (4)

Amazon anunció recientemente una nueva función en la que puede otorgar "roles IAM" a sus instancias EC2. Esto hace que sea bastante fácil permitir que instancias específicas tengan permiso para leer recursos específicos de S3.

Aquí está su publicación de blog anunciando la nueva característica:

http://aws.typepad.com/aws/2012/06/iam-roles-for-ec2-instances-simplified-secure-access-to-aws-service-apis-from-ec2.html

Aquí está la sección en la documentación de EC2:

http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/UsingIAM.html#UsingIAMrolesWithAmazonEC2Instances

Aquí está la sección en la documentación de IAM:

http://docs.amazonwebservices.com/IAM/latest/UserGuide/WorkingWithRoles.html

Los roles de IAM ponen las credenciales a disposición de la instancia a través de HTTP, por lo que cualquier usuario o proceso que se ejecute en la instancia puede verlas.

Estoy usando CloudFormation para administrar una pila de servidor web de Tomcat, pero estoy cansado de hacer la gestión RAW de AMI para nuevas versiones de aplicaciones. Me gustaría moverme en la dirección del Chef pero no tengo el tiempo ahora mismo. En cambio, intento conquistar un problema simple en la creación de instancias del servidor web: ¿cómo puedo descargar un WAR "actual" cuando las nuevas máquinas se aceleran?

Mi idea era utilizar un cubo privado de S3 y una nube flotante, pero estoy un poco perplejo sobre qué hacer con las credenciales de IAM. Podría ponerlos en los datos de usuario de la plantilla, pero detestaba hacerlo, particularmente porque soy la versión que controla ese archivo. La única alternativa que puedo pensar es usar variables de entorno en el AMI mismo. Tendrían que ser de texto plano, pero ... eh, si puedes entrar en mi instancia, puedes comprimir y descargar todo mi servidor web. Siempre que el usuario de IAM no se reutilice para nada más y se gire con regularidad, parece una forma razonable de resolver el problema. ¿Me estoy perdiendo algo? ¿Cómo puedo descargar de forma segura un activo privado S3 utilizando cloudinit?


Una instancia con un rol de IAM tiene credenciales de seguridad temporales que se rotan automáticamente. Están disponibles a través de http en http://169.254.169.254/latest/meta-data/iam/security-credentials/RoleName , donde RoleName es lo que usted llamó su función. Así que son fáciles de obtener de su instancia, pero caducan regularmente.

Usarlos es un poco difícil. CloudFormation no puede usar credenciales temporales directamente. Amazon Linux AMI tiene el boto de Python instalado, y ahora es lo suficientemente inteligente como para encontrar y usar esas credenciales automáticamente. Aquí hay una línea que puede poner en una secuencia de comandos para buscar un archivo desde el cubo S3 b , tecla k hasta el archivo local f :

python -c "import boto;boto.connect_s3().get_bucket(''b'').get_key(''k'').get_contents_to_filename(''f'')"

Boto encuentra y usa las credenciales temporales de la función para usted, lo que lo hace realmente fácil de usar.


Para actualizar las respuestas a esta pregunta un poco:

Junto con los roles de IAM, el nuevo cliente de línea de comandos de AWS hace que recuperar estos activos sea trivial. Automáticamente extraerá las credenciales de AWS otorgadas a través de IAM del entorno y manejará la actualización de esas credenciales.

A continuación, se muestra un ejemplo de obtención de un único activo de un depósito de S3 seguro en un script de datos de usuario:

# Install the AWS command-line tools pip install awscli # Fetch the asset aws s3 cp --region us-east-1 s3://my-private-bucket/a-folder/an-asset.zip /some/destination

Simple como eso. También puede copiar todo el contenido del directorio desde S3 y cargarlo, etc. Consulte el material de referencia para obtener más detalles y opciones.


Para descargar de forma segura un activo S3 privado a una nueva instancia EC2, debe usar Roles IAM para que EC2 otorgue el permiso S3 necesario a su instancia EC2, luego llame a aws s3 cp en la secuencia de comandos UserInnain cloudinit de su instancia para descargar el activo.

Para configurar un rol de IAM para EC2 desde una plantilla de CloudFormation, use el recurso AWS::IAM::InstanceProfile , haciendo referencia a un recurso AWS::IAM::Role con un AssumeRolePolicyDocument delegando el acceso a ec2.amazonaws.com , con una Política diseñada para otorgar menos privilegios (en este caso, permitiendo ''s3:GetObject'' solo para el activo S3 específico que se está descargando).

Aquí hay una plantilla de ejemplo completa que descarga un activo S3 en una nueva instancia EC2 utilizando cloudinit, devolviendo su contenido como un Stack Output :

Description: (securely) download a private S3 asset onto a new EC2 instance with cloudinit Parameters: S3Bucket: Description: S3 bucket name Type: String S3Key: Description: S3 object key Type: String Mappings: # amzn-ami-hvm-2016.09.1.20161221-x86_64-gp2 RegionMap: us-east-1: "64": "ami-9be6f38c" Resources: EC2Role: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: {Service: [ ec2.amazonaws.com ]} Action: ["sts:AssumeRole"] Path: / Policies: - PolicyName: EC2Policy PolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: [''s3:GetObject''] Resource: !Sub ''arn:aws:s3:::${S3Bucket}/${S3Key}'' RootInstanceProfile: Type: AWS::IAM::InstanceProfile Properties: Path: / Roles: [ !Ref EC2Role ] WebServer: Type: AWS::EC2::Instance Properties: ImageId: !FindInMap [ RegionMap, !Ref "AWS::Region", 64 ] InstanceType: m3.medium IamInstanceProfile: !Ref RootInstanceProfile UserData: "Fn::Base64": !Sub | #!/bin/bash DATA=$(aws s3 cp s3://${S3Bucket}/${S3Key} -) /opt/aws/bin/cfn-signal / -e $? / -d "$DATA" / ''${Handle}'' Handle: Type: AWS::CloudFormation::WaitConditionHandle Wait: Type: AWS::CloudFormation::WaitCondition Properties: Handle: !Ref Handle Timeout: 300 Outputs: Result: Value: !GetAtt Wait.Data