¿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 una condición de espera.

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, consulte 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 su caso de uso, lleve a cabo los siguientes pasos de solución de problemas para resolver el error.

Nota: Para evitar una restauración de la pila, elija 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 finalizará hasta que elimine 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, siga estos pasos:

  1. Utilice SSH para conectarse a su instancia Linux.

  2. Utilice uno de los siguientes scripts para confirmar que el script cfn-signal esté instalado.

    Para confirmar que el script cfn-signal se encuentra en su directorio, ejecute 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, ejecute el siguiente comando:

    $ sudo rpm -q aws-cfn-bootstrap
    aws-cfn-bootstrap-1.4-30.amzn2.noarch

    Importante: El comando anterior solo funciona en distribuciones que utilizan el Administrador de paquetes RPM. 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, consulte 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, siga estos pasos:

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

Si envía una señal en los comandos cfn-init, busque información sobre la señal en los registros de cfn-init. Para buscar errores en los registros cloud-init o cfn-init, utilice SSH para conectarse a su instancia. A continuación, utilice 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, ejecute 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 valor de la propiedad timeout se define mediante el atributo CreationPolicy. Confirme 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, siga estos pasos:

  1. En un editor de código, abra la plantilla de CloudFormation de su 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, utilice SSH para conectarse a la instancia. A continuación, ejecute 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.
    Ejemplo:

    2019-01-11 12:46:40,101 [DEBUG] Signaling resource EC2Instance in stack XXXX with unique ID i-045a536a3dfc8ccad and status SUCCESS
  3. Abra la consola de CloudFormation.

  4. Seleccione la vista Eventos.

  5. Seleccione Motivo del estado. Expanda la fila del evento con el motivo de estado «Failed to receive X resource signal(s) within the specified duration».

  6. Compare la marca de tiempo de la señalización 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

Verifique que la señal que recibió CloudFormation provenga de la instancia. Compruebe 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 su instancia y el punto de enlace de CloudFormation.

Cuando envíe señales desde algún lugar que no sea su instancia, utilice la API SignalResource. Por ejemplo, puede 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, utilice CloudWatch Logs 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 7 meses