Wie verwende ich AwsUtility: :CloudFormation: :CommandRunner, um einen Befehl vor oder nach einer Ressource in meinem CloudFormation-Stack auszuführen?

Lesedauer: 3 Minute
0

Ich möchte AwsUtility: :CloudFormation: :CommandRunner verwenden, um einen Befehl vor oder nach einer Ressource in meinem AWS CloudFormation-Stack auszuführen.

Behebung

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version von AWS CLI verwendest.

AWSUtility::CloudFormation::CommandRunner registrieren

Wenn du die Ressource AWSUtility::CloudFormation::CommandRunner nicht registriert hast, führe die folgenden Befehle aus, um sie zu registrieren:

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

Das Skript register.sh führt den AWS-CLI-Befehl register-type aus und verwendet awsutility-cloudformation-commandrunner.zip, um den Ressourcentyp in deiner AWS-Standardregion zu registrieren. Um die Standardregion zu überprüfen, führe den Befehl aws configure get region aus. Weitere Informationen zu den Aktionen, die das Skript register.sh ausführt, findest du unter Schritte zur Benutzerinstallation auf der AWS-GitHub-Website.

Definiere die Ressource in deiner CloudFormation-Vorlage

Um einen Befehl vor oder nach einer Ressource in deinem CloudFormation-Stack auszuführen, definiere die Ressource AwsUtility::CloudFormation::CommandRunner in deiner CloudFormation-Vorlage.

Beispielvorlage:

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

Du musst die Option --region in deine AWS-CLI-Befehle aufnehmen. Schreibe dann die Ausgabe des Befehls in eine reservierte Datei namens /command-output.txt.

Die Eigenschaft Role muss der Name eines AWS Identity and Access Management (IAM)-Instance-Profils sein, dem eine IAM-Rolle zugeordnet ist. Die IAM-Rolle muss eine Vertrauensbeziehung zum Amazon Elastic Compute Cloud (Amazon EC2)-Service (ec2.amazonaws.com) haben. Um deinen Befehl auszuführen, nimmt die Ressource AWSUtility::CloudFormation::CommandRunner die Eigenschaft Role an. Wenn du die LogGroup-Eigenschaft angibst, schreibt LogGroup die Protokolle der Ausführung deines Befehls in die Amazon CloudWatch-Protokollgruppe.

Weitere Informationen zur Verwendung der Ressource AWSUtility::CloudFormation::CommandRunner in deiner Vorlage findest du unter README.md und docs/README.md auf der GitHub-Website.

Verwende Fn::GetAtt, um auf die Ausgabe des Befehls zu verweisen.

Beispiel für einen Vorlagenausschnitt:

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

Um den Befehl nach einer Ressource mit dem logischen Namen Instance auszuführen, gib dependOn an: Instanz in der Definition der Ressource AwsUtility::CloudFormation::CommandRunner.

Beispielvorlage:

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

Um den Befehl vor einer Ressource auszuführen, setze DependsOn auf den logischen Namen der AwsUtility::CloudFormation::CommandRunner-Ressource in der Definition dieser Ressource.

Beispielvorlage:

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

Hinweis: In den vorangegangenen Beispielen gibt sed -n 1p die erste Zeile der Antwort aus, die aws s3 ls zurückgegeben hat. Um den Bucket-Namen zu erhalten, sendet sed -n 1p die Antwort an cut -d " " -f3. Dann wählt cut -d " " -f3 das dritte Element in dem Array aus, das erstellt wird, nachdem es die durch ein Leerzeichen begrenzte Linie geteilt hat.

Ähnliche Informationen

Ausführen von Bash-Befehlen in AWS CloudFormation-Vorlagen

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 4 Monaten