Quiero seguir las prácticas recomendadas al implementar recursos personalizados respaldados por AWS Lambda con AWS CloudFormation.
Resolución
Cuando implemente recursos personalizados respaldados por Lambda con CloudFormation, utilice las siguientes prácticas recomendadas.
Creación de recursos personalizados para informar, registrar y gestionar los errores
Las excepciones pueden provocar que el código de la función se cierre sin enviar una respuesta. CloudFormation requiere una respuesta HTTPS para confirmar si la operación se ha realizado correctamente o se ha producido un error. Una excepción no notificada hace que CloudFormation espere hasta que se agote el tiempo de espera de la operación antes de iniciar una reversión de pila. Si la excepción se repite durante la reversión, CloudFormation vuelve a esperar a que se agote el tiempo de espera antes de que finalice con un error de reversión. Durante este tiempo, no puede usar la pila.
Para evitar problemas de tiempo de espera, incluya los siguientes elementos en el código que cree para la función de Lambda:
- Lógica para gestionar las excepciones
- La capacidad de registrar errores para los escenarios de solución de problemas
- La capacidad de responder a CloudFormation con una respuesta HTTPS que confirme que una operación ha fallado
- Una cola de mensajes fallidos que permite capturar y gestionar las ejecuciones incompletas
- Un módulo cfn-response para enviar una respuesta a CloudFormation
Establecimiento de periodos de tiempo de espera razonables y creación de informes cuando estén a punto de superarse
Si una operación no se ejecuta dentro del periodo de tiempo de espera definido, la función genera una excepción y no envía ninguna respuesta a CloudFormation.
Para evitarlo, tome las siguientes medidas:
- Establezca un valor de tiempo de espera para las funciones de Lambda lo suficientemente alto como para gestionar las variaciones en el tiempo de procesamiento y las condiciones de la red.
- Configure un temporizador en su función para responder a CloudFormation con un error cuando una función esté a punto de agotarse.
Compilación en torno a los eventos de creación, actualización y eliminación
Dependiendo de la acción de la pila, CloudFormation envíe a su función un evento de creación, actualización o eliminación. Como cada evento se gestiona de forma diferente, asegúrese de que no haya ningún comportamiento no deseado cuando la función reciba alguno de los tres tipos de eventos.
Para obtener más información, consulte Tipos de solicitud de recurso personalizados.
Comprender cómo CloudFormation identifica y reemplaza los recursos
Cuando una actualización reemplaza un recurso físico, CloudFormation compara el PhysicalResourceId que devuelve la función de Lambda con el PhysicalResourceId anterior. Si los ID son diferentes, CloudFormation supone que el recurso se ha reemplazado por un nuevo recurso físico.
Sin embargo, para permitir posibles reversiones, CloudFormation no elimina el recurso anterior. Cuando se completa la actualización de la pila, CloudFormation envía una solicitud de evento de eliminación con el ID físico anterior como identificador. Si se produce un error en la actualización de la pila y se produce una reversión, CloudFormation envía el nuevo ID físico en el evento de eliminación.
Use PhysicalResourceId para identificar de forma exclusiva los recursos, de modo que cuando la función reciba un evento de eliminación, la función elimine solo los recursos correctos durante el reemplazo.
Diseñar las funciones con idempotencia
Puede repetir una función idempotente varias veces con las mismas entradas y el resultado es el mismo que si lo hiciera solo una vez. La idempotencia garantiza que los reintentos, las actualizaciones y las anulaciones no generen recursos duplicados ni introduzcan errores.
Por ejemplo, CloudFormation invoca su función para crear un recurso, pero no recibe una respuesta que indique que el recurso se ha creado correctamente. CloudFormation podría volver a invocar la función y crear un segundo recurso. El primer recurso puede quedar huérfano.
Implementar los controladores para gestionar correctamente las reversiones
Cuando se produce un error en una operación de pila, CloudFormation intenta devolver todos los recursos a su estado anterior. Esta acción da como resultado diferentes comportamientos en función de si la actualización provocó un reemplazo de recursos.
Para asegurarse de que CloudFormation pueda completar las reversiones, lleve a cabo las siguientes acciones:
- Evite eliminar implícitamente los recursos antiguos hasta que la función reciba un evento de eliminación.
- Para seguir las prácticas recomendadas, use cloudformation-accustom o el Custom Resource Helper en el sitio web de GitHub.
Información relacionada
Creación de una lógica de aprovisionamiento personalizada con recursos personalizados