Skip to content

¿Cómo utilizo AWSUtility::CloudFormation::CommandRunner para ejecutar un comando antes o después de un recurso de mi pila de CloudFormation?

3 minutos de lectura
0

Quiero usar AWSUtility::CloudFormation::CommandRunner para ejecutar un comando antes o después de un recurso de mi pila de AWS CloudFormation.

Solución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulte Solución de problemas de AWS CLI. Además, asegúrese de utilizar la versión más reciente de la AWS CLI.

Registro de AWSUtility::CloudFormation::CommandRunner

Si no ha registrado el recurso AWSUtility::CloudFormation::CommandRunner, ejecute los siguientes comandos para hacerlo:

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

El script register.sh ejecuta el comando register-type de la AWS CLI y usa awsutility-cloudformation-commandrunner.zip para registrar el tipo de recurso en la región de AWS predeterminada. Para comprobar la región predeterminada, ejecute el comando aws configure get region. Para obtener más información sobre las acciones que realiza el script register.sh, consulte los pasos de instalación del usuario en el sitio web de AWS GitHub.

Defina el recurso en su plantilla de CloudFormation

Para ejecutar un comando antes o después de un recurso de su pila de CloudFormation, defina el recurso AWSUtility::CloudFormation::CommandRunner en su plantilla de CloudFormation.

Ejemplo de plantilla:

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

Debe incluir la opción --region en los comandos de la AWS CLI. A continuación, escriba el resultado del comando en un archivo reservado denominado /command-output.txt.

La propiedad Rol debe ser el nombre de un perfil de instancia de AWS Identity and Access Management (IAM) con un rol de IAM asociado. El rol de IAM debe tener una relación de confianza con el servicio Amazon Elastic Compute Cloud (Amazon EC2) ec2.amazonaws.com. Para ejecutar el comando, el recurso AWSUtility::CloudFormation::CommandRunner asume la propiedad Rol. Si especifica la propiedad LogGroup, LogGroup escribe los registros de la ejecución del comando en el grupo de registros de Amazon CloudWatch.

Para obtener más información sobre cómo usar el recurso AWSUtility::CloudFormation::CommandRunner en su plantilla, consulte README.md y docs/README.md en el sitio web de GitHub.

Utilice Fn::GetAtt para hacer referencia al resultado del comando.

Ejemplo de fragmento de plantilla:

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

Para ejecutar el comando después de un recurso con el nombre lógico Instance, especifique DependsOn: Instance en la definición del recurso AWSUtility::CloudFormation::CommandRunner.

Ejemplo de plantilla:

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 ejecutar el comando antes de un recurso, defina DependsOn en el nombre lógico del recurso AWSUtility::CloudFormation::CommandRunner en la definición del recurso.

Ejemplo de plantilla:

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: En los ejemplos anteriores, sed -n 1p imprime solo la primera línea de la respuesta que devuelve aws s3 ls. Para obtener el nombre del bucket, sed -n 1p envía la respuesta a cut -d " " -f3. Luego, cut -d " " -f3 elige el tercer elemento de la matriz que se crea después de dividir la línea delimitada por un espacio.

Información relacionada

Ejecución de comandos bash en plantillas de AWS CloudFormation

OFICIAL DE AWSActualizada hace 6 meses