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
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é:
Voici la section dans la documentation EC2:
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.
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.
Qu'est-ce que la «clé k»? Est-ce un fichier avec des informations d'identification temporaires? – doNotCheckMyBlog
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
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.
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
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
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:
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
- 1. Cron pour télécharger en toute sécurité un fichier sur S3
- 2. Télécharger un fichier vers une instance EC2 ou vers S3
- 3. S3 Image Télécharger Problème sur EC2 AWS instance de serveur
- 4. Instance AWS EC2 sans ip privé (windows)
- 5. Seau AWS Synchronize S3 avec instance EC2
- 6. Comment télécharger un fichier sur Amazon S3?
- 7. iOS avec AWS EC2 Endpoint ou S3
- 8. Distribuez les paires de clés ec2 en toute sécurité
- 9. Affichage en toute sécurité d'images avec Amazon S3 en Python
- 10. En toute sécurité ajouter une nouvelle instance d'élément dans un std :: vector
- 11. Comment télécharger un fichier dans une instance Windows EC2?
- 12. Comment stocker en toute sécurité un module, un exposant public et un exposant privé sur Android?
- 13. Comment configurer le registre de docker privé en toute sécurité?
- 14. télécharger EC2 n'a pas réussi à S3
- 15. Télécharger le fichier en s3 avec PHP sur une instance EC2 jeter les informations d'identification, mais fonctionne localement
- 16. Comment télécharger en toute sécurité un fichier dans Appcelerator?
- 17. ec2.py traction d'inventaire ec2.ini sur l'instance EC2 sur un sous-réseau privé
- 18. Télécharger des fichiers de S3 beaucoup plus rapidement sur un hôte local que sur une instance EC2?
- 19. Comment télécharger un fichier d'une instance Amazon EC2 vers une autre instance EC2 en utilisant java apache FTPClient
- 20. Comment créer une nouvelle instance EC2 avec une image d'instance EC2 existante pendant qu'elle se termine?
- 21. télécharger des fichiers de ec2 à s3
- 22. en utilisant amazon Ec2 avec S3
- 23. Comment ajouter un groupe de sécurité à une instance EC2 existante avec CloudFormation
- 24. Comment lancer une nouvelle instance ec2 via snapshot et cli
- 25. Télécharger en toute sécurité/télécharger des images via l'URL
- 26. Comment créer une nouvelle instance EC2 dans le groupe AutoScaling?
- 27. Certificats SSL multiples sur une instance EC2
- 28. Comment sérialiser en toute sécurité un lambda?
- 29. Comment télécharger une instance d'amazon ec2 t1.micro?
- 30. Comment créer un script de démarrage pour configurer un serveur web apache fonctionnant sur une toute nouvelle instance d'AWS EC2 Ubuntu?
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