Le message d'erreur suivant s’affiche : « Impossible de recevoir le ou les signaux de ressource X pendant la durée spécifiée » pour les instances Windows Amazon Elastic Compute Cloud (Amazon EC2) dans AWS CloudFormation.
Brève description
Cette erreur s'affiche lorsque CloudFormation ne reçoit aucun signal de réussite pour les ressources dont l'attribut CreationPolicy est spécifié avec un ResourceSignal. L'erreur peut se produire pour une instance Amazon EC2, un groupe Auto Scaling ou une condition d’attente.
Remarque : La résolution suivante s'applique uniquement aux piles CloudFormation que vous créez avec des instances Windows. Pour les instances Linux, consultez la section Comment puis-je résoudre l'erreur « Impossible de recevoir le ou les signaux de ressources X pendant la durée spécifiée » dans AWS CloudFormation ?
Résolution
En fonction de votre cas d'utilisation, suivez les étapes de dépannage ci-dessous pour résoudre votre problème.
Remarque : Pour éviter une restauration de la pile, sélectionnez Conserver les ressources correctement allouées pour les options d’échec de la pile dans la console CloudFormation. Lorsque vous sélectionnez cette option, l'instance en échec n'est pas arrêtée tant que vous n'avez pas supprimé la pile.
Le package MSI cfn-bootstrap n'est pas installé sur une ou plusieurs instances de la pile AWS CloudFormation
Pour vérifier que le script cfn-signal est installé sur l'instance configurée pour envoyer des signaux à la pile, procédez comme suit :
- Utilisez le protocole RDP pour vous connecter à votre instance Windows.
- Vérifiez que le package de scripts d’assistance cfn est installé. Exécutez la commande suivante dans Windows PowerShell :
Get-Package -name aws-cfn-bootstrap
Important : Par défaut, les scripts d’assistance CloudFormation sont installés sur des Amazon Windows Amazon Machine Images (AMI). Pour installer les scripts d'assistance, consultez la section Référence des scripts d'assistance CloudFormation.
Le modèle AWS CloudFormation contient des erreurs de syntaxe ou des valeurs incorrectes
Pour identifier les erreurs et les valeurs incorrectes, procédez comme suit :
- Dans un éditeur de code, ouvrez le modèle CloudFormation pour votre pile. Puis, recherchez la section de propriété UserData.
- Vérifiez les erreurs de syntaxe, les espaces manquants, les fautes d'orthographe et autres fautes de frappe.
- Vérifiez que les valeurs des propriétés de pile, de ressource et de région AWS sont correctes.
Remarque : Vérifiez la présence d'erreurs de syntaxe ou de valeurs incorrectes dans le script d'amorçage inclus dans la propriété UserData. Le script appelle le signal cfn.
Si vous signalez 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 RDP pour vous connecter à votre instance. Puis, utilisez le mot clé « erreur » ou « échec » pour rechercher des messages d'erreur ou d'échec détaillés dans les journaux suivants :
C:\cfn\log\cfn-init.log
C:\cfn\log\cfn-init-cmd.log
C:\cfn\log\cfn-wire.log
La propriété de délai d’expiration de l'attribut CreationPolicy est très faible
La valeur de la propriété délai d’expiration est définie par l'attribut CreationPolicy. Vérifiez que la valeur est suffisamment élevée pour exécuter des tâches avant que le script cfn-signal n'envoie des signaux aux ressources CloudFormation.
Pour vérifier la valeur de la propriété délai d’expiration et comparer les horodatages de signalisation et de défaillance des ressources, procédez comme suit :
-
Dans un éditeur de code, ouvrez le modèle CloudFormation pour votre pile afin de trouver la valeur de la propriété délai d’expiration.
Remarque : La valeur de la propriété délai d’expiration est la durée maximale pendant laquelle CloudFormation attend un signal avant de renvoyer une erreur.
-
Pour obtenir une estimation du moment où le script cfn-signal est activé, utilisez le protocole RDP pour vous connecter à l'instance. Puis, exécutez la commande suivante :
C:\cfn\log\cfn-init.log
Comparez les horodatages de début et de fin enregistrés dans le fichier pour obtenir une estimation du temps nécessaire au démarrage. Modifiez la valeur du délai d'expiration selon vos besoins. La durée maximale que vous pouvez spécifier est de 12 heures.
Le fichier journal affiche un horodatage lorsque le signal RÉUSSITE 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
-
Ouvrez la console CloudFormation.
-
Choisissez la vue Événements.
-
Sélectionnez Motif du statut. Développez la ligne correspondant à l'événement avec le motif du statut « Impossible de recevoir le ou les signaux de ressources X au cours de la durée spécifiée. »
-
Comparez l'horodatage de signalisation avec l'horodatage de défaillance des ressources.
Remarque : Pour une exécution réussie, le script doit envoyer le signal avant que l'instance ne soit créée ou qu'elle échoue.
Le signal cfn n'est pas envoyé depuis l'instance Amazon EC2
Vérifiez que le signal reçu par CloudFormation provient de l'instance. Consultez le journal des câbles CFN disponible sur C:\cfn\log\cfn-wire.log. Si la réponse n'est pas 200, il se peut qu'il y ait un problème de connectivité entre votre instance et le point de terminaison de CloudFormation.
Si vous configurez un redémarrage dans votre instance et que le signal cfn est défini dans la section UserData, il se peut que le signal ne soit pas envoyé. Cela est dû au fait que UserData ne s'exécute qu'une seule fois. Pour plus d'informations, consultez la section Comment puis-je empêcher mon instance Windows Amazon EC2 de renvoyer le signal CREATE_COMPLETE avant la fin du démarrage de l'instance ?
Lorsque vous envoyez des signaux depuis un emplacement qui n'est pas votre instance, utilisez l'API SignalResource. Par exemple, vous pouvez utiliser une fonction AWS Lambda pour appeler l'API SignalResource, puis envoyer le signal à la pile. Si une erreur s’affiche, utilisez CloudWatch Logs pour consulter vos journaux Lambda afin de comprendre pourquoi le signal n'a pas été envoyé à la pile.