Direkt zum Inhalt

Wie behebe ich den Fehler „X-Ressourcensignal (e) konnten innerhalb der angegebenen Dauer nicht empfangen werden“ in AWS CloudFormation?

Lesedauer: 5 Minute
0

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, einer Auto-Scaling-Gruppe oder einer AWS::CloudFormation::WaitCondition auftreten.

Hinweis: Die folgende Behebung gilt nur für CloudFormation-Stacks, die du mit Linux-Instances erstellst. 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?

Lösung

Verwende je nach Anwendungsfall die folgenden Schritte zur Fehlerbehebung, um das Problem zu lösen.

Hinweis: Um ein Stack-Rollback zu verhindern, wähle in der CloudFormation-Konsole die Option Erfolgreich bereitgestellte Ressourcen beibehalten für Stackfehler-Optionen. Diese Option bedeutet, dass es kein Fehler-Rollback gibt und die Instance erst beendet wird, wenn du den Stack löschst.

Das Skript cfn-signal ist nicht auf der Instance des CloudFormation-Stacks installiert

Gehe 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:

  1. Verwende SSH, um eine Verbindung zu der Linux-Instance herzustellen.
  2. Verwende eines der folgenden Skripte, um zu bestätigen, dass das Skript cfn-signal installiert ist.
    Führe den folgenden Befehl aus, um zu überprüfen, ob sich das cfn-signal-Skript in dem 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-bootstrapaws-cfn-bootstrap-1.4-30.amzn2.noarch
    Wichtig: Der obige Befehl funktioniert nur auf Distributionen, die den RPM Package Manager (RPM, RPM-Paketmanager) verwenden. Weitere Informationen zum RPM-Paketmanager findest du in Kapitel 1. Einführung in den RPM auf der Red Hat-Website. Standardmäßig sind CloudFormation-Hilfsskripte auf Amazon Linux Amazon Machine Images (AMIs) installiert. Informationen zur Installation der Hilfsskripte findest du in der Referenz zu CloudFormation-Hilfsskripten.

Die CloudFormation-Vorlage enthält Syntaxfehler oder falsche Werte

Gehe wie folgt vor, um die Fehler und falschen Werte zu finden:

  1. Öffnen Sie in einem Code-Editor die Vorlage für Ihren Stack. Suchen Sie dann den Eigenschaftenabschnitt UserData.
  2. Suchen Sie nach Syntaxfehlern, fehlenden Leerzeichen, Rechtschreibfehlern und anderen Tippfehlern.
  3. Vergewissern Sie sich, dass die Werte für die Eigenschaften Stack, Ressource und AWS-Region korrekt sind.
    Hinweis: Überprüfe das Bootstrap-Skript, das in der Eigenschaft UserData enthalten ist. Das Script ruft cfn-signal auf. Prüfe, ob Syntaxfehler oder falsche Werte vorliegen.

Wenn du innerhalb der Befehle cfn-init signalisierst, suche in den Protokollen cfn-init nach Informationen über das Signal. Um in den Protokollen cloud-init oder cfn-init nach Fehlern zu suchen, verwende SSH, um eine Verbindung zu der Instance herzustellen. Verwende 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ühre 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

Das CreationPolicy-Attribut definiert den Wet der Eigenschaft Timeout. Stelle 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:

  1. Ö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.
  2. 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.
  3. Öffne die CloudFormation-Konsole.
  4. Wähle die Ansicht Ereignisse.
  5. Wähle Statusgrund. Erweitere unter „Statusgrund“ die Zeile für das Ereignis mit dem Statusgrund „Innerhalb der angegebenen Dauer konnten keine X-Ressourcensignale empfangen werden.“
  6. Vergleiche den Zeitstempel für das Signal 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

Stelle sicher, dass das Signal, das CloudFormation empfangen hat, von der Instance stammt. Prüfe 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 der Instance und dem Endpunkt von CloudFormation vor.

Wenn du Signale von einem Ort sendest, der nicht die Instance ist, verwende die SignalResource-API. Du kannst beispielsweise eine AWS Lambda-Funktion verwendest, um die SignalResource API aufzurufen und das Signal dann an den Stack zu senden. Wenn du eine Fehlermeldung erhältst, verwende CloudWatch-Protokolle, um die Lambda-Protokolle zu überprüfen, um zu verstehen, warum das Signal nicht an den Stack gesendet wurde.

AWS OFFICIALAktualisiert vor 7 Monaten