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), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Registra AWSUtility::CloudFormation::CommandRunner

Se non hai registrato la risorsa AWSUtility::CloudFormation::CommandRunner, esegui i seguenti comandi per registrarla:

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

Lo script register.sh esegue il comando AWS CLI register-type e utilizza awsutility-cloudformation-commandrunner.zip per registrare il tipo di risorsa nella regione AWS predefinita. Per verificare la regione predefinita, esegui il comando aws configure get region. Per ulteriori informazioni sulle azioni eseguite dallo script register.sh, consulta User installation steps (Procedura di installazione per l'utente) sul sito web di AWS GitHub.

Definisci la risorsa nel tuo modello CloudFormation

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

Esempio di modello:

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

È necessario includere l'opzione --region nei comandi dell'Interfaccia della linea di comando AWS. Quindi scrivi l'output del comando in un file riservato denominato /command-output.txt.

La proprietà Role deve essere il nome di un profilo di istanza AWS Identity and Access Management (IAM) a cui è associato un ruolo IAM. Il ruolo IAM deve avere una relazione di affidabilità con il servizio Amazon Elastic Compute Cloud (Amazon EC2), ec2.amazonaws.com. Per eseguire il comando, la risorsa AWSUtility::CloudFormation::CommandRunner assume la proprietà Role. Se specifichi la proprietà LogGroup, LogGroup scrive i log dall'esecuzione del comando nel gruppo di log di Amazon CloudWatch.

Per ulteriori informazioni sull'utilizzo della risorsa AWSUtility::CloudFormation::CommandRunner nel modello, consulta README.md and docs/README.md sul sito web di GitHub.

Utilizza Fn::GetAtt per fare riferimento all'output del comando.

Esempio di frammento di modello:

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

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

Esempio di modello:

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 della risorsa.

Esempio di modello:

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 riga delimitata da uno spazio.

Informazioni correlate

Esecuzione di comandi bash nei modelli di AWS CloudFormation

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 mesi fa