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

Creación de condiciones de espera en una plantilla

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 con AWS CloudFormation.

Con el recurso AWS::CloudFormation::WaitConditionHandle y con el atributo Atributo CreationPolicy, puede hacer lo siguiente:

  • Coordinar la creación de recursos de la pila con otras acciones de configuración que son externas a la creación de la pila

  • Realizar un seguimiento del estado 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.

Uso de un identificador de condición de espera

nota

Si utiliza la característica punto de conexión de VPC, los recursos en la VPC que responden a condiciones de espera tienen que tener acceso a buckets Amazon Simple Storage Service (Amazon S3) específicos de AWS CloudFormation. Los recursos deben enviar respuestas de condición de espera a una URL de Amazon S3 prefirmada. Si no puede enviar las respuestas a Amazon S3, AWS CloudFormation no recibirá una respuesta y la operación de pila producirá un error. Para obtener más información, consulte Configuración de puntos de enlace de la VPC para AWS CloudFormation y Ejemplo de políticas de bucket para puntos de enlace de la VPC de Amazon S3.

Puede utilizar la condición de espera y el identificador de condición de espera para hacer que AWS CloudFormation detenga la creación de una pila y espere a recibir una señal antes de que siga creando la pila. Por ejemplo, es posible que le interese descargar y configurar aplicaciones en una instancia Amazon EC2 antes de considerar la creación la instancia Amazon EC2 completa.

La siguiente lista ofrece un resumen de cómo funciona una condición de espera con un identificador de condición de espera:

  • AWS CloudFormation crea una condición de espera igual que cualquier otro recurso. Cuando AWS CloudFormation crea una condición de espera, informa el estado de la condición de espera como CREATE_IN_PROGRESS y espera hasta que recibe el número necesario de señales de éxito o hasta que ha vencido el periodo de tiempo de espera de la condición de espera. Si AWS CloudFormation recibe el número necesario de señales de éxito antes de que venza el periodo del tiempo de espera, sigue creando la pila. De lo contrario, establece el estado de la condición de espera en CREATE_FAILED y restaura la pila al estado anterior.

  • La propiedad Timeout determina cuánto tiempo AWS CloudFormation espera el número necesario de señales de éxito. 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).

  • Normalmente, desea que una condición de espera comience inmediatamente después de la creación de un recurso específico, como, por ejemplo, una instancia de Amazon EC2, instancia de base de datos de RDS o grupo de Auto Scaling. Para ello, agregue el atributo DependsOn a una condición de espera. Cuando agrega un atributo DependsOn a una condición de espera, especifica que la condición se cree únicamente después de se haya completado la creación de un recurso determinado. Cuando se crea la condición de espera, AWS CloudFormation comienza el periodo de tiempo de espera y espera las señales de éxito.

  • También puede utilizar el atributo DependsOn en otros recursos. Por ejemplo, es posible que desee que se cree una instancia de base de datos de Amazon RDS y se configure una base de datos en esa instancia de base de datos antes de crear las instancias de EC2 que utilizan esa base de datos. En este caso, tiene que crear una condición de espera que tiene un atributo DependsOn que especifica la instancia de la base de datos, así como también crear recursos de instancias de EC2 que tienen atributos DependsOn que especifican la condición de espera. Esto garantizaría que las instancias de EC2 solo se creen directamente una vez que la instancia de base de datos y la condición de espera se han completado.

  • AWS CloudFormation debe recibir un número especificado de señales de éxito para una condición de espera antes de configurar el estado de esa condición de espera en CREATE_COMPLETE tras la creación de la pila. La propiedad Count de la condición de espera especifica el número de señales de éxito. Si no se establece ninguna, el valor predeterminado es 1.

  • Una condición de espera requiere que un indicador de condición de espera configure una URL prefirmada que se utiliza con el mecanismo de señalización. La URL prefirmada le permite enviar una señal sin tener que proporcionar sus credenciales de AWS. Usted utiliza dicha URL prefirmada para señalar el éxito o el error, que se encapsula en una instrucción JSON. Para el formato de dicha instrucción JSON, consulte Formato JSON de señal de condición de espera.

  • Si una condición de espera recibe el número necesario de señales de éxito (definido en la propiedad Count [Recuento]) antes de que venza el periodo del tiempo de espera, AWS CloudFormation señala la condición de espera como CREATE_COMPLETE y sigue creando la pila. De lo contrario, AWS CloudFormation falla la condición de espera y restaura la pila al estado anterior (por ejemplo, si el periodo de tiempo de espera vence sin las señales de éxito necesarias o si se ha recibido una señal de error).

Para utilizar una condición de espera en una pila:
  1. Declare un recurso AWS::CloudFormation::WaitConditionHandle en la plantilla de la pila. Un identificador de condición de espera no tiene propiedades; sin embargo, una referencia a un recurso WaitConditionHandle se resuelve en una URL prefirmada que puede utilizar para señalar el éxito o el error de WaitCondition. Por ejemplo:

    "myWaitHandle" : { "Type" : "AWS::CloudFormation::WaitConditionHandle", "Properties" : { } }
  2. Declare un recurso AWS::CloudFormation::WaitCondition en la plantilla de la pila. Un recurso WaitCondition tiene dos propiedades obligatorias: Handle es una referencia a un WaitConditionHandle declarado en la plantilla y Timeout es el número de segundos que AWS CloudFormation debe esperar. Si lo desea, puede configurar la propiedad Count, que determina el número de señales de éxito que la condición de espera debe recibir antes de que AWS CloudFormation pueda reanudar la creación de la pila.

    Para controlar cuándo se activa la condición de espera, se establece un atributo DependsOn en la condición de espera. Una cláusula DependsOn asocia un recurso con la condición de espera. Después de que AWS CloudFormation cree el recurso DependsOn, bloquea cualquier creación de recursos de pila hasta que se produzca cualquiera de los siguientes eventos: a) vence el periodo de tiempo de espera, b) se recibe el número necesario de señales de éxito o c) se recibe una señal de error.

    A continuación se muestra un ejemplo de una condición de espera que comienza después de la creación del recurso Ec2Instance, utiliza el recurso myWaitHandle como el WaitConditionHandle, tiene un tiempo de espera de 4500 segundos y cuya propiedad Count predeterminada es 1 (dado que no se especifica ninguna propiedad Count):

    "myWaitCondition" : { "Type" : "AWS::CloudFormation::WaitCondition", "DependsOn" : "Ec2Instance", "Properties" : { "Handle" : { "Ref" : "myWaitHandle" }, "Timeout" : "4500" } }
  3. Obtenga la URL prefirmada para utilizarla para señalización.

    En la plantilla, la URL prefirmada puede recuperarse pasando el nombre lógico del recurso AWS::CloudFormation::WaitConditionHandle a la función intrínseca Ref. Por ejemplo, puede utilizar la propiedad UserData en los recursos AWS::EC2::Instance para pasar la URL prefirmada a las instancias de Amazon EC2 para que los scripts o aplicaciones que se ejecutan en estas instancias puedan señalar el éxito o el error a AWS CloudFormation:

    "UserData" : { "Fn::Base64" : { "Fn::Join" : [ "", ["SignalURL=", { "Ref" : "myWaitHandle" } ] ] } }

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

  4. Seleccione un método para detectar cuándo pasa la pila a la condición de espera.

    Si crea la pila con las notificaciones habilitadas, AWS CloudFormation publica una notificación para cada evento de pila al 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 supervisar los eventos de la pila mediante la AWS Management Console, las herramientas de línea de comandos de AWS CloudFormation o la API de AWS CloudFormation.

  5. Utilice la URL prefirmada para señalar el éxito o el error.

    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 Formato JSON de señal de condición de espera.

    Debe enviar el número de señales de éxito que se especifica en la propiedad Count para que AWS 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://cloudformation-waitcondition-test.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-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://cloudformation-waitcondition-test.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-2%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"

Formato JSON de señal de condición de espera

Cuando señala una condición de espera, tiene que utilizar el siguiente formato JSON:

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

Donde:

StatusValue tiene que ser uno de los siguientes valores:

  • SUCCESS indica una señal de éxito.

  • FAILURE indica una señal de error y desencadena una condición de espera con error y una restauración de pila.

UniqueId identifica la señal para AWS 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, AWS CloudFormation considerará la señal una retransmisión de la señal enviada con anterioridad con el mismo UniqueId y pasará por alto la señal.

Data es cualquier información que desea devolver con la señal. Es posible obtener acceso al valor Data llamando a la función Fn::GetAtt dentro de la plantilla. Por ejemplo, si crea el siguiente valor de salida para la condición de espera mywaitcondition, puede utilizar el comando aws cloudformation describe-stacks, la operación DescribeStacks de la API o la pestaña Salidas de la consola de AWS CloudFormation para ver los Data enviados mediante señales válidas enviadas a AWS CloudFormation:

"WaitConditionData" : { "Value" : { "Fn::GetAtt" : [ "mywaitcondition", "Data" ]}, "Description" : "The data passed back as part of signalling the WaitCondition" },

La función Fn::GetAtt devuelve los valores UniqueId y Data como un par nombre-valor dentro de una estructura JSON. A continuación se muestra un ejemplo del atributo Data devuelto por el valor de salida WaitConditionData definido anteriormente:

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

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