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), certifique-se de estar usando a versão mais recente da AWS CLI.
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.
Por exemplo:
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 você ainda não registrou o recurso AWSUtility::CloudFormation::CommandRunner, execute os comandos a seguir. O script register.sh usa o awsutility-cloudformation-commandrunner.zip para registrar o tipo de recurso na sua região da AWS. O script usa o comando registrer-type da AWS CLI para registrar o tipo de recurso na região padrão configurada na AWS CLI. Você pode verificar a região padrão configurada executando 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.
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: A propriedade Perfil deve ser o nome de um perfil de instância do AWS Identity and Access Management (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). A propriedade Perfil é assumida pelo recurso AWSUtility::CloudFormation::CommandRunner para executar seu comando. A propriedade opcional LogGroup, se especificada, grava 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 do repositório aws-cloudformation-resource-providers-awsutilities-commandrunner no AWS GitHub.
Você deve incluir a opção --region em seus comandos da AWS CLI. Em seguida, você deve gravar a saída do comando em um arquivo reservado chamado /command-output.txt, como no exemplo de código anterior.
Você pode referenciar a saída do comando usando Fn::GetAtt. Por exemplo:
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**. Por exemplo:
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. Por exemplo:
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 canaliza a resposta para cut -d " " -f3. Em seguida, cut -d " " -f3 escolhe o terceiro elemento na matriz criada após dividir a linha delimitada por um espaço.
Informações relacionadas
Execução de comandos bash em modelos do AWS CloudFormation