Erstellen Sie eine benutzerdefinierte Bereitstellungslogik mit benutzerdefinierten Ressourcen - 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 Sie eine benutzerdefinierte Bereitstellungslogik mit benutzerdefinierten Ressourcen

Benutzerdefinierte Ressourcen bieten Ihnen die Möglichkeit, benutzerdefinierte Bereitstellungslogik in Ihre CloudFormation Vorlagen zu schreiben und sie jedes Mal CloudFormation auszuführen, wenn Sie einen Stack erstellen, aktualisieren (falls Sie die benutzerdefinierte Ressource geändert haben) oder löschen. Dies kann nützlich sein, wenn Ihre Bereitstellungsanforderungen komplexe Logiken oder Workflows beinhalten, die mit CloudFormation den integrierten Ressourcentypen nicht ausgedrückt werden können.

Beispielsweise möchten Sie möglicherweise Ressourcen einbeziehen, die nicht als CloudFormation Ressourcentypen verfügbar sind. Sie können diese Ressourcen mithilfe von benutzerdefinierten Ressourcen einschließen. Auf diese Weise können Sie immer noch alle Ihre zugehörigen Ressourcen in einem einzigen Stapel verwalten.

Um eine benutzerdefinierte Ressource in Ihrer CloudFormation Vorlage zu definieren, verwenden Sie den Custom::MyCustomResourceTypeNameRessourcentyp AWS::CloudFormation::CustomResourceoder. Benutzerdefinierte Ressourcen benötigen eine Eigenschaft, das Service-Token, das angibt, wohin Anfragen CloudFormation gesendet werden, z. B. ein Amazon SNS SNS-Thema oder eine Lambda-Funktion.

In den folgenden Themen finden Sie Informationen über die Verwendung von benutzerdefinierten Ressourcen.

Anmerkung

Die CloudFormation Registrierung und die benutzerdefinierten Ressourcen bieten jeweils ihre eigenen Vorteile. Benutzerdefinierte Ressourcen bieten die folgenden Vorteile:

  • Sie brauchen die Ressource nicht zu registrieren.

  • Sie können eine ganze Ressource als Teil einer Vorlage einfügen, ohne sich zu registrieren.

  • Unterstützt die Operationen,Create,Update und Delete .

Zu den Vorteilen, die registrierungsbasierte Ressourcen bieten, gehören die folgenden:

  • Unterstützt die Modellierung, Provisionierung und Verwaltung von Anwendungsressourcen von Drittanbietern

  • Unterstützt die Vorgänge Create, Read, Update, Delete und List (CRUDL)

  • Unterstützt die Drifterkennung für Ressourcentypen privater und Drittanbieter

Im Gegensatz zu benutzerdefinierten Ressourcen müssen registrierungsbasierte Ressourcen kein Amazon SNS-Thema oder Lambda-Funktion zur Durchführung von CRUDL-Vorgängen verknüpfen. Weitere Informationen finden Sie unter Verwaltung von Erweiterungen mit der CloudFormation-Registrierung.

So funktionieren benutzerdefinierte Ressourcen

Der allgemeine Prozess zur Einrichtung einer neuen benutzerdefinierten Ressource umfasst die folgenden Schritte. An diesen Schritten sind zwei Rollen beteiligt: der Anbieter einer benutzerdefinierten Ressource der die benutzerdefinierte Ressource besitzt und der Vorlagenentwickler der eine Vorlage erstellt, die einen benutzerdefinierten Ressourcentyp enthält. Dies kann dieselbe Person sein, aber wenn nicht, sollte der Anbieter der benutzerdefinierten Ressourcen mit dem Entwickler der Vorlage zusammenarbeiten.

  1. Der Anbieter für benutzerdefinierte Ressourcen schreibt eine Logik, die bestimmt, wie Anfragen von der benutzerdefinierten Ressource behandelt CloudFormation und Aktionen für diese ausgeführt werden.

  2. Der benutzerdefinierte Ressourcenanbieter erstellt das Amazon SNS SNS-Thema oder die Lambda-Funktion, an die Anfragen gesendet CloudFormation werden können. Das Amazon SNS-Thema oder die Lambda-Funktion muss sich in der gleichen Region befinden, in der der Stack erstellt wird.

  3. Der benutzerdefinierte Ressourcenanbieter übergibt den Amazon SNS-Topic-ARN oder Lambda-Funktions-ARN an den Vorlagenentwickler.

  4. Der Vorlagenentwickler definiert die benutzerdefinierte Ressource in seiner CloudFormation Vorlage. Dazu gehören ein Service-Token und alle Eingabedatenparameter. Das Service-Token und die Struktur der Eingabedaten werden von dem benutzerdefinierten Ressourcenanbieter definiert. Das Service-Token gibt den Amazon SNS-Topic-ARN oder Lambda-Funktions-ARN an und ist immer erforderlich, aber die Eingabedaten sind je nach benutzerdefinierter Ressource optional.

Wenn nun jemand die Vorlage verwendet, um die benutzerdefinierte Ressource zu erstellen, zu aktualisieren oder zu löschen, CloudFormation sendet er eine Anfrage an das angegebene Service-Token und wartet dann auf eine Antwort, bevor er mit dem Stack-Vorgang fortfährt.

Im Folgenden ist der Ablauf für die Erstellung eines Stapels aus der Vorlage zusammengefasst:

  1. CloudFormation sendet eine Anfrage an das angegebene Service-Token. Die Anfrage enthält Informationen wie den Anfragetyp und eine vorsignierte Amazon S3 S3-Bucket-URL, an die die benutzerdefinierte Ressource Antworten sendet. Weitere Informationen zu den in der Anforderung enthaltenen Informationen finden Sie unter CloudFormation Referenz für benutzerdefinierte Ressourcenanfragen und Antworten.

    Die folgenden Beispieldaten zeigen, was in einer Create Anfrage CloudFormation enthalten ist. In diesem Beispiel ResourceProperties können CloudFormation Sie eine benutzerdefinierte Nutzlast erstellen, die an die Lambda-Funktion gesendet werden soll.

    { "RequestType" : "Create", "ResponseURL" : "http://pre-signed-S3-url-for-response", "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10", "RequestId" : "unique id for this create request", "ResourceType" : "Custom::TestResource", "LogicalResourceId" : "MyTestResource", "ResourceProperties" : { "Name" : "Value", "List" : [ "1", "2", "3" ] } }
  2. Der benutzerdefinierte Ressourcenanbieter verarbeitet die CloudFormation Anfrage und gibt eine Antwort von SUCCESS oder FAILED an die vorsignierte URL zurück. Der custom resource provider gibt die Antwort in einer JSON-formatierten Datei zurück und lädt diese zu der vorsignierten S3-URL hoch. Weitere Informationen finden Sie unter Hochladen von Objekten mit Vorsignierung URLs im Amazon Simple Storage Service-Benutzerhandbuch.

    Der custom resource provider kann in der Antwort auch Name-Wert-Paare angeben, auf die der template developer zugreifen kann. Die Antwort kann beispielsweise Ausgabedaten enthalten, wenn die Anforderung erfolgreich war, oder eine Fehlermeldung, wenn die Anforderung fehlgeschlagen ist. Weitere Informationen zu Antworten finden Sie unter CloudFormation Referenz für benutzerdefinierte Ressourcenanfragen und Antworten.

    Wichtig

    Wenn die Namen-Wert-Paare vertrauliche Informationen enthalten, sollten Sie das NoEcho-Feld benutzen, um die Ausgabe der benutzerdefinierten Ressource zu maskieren. Andernfalls sind die Werte durch die Eigenschaftswerte APIs dieser Oberfläche sichtbar (z. B.DescribeStackEvents).

    Weitere Informationen über die Verwendung von NoEcho zur Maskierung sensibler Informationen finden Sie in der bewährten Methode Keine Anmeldeinformationen in Vorlagen einbetten .

    Der custom resource provider ist für das Erkennen und Beantworten der Anforderung verantwortlich. Bei Amazon SNS SNS-Benachrichtigungen muss der Anbieter benutzerdefinierter Ressourcen beispielsweise Benachrichtigungen abhören und beantworten, die an einen bestimmten Themen-ARN gesendet werden. CloudFormation wartet und wartet auf eine Antwort an der Stelle mit der vorab signierten URL.

    In den folgenden Beispieldaten wird gezeigt, was eine benutzerdefinierte Ressourcen in eine Antwort einschließen kann:

    { "Status" : "SUCCESS", "PhysicalResourceId" : "TestResource1", "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10", "RequestId" : "unique id for this create request", "LogicalResourceId" : "MyTestResource", "Data" : { "OutputName1" : "Value1", "OutputName2" : "Value2", } }
  3. Nachdem Sie eine SUCCESS Antwort erhalten haben, wird mit dem CloudFormation Stack-Vorgang fortgefahren. Wenn keine FAILED-Antwort oder gar keine Antwort zurückgegeben wird, schlägt der Vorgang fehl. Alle Ausgabedaten von der benutzerdefinierten Ressource werden am Speicherort der vorsignierten URL gespeichert. Der Vorlagenentwickler kann diese Daten mithilfe der GetAtt Funktion Fn:: abrufen.

Anmerkung

Wenn Sie verwenden AWS PrivateLink, müssen benutzerdefinierte Ressourcen in der VPC Zugriff auf CloudFormation -spezifische S3-Buckets haben. Benutzerdefinierte Ressourcen müssen Antworten an eine vorsignierte Amazon S3-URL senden. Wenn sie keine Antworten an Amazon S3 senden können, erhalten sie CloudFormation keine Antwort und der Stack-Vorgang schlägt fehl. Weitere Informationen finden Sie unter Zugriff CloudFormation über einen Schnittstellenendpunkt (AWS PrivateLink).

Zeitüberschreitung bei der Antwort

Der Standard-Timeout für Ihre benutzerdefinierte Ressource beträgt 3600 Sekunden (1 Stunde). Wenn während dieser Zeit keine Antwort empfangen wird, schlägt der Stapelvorgang fehl.

Sie können den Timeout-Wert anpassen, je nachdem, wie lange die Antwort von der benutzerdefinierten Ressource voraussichtlich dauern wird. Wenn Sie beispielsweise eine benutzerdefinierte Ressource bereitstellen, die eine Lambda-Funktion aufruft, von der erwartet wird, dass sie innerhalb von fünf Minuten antwortet, können Sie in der Stack-Vorlage eine Zeitüberschreitung von fünf Minuten festlegen, indem Sie die Eigenschaft ServiceTimeout angeben. Weitere Informationen finden Sie unter CloudFormation Referenz für benutzerdefinierte Ressourcenanfragen und Antworten. Auf diese Weise schlägt der Stack-Vorgang nach fünf Minuten fehl, wenn in der Lambda-Funktion ein Fehler auftritt, der dazu führt, dass sie hängen bleibt, CloudFormation anstatt die ganze Stunde zu warten.

Achten Sie jedoch darauf, den Timeout-Wert nicht zu niedrig anzusetzen. Um unerwartete Timeouts zu vermeiden, stellen Sie sicher, dass Ihre benutzerdefinierte Ressource genügend Zeit hat, um die erforderlichen Aktionen durchzuführen und eine Antwort zurückzugeben.