Wie behebe ich Probleme beim Einbeziehen von Metadaten auf einer EC2-Instance in CloudFormation?

Zuletzt aktualisiert: 12.04.2022

Ich habe AWS::CloudFormation::Init verwendet, um Metadaten in eine Instance von Amazon Elastic Cloud Compute (Amazon EC2) aufzunehmen, aber ich sehe keine Änderungen in der Instance.

Kurzbeschreibung

Probleme mit EC2-Instance-Metadaten in einem AWS CloudFormation-Stack können aus folgenden Gründen auftreten:

  • Das cfn-init-Hilfsskript ist nicht auf einer oder mehreren Instances des CloudFormation-Stacks installiert. Um dieses Problem zu beheben, führen Sie die Schritte im Abschnitt Überprüfen, ob das cfn-init-Hilfsskript installiert ist aus.
  • Die Instance ist nicht mit dem Internet verbunden. Um dieses Problem zu beheben, führen Sie die Schritte im Abschnitt Überprüfen, ob die Instance mit dem Internet verbunden ist aus.
  • Die CloudFormation-Vorlage enthält Syntaxfehler oder falsche Werte. Um dieses Problem zu beheben, führen Sie die Schritte im Abschnitt Suchen nach Fehlern in den cloud-init- oder cfn-init-Protokollen aus.

Wichtig: Bevor Sie die folgenden Auflösungen abschließen, setzen Sie die Option Rollback bei Ausfall für Ihren CloudFormation-Stack auf Nein.

Hinweis: Die folgenden Lösungen sind spezifisch für CloudFormation-Stacks, die mit Linux-Instances erstellt werden.

Lösung

Stellen Sie sicher, dass das cfn-init-Hilfsskript installiert ist

Um zu bestätigen, dass cfn-init auf der Instance installiert ist, die für das Senden von Signalen an CloudFormation-Ressourcen konfiguriert ist:

1.    Stellen Sie über SSH eine Verbindung zu der Instance her.

2.    Führen Sie einen der folgenden Befehle aus, um zu überprüfen, ob cfn-init oder das aws-cfn-bootstrap-Paket in Ihrem Verzeichnis installiert ist.

cfn-init:

$ sudo find / -name cfn-init
/opt/aws/bin/cfn-init
/opt/aws/apitools/cfn-init
/opt/aws/apitools/cfn-init-1.4-34.24.amzn1/bin/cfn-init
/var/lib/cfn-init

- oder -

aws-cfn-bootstrap-Paket:

$ sudo rpm -q aws-cfn-bootstrap
aws-cfn-bootstrap-1.4-34.24.amzn1.noarch

Wichtig: Der obige Befehl funktioniert nur bei Verteilungen, die den RPM-Package-Manager verwenden.

Hinweis: Standardmäßig sind CloudFormation-Hilfsskripte auf dem Amazon Linux Amazon Machine Image (AMI) installiert. Wenn CloudFormation-Hilfsskripte nicht installiert sind, finden Sie Anweisungen zur Installation in der Referenz zu CloudFormation-Hilfsskripten.

Stellen Sie sicher, dass die Instance mit dem Internet verbunden ist

Wenn sich die Instance in einer Amazon Virtual Private Cloud (Amazon VPC) befindet, kann eine Verbindung zum Internet wie folgt hergestellt werden:

  • Ein NAT-Gerät in einem privaten Subnetz
  • Ein Internet-Gateway in einem öffentlichen Subnetz

Um die Internetverbindung der Instance zu testen, greifen Sie auf eine öffentliche Webseite, wie AWS zu und führen Sie einen Curl-Befehl auf der Instance aus. Zum Beispiel:

curl -I https://aws.amazon.com

Hinweis: Wenn die Instance mit dem Internet verbunden ist, gibt der Befehl einen HTTP-200-Statuscode zurück.

Wenn Sie einen Schnittstellen-VPC-Endpunkt verwenden, muss sich der Endpunkt in derselben AWS-Region wie die Instance befinden. Außerdem muss die Sicherheitsgruppe, die an den Schnittstellenendpunkt angeschlossen ist, eingehende Verbindungen auf Port 443 aus dem privaten Subnetz der Amazon VPC zulassen.

Suchen Sie in den cloud-Init- oder cfn-init-Protokollen nach Fehlern

So suchen Sie in den cloud-init-Protokollen oder cfn-init-Protokollen nach Fehlern:

1.    Stellen Sie über SSH die Verbindung zu Ihrer Instance her.

2.    Suchen Sie nach detaillierten Fehler- oder Ausfallmeldungen, indem Sie in den folgenden Protokollen nach den Schlüsselwörtern „Fehler“ oder „Ausfall“ suchen:

  • /var/log/cloud-init-output.log
  • /var/log/cloud-init.log
  • /var/log/cfn-init.log
  • /var/log/cfn-init-cmd.log

Um in allen Instances die Wörter „error“ (Fehler) oder „failure“ (Ausfall) in den Dateien /var/log/cfn oder /var/log/cloud-init zu analysieren, führen Sie den folgenden Befehl aus:

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

Hinweis: Der vorherige Befehl gibt den Dateinamen, die Zeilennummer und die Fehlermeldung zurück.

Suchen Sie nach cfn-init.log. Wenn Sie ihn nicht finden können, wurde cfn-init nicht ausgeführt. Sie müssen auch cloud-init-output.log und cloud-init.log überprüfen, um festzustellen, ob beim Ausführen von Benutzerdaten ein Fehler aufgetreten ist. Nachdem Sie den Fehler identifiziert haben, beheben Sie ihn anhand der Fehlermeldung und erstellen Sie dann den Stack neu.

Falls cfn-init.log existiert, wurde cfn-init ausgeführt, aber es ist ein Fehler aufgetreten. Überprüfen Sie cfn-init.log, um zu sehen, was schief gelaufen ist und beheben Sie es anhand der Fehlermeldung.

Führen Sie die folgenden Schritte aus, um zu bestätigen, dass die UserData-Eigenschaft für die Ausführung von cfn-init konfiguriert ist:

  1. Öffnen Sie in einem Code-Editor die AWS CloudFormation-Vorlage für Ihren Stack, und suchen Sie dann den Eigenschaftsabschnitt UserData.
  2. Suchen Sie nach Fehlern, einschließlich Syntaxfehlern, fehlenden Leerzeichen, Rechtschreibfehlern und anderen Tippfehlern.
  3. Vergewissern Sie sich, dass die Werte für die Eigenschaften der Stacks, Ressource und Region korrekt sind.
  4. Verwenden Sie für die intrinsische Funktion Fn::Join der UserData-Eigenschaft, die Option -v, um cfn-init im ausführlichen Modus auszuführen. Siehe JSON- und YAML-Beispielvorlagen.