¿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.

Resolución

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

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.

Por ejemplo:

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: Si aún no ha registrado el recurso AWSUtility::CloudFormation::CommandRunner, ejecute los siguientes comandos. El script register.sh usa awsutility-cloudformation-commandrunner.zip para registrar el tipo de recurso en su región de AWS. El script usa el comando register-type de la CLI de AWS para registrar el tipo de recurso en la región predeterminada configurada en la CLI de AWS. Puede comprobar la región predeterminada configurada ejecutando 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 repositorio de 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: La propiedad Rol debe ser el nombre de un perfil de instancia de AWS Identity and Access Management (IAM) con una función de IAM asociada. El rol de IAM debe tener una relación de confianza con el servicio Amazon Elastic Compute Cloud (Amazon EC2) (ec2.amazonaws.com). El recurso AWSUtility::CloudFormation::CommandRunner asume la propiedad Rol para ejecutar el comando. La propiedad opcional LogGroup, si se especifica, escribe los registros de la ejecución del comando en el grupo de registros de Amazon CloudWatch. Para obtener más información sobre el uso del recurso AWSUtility::CloudFormation::CommandRunner en la plantilla, consulte README.md y docs/README.md del repositorio aws-cloudformation-resource-providers-awsutilities-commandrunner en AWS GitHub.

Debe incluir la opción --region en los comandos de la CLI de AWS. A continuación, debe escribir el resultado del comando en un archivo reservado denominado /command-output.txt, como en el ejemplo de código anterior.

Puede hacer referencia a la salida del comando mediante Fn::GetAtt. Por ejemplo:

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. Por ejemplo:

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 de ese recurso. Por ejemplo:

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 devuelta por aws s3 ls. Para obtener el nombre del bucket, sed -n 1p canaliza la respuesta a cut -d " " -f3. Luego, cut -d " " -f3 elige el tercer elemento de la matriz creada 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 AWS
OFICIAL DE AWSActualizada hace 3 años