Creación de condiciones de espera en una plantilla de CloudFormation - AWS CloudFormation

Creación de condiciones de espera en una plantilla de CloudFormation

En este tema se explica cómo crear una condición de espera en una plantilla para coordinar la creación de los recursos de la pila o realizar un seguimiento del progreso de un proceso de configuración. Por ejemplo, puede comenzar la creación de otro recurso después de que la configuración de la aplicación esté parcialmente completa o puede enviar señales durante un proceso de instalación y configuración para realizar un seguimiento de su progreso.

Cuando CloudFormation crea una pila que incluye una condición de espera:

  • Crea una condición de espera igual que cualquier otro recurso y establece el estado de la condición de espera en CREATE_IN_PROGRESS.

  • CloudFormation espera hasta que recibe la cantidad necesara de señales de éxito o hasta que haya vencido el periodo de la condición de espera.

  • Si recibe la cantidad requerida de señales de éxito antes de que venza el periodo de espera:

    • El estado de la condición de espera cambia a CREATE_COMPLETE

    • La creación de la pila continúa

  • Si se agota el tiempo de espera o se recibe una señal de error:

    • El estado de la condición de espera cambia a CREATE_FAILED

    • Restauración de una pila

importante

Con los recursos de Amazon EC2 y Auto Scaling recomendamos que use un atributo CreationPolicy en lugar de condiciones de espera. Agregue un atributo CreationPolicy a esos recursos y use el script de ayuda cfn-signal para señalar que el proceso de creación de instancias ha finalizado satisfactoriamente.

Para obtener más información, consulte Atributo CreationPolicy o Implementación de aplicaciones en Amazon EC2.

nota

Si utiliza AWS PrivateLink, los recursos de la VPC que responden a condiciones de espera tienen que tener acceso a buckets de Amazon Simple Storage Service (Amazon S3) específicos de CloudFormation. Los recursos deben enviar respuestas de condición de espera a una URL de Amazon S3 prefirmada. Si no pueden enviar respuestas a Amazon S3, CloudFormation no recibirá una respuesta y la operación de pila producirá un error. Para obtener más información, consulte Acceso a CloudFormation mediante un punto de conexión de la interfaz (AWS PrivateLink) y Control del acceso desde puntos de conexión de VPC con políticas de bucket.

Creación de una condición de espera en su plantilla

1. Identificador de condición de espera

Se empieza por definir un recurso AWS::CloudFormation::WaitConditionHandle en la plantilla de la pila. Este recurso genera la URL prefirmada necesaria para enviar señales. Esto le permite enviar una señal sin tener que proporcionar sus credenciales de AWS. Por ejemplo:

Resources: MyWaitHandle: Type: AWS::CloudFormation::WaitConditionHandle
2. Condición de espera

A continuación, debe definir un recurso AWS::CloudFormation::WaitCondition en la plantilla de la pila. La estructura básica de AWS::CloudFormation::WaitCondition tiene un aspecto similar al siguiente:

MyWaitCondition: Type: AWS::CloudFormation::WaitCondition Properties: Handle: String Timeout: String Count: Integer

El recurso AWS::CloudFormation::WaitCondition tiene dos propiedades obligatorias y una propiedad opcional.

  • Handle (obligatoria): referencia a un WaitConditionHandle declarado en la plantilla.

  • Timeout (obligatoria): la cantidad de segundos que CloudFormation debe esperar a que se reciba la cantidad de señales requerida. Timeout es una propiedad con un límite mínimo, lo que quiere decir que el tiempo de espera comienza a partir del momento en que se especifique, no antes, aunque también puede producirse poco después. El tiempo máximo que puede especificar es de 43200 segundos (12 horas).

  • Count (opcional): la cantidad de señales de éxito que CloudFormation debe recibir antes de configurar el estado de esa condición de espera en CREATE_COMPLETE y retoma la creación de la pila. Si no se especifica, el valor predeterminado es 1.

Normalmente, querrá que una condición de espera comience inmediatamente después de la creación de un recurso específico. Para ello, agregue el atributo DependsOn a una condición de espera. Al añadir un atributo DependsOn a una condición de espera, CloudFormation crea primero el recurso en el atributo DependsOn y, a continuación, crea la condición de espera.

En el siguiente ejemplo se muestra una condición de espera que:

  • Comienza después de la creación correcta del recurso MyEC2Instance

  • Utiliza el recurso MyWaitHandle como WaitConditionHandle

  • Tiene un tiempo de espera de 4500 segundos

  • Tiene el valor predeterminado Count de 1 (ya que no se especifica ninguna propiedad Count)

MyWaitCondition: Type: AWS::CloudFormation::WaitCondition DependsOn: MyEC2Instance Properties: Handle: !Ref MyWaitHandle Timeout: '4500'
3. Envío de una señal

Para indicar el éxito o el error de CloudFormation, normalmente se ejecuta algún código o script. Por ejemplo, una aplicación que se ejecuta en una instancia de EC2 puede realizar algunas tareas de configuración adicionales y, a continuación, enviar una señal a CloudFormation para indicar que ha finalizado.

La señal debe enviarse a la URL prefirmada generada por el identificador de la condición de espera. Debe utilizar la URL prefirmada para señalar el éxito o el error.

Enviar una señal
  1. Para recuperar la URL prefirmada dentro de la plantilla, utilice la función intrínseca Ref con el nombre lógico del identificador de la condición de espera.

    Como se muestra en el siguiente ejemplo, su plantilla puede indicar una instancia de Amazon EC2 y pasar la URL prefirmada a las instancias de EC2 mediante la propiedad UserData de Amazon EC2. Esto permite que los scripts o las aplicaciones que se ejecutan en esas instancias indiquen el éxito o el error a CloudFormation.

    MyEC2Instance: Type: AWS::EC2::Instance Properties: InstanceType: t2.micro # Example instance type ImageId: ami-055e3d4f0bbeb5878 # Change this as needed (Amazon Linux 2023 in us-west-2) UserData: Fn::Base64: Fn::Join: - "" - - "SignalURL=" - { "Ref": "MyWaitHandle" }

    Esto devuelve un resultado UserData similar a:

    SignalURL=https://amzn-s3-demo-bucket.s3.amazonaws.com/....

    Nota: En la AWS Management Console o las herramientas de línea de comandos, la URL prefirmada se muestra con el ID físico de la condición de espera del recurso del administrador.

  2. (Opcional) Para detectar cuándo la pila entra en estado de espera, puede usar uno de los siguientes métodos:

    • Si crea la pila con las notificaciones habilitadas, CloudFormation publica una notificación para cada evento de pila en el tema especificado. Si usted o su aplicación se suscriben a ese tema, puede monitorizar las notificaciones para el evento de creación del identificador de la condición de espera y recuperar la URL prefirmada del mensaje de notificación.

    • También puede monitorear los eventos de la pila mediante la AWS Management Console, la AWS CLI o un SDK.

  3. Para enviar una señal, envía un mensaje de solicitud HTTP usando la URL prefirmada. El método de solicitudes debe ser PUT y el encabezado Content-Type debe ser una cadena vacía u omitirse. El mensaje de solicitud debe ser una estructura JSON con la forma especificada en Sintaxis de señal de condición de espera.

    Debe enviar la cantidad de señales de éxito que se especifica en la propiedad Count para que CloudFormation continúe con la creación de la pila. Si la propiedad Count es superior a 1, el valor UniqueId para cada señal debe ser único entre todas las señales enviadas a una condición de espera en particular. El UniqueId es una cadena alfanumérica arbitraria.

    Un comando curl es una forma de enviar una señal. El siguiente ejemplo muestra una línea de comandos curl que señala el éxito a una condición de espera.

    $ curl -T /tmp/a \ "https://amzn-s3-demo-bucket.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-west-2%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"

    donde el archivo /tmp/a contiene la siguiente estructura JSON:

    { "Status" : "SUCCESS", "Reason" : "Configuration Complete", "UniqueId" : "ID1234", "Data" : "Application has completed configuration." }

    En este ejemplo se muestra una línea de comandos curl que envía la misma señal de éxito, salvo que envía la estructura JSON como parámetro en la línea de comandos.

    $ curl -X PUT \ -H 'Content-Type:' --data-binary '{"Status" : "SUCCESS","Reason" : "Configuration Complete","UniqueId" : "ID1234","Data" : "Application has completed configuration."}' \ "https://amzn-s3-demo-bucket.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-west-2%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"

Sintaxis de señal de condición de espera

Cuando envía señales a la URL generada por el administrador de la condición de espera, tiene que utilizar el siguiente formato JSON:

{ "Status" : "StatusValue", "UniqueId" : "Some UniqueId", "Data" : "Some Data", "Reason" : "Some Reason" }

Propiedades

El campo Status debe tener uno de los siguientes valores:

  • SUCCESS

  • FAILURE

El campo UniqueId identifica la señal a CloudFormation. Si la propiedad Count de la condición de espera es superior a 1, el valor UniqueId debe ser único en todas las señales enviadas para una determinada condición de espera; de lo contrario, CloudFormation considerará que la señal es una retransmisión de la señal enviada con anterioridad con el mismo UniqueId y la ignorará.

El campo Data puede contener cualquier información que desea devolver con la señal. Puede acceder al valor Data usando la función Fn::GetAtt dentro de la plantilla.

El campo Reason es una cadena sin ninguna restricción en su contenido, salvo la conformidad de JSON.

Acceso a los datos de señales

Para acceder a los datos enviados por señales válidas, puede crear un valor de salida para la condición de espera en la plantilla de CloudFormation. Por ejemplo:

Outputs: WaitConditionData: Description: The data passed back as part of signalling the WaitCondition Value: !GetAtt MyWaitCondition.Data

Luego, puede ver estos datos con el comando describe-stacks o la pestaña Salida de la consola de CloudFormation.

La función Fn::GetAtt devuelve los valores UniqueId y Data como un par nombre-valor dentro de una estructura JSON. Por ejemplo:

{"Signal1":"Application has completed configuration."}