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