Comment résoudre l'erreur « Failed to receive X resource signal(s) within the specified duration » dans AWS CloudFormation ?

Lecture de 5 minute(s)
0

Je reçois le message d'erreur : «Failed to receive X resource signal(s) within the specified duration » pour les instances Amazon Elastic Compute Cloud (Amazon EC2) Linux dans AWS CloudFormation.

Brève description

Cette erreur survient lorsque CloudFormation ne reçoit pas signal de réussite pour les ressources dont l'attribut CreationPolicy spécifié contient un ResourceSignal. Cette erreur peut se produire dans le cadre d’une instance Amazon EC2, d’un groupe Auto Scaling ou d’une condition d'attente.

Remarque : la résolution suivante s'applique uniquement aux piles CloudFormation que vous créez avec des instances Linux. Pour les instances Windows, consultez la page Comment résoudre l'erreur « Failed to receive X resource signal(s) within the specified duration » pour des instances EC2 Windows dans AWS CloudFormation ?

Résolution

En fonction de votre cas d'utilisation, choisissez une méthode pour résoudre votre problème. 

Remarque : pour éviter une restauration de la pile, sélectionnez Conserver les ressources correctement allouées dans les Options d'échec de la pile de la console CloudFormation. Cette option signifie qu'une restauration ne sera pas déclenchée en cas d'échec et que l'instance ne sera pas arrêtée tant que vous n'aurez pas supprimé la pile.

Le script cfn-signal n'est pas installé sur l'instance de la pile CloudFormation

Pour vérifier que le script cfn-signal est bien installé sur l'instance configurée pour envoyer des signaux à la pile, procédez comme suit :

  1. Utilisez le protocole SSH pour vous connecter à votre instance Linux.

  2. Utilisez l'un des scripts suivants pour confirmer que le script cfn-signal est bien installé.

    Pour confirmer la présence du script cfn-signal dans votre répertoire, exécutez la commande suivante :

    $ sudo find / -name cfn-signal
    /opt/aws/bin/cfn-signal
    /opt/aws/apitools/cfn-init-1.4-30.amzn2/bin/cfn-sign

    Pour vérifier que le package de scripts d'assistance CloudFormation qui contient le script cfn-signal est bien installé, exécutez la commande suivante :

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

    **Important :**La commande présentée ci-dessus ne fonctionne que sur les distributions qui utilisent le gestionnaire de packages RPM. Par défaut, les scripts d'assistance CloudFormation sont installés sur des Amazon Machine Images (AMI) Amazon Linux. Pour installer les scripts d'assistance, consultez la page Documentation de référence des scripts d'assistance CloudFormation.

Le modèle CloudFormation contient des erreurs de syntaxe ou des valeurs incorrectes

Pour identifier d’éventuelles erreurs et valeurs incorrectes, procédez comme suit :

  1. Dans un éditeur de code, ouvrez le modèle de votre pile. Recherchez ensuite la section relative à la propriété UserData.
  2. Vérifiez les erreurs de syntaxe, les espaces manquants, les fautes d'orthographe et autres fautes de frappe.
  3. Vérifiez que les valeurs renseignées pour les propriétés de la pile, de la ressource et de la région AWS sont correctes.
    Remarque : vérifiez le script bootstrap qui est inclus dans la propriété UserData. Ce script appelle cfn-signal. Vérifiez qu'il ne contient pas d'erreurs de syntaxe ou de valeurs incorrectes.

Si vous utilisez les signaux dans les commandes cfn-init, recherchez des informations sur le signal dans les journaux cfn-init. Pour rechercher des erreurs dans les journaux cloud-init ou cfn-init, utilisez le protocole SSH pour vous connecter à votre instance. Utilisez ensuite le mot clé « error » ou « failure » pour rechercher des messages d'erreur ou d'échec détaillés dans les journaux suivants :

/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

Pour analyser tous les mots « error » ou « failure » dans les fichiers /var/log/cfn ou /var/log/cloud-init, exécutez la commande suivante :

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

Remarque : la commande présentée ci-dessus renvoie le nom du fichier, le numéro de ligne et le message d'erreur.

La valeur de la propriété timeout pour l'attribut CreationPolicy est trop faible

La valeur de la propriété timeout est définie par l'attribut CreationPolicy. Vérifiez que la valeur est suffisante pour exécuter les tâches avant que le script cfn-signal n'envoie des signaux aux ressources CloudFormation.

Pour vérifier la valeur de la propriété timeout et comparer l’horodatage des signaux et des échec de ressources, procédez comme suit :

  1. Dans un éditeur de code, ouvrez le modèle CloudFormation pour votre pile afin de trouver la valeur de la propriété timeout.
    Remarque : la valeur de la propriété timeout indique la durée d’attente maximale du signal par CloudFormation avant l’envoi d’une erreur.

  2. Pour estimer le moment de l’activation du script cfn-signal, utilisez SSH pour vous connecter à l'instance. Exécutez ensuite la commande suivante :

    less /var/log/cfn-init.log

    Le fichier journal comprend un horodatage lorsque le signal SUCCESS est envoyé aux ressources CloudFormation.
    Exemple :

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

  4. Choisissez la vue Événements.

  5. Choisissez Motif du statut. Développez la ligne correspondant à l'événement avec le motif de statut « Failed to receive X resource signal(s) within the specified duration ».

  6. Comparez l'horodatage de la signalisation avec l'horodatage de l’échec des ressources.
    Remarque : pour réussir l’exécution, le script doit envoyer le signal avant la création ou l’échec de l'instance.

Le cfn-signal n'est pas envoyé depuis l'instance

Vérifiez que le signal reçu par CloudFormation provient bien de l'instance. Consultez le journal des connexions cfn disponible dans **/var/log/cfn-wire.log.**Si la réponse n'est pas « 200 », il peut exister un problème de connectivité entre votre instance et le point de terminaison de CloudFormation.

Lorsque vous envoyez des signaux depuis une source autre que votre instance, vous devez utiliser l'API SignalResource. Par exemple, vous pouvez utiliser une fonction AWS Lambda pour appeler l'API SignalResource, puis envoyer le signal à la pile. Si vous obtenez une erreur, utilisez CloudWatch Logs pour consulter vos journaux Lambda afin de comprendre pourquoi le signal n'a pas été envoyé à la pile.

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 7 mois