14

J'utilise CloudFormation pour gérer une pile de serveurs Web Tomcat, mais j'en ai assez de faire de la gestion AMI brute pour les nouvelles versions d'applications. Je voudrais aller dans la direction de Chef mais je n'ai pas le temps maintenant. Au lieu de cela, j'essaie de vaincre un problème simple dans l'instanciation du serveur Web: Comment puis-je télécharger un fichier WAR "actuel" lorsque de nouvelles machines apparaissent? Ma pensée était d'utiliser un seau privé S3 et cloudinit, mais je suis un peu perplexe par quoi faire avec les informations d'identification IAM. Je pourrais les mettre dans les données d'utilisateur du modèle, mais je déteste faire cela, particulièrement parce que je suis la version contrôlant ce fichier. La seule alternative à laquelle je peux penser est d'utiliser des variables d'environnement dans l'AMI elle-même. Ils devraient être en clair, mais ... eh, si vous pouvez entrer dans mon instance, vous pouvez compresser et télécharger l'ensemble de mon serveur web. Tant que l'utilisateur IAM n'est pas réutilisé pour quelque chose d'autre et qu'il subit une rotation régulière, il semble que ce soit une manière raisonnable de résoudre le problème. Est-ce que je manque quelque chose? Comment puis-je télécharger en toute sécurité un actif S3 privé à l'aide de cloudinit?Comment télécharger (en toute sécurité) un asset S3 privé sur une nouvelle instance EC2 avec cloudinit?

Répondre

15

Amazon a récemment annoncé une nouvelle fonctionnalité dans laquelle vous pouvez attribuer des "rôles IAM" à vos instances EC2. Cela rend assez facile d'autoriser des instances spécifiques à avoir la permission de lire des ressources S3 spécifiques.

Voici leur blog annonçant la nouvelle fonctionnalité:

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

Voici la section dans la documentation EC2:

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

est ici la section dans la documentation IAM:

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

Les rôles IAM mettent les informations d'identification à la disposition de l'instance via HTTP, de sorte que tous les utilisateurs ou processus s'exécutant sur l'instance peuvent les voir.

+0

Y at-il complet de-début-to fin exemple AWS CLI ou tutoriel montrant comment configurer et utiliser le mécanisme IAM? Ces références ont l'air si compliquées et complètes que le suivi-commande serait très apprécié. – pt12lol

5

Une instance avec un rôle IAM possède des informations d'identification de sécurité temporaires qui sont automatiquement pivotées. Ils sont disponibles via http au http://169.254.169.254/latest/meta-data/iam/security-credentials/RoleName, où RoleName est ce que vous appelez votre rôle. Ils sont donc faciles à obtenir auprès de votre instance, mais ils expirent régulièrement.

Les utiliser est un peu difficile. CloudFormation ne peut pas utiliser les informations d'identification temporaires directement. Amazon AMI Linux a installé Python boto, et il est maintenant assez intelligent pour trouver et utiliser ces informations d'identification automatiquement. Voici un one-liner vous pouvez mettre dans un script pour récupérer un fichier de seau S3 b, clé k au fichier local f:

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

Boto trouve et utilise des informations d'identification temporaires du rôle pour vous , ce qui le rend vraiment facile à utiliser.

+0

Qu'est-ce que la «clé k»? Est-ce un fichier avec des informations d'identification temporaires? – doNotCheckMyBlog

+1

Pour les futurs utilisateurs, la clé k est le nom de fichier que vous voulez depuis S3. Si vous avez une structure de dossier alors la clé sera, foldername/file.sh – doNotCheckMyBlog

14

Pour mettre à jour les réponses à cette question un peu:

Avec rôles IAM, le nouveau AWS command-line client fait aller chercher ces actifs trivial. Il récupère automatiquement les informations d'identification AWS fournies par l'intermédiaire d'IAM depuis l'environnement et gère l'actualisation de ces informations d'identification.

Voici un exemple d'aller chercher un seul actif d'un seau S3 sécurisé dans un script de données utilisateur:

# 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 que cela. Vous pouvez également copier tout le contenu du répertoire à partir de S3 et téléchargé, etc. Voir the reference material pour plus de détails et d'options.

+0

Ouais les nouveaux outils de cli sont basés sur 'botocore', qui semble être le fondement de' boto' v3. Globalement [botocore] (https://github.com/boto/botocore) est une excellente interface si vous connaissez la structure de l'API AWS. – Christopher

+0

Excellente, réponse succincte @ James Van Dyke. Mais j'ai encore des doutes quant à la façon dont cela est sécurisé, illustré dans ma question similaire ici: http://stackoverflow.com/questions/29932355/is-it-secure-to-store-ec2-user-data-shell-scripts- in-a-private-s3-seau – AJB

3

Pour télécharger en toute sécurité un actif S3 privé sur une nouvelle instance EC2, vous devez utiliser IAM Roles for EC2 pour accorder l'autorisation de S3 nécessaire à votre instance EC2, puis appelez aws s3 cp dans UserDatacloudinit script pour télécharger l'actif de votre instance.

Pour configurer un rôle IAM pour EC2 à partir d'un modèle de CloudFormation, utilisez la ressource AWS::IAM::InstanceProfile, faisant référence à une ressource AWS::IAM::Role avec un AssumeRolePolicyDocument déléguer l'accès à ec2.amazonaws.com, avec une politique visant à grant least privilege (dans ce cas, ce qui permet 's3:GetObject' seulement pour le particulier Actif S3 en cours de téléchargement).

Voici un exemple de modèle complet qui télécharge un actif S3 sur une nouvelle instance EC2 en utilisant cloudinit, retournant son contenu comme Stack Output:

Launch Stack

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 
Questions connexes