Je souhaite utiliser AWSUtility::CloudFormation::CommandRunner pour exécuter une commande avant ou après une ressource de ma pile AWS CloudFormation.
Résolution
Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l’AWS CLI.
Enregistrer AWSUtility::CloudFormation::CommandRunner
Si vous n'avez pas enregistré la ressource AWSUtility::CloudFormation::CommandRunner, exécutez les commandes suivantes pour l'enregistrer :
git clone https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-awsutilities-commandrunner.git
cd aws-cloudformation-resource-providers-awsutilities-commandrunner
curl -LO https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-awsutilities-commandrunner/releases/latest/download/awsutility-cloudformation-commandrunner.zip
./scripts/register.sh --set-default
Le script register.sh exécute la commande register-type de l'interface de ligne de commande AWS et utilise awsutility-cloudformation-commandrunner.zip pour enregistrer le type de ressource dans votre région AWS par défaut. Pour vérifier la région par défaut, exécutez la commande aws configure get region. Pour plus d'informations sur les actions effectuées par le script register.sh, consultez la page Étapes d'installation par l'utilisateur sur le site Web d’AWS GitHub.
Définir la ressource dans votre modèle CloudFormation
Pour exécuter une commande avant ou après une ressource de votre pile CloudFormation, définissez la ressource AWSUtility::CloudFormation::CommandRunner dans votre modèle CloudFormation.
Exemple de modèle :
Resources:
CommandRunner:
Type: AWSUtility::CloudFormation::CommandRunner
Properties:
Command: 'aws ssm get-parameter --name BucketName --region us-east-1 --query Parameter.Value --output text > /command-output.txt'
Role: EC2-Role
LogGroup: my-cloudwatch-log-group
Vous devez inclure l'option --region dans les commandes de l'interface de ligne de commande AWS. Puis, écrivez la sortie de la commande dans un fichier réservé appelé /command-output.txt.
La propriété Rôle doit être le nom d'un profil d'instance AWS Identity and Access Management (IAM) auquel est associé un rôle IAM. Le rôle IAM doit avoir une relation de confiance avec le service Amazon Elastic Compute Cloud (Amazon EC2), ec2.amazonaws.com. Pour exécuter votre commande, la ressource AWSUtility::CloudFormation::CommandRunner suppose la propriété Rôle. Si vous spécifiez la propriété LogGroup, LogGroup écrit les journaux à partir de l'exécution de votre commande dans le groupe de journaux Amazon CloudWatch.
Pour plus d'informations sur l'utilisation de la ressource AWSUtility::CloudFormation::CommandRunner dans votre modèle, consultez les pages README.md et docs/README.md sur le site Web de GitHub.
Utilisez Fn::GetAtt pour référencer la sortie de la commande.
Exemple d'extrait de modèle :
S3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !GetAtt CommandRunner.Output
Pour exécuter la commande après une ressource portant le nom logique Instance, spécifiez DependsOn: Instance dans la définition de la ressource AWSUtility::CloudFormation::CommandRunner.
Exemple de modèle :
Resources:
CommandRunner:
DependsOn: Instance
Type: AWSUtility::CloudFormation::CommandRunner
Properties:
Command: aws s3 ls | sed -n 1p | cut -d " " -f3 > /command-output.txt
LogGroup: my-cloudwatch-log-group
Role: EC2-Role
Instance:
Type: AWS::EC2::Instance
Properties:
Image: ami-abcd1234
Pour exécuter la commande avant une ressource, définissez DependsOn sur le nom logique de la ressource AWSUtility::CloudFormation::CommandRunner dans la définition de la ressource.
Exemple de modèle :
Resources:
CommandRunner:
Type: AWSUtility::CloudFormation::CommandRunner
Properties:
Command: aws s3 ls | sed -n 1p | cut -d " " -f3 > /command-output.txt
LogGroup: my-cloudwatch-log-group
Role: EC2-Role
Instance:
DependsOn: CommandRunner
Type: AWS::EC2::Instance
Properties:
Image: ami-abcd1234
Remarque : Dans les exemples précédents, sed -n 1p affiche uniquement la première ligne de la réponse renvoyée par aws s3 ls. Pour obtenir le nom du compartiment, sed -n 1p envoie la réponse à cut -d " " -f3. Ensuite, cut -d " " -f3 choisit le troisième élément du tableau créé après avoir scindé la ligne délimitée par un espace.
Informations connexes
Exécution de commandes bash dans les modèles AWS CloudFormation