Passer au contenu

Comment utiliser AWSUtility::CloudFormation::CommandRunner pour exécuter une commande avant ou après une ressource de ma pile CloudFormation ?

Lecture de 3 minute(s)
0

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

AWS OFFICIELA mis à jour il y a un an