Ir para o conteúdo

Como uso o AWSUtility::CloudFormation::CommandRunner para executar um comando antes ou depois de um recurso na minha pilha do CloudFormation?

3 minuto de leitura
0

Quero usar o AWSUtility::CloudFormation::CommandRunner para executar um comando antes ou depois de um recurso na minha pilha do AWS CloudFormation.

Resolução

Observação: Se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de erros da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Registre o AWSUtility::CloudFormation::CommandRunner

Se você não registrou o recurso AWSUtility::CloudFormation::CommandRunner, execute os seguintes comandos para registrá-lo:

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

O script register.sh executa o comando register-type AWS CLI e usa awsutility-cloudformation-commandrunner.zip para registrar o tipo de recurso em sua região da AWS padrão. Para verificar a região padrão, execute o comando aws configure get region. Para obter mais informações sobre quais ações o script register.sh executa, consulte Etapas de instalação do usuário no repositório do AWS GitHub.

Defina o recurso em seu modelo do CloudFormation

Para executar um comando antes ou depois de um recurso na sua pilha do CloudFormation, defina o recurso AWSUtility::CloudFormation::CommandRunner em seu modelo do CloudFormation.

Exemplo de modelo:

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

Você deve incluir a opção --region em seus comandos da AWS CLI. Em seguida, grave a saída do comando em um arquivo reservado chamado /command-output.txt.

A propriedade Perfil deve ser o nome de um perfil de instância do AWS Identity and Access Management (AWS IAM) com um perfil do IAM associado. O perfil do IAM deve ter uma relação de confiança com o serviço Amazon Elastic Compute Cloud (Amazon EC2), ec2.amazonaws.com. Para executar seu comando, o recurso AWSUtility::CloudFormation::CommandRunner assume a propriedade Role. Se você especificar a propriedade LogGroup, o LogGroup gravará os logs da execução do seu comando no grupo de logs do Amazon CloudWatch.

Para obter mais informações sobre como usar o recurso AWSUtility::CloudFormation::CommandRunner em seu modelo, consulte README.md e Docs/README.md no site do GitHub.

Use Fn::GetAtt para referenciar a saída do comando.

Exemplo de trecho de modelo:

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

Para executar o comando após um recurso com o nome lógico Instância, especifique DependsOn: Instância na definição do recurso AWSUtility::CloudFormation::CommandRunner.

Exemplo de modelo:

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

Para executar o comando antes de um recurso, defina DependsOn como o nome lógico do recurso AWSUtility::CloudFormation::CommandRunner na definição desse recurso.

Exemplo de modelo:

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

Observação: nos exemplos anteriores, sed -n 1p imprime somente a primeira linha da resposta retornada pelo aws s3 ls. Para obter o nome do bucket, sed -n 1p envia a resposta para cut -d " " -f3. Em seguida, cut -d " " -f3 escolhe o terceiro elemento na matriz que é criada depois de dividir a linha delimitada por um espaço.

Informações relacionadas

Execução de comandos bash em modelos do AWS CloudFormation

AWS OFICIALAtualizada há 10 meses