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

Dernière mise à jour : 02/03/2021

Je souhaite utiliser AWSUtility::CloudFormation::CommandRunner pour exécuter une commande avant ou après une ressource dans ma pile AWS CloudFormation.

Résolution

Remarque : si vous des erreurs s'affichent lors de l'exécution de commandes à partir de l'interface de ligne de commande AWS (CLI AWS), assurez-vous que vous utilisez la version la plus récente de l'interface.

Pour exécuter une commande avant ou après une ressource dans votre pile CloudFormation, définissez la ressource AWSUtility።CloudFormation።CommandRunner dans votre modèle CloudFormation.

Par exemple :

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

Important : si vous n'avez pas encore enregistré la ressource AWSUtility።CloudFormation።CommandRunner, exécutez les commandes suivantes. Le script register.sh utilise le awsutility-cloudformation-commandrunner.zip pour enregistrer la ressource sur votre compte. Pour plus d'informations sur les actions effectuées par le script register.sh, consultez la section Étapes de l'installation utilisateur sur le GitHub AWS.

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

Important : la propriété Rôle doit être le nom d'un profil d'instance AWS Identity and Access Management (IAM) associé à un rôle IAM qui a une relation de confiance avec le service Amazon Elastic Compute Cloud (Amazon EC2) (ec2.amazonaws.com). La propriété Rôle est assumée par la ressource AWSUtility::CloudFormation::CommandRunner pour exécuter votre commande. La propriété facultative Groupe de journaux, si elle est spécifiée, écrit les journaux 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 README.md et docs/README.md du référentiel aws-cloudformation-resource-providers-awsutilities-commandrunner sur le GitHub AWS.

Vous devez inclure l'option --region dans vos commandes CLI AWS. Ensuite, vous devez écrire la sortie de la commande dans un fichier réservé appelé /command-output.txt, comme dans l'exemple de code précédent.

Vous pouvez référencer la sortie de la commande en utilisant Fn።GetAtt. Par exemple :

S3Bucket: 
    Type: AWS::S3::Bucket
    Properties: 
        BucketName: !GetAtt CommandRunner.Output

Pour exécuter la commande après une ressource avec le nom logique Instance, spécifiez DependsOn: Instance dans la définition de la ressource AWSUtility።CloudFormation።CommandRunner. Par exemple :

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 cette ressource. Par exemple :

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 imprime uniquement la première ligne de la réponse renvoyée par aws s3 ls. Pour obtenir le nom du compartiment, sed -n 1p canalise la réponse à cut -d " " -f3, qui sélectionne le troisième élément du tableau créé après avoir divisé la ligne délimitée par un espace.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?