Come posso usare AwsUtility::CloudFormation::CommandRunner per eseguire un comando prima o dopo una risorsa nel mio stack CloudFormation?

3 minuti di lettura
0

Voglio usare AWSUtility::CloudFormation::CommandRunner per eseguire un comando prima o dopo una risorsa nel mio stack AWS CloudFormation.

Risoluzione

Nota: se ricevi errori durante l'esecuzione dei comandi dell'interfaccia della linea di comando AWS (AWS CLI), assicurati di utilizzare la versione più recente dell'interfaccia a riga di comando di AWS.

Per eseguire un comando prima o dopo una risorsa nel tuo stack CloudFormation, definisci la risorsa AWSUtility::CloudFormation::CommandRunner nel tuo modello CloudFormation.

Ad esempio:

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

Importante: se non hai già registrato la risorsa AWSUtility::CloudFormation::CommandRunner, esegui i seguenti comandi. Lo script register.sh utilizza awsutility-cloudformation-commandrunner.zip per registrare il tipo di risorsa nella tua regione AWS. Lo script utilizza il comando AWS CLI di register-type per registrare il tipo di risorsa nella regione predefinita configurata nell'interfaccia a riga di comando di AWS. Puoi controllare la regione predefinita configurata eseguendo aws configure get region. Per ulteriori informazioni sulle azioni eseguite dallo script register.sh, consulta la procedura di installazione degli utenti nel repository AWS GitHub.

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

Importante: la proprietà Role deve essere il nome di un profilo di istanza di AWS Identity and Access Management (IAM) con un ruolo IAM associato. Il ruolo IAM deve avere una relazione di fiducia con il servizio Amazon Elastic Compute Cloud (Amazon EC2) (ec2.amazonaws.com). La proprietà Role è assunta dalla risorsa AwsUtility::CloudFormation::CommandRunner per eseguire il comando. La proprietà opzionale LogGroup, se specificata, scrive i log dell'esecuzione del comando nel gruppo di log di Amazon CloudWatch. Per ulteriori informazioni sull'utilizzo della risorsa AWSUtility::CloudFormation::CommandRunner nel tuo modello, consulta README.md e docs/README.md dal repository aws-cloudformation-resource-providers-awsutilities-commandrunner su AWS GitHub.

Devi includere l'opzione --region nei comandi dell'interfaccia a riga di comando di AWS. Quindi, è necessario scrivere l'output del comando in un file riservato chiamato /command-output.txt, come nell'esempio di codice precedente.

Puoi fare riferimento all'output del comando usando Fn::GetAtt. Ad esempio:

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

Per eseguire il comando dopo una risorsa con il nome logico Instanza, specifica DependsOn: Istanza nella definizione della risorsa AWSUtility::CloudFormation::CommandRunner. Ad esempio:

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

Per eseguire il comando prima di una risorsa, imposta ** DependsOn** sul nome logico della risorsa AWSUtility::CloudFormation::CommandRunner nella definizione di quella risorsa. Ad esempio:

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

Nota: negli esempi precedenti, sed -n 1p stampa solo la prima riga della risposta restituita da aws s3 ls. Per ottenere il nome del bucket, sed -n 1p invia la risposta a cut -d " " -f3. Quindi, cut -d " " -f3 sceglie il terzo elemento dell'array creato dopo aver diviso la linea delimitata da uno spazio.


Informazioni correlate

Esecuzione di comandi bash nei modelli di AWS CloudFormation

AWS UFFICIALE
AWS UFFICIALEAggiornata 3 anni fa