Comment dois-je procéder si AWS CloudFormation affiche le message d'erreur « Failed to receive X resource signal(s) within the specified duration » (Impossible de recevoir X signal/signaux de ressource dans les délais impartis) ?

Lecture de 6 minute(s)
0

Dans AWS CloudFormation, le message d'erreur suivant s'affiche : « Failed to receive X resource signal(s) within the specified duration » (Impossible de recevoir X signal/signaux de ressource dans les délais impartis). Comment puis-je résoudre cette erreur ?

Brève description

Ce message d'erreur s'affiche lorsqu'une instance Amazon Elastic Compute Cloud (Amazon EC2), un groupe Auto Scaling ou une ressource WaitCondition ne reçoit pas de signal de réussite auprès d'une ou plusieurs instances au cours de la période spécifiée par l'attribut CreationPolicy.

Cette situation peut se produire si l'un des scénarios suivants se vérifie :

  • Scénario 1 : le script cfn-signal n'est pas installé sur une ou plusieurs instances de la pile AWS CloudFormation.
  • Scénario 2 : le modèle AWS CloudFormation contient des erreurs de syntaxe ou des valeurs incorrectes.
  • Scénario 3 : la valeur de la propriété Timeout pour l'attribut CreationPolicy est trop basse.
  • Scénario 4 : le script cfn-signal n'est pas envoyé à partir de l'instance Amazon EC2.

Remarque : les solutions de dépannage s'appliquent uniquement aux piles AWS CloudFormation créées avec des instances Linux. Les scénarios ne s'appliquent pas aux instances Windows. Pour plus d'informations, consultez Comment résoudre les problèmes de création de stack.

Solution

Avant de suivre les étapes des scénarios de dépannage, définissez l'option Annulation en cas d'échec de votre pile AWS CloudFormation sur Non.

Scénario 1 : le script cfn-signal script n’est pas installé sur une ou plusieurs instances de la pile AWS CloudFormation.

Afin de vérifier que le script cfn-signal est bien installé sur l'instance censée envoyer des signaux aux ressources AWS CloudFormation, procédez comme suit :

1.    Connectez-vous à votre instance Linux à l'aide de SSH.

2.    Vérifiez que le script cfn-signal est installé à l'aide de l'une des commandes suivantes.

Pour vérifier que le script cfn-signal se situe bien 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-signal

Pour vérifier que le paquet de scripts d'assistance AWS CloudFormation, comprenant 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 : cette commande fonctionne uniquement avec les distributions de type RPM Package Manager.

Remarque : par défaut, les scripts d'assistance AWS CloudFormation sont installés sur des images Amazon Machine Image (AMI) sous Amazon Linux. Si les scripts d'assistance AWS CloudFormation ne sont pas installés, consultez la référence des scripts d'assistance CloudFormation pour obtenir des instructions d'installation.

Scénario 2 : le modèle AWS CloudFormation contient des erreurs de syntaxe ou des valeurs incorrectes.

Pour vérifier que la propriété UserData est bien configurée pour envoyer un signal aux ressources AWS CloudFormation spécifiées par l'attribut CreationPolicy, procédez comme suit :

1.    Dans un éditeur de code, ouvrez le modèle AWS CloudFormation pour votre pile, puis recherchez la section de propriété UserData.

2.    Recherchez les erreurs, notamment au niveau de la syntaxe, des espaces manquants, des fautes d'orthographe et d’autres fautes de frappe.

3.    Vérifiez que les valeurs applicables aux propriétés de la pile, de la ressource et de la région sont correctes.

Remarque : si vous utilisez un script d'amorçage comprenant la propriété UserData et permettant d'appeler le script cfn-signal, vérifiez la présence éventuelle d'erreurs de syntaxe ou de valeurs incorrectes.

Si vous employez des commandes de type cfn-init, recherchez des informations sur le signal dans les journaux cfn-init. Pour rechercher des erreurs au sein des journaux cloud-init ou cfn-init, connectez-vous à votre instance Amazon EC2 à l'aide du protocole SSH. Recherchez ensuite des messages d'erreur ou d'échec détaillés par le biais du mot clé « error » (erreur) ou « failure » (échec) 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 toutes les occurrences des mots clés « 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 : cette commande renvoie le nom du fichier, le numéro de ligne et un message d'erreur.

Scénario 3 : la valeur de la propriété Timeout pour l'attribut CreationPolicy est trop basse

La valeur de la propriété Timeout est définie par l'attribut CreationPolicy. Afin de vérifier que la valeur est suffisamment élevée pour permettre l'exécution des tâches avant l'envoi des signaux aux ressources AWS CloudFormation par le script cfn-signal, procédez comme suit.

Important : les étapes suivantes fonctionnent uniquement si l'instance n'est pas annulée (par exemple, par un groupe Auto Scaling). L'option Annulation en cas d'échec de votre pile AWS CloudFormation est déjà désactivée. Si l’option est activée, il n’y a pas de restauration d'échec possible et l'instance ne sera pas annulée tant que vous n’aurez pas supprimé la pile. Vous pouvez vous connecter à l'instance via SSH et poursuivre avec les étapes de dépannage suivantes.

1.    Dans un éditeur de code, ouvrez le modèle AWS CloudFormation pour votre pile, puis recherchez la valeur de la propriété Timeout.

Remarque : la valeur de la propriété Timeout correspond à la durée maximale pendant laquelle AWS CloudFormation attend un signal, avant d’envoyer une erreur.

2.    Pour obtenir une estimation du moment auquel le script cfn-signal se déclenchera, connectez-vous à l'instance à l'aide du protocole SSH, puis exécutez la commande suivante :

less /var/log/cfn-init.log

Le fichier journal indique la date et l'heure d'envoi du signal SUCCESS aux ressources AWS CloudFormation. Reportez-vous à l'exemple suivant :

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

4.    Pour connaître l'heure et la date d'échec de la ressource pour l'événement « Impossible de recevoir X signal/signaux de ressource dans les délais impartis », sélectionnez la vue Événements.

5.    Dans la section Motif de l'état, développez la ligne de l'événement associé au motif « Impossible de recevoir X signal/signaux de ressource dans les délais impartis ».

6.    Comparez la date et l’heure de signalisation à la date et l’heure de défaillance de la ressource.

Remarque : il est important de noter que le signal a été envoyé après la création de la ressource Amazon EC2. Le signal est envoyé avant la création ou l'échec de la création de la ressource Amazon EC2.

Scénario 4 : le signal fn-signal n'est pas envoyé à partir de l'instance Amazon EC2

L'API SignalResource se révèle utile lorsque vous souhaitez envoyer des signaux à partir d'un élément autre qu'une instance Amazon EC2.

Par exemple, vous pouvez utiliser une fonction AWS Lambda afin d'appeler l'API SignalResource, puis envoyer le signal à la pile AWS CloudFormation. Dans un tel scénario, vérifiez vos journaux Lambda par le biais d'Amazon CloudWatch Logs. Ces journaux vous permettent de déterminer pourquoi le signal n'a pas été envoyé à la pile AWS CloudFormation.


AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an