Wartebedingungen in einer CloudFormation Vorlage erstellen - 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.

Wartebedingungen in einer CloudFormation Vorlage erstellen

In diesem Thema wird erklärt, wie Sie eine Wartebedingung in einer Vorlage erstellen, um die Erstellung von Stack-Ressourcen zu koordinieren oder den Fortschritt eines Konfigurationsprozesses zu verfolgen. 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.

Wenn ein Stack CloudFormation erstellt wird, der eine Wartebedingung enthält:

  • Es erstellt wie jede andere Ressource eine Wartebedingung und setzt den Status der Wartebedingung aufCREATE_IN_PROGRESS.

  • CloudFormation wartet, bis die erforderliche Anzahl von Erfolgssignalen empfangen wurde oder die Zeitüberschreitung der Wartebedingung abgelaufen ist.

  • Wenn es die erforderliche Anzahl von Erfolgssignalen empfängt, bevor der Timeout-Zeitraum abläuft:

    • Der Status des Wartezustands ändert sich zu CREATE_COMPLETE

    • Die Stack-Erstellung wird fortgesetzt

  • Wenn das Timeout abläuft oder ein Fehlersignal empfangen wird:

    • Der Status des Wartezustands ändert sich zu CREATE_FAILED

    • Der Stapel wird zurückgesetzt

Wichtig

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

Weitere Informationen finden Sie unter CreationPolicy Attribut oder Stellen Sie Anwendungen auf Amazon bereit EC2.

Anmerkung

Wenn Sie verwenden AWS PrivateLink, müssen Ressourcen in den, VPC die auf Wartebedingungen reagieren, Zugriff auf CloudFormation spezifische Amazon Simple Storage Service (Amazon S3) -Buckets haben. Ressourcen müssen Antworten auf Wartebedingungen an ein vorsigniertes Amazon S3 URL senden. Wenn sie keine Antworten an Amazon S3 senden können, empfängt CloudFormation keine Antwort und der Stack-Vorgang schlägt fehl. Weitere Informationen finden Sie unter Zugriff CloudFormation über einen Schnittstellenendpunkt (AWS PrivateLink) und Steuern des Zugriffs von VPC Endpunkten aus mit Bucket-Richtlinien.

Eine Wartebedingung in Ihrer Vorlage erstellen

1. Handle für Wartebedingungen

Sie beginnen mit der Definition eines AWS::CloudFormation::WaitConditionHandleRessource in der Vorlage des Stacks. Diese Ressource generiert das Vorzeichen, das für das Senden von Signalen URL benötigt wird. Auf diese Weise können Sie ein Signal senden, ohne Ihre AWS Anmeldeinformationen angeben zu müssen. Beispielsweise:

Resources: MyWaitHandle: Type: AWS::CloudFormation::WaitConditionHandle
2. Wartebedingung

Als Nächstes definieren Sie eine AWS::CloudFormation::WaitConditionRessource in der Vorlage des Stacks. Die Grundstruktur von a AWS::CloudFormation::WaitCondition sieht so aus:

MyWaitCondition: Type: AWS::CloudFormation::WaitCondition Properties: Handle: String Timeout: String Count: Integer

Die AWS::CloudFormation::WaitCondition Ressource hat zwei erforderliche Eigenschaften und eine optionale Eigenschaft.

  • Handle(erforderlich) — Ein Verweis auf eine in der Vorlage WaitConditionHandle deklarierte.

  • Timeout(erforderlich) — Die Anzahl der Sekunden, die benötigt werden CloudFormation, um auf den Empfang der erforderlichen Anzahl von Signalen zu warten. Timeoutist eine Eigenschaft, die an das Minimum gebunden ist. Das bedeutet, dass der Timeout frühestens zu dem von Ihnen angegebenen Zeitpunkt eintritt, aber auch kurz danach eintreten kann. Die maximale Zeit, die Sie angeben können, ist 43200 Sekunden (12 Stunden).

  • Count(optional) — Die Anzahl der Erfolgssignale, die empfangen CloudFormation werden müssen, bevor der Status dieser Wartebedingung auf gesetzt CREATE_COMPLETE und die Erstellung des Stacks fortgesetzt wird. Wenn nicht angegeben, ist der Standardwert 1.

In der Regel möchten Sie, dass eine Wartebedingung unmittelbar nach der Erstellung einer bestimmten Ressource beginnt. Sie tun dies, indem Sie den hinzufügen DependsOn Attribut einer Wartebedingung. Wenn Sie einer Wartebedingung ein DependsOn Attribut hinzufügen, CloudFormation erstellt zuerst die Ressource im DependsOn Attribut und dann die Wartebedingung.

Das folgende Beispiel zeigt eine Wartebedingung, die:

  • Beginnt nach der erfolgreichen Erstellung der MyEC2Instance Ressource

  • Verwendet die MyWaitHandle Ressource als WaitConditionHandle

  • Hat ein Timeout von 4500 Sekunden

  • Hat den Standardwert Count 1 (da keine Count Eigenschaft angegeben ist)

MyWaitCondition: Type: AWS::CloudFormation::WaitCondition DependsOn: MyEC2Instance Properties: Handle: !Ref MyWaitHandle Timeout: '4500'
3. Ein Signal senden

Um Erfolg oder Misserfolg zu signalisieren CloudFormation, führen Sie normalerweise Code oder ein Skript aus. Beispielsweise kann eine Anwendung, die auf einer EC2 Instanz ausgeführt wird, einige zusätzliche Konfigurationsaufgaben ausführen und dann ein Signal an senden, CloudFormation um den Abschluss anzuzeigen.

Das Signal muss an das vom Wartebedingungs-Handle URL generierte Vorzeichen gesendet werden. Sie verwenden dieses Vorzeichen, um Erfolg oder Misserfolg URL zu signalisieren.

Um ein Signal zu senden
  1. Um das URL in der Vorlage vorsignierte Objekt abzurufen, verwenden Sie die Ref systeminterne Funktion mit dem logischen Namen des Wartebedingungs-Handles.

    Wie im folgenden Beispiel gezeigt, kann Ihre Vorlage eine EC2 Amazon-Instance deklarieren und die vorsignierte Instance mithilfe der EC2 UserData Amazon-Eigenschaft URL an EC2 Instances übergeben. Auf diese Weise können Skripte oder Anwendungen, die auf diesen Instances ausgeführt werden, den Erfolg oder Misserfolg signalisieren. CloudFormation

    MyEC2Instance: Type: AWS::EC2::Instance Properties: InstanceType: t2.micro # Example instance type ImageId: ami-055e3d4f0bbeb5878 # Change this as needed (Amazon Linux 2023 in us-west-2) UserData: Fn::Base64: Fn::Join: - "" - - "SignalURL=" - { "Ref": "MyWaitHandle" }

    Dies führt zu einer UserData Ausgabe, die der folgenden ähnelt:

    SignalURL=https://amzn-s3-demo-bucket.s3.amazonaws.com/....

    Hinweis: In den Befehlszeilentools AWS Management Console und den Befehlszeilentools URL wird das Presigned als physische ID der Handle-Ressource für die Wartebedingung angezeigt.

  2. (Optional) Um zu erkennen, wann der Stack in den Wartezustand übergeht, können Sie eine der folgenden Methoden verwenden:

    • Wenn Sie den Stack mit aktivierten Benachrichtigungen erstellen, veröffentlicht CloudFormation 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 Ereignis zur Erstellung des Wartebedingungs-Handles überwachen und die URL aus der Benachrichtigung vorsignierte Nachricht abrufen.

    • Sie können die Ereignisse des Stacks auch mit dem AWS Management Console AWS CLI, dem oder einem SDK überwachen.

  3. Um ein Signal zu senden, senden Sie eine HTTP Anforderungsnachricht unter Verwendung des VorsigniertenURL. Die Anforderungsmethode muss PUT und der Header Content-Type muss eine leere Zeichenfolge oder nicht angegeben sein. Die Anforderungsnachricht muss eine JSON Struktur der in Syntax des Signals für Wartebedingungen angegebenen Form haben.

    Sie müssen die in der Count Eigenschaft angegebene Anzahl von Erfolgssignalen senden, um mit der Stack-Erstellung fortzufahren. CloudFormation 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://amzn-s3-demo-bucket.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-west-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 die folgende JSON Struktur /tmp/a enthält:

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

    Dieses Beispiel zeigt eine curl Befehlszeile, die dasselbe Erfolgssignal sendet, außer dass sie die JSON Struktur als Parameter an die Befehlszeile sendet.

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

Syntax des Signals für Wartebedingungen

Wenn Sie Signale an das durch die Wartebedingung URL generierte Handle senden, müssen Sie das folgende JSON Format verwenden:

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

Eigenschaften

Das Status Feld muss einen der folgenden Werte haben:

  • SUCCESS

  • FAILURE

Das UniqueId Feld identifiziert das Signal an CloudFormation. Wenn die Count Eigenschaft der Wartebedingung größer als 1 ist, muss der UniqueId Wert für alle Signale, die für eine bestimmte Wartebedingung gesendet wurden, eindeutig sein. Andernfalls CloudFormation wird das Signal als erneute Übertragung des zuvor gesendeten Signals mit derselben betrachtet UniqueId und ignoriert.

Das Data Feld kann alle Informationen enthalten, die Sie zusammen mit dem Signal zurücksenden möchten. Sie können auf den Data Wert zugreifen, indem Sie die GetAtt Funktion Fn:: innerhalb der Vorlage verwenden.

Das Reason Feld ist eine Zeichenfolge, deren Inhalt außer der JSON Konformität keine weiteren Einschränkungen aufweist.

Zugreifen auf Signaldaten

Um auf die von gültigen Signalen gesendeten Daten zuzugreifen, können Sie in Ihrer CloudFormation Vorlage einen Ausgabewert für die Wartebedingung erstellen. Beispielsweise:

Outputs: WaitConditionData: Description: The data passed back as part of signalling the WaitCondition Value: !GetAtt MyWaitCondition.Data

Sie können diese Daten dann mit dem Befehl anzeigen describe-stacksBefehl oder die Registerkarte Ausgaben der CloudFormation Konsole.

Die Fn::GetAtt Funktion gibt das UniqueId und Data als Name/Wert-Paar innerhalb einer JSON Struktur zurück. Beispielsweise:

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