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

Date de la dernière mise à jour : 15/06/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 awsutility-cloudformation-commandrunner.zip pour enregistrer le type de ressource dans votre région AWS. Le script utilise la commande AWS CLI register-type pour enregistrer le type de ressource dans la région par défaut configurée dans AWS CLI. Vous pouvez vérifier la région par défaut configurée en exécutant aws configure get region. Pour plus d'informations sur les actions effectuées par le script register.sh, consultez la section Étapes de l'installation utilisateur sur le référentiel 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 : le rôle de propriété doit être le nom d'un profil d'instance AWS Identity and Access Management (IAM) avec un rôle IAM associé. Le rôle IAM doit posséder 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 LogGroup, 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 AWS CLI. 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 dirige la réponse vers cut -d " " -f3. Ensuite, cut -d " " -f3 choisit le troisième élément du tableau créé après avoir fractionné 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 ?