Wie behebe ich den Fehler „X-Ressourcensignal (e) konnten innerhalb der angegebenen Dauer nicht empfangen werden“ in AWS CloudFormation?
Ich erhalte die folgende Fehlermeldung: „Fehler beim Empfang von X Ressourcensignal(en) innerhalb der angegebenen Dauer“ für Linux Amazon Elastic Compute Cloud (Amazon EC2)-Instances in AWS CloudFormation.
Kurzbeschreibung
Dieser Fehler wird angezeigt, wenn CloudFormation keine Erfolgssignale für Ressourcen empfängt, für die ein CreationPolicy-Attribut mit einem ResourceSignal angegeben ist. Der Fehler kann bei einer Amazon EC2-Instance, Auto-Scaling-Gruppe oder einer Wartebedingung auftreten.
**Hinweis:**Die folgende Behebung gilt nur für CloudFormation-Stacks, die Sie mit Linux-Instances erstellen. Informationen zu Windows-Instances finden Sie unter Wie behebe ich den Fehler „X-Ressourcensignal(e) konnten innerhalb der angegebenen Dauer nicht empfangen werden“ für EC2-Windows-Instances in AWS CloudFormation?
Behebung
Verwenden Sie je Ihrem Anwendungsfall die folgenden Schritte zur Fehlerbehebung, um Ihr Problem zu lösen.
Hinweis: Um ein Stack-Rollback zu verhindern, wählen Sie in der CloudFormation-Konsole die Option Erfolgreich bereitgestellte Ressourcen beibehalten für Stackfehler-Optionen aus. Diese Option bedeutet, dass es kein Fehler-Rollback gibt und die Instance erst beendet wird, wenn Sie den Stack löschen.
**Das Skript cfn-signal ist nicht auf der Instance des CloudFormation-Stacks installiert **
Gehen Sie wie folgt vor, um zu bestätigen, dass das cfn-Signal-Skript auf der Instance installiert ist, die für das Senden von Signalen an den Stack konfiguriert ist:
-
Verwenden Sie SSH, um eine Verbindung zu Ihrer Linux-Instance herzustellen.
-
Verwenden Sie eines der folgenden Skripte, um zu bestätigen, dass das Skript cfn-signal installiert ist.
Führen Sie den folgenden Befehl aus, um zu überprüfen, ob sich das cfn-signal-Skript in Ihrem Verzeichnis befindet:
$ sudo find / -name cfn-signal /opt/aws/bin/cfn-signal /opt/aws/apitools/cfn-init-1.4-30.amzn2/bin/cfn-sign
Führen Sie den folgenden Befehl aus, um zu überprüfen, ob das CloudFormation-Helper-Skriptpaket, das das cfn-signal-Skript enthält, installiert ist:
$ sudo rpm -q aws-cfn-bootstrap aws-cfn-bootstrap-1.4-30.amzn2.noarch
**Wichtig:**Der obige Befehl funktioniert nur auf Distributionen, die den RPM-Paketmanager verwenden. Standardmäßig sind CloudFormation-Hilfsskripte auf Amazon Linux Amazon Machine Images (AMIs) installiert. Informationen zur Installation der Hilfsskripte finden Sie in der Referenz zu CloudFormation-Hilfsskripten.
Die CloudFormation-Vorlage enthält Syntaxfehler oder falsche Werte
Gehen Sie wie folgt vor, um die Fehler und falschen Werte zu finden:
- Öffnen Sie in einem Code-Editor die Vorlage für Ihren Stack. Suchen Sie dann den Eigenschaftenabschnitt UserData.
- Suchen Sie nach Syntaxfehlern, fehlenden Leerzeichen, Rechtschreibfehlern und anderen Tippfehlern.
- Vergewissern Sie sich, dass die Werte für die Eigenschaften Stack, Ressource und AWS-Region korrekt sind.
Hinweis: Überprüfen Sie das Bootstrap-Skript, das in der Eigenschaft UserData enthalten ist. Das Script ruft cfn-signal auf. Prüfen Sie, ob Syntaxfehler oder falsche Werte vorliegen.
Wenn Sie innerhalb der Befehle cfn-init signalisieren, suchen Sie in den Protokollen cfn-init nach Informationen über das Signal. Um in den Protokollen cloud-init oder cfn-init nach Fehlern zu suchen, verwenden Sie SSH, um eine Verbindung zu Ihrer Instance herzustellen. Verwenden Sie dann das Schlüsselwort „error“ oder „failure“, um in den folgenden Protokollen nach detaillierten Fehler- oder Ausfallmeldungen zu suchen:
/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
Führen Sie den folgenden Befehl aus, um Vorkommen der Wörter „error“ oder „failure“ in der Datei /var/log/cfn- oder /var/log/cloud-init zu analysieren:
grep -ni 'error\|failure' $(sudo find /var/log -name cfn\* -or -name cloud-init\*)
Hinweis: Der vorherige Befehl gibt den Dateinamen, die Zeilennummer und die Fehlermeldung zurück.
Der Wert der Timeout-Eigenschaft für das Attribut creationPolicy ist zu niedrig
Der Wert der Eigenschaft timeout wird durch das Attribut CreationPolicy definiert. Stellen Sie sicher, dass der Wert hoch genug ist, um Aufgaben auszuführen, bevor das Skript cfn-signal Signale an CloudFormation-Ressourcen sendet.
Gehen Sie wie folgt vor, um den Eigenschaftswert timeout zu überprüfen und die Zeitstempel für Signalisierung und Ressourcenausfall zu vergleichen:
-
Öffnen Sie in einem Code-Editor die CloudFormation-Vorlage für Ihren Stack, um den Eigenschaftswert Timeout zu ermitteln.
**Hinweis:**Der Eigenschaftswert timeout ist die maximale Zeit, die CloudFormation auf ein Signal wartet, bevor es einen Fehler zurückgibt. -
Um eine Schätzung darüber zu erhalten, wann das Skript cfn-signal aktiviert wurde, verwenden Sie SSH, um eine Verbindung zur Instance herzustellen. Führen Sie dann den folgenden Befehl aus:
less /var/log/cfn-init.log
Die Protokolldatei zeigt einen Zeitstempel, wenn das Signal SUCCESS an die CloudFormation-Ressourcen gesendet wird.
Beispiel:2019-01-11 12:46:40,101 [DEBUG] Signaling resource EC2Instance in stack XXXX with unique ID i-045a536a3dfc8ccad and status SUCCESS
-
Öffnen Sie die CloudFormation-Konsole.
-
Wählen Sie die Ansicht Ereignisse aus.
-
Wählen Sie Statusgrund aus. Erweitern Sie unter Statusgrund die Zeile für das Ereignis mit dem Statusgrund „Innerhalb der angegebenen Dauer konnten keine X-Ressourcensignale empfangen werden“.
-
Vergleichen Sie den Zeitstempel der Signalisierung mit dem Zeitstempel für den Ressourcenausfall.
Hinweis: Für einen erfolgreichen Abschluss muss das Skript das Signal senden, bevor die Instance erstellt wird oder nicht erstellt werden kann.
Das CFN-Signal wird nicht von der Instance gesendet
Stellen Sie sicher, dass das Signal, das CloudFormation empfangen hat, von der Instance stammt. Prüfen Sie das Protokoll cfn wire, das unter /var/log/cfn-wire.log verfügbar ist. Wenn die Antwort nicht 200 ist, liegt möglicherweise ein Verbindungsproblem zwischen Ihrer Instance und dem Endpunkt von CloudFormation vor.
Wenn Sie Signale von einem Ort senden, der nicht Ihre Instance ist, verwenden Sie die SignalResource-API. Sie können beispielsweise eine AWS Lambda-Funktion verwenden, um die SignalResource API aufzurufen und das Signal dann an den Stack zu senden. Wenn Sie eine Fehlermeldung erhalten, verwenden Sie CloudWatch-Protokolle, um Ihre Lambda-Protokolle zu überprüfen, um zu verstehen, warum das Signal nicht an den Stack gesendet wurde.
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor einem Jahr
- AWS OFFICIALAktualisiert vor 3 Jahren