¿Cómo puedo solucionar el error "Failed to receive X resource signal(s) within the specified duration" en AWS CloudFormation?

5 minutos de lectura
0

Se muestra el siguiente mensaje de error: «Failed to receive X resource signal(s) within the specified duration» para las instancias de Amazon Elastic Compute Cloud (Amazon EC2) de Linux en AWS CloudFormation.

Descripción breve

Este error aparece cuando CloudFormation no recibe señales de éxito para los recursos en los que se ha especificado un atributo CreationPolicy que contiene un ResourceSignal. El error puede producirse en una instancia de Amazon EC2, en un grupo de escalamiento automático o en AWS::CloudFormation::WaitCondition.

Nota: La siguiente resolución se aplica solo a las pilas de CloudFormation que se crean con instancias de Linux. Para las instancias de Windows, consulta How do I resolve the error "Failed to receive X resource signal(s) within the specified duration" for EC2 Windows instances in AWS CloudFormation?

Resolución

En función de tu caso de uso, lleva a cabo los siguientes pasos de solución de problemas para resolver el error.

Nota: Para evitar una restauración de la pila, elige Conservar los recursos aprovisionados correctamente para Opciones de error de la pila en la consola de CloudFormation. Esta opción significa que no se produce ningún error de restauración y que la instancia no se detendrá hasta que elimines la pila.

El script cfn-signal no está instalado en la instancia de la pila de CloudFormation

Para confirmar que el script cfn-signal esté instalado en la instancia que está configurada para enviar señales a la pila, sigue estos pasos:

  1. Utiliza SSH para conectarte a tu instancia de Linux.
  2. Utiliza uno de los siguientes scripts para confirmar que el script cfn-signal esté instalado.
    Para confirmar que el script cfn-signal se encuentra en tu directorio, ejecuta el siguiente comando:
    $ sudo find / -name cfn-signal/opt/aws/bin/cfn-signal/opt/aws/apitools/cfn-init-1.4-30.amzn2/bin/cfn-sign
    Para confirmar que el paquete de scripts auxiliares de CloudFormation que contiene el script cfn-signal está instalado, ejecuta el siguiente comando:
    $ sudo rpm -q aws-cfn-bootstrapaws-cfn-bootstrap-1.4-30.amzn2.noarch
    Importante: El comando anterior solo funciona en distribuciones que utilicen el Administrador de paquetes RPM. Para obtener más información sobre el Administrador de paquetes RPM, consulta el Capítulo 1. Introducción a RPM en el sitio web de Red Hat. De forma predeterminada, los scripts auxiliares de CloudFormation se instalan en las imágenes de máquina de Amazon (AMI) en Linux. Para instalar los scripts auxiliares, consulta Referencia de scripts auxiliares de CloudFormation.

Hay errores de sintaxis o valores incorrectos en la plantilla de CloudFormation

Para encontrar los errores y los valores incorrectos, sigue estos pasos:

  1. En un editor de código, abre la plantilla de la pila. Luego, busca la sección de propiedades UserData.
  2. Comprueba si hay errores de sintaxis, espacios que faltan, errores ortográficos y otros errores tipográficos.
  3. Confirma que los valores de las propiedades de pila, recurso y región de AWS sean correctos.
    Nota: Comprueba el script de arranque que se incluye en la propiedad UserData. El script llama a cfn-signal. Comprueba si hay errores de sintaxis o valores incorrectos.

Si envías una señal en los comandos cfn-init, busca información sobre la señal en los registros de cfn-init. Para buscar errores en los registros cloud-init o cfn-init, utiliza SSH para conectarte a tu instancia. A continuación, utiliza la palabra clave error o fallo para buscar mensajes detallados de error o fallo en los siguientes registros:

/var/log/cloud-init-output.log
/var/log/cloud-init.log
/var/log/cfn-init.log
/var/log/cfn-init-cmd.log
/var/log/cfn-wire.log

Para analizar todas las instancias de las palabras error o fallo en archivos /var/log/cfn o /var/log/cloud-init, ejecuta el siguiente comando:

grep -ni 'error\|failure' $(sudo find /var/log -name cfn\* -or -name cloud-init\*)

Nota: El comando anterior devuelve el nombre del archivo, el número de línea y el mensaje de error.

El valor de la propiedad timeout del atributo CreationPolicy es demasiado bajo

El atributo CreationPolicy define el valor de la propiedad timeout. Confirma que el valor sea lo suficientemente alto como para ejecutar tareas antes de que el script cfn-signal envíe señales a los recursos de CloudFormation.

Para comprobar el valor de la propiedad timeout y comparar las marcas de tiempo de los errores de señalización y de los recursos, sigue estos pasos:

  1. En un editor de código, abre la plantilla de CloudFormation de tu pila para encontrar el valor de la propiedad timeout.
    Nota: El valor de la propiedad timeout es la cantidad máxima de tiempo que CloudFormation espera una señal antes de devolver un error.
  2. Para obtener una estimación de cuándo se activó el script cfn-signal, utiliza SSH para conectarte a la instancia. A continuación, ejecuta el siguiente comando:
    less /var/log/cfn-init.log
    El archivo de registro muestra una marca de tiempo cuando se envía la señal de SUCCESS a los recursos de CloudFormation.
  3. Abre la consola de CloudFormation.
  4. Selecciona la vista Eventos.
  5. Selecciona Motivo del estado. Expande la fila del evento con el motivo de estado «Failed to receive X resource signal(s) within the specified duration».
  6. Compara la marca de tiempo de la señal con la marca de tiempo del fallo del recurso.
    Nota: Para completar el proceso correctamente, el script debe enviar la señal antes de que se cree la instancia o la creación falle.

El cfn-signal no se envía desde la instancia

Verifica que la señal que recibió CloudFormation provenga de la instancia. Comprueba el registro de cfn wire que está disponible en /var/log/cfn-wire.log. Si la respuesta no es 200, es posible que haya un problema de conectividad entre tu instancia y el punto de enlace de CloudFormation.

Cuando envíes señales desde algún lugar que no sea tu instancia, utiliza la API SignalResource. Por ejemplo, puedes usar una función de AWS Lambda para llamar a la API SignalResource y, a continuación, enviar la señal a la pila. Si aparece un error, utiliza Registros de CloudWatch para comprobar los registros de Lambda y comprender por qué no se envió la señal a la pila.

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un mes