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.
Temas
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 unWaitConditionHandle
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 enCREATE_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
comoWaitConditionHandle
-
Tiene un tiempo de espera de 4500 segundos
-
Tiene el valor predeterminado
Count
de 1 (ya que no se especifica ninguna propiedadCount
)
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
-
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.
-
(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.
-
-
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 encabezadoContent-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 propiedadCount
es superior a 1, el valorUniqueId
para cada señal debe ser único entre todas las señales enviadas a una condición de espera en particular. ElUniqueId
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 comandoscurl
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
contiene la siguiente estructura JSON:/tmp/a
{ "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: !GetAttMyWaitCondition
.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."}