Erstellen von Wartebedingungen in einer Vorlage - AWS CloudFormation

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Erstellen von Wartebedingungen in einer Vorlage

Wichtig

Für Amazon EC2- und Auto Scaling-Ressourcen empfehlen wir die Verwendung eines CreationPolicy Attributs anstelle von Wartebedingungen. Fügen Sie diesen Ressourcen ein CreationPolicy Attribut hinzu und verwenden Sie das Hilfsskript cfn-signal, um zu signalisieren, wann ein Instance-Erstellungsprozess erfolgreich abgeschlossen wurde.

Weitere Informationen finden Sie unter CreationPolicy Attribut oder Bereitstellen von Anwendungen auf Amazon EC2 mit AWS CloudFormation.

Mit der AWS::CloudFormation::WaitConditionHandle-Ressource und dem CreationPolicy Attribut-Attribut können Sie die folgenden Aufgaben ausführen:

  • Koordinieren der Erstellung von Stack-Ressourcen mit anderen Konfigurationsaktionen, die sich zur Stack-Erstellung extern verhalten

  • Verfolgen des Status eines Konfigurationsvorgangs

Sie können z. B. die Erstellung einer anderen Ressource beginnen, nachdem eine Anwendungskonfiguration teilweise abgeschlossen ist, oder während eines Installations- und Konfigurationsvorgangs Signale senden, um dessen Fortschritt zu überwachen.

Verwenden eines Wartebedingungs-Handles

Anmerkung

Wenn Sie die VPC-Endpunktfunktion verwenden, müssen Ressourcen in der VPC, die auf Wartebedingungen reagieren, Zugriff auf AWS CloudFormation-spezifische Amazon Simple Storage Service (Amazon S3)-Buckets haben. Ressourcen müssen Wartebedingungs-Antworten an eine vorsignierte Amazon-S3-URL senden. Wenn sie keine Antworten an Amazon S3 senden können, empfängt AWS CloudFormation keine Antwort und der Stack-Vorgang schlägt fehl. Weitere Informationen finden Sie unter Einrichten von VPC-Endpunkten für AWS CloudFormation und Beispiel-Bucket-Richtlinien für VPC-Endpunkte für Amazon S3.

Sie können die Wartebedingung und den Wartebedingungs-Handle verwenden, um die Erstellung eines Stacks AWS CloudFormation anzuhalten und auf ein Signal zu warten, bevor der Stack weiter erstellt wird. Sie können beispielsweise Anwendungen auf eine Amazon EC2-Instance herunterladen und konfigurieren, bevor die Erstellung der Amazon EC2-Instance als abgeschlossen betrachtet wird.

Die folgende Liste enthält eine Zusammenfassung der Funktionsweise einer Wartebedingung mit einem Wartebedingungs-Handle:

  • AWS CloudFormation erstellt eine Wartebedingung wie jede andere Ressource. Wenn eine Wartebedingung AWS CloudFormation erstellt, meldet es den Status der Wartebedingung als CREATE_IN_PROGRESS und wartet, bis es die erforderliche Anzahl Erfolgssignale erhält oder der Timeout-Zeitraum der Wartebedingung abgelaufen ist. Wenn die erforderliche Anzahl Erfolgssignale AWS CloudFormation erhält, bevor der Timeout-Zeitraum abgelaufen ist, wird die Stack-Erstellung fortgesetzt. Andernfalls wird der Status der Wartebedingung auf gesetzt CREATE_FAILED und der Stack wird zurückgesetzt.

  • Die -TimeoutEigenschaft bestimmt, wie lange auf die erforderliche Anzahl von Erfolgssignalen AWS CloudFormation wartet. Timeout ist eine minimal gebundene Eigenschaft, d. h. das Timeout tritt frühestens zu dem von Ihnen angegebenen Zeitpunkt auf, kann aber kurz danach auftreten. Die maximale Zeit, die Sie angeben können, ist 43200 Sekunden (12 Stunden).

  • In der Regel sollte eine Wartebedingung sofort nach der Erstellung einer bestimmten Ressource beginnen, z. B. einer Amazon EC2-Instance, einer RDS DB-Instance oder einer Auto-Scaling-Gruppe. Dazu fügen Sie das Attribut DependsOn einer Wartebedingung hinzu. Wenn Sie ein DependsOn-Attribut einer Wartebedingung hinzufügen, geben Sie an, dass die Wartebedingung erst erstellt wird, nachdem die Erstellung einer bestimmten Ressource abgeschlossen ist. Wenn die Wartebedingung erstellt wird, AWS CloudFormation beginnt mit dem Timeout-Zeitraum und wartet auf Erfolgssignale.

  • Das Attribut DependsOn können Sie auch für andere Ressourcen verwenden. Beispiel: Sie möchten zunächst eine Amazon-RDS-DB-Instance erstellen und darauf eine Datenbank konfigurieren, bevor Sie die EC2-Instances erstellen, die die betreffende Datenbank verwenden. In diesem Fall erstellen Sie eine Wartebedingung mit einem DependsOn-Attribut, das die DB-Instance angibt. Dann erstellen Sie EC2-Instance-Ressourcen mit DependsOn-Attributen, die die Wartebedingung angeben. Dies würde sicherstellen, dass die EC2-Instances erst unmittelbar nach Abschluss der DB-Instance und der Wartebedingung erstellt werden.

  • AWS CloudFormation muss eine bestimmte Anzahl von Erfolgssignalen für eine Wartebedingung erhalten, bevor der Status dieser Wartebedingung so festgelegt wird, dass die Stack-Erstellung CREATE_COMPLETE fortgesetzt wird. Die Eigenschaft Count der Wartebedingung gibt die Anzahl der Erfolgssignale an. Wenn keine festgelegt ist, ist der Standardwert 1.

  • Eine Wartebedingung erfordert ein Wartebedingungs-Handle zum Einrichten einer vorsignierten URL, die als Signalmechanismus verwendet wird. Mit der vorsignierten URL können Sie ein Signal senden, ohne Ihre AWS Anmeldeinformationen angeben zu müssen. Sie verwenden diese vorsignierte URL, um Erfolg oder Misserfolg anzugeben. Sie ist in einer JSON-Anweisung verkapselt. Informationen zum Format der JSON-Anweisung finden Sie unter JSON-Format des Signals einer Wartebedingung.

  • Wenn eine Wartebedingung die erforderliche Anzahl Erfolgssignale (wie in der Count-Eigenschaft definiert) erhält, bevor der Timeout-Zeitraum abläuft, AWS CloudFormation markiert die Wartebedingung als CREATE_COMPLETE und setzt die Stack-Erstellung fort. Andernfalls AWS CloudFormation schlägt die Wartebedingung fehl und setzt den Stack zurück (z. B. wenn der Timeout-Zeitraum ohne die erforderlichen Erfolgssignale abläuft oder wenn ein Fehlersignal empfangen wird).

So verwenden Sie eine Wartebedingung in einem Stack:
  1. Deklarieren Sie eine AWS::CloudFormation::WaitConditionHandle-Ressource in der Vorlage des Stacks. Ein Wartebedingungs-Handle hat keine Eigenschaften. Ein Verweis auf eine WaitConditionHandle-Ressource wird jedoch zu einer vorsignierten URL aufgelöst, mit deren Hilfe Sie der WaitCondition den Erfolg oder Fehler signalisieren können. Beispielsweise:

    "myWaitHandle" : { "Type" : "AWS::CloudFormation::WaitConditionHandle", "Properties" : { } }
  2. Deklarieren Sie eine AWS::CloudFormation::WaitCondition-Ressource in der Vorlage des Stacks. Eine WaitCondition-Ressource verfügt über zwei erforderliche Eigenschaften: Handle ist ein Verweis auf ein in der Vorlage deklariertes WaitConditionHandle und Timeout die Anzahl Sekunden, die AWS CloudFormation warten muss. Sie können optional die -CountEigenschaft festlegen, die die Anzahl der Erfolgssignale bestimmt, die die Wartebedingung erhalten muss, bevor die Stack-Erstellung fortsetzen AWS CloudFormation kann.

    Um zu steuern, wann die Wartebedingung ausgelöst wird, legen Sie ein DependsOn-Attribut für die Wartebedingung fest. Eine DependsOn-Klausel ordnet eine Ressource der Wartebedingung zu. Nachdem AWS CloudFormation die Ressource DependsOn erstellt hat, wird jede weitere Erstellung von Stack-Ressourcen blockiert, bis eines der folgenden Ereignisse eintritt: a) der Timeout-Zeitraum läuft ab, b) die erforderliche Anzahl Erfolgssignale wird empfangen, c) ein Fehlersignal wird empfangen.

    Hier folgt ein Beispiel für eine Wartebedingung, die nach der erfolgreichen Erstellung der Ressource Ec2Instance beginnt, die Ressource myWaitHandle als WaitConditionHandle verwendet, ein Timeout von 4 500 Sekunden und den Standardwert 1 für Count aufweist (da keine Count-Eigenschaft angegeben ist):

    "myWaitCondition" : { "Type" : "AWS::CloudFormation::WaitCondition", "DependsOn" : "Ec2Instance", "Properties" : { "Handle" : { "Ref" : "myWaitHandle" }, "Timeout" : "4500" } }
  3. Rufen Sie die vorsignierte URL ab, die für Signale verwendet werden soll.

    In der Vorlage kann die vorsignierte URL abgerufen werden, indem der logische Name der Ressource AWS::CloudFormation::WaitConditionHandle an die intrinsische Ref-Funktion übergeben wird. Sie können beispielsweise mithilfe der Eigenschaft UserData von AWS::EC2::Instance-Ressourcen die vorsignierte URL an die Amazon-EC2-Instances übergeben, damit die Skripts oder Anwendungen, die auf diesen Instances ausgeführt werden, den Erfolg oder Fehler an AWS CloudFormationsignalisieren können:

    "UserData" : { "Fn::Base64" : { "Fn::Join" : [ "", ["SignalURL=", { "Ref" : "myWaitHandle" } ] ] } }

    Hinweis: In der AWS Management Console oder den AWS CloudFormation Befehlszeilen-Tools wird die vorsignierte URL als physische ID der Wartebedingungs-Handle-Ressource angezeigt.

  4. Wählen Sie eine Methode aus, mit der erkannt wird, wann für den Stack die Wartebedingung beginnt.

    Wenn Sie den Stack mit aktivierten Benachrichtigungen erstellen, AWS CloudFormation veröffentlicht eine Benachrichtigung für jedes Stack-Ereignis für das angegebene Thema. Wenn Sie oder Ihre Anwendung dieses Thema abonnieren, können Sie die Benachrichtigungen für das Wartebedingungs-Handle-Erstellungsereignis überwachen und die vorsignierte URL aus der Benachrichtigungsnachricht abrufen.

    Sie können die Ereignisse des Stacks auch mithilfe der AWS Management Console, der AWS CloudFormation Befehlszeilen-Tools oder der AWS CloudFormation API überwachen.

  5. Verwenden Sie die vorsignierte URL, um Erfolg oder Fehler anzugeben.

    Um ein Signal zu senden, senden Sie eine HTTP-Anforderungsnachricht mithilfe der vorsignierten URL. Die Anforderungsmethode muss PUT und der Header Content-Type muss eine leere Zeichenfolge oder nicht angegeben sein. Die Anforderungsnachricht muss eine JSON-Struktur der Form aufweisen, die in JSON-Format des Signals einer Wartebedingung angegeben ist.

    Sie müssen die Anzahl der Erfolgssignale senden, die von der -CountEigenschaft angegeben werden AWS CloudFormation , damit die Stack-Erstellung fortsetzen kann. Wenn Count größer als 1 ist, muss der Wert UniqueId für alle Signale, die an eine bestimmte Wartebedingung gesendet werden, jeweils eindeutig sein. Die UniqueId ist eine beliebige alphanumerische Zeichenfolge.

    Ein curl-Befehl ist eine Möglichkeit zum Senden eines Signals. Das folgende Beispiel zeigt eine curl-Befehlszeile, die einer Wartebedingung den Erfolg signalisiert.

    $ curl -T /tmp/a \ "https://cloudformation-waitcondition-test.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-2%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"

    wobei die Datei /tmp/a die folgenden JSON-Struktur enthält:

    { "Status" : "SUCCESS", "Reason" : "Configuration Complete", "UniqueId" : "ID1234", "Data" : "Application has completed configuration." }

    Das folgende Beispiel zeigt eine curl-Befehlszeile, die dasselbe Erfolgssignal sendet, wobei aber die JSON-Struktur als Parameter in der Befehlszeile gesendet wird.

    $ curl -X PUT \ -H 'Content-Type:' --data-binary '{"Status" : "SUCCESS","Reason" : "Configuration Complete","UniqueId" : "ID1234","Data" : "Application has completed configuration."}' \ "https://cloudformation-waitcondition-test.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-2%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"

JSON-Format des Signals einer Wartebedingung

Wenn Sie ein Signal an eine Wartebedingung senden, müssen Sie das folgenden JSON-Format verwenden:

{ "Status" : "StatusValue", "UniqueId" : "Some UniqueId", "Data" : "Some Data", "Reason" : "Some Reason" }

Wobei gilt:

StatusValue muss einer der folgenden Werte sein:

  • SUCCESS gibt ein Erfolgssignal an.

  • FAILURE gibt ein Fehlersignal an und löst eine fehlgeschlagene Wartebedingung und das Rollback des Stacks aus.

UniqueId identifiziert das Signal an AWS CloudFormation. Wenn die -CountEigenschaft der Wartebedingung größer als 1 ist, muss der UniqueId Wert für alle Signale, die für eine bestimmte Wartebedingung gesendet werdenUniqueId, eindeutig sein. Andernfalls AWS CloudFormation betrachtet das Signal als erneute Übertragung des zuvor gesendeten Signals mit demselben und ignoriert das Signal.

Data enthält Informationen, die Sie zusammen mit dem Signal senden möchten. Auf den Data Wert kann zugegriffen werden, indem die -Fn::GetAtt Funktion innerhalb der Vorlage aufgerufen wird. Wenn Sie beispielsweise den folgenden Ausgabewert für die Wartebedingung erstellenmywaitcondition, können Sie den aws cloudformation describe-stacks Befehl, die DescribeStacks API-Operation oder die Registerkarte Outputs der AWS CloudFormation Konsole verwenden, um die von gültigen Signalen Data gesendeten anzuzeigen AWS CloudFormation:

"WaitConditionData" : { "Value" : { "Fn::GetAtt" : [ "mywaitcondition", "Data" ]}, "Description" : "The data passed back as part of signalling the WaitCondition" },

Die Fn::GetAtt Funktion gibt die UniqueId und Data als Name-Wert-Paar innerhalb einer JSON-Struktur zurück. Das folgende Beispiel zeigt ein Data-Attribut, das vom oben definierten Ausgabewert WaitConditionData zurückgegeben wird:

{"Signal1":"Application has completed configuration."}

Reason ist eine Zeichenfolge mit keinen anderen Einschränkungen für den Inhalt als der Übereinstimmung mit JSON.