

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.

# Amazon SNS-gestützte benutzerdefinierte Ressourcen
<a name="template-custom-resources-sns"></a>

Das folgende Thema zeigt Ihnen, wie Sie eine benutzerdefinierte Ressource mit einem Service-Token konfigurieren, das das Amazon SNS SNS-Thema angibt, CloudFormation an das Anfragen gesendet werden. Sie lernen auch die Abfolge von Ereignissen und Nachrichten kennen, die als Ergebnis der Erstellung, Aktualisierung und Löschung eines benutzerdefinierten Ressourcenstapels gesendet und empfangen werden.

Bei benutzerdefinierten Ressourcen und Amazon SNS können Sie Szenarien wie das Hinzufügen neuer Ressourcen zu einem Stack und das Einfügen dynamischer Daten in einen Stack ermöglichen. Wenn Sie beispielsweise einen Stack erstellen, CloudFormation können Sie eine `Create` Anfrage an ein Thema senden, das von einer Anwendung überwacht wird, die auf einer Amazon EC2 EC2-Instance ausgeführt wird. Die Amazon-SNS-Benachrichtigung löst aus, dass die Anwendung weitere Bereitstellungsaufgaben ausführt, z. B. das Abrufen eines Pools von erlaubten Elastic-IP-Adressen. Danach sendet die Anwendung eine Antwort (und alle Ausgabedaten), in der Sie aufgefordert werden, mit dem Stack-Vorgang CloudFormation fortzufahren.

Wenn Sie ein Amazon SNS SNS-Thema als Ziel einer benutzerdefinierten Ressource angeben, CloudFormation sendet bei Stack-Vorgängen, die die benutzerdefinierte Ressource betreffen, Nachrichten an das angegebene SNS-Thema. Um diese Nachrichten zu verarbeiten und die erforderlichen Aktionen durchzuführen, müssen Sie einen unterstützten Endpunkt bei dem SNS-Thema abonniert haben.

Eine Einführung in benutzerdefinierte Ressourcen und ihre Funktionsweise finden Sie unter [So funktionieren benutzerdefinierte Ressourcen](template-custom-resources.md#how-custom-resources-work). Informationen über Amazon SNS und dessen Funktionsweise finden Sie im [Amazon-Simple-Notification-Service-Entwicklerleitfaden](https://docs.aws.amazon.com/sns/latest/dg/).

## Verwendung von Amazon SNS zur Erstellung benutzerdefinierter Ressourcen
<a name="walkthrough-custom-resources-sns-adding-nonaws-resource"></a>

**Topics**
+ [Schritt 1: Erstellen des Stacks](#crpg-walkthrough-stack-creation)
+ [Schritt 2: Stack-Updates](#crpg-walkthrough-stack-updates)
+ [Schritt 3: Löschen des Stacks](#crpg-walkthrough-stack-deletion)

### Schritt 1: Erstellen des Stacks
<a name="crpg-walkthrough-stack-creation"></a>

1. <a name="crpg-walkthrough-stack-creation-customer-template"></a>Der Vorlagenentwickler erstellt einen CloudFormation Stack, der eine benutzerdefinierte Ressource enthält. 

   In der Vorlage unten verwenden wir den benutzerdefinierten Ressourcentyp `Custom::{{SeleniumTester}}` für die benutzerdefinierte Ressource mit der logischen ID `{{MySeleniumTest}}`. Benutzerdefinierte Ressourcentypnamen müssen alphanumerisch sein und können maximal 60 Zeichen enthalten. 

   Der benutzerdefinierte Ressourcentyp wird mit einem Diensttoken, optionalen anbieterspezifischen Eigenschaften und optionalen [Fn:: GetAtt](resources-section-structure.md#resource-properties-getatt) -Attributen deklariert, die vom benutzerdefinierten Ressourcenanbieter definiert werden. Diese Eigenschaften und Attribute können verwendet werden, um Informationen vom template developer an custom resource provider zu übergeben und umgekehrt. Das Service-Token gibt ein Amazon SNS-Thema an, das der Ressourcenanbieter konfiguriert hat.

   ```
   {
      "AWSTemplateFormatVersion" : "2010-09-09",
      "Resources" : {
         "{{MySeleniumTest}}" : {
            "Type": "Custom::{{SeleniumTester}}",
            "Version" : "1.0",
            "Properties" : {
               "ServiceToken": "arn:aws:sns:{{us-west-2}}:{{123456789012}}:{{CRTest}}",
               {{"seleniumTester" : "SeleniumTest()",
               "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com" ],
               "frequencyOfTestsPerHour" : [ "3", "2", "4" ]}}
            }
         }
      },
      "Outputs" : {
         "{{topItem}}" : {
            "Value" : { "Fn::GetAtt" : ["{{MySeleniumTest}}", "{{resultsPage}}"] }
         },
         "{{numRespondents}}" : {
            "Value" : { "Fn::GetAtt" : ["{{MySeleniumTest"}}, "{{lastUpdate}}"] }
         }
      }
   }
   ```
**Anmerkung**  
Die Namen und Werte der Daten, mit `Fn::GetAtt` denen zugegriffen wird, werden vom benutzerdefinierten Ressourcenanbieter während der Antwort des Anbieters auf zurückgegeben. CloudFormation Wenn der custom resource provider von einem Drittanbieter stammt, muss der template developer die Namen dieser Rückgabewerte vom custom resource provider abrufen.

1. <a name="crpg-walkthrough-stack-creation-provider-request"></a>CloudFormation sendet eine Amazon SNS SNS-Benachrichtigung an den Ressourcenanbieter mit einer`"RequestType" : "Create"`, die Informationen über den Stack, die benutzerdefinierten Ressourceneigenschaften aus der Stack-Vorlage und eine S3-URL für die Antwort enthält.

   Das SNS-Thema, das zum Senden der Benachrichtigung verwendet wird, ist in die Vorlage in der `ServiceToken`-Eigenschaft eingebettet. Um die Verwendung eines hartcodierten Werts zu vermeiden, kann ein Vorlagen-Entwickler einen Vorlagenparameter verwenden, sodass der Wert zu dem Zeitpunkt eingegeben wird, wenn der Stack gelauncht wird.

   Das folgende Beispiel zeigt eine `Create`-Anforderung einer benutzerdefinierten Ressource, die einen benutzerdefinierten Ressourcentypnamen, `Custom::SeleniumTester`, enthält, der mit der `LogicalResourceId` `MySeleniumTester` erstellt wurde:

   ```
   {
      "RequestType" : "Create",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::SeleniumTester",
      "LogicalResourceId" : "MySeleniumTester",
      "ResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4" ]
      }
   }
   ```

   Ausführliche Informationen über das Anfrageobjekt für `Create`-Anfragen finden Sie im Thema [Referenz für Anfrage und Antwort](crpg-ref.md) .

1. <a name="crpg-walkthrough-stack-creation-provider-response"></a>Der custom resource provider verarbeitet die Daten, die von template developer gesendet werden und bestimmt, ob die `Create`-Anforderung erfolgreich war. Der Ressourcenanbieter verwendet dann die von gesendete S3-URL CloudFormation , um eine Antwort entweder `SUCCESS` oder `FAILED` zu senden.

   Je nach Antworttyp werden unterschiedliche Antwortfelder von CloudFormation erwartet. Informationen über die Antwortfelder für einen bestimmten Anfragetyp finden Sie in der Dokumentation für diesen Anfragetyp im Abschnitt [Referenz für Anfrage und Antwort](crpg-ref.md) .

   Als Antwort auf eine Erstellungs- oder Aktualisierungsanfrage kann der benutzerdefinierte Ressourcenanbieter Datenelemente in das Feld `Data` der Antwort zurückgeben. Dabei handelt es sich um Name-Wert-Paare und die *Namen* entsprechen den `Fn::GetAtt`-Attributen mit der benutzerdefinierten Ressource in der Stack-Vorlage. Die *Werte* sind die Daten, die zurückgegeben werden, wenn der Vorlagen-Entwickler `Fn::GetAtt` für die Ressource mit dem Attributnamen aufruft.

   Nachfolgend finden Sie eine Beispielantwort einer benutzerdefinierten Ressource:

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1",
      "Data" : {
         "resultsPage" : "http://www.myexampledomain/test-results/guid",
         "lastUpdate" : "2012-11-14T03:30Z"
      }
   }
   ```

   Ausführliche Informationen über das Antwortobjekt für `Create`-Anfragen finden Sie im Thema [Referenz für Anfrage und Antwort](crpg-ref.md) .

   Die `StackId`, `RequestId` und `LogicalResourceId`-Felder müssen wörtlich aus der Anforderung kopiert werden.

1. <a name="crpg-walkthrough-stack-creation-stack-status"></a> CloudFormation deklariert den Stack-Status als `CREATE_COMPLETE` oder`CREATE_FAILED`. Wenn der Stack erfolgreich erstellt wurde, kann der Vorlagenentwickler die Ausgabewerte der erstellten benutzerdefinierten Ressource verwenden, indem er mit [Fn:: GetAtt](resources-section-structure.md#resource-properties-getatt) auf sie zugreift.

   Die benutzerdefinierte Ressourcenvorlage, die zur Veranschaulichung verwendet wird, verwendete `Fn::GetAtt` zum Kopieren von Ressourcenausgaben in die Stack-Ausgabe:

   ```
   "Outputs" : {
      "{{topItem}}" : {
         "Value" : { "Fn::GetAtt" : ["{{MySeleniumTest}}", "{{resultsPage}}"] }
      },
      "{{numRespondents}}" : {
         "Value" : { "Fn::GetAtt" : ["{{MySeleniumTest}}", "{{lastUpdate}}"] }
      }
   }
   ```

### Schritt 2: Stack-Updates
<a name="crpg-walkthrough-stack-updates"></a>

Um einen vorhandenen Stack zu aktualisieren, müssen Sie eine Vorlage übermitteln, die Updates für die Eigenschaften von Ressourcen im Stack angibt, wie im folgenden Beispiel dargestellt. CloudFormation aktualisiert nur die Ressourcen, für die Änderungen in der Vorlage angegeben sind. Weitere Informationen finden Sie unter [Verstehen des Aktualisierungsverhaltens von Stack-Ressourcen](using-cfn-updating-stacks-update-behaviors.md).

Sie können benutzerdefinierte Ressourcen aktualisieren, bei denen eine der zugrunde liegenden physischen Ressourcen ersetzt werden muss. Wenn Sie eine benutzerdefinierte Ressource in einer CloudFormation Vorlage aktualisieren, CloudFormation sendet eine Aktualisierungsanforderung an diese benutzerdefinierte Ressource. Wenn eine benutzerdefinierte Ressource ersetzt werden muss, muss die neu benutzerdefinierte Ressource eine Antwort mit der neuen physischen ID senden. When CloudFormation die Antwort empfängt, wird die `PhysicalResourceId` der alten und der neuen benutzerdefinierten Ressource verglichen. Wenn sie unterschiedlich sind, CloudFormation erkennt das Update als Ersatz und sendet eine Löschanfrage an die alte Ressource, wie unter gezeigt[Schritt 3: Löschen des Stacks](#crpg-walkthrough-stack-deletion).

**Anmerkung**  
Wenn Sie keine Änderungen an der benutzerdefinierten Ressource vorgenommen haben, CloudFormation werden während eines Stack-Updates keine Anfragen an sie gesendet.

1. <a name="crpg-walkthrough-stack-updates-customer-template"></a>Der template developer initiiert ein Update für den Stack, der eine benutzerdefinierte Ressource enthält. Während eines Update kann template developer neue Eigenschaften in der Stack-Vorlage angeben.

   Nachfolgend sehen Sie ein Beispiel für ein `Update` am der Stack-Vorlage mithilfe eines benutzerdefinierten Ressourcentyps:

   ```
   {
      "AWSTemplateFormatVersion" : "2010-09-09",
      "Resources" : {
         "MySeleniumTest" : {
            "Type": "Custom::SeleniumTester",
            "Version" : "1.0",
            "Properties" : {
               "ServiceToken": "arn:aws:sns:us-west-2:123456789012:CRTest",
               "seleniumTester" : "SeleniumTest()",
               "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com",
                  {{"http://mynewsite.com"}} ],
               "frequencyOfTestsPerHour" : [ "3", "2", "4", {{"3"}} ]
            }
         }
      },
      "Outputs" : {
         "topItem" : {
            "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "resultsPage"] }
         },
         "numRespondents" : {
            "Value" : { "Fn::GetAtt" : ["MySeleniumTest", "lastUpdate"] }
         }
      }
   }
   ```

1. <a name="crpg-walkthrough-stack-updates-provider-request"></a>CloudFormation sendet eine Amazon SNS SNS-Benachrichtigung an den Ressourcenanbieter mit einer`"RequestType" : "Update"`, die ähnliche Informationen wie der `Create` Anruf enthält, außer dass das `OldResourceProperties` Feld die alten Ressourceneigenschaften und die aktualisierten (falls vorhanden) Ressourceneigenschaften ResourceProperties enthält.

   Es folgt ein Beispiel für eine `Update`-Anforderung.

   ```
   {
      "RequestType" : "Update",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::SeleniumTester",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1",
      "ResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com",
            "http://mynewsite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4", "3" ]
      },
      "OldResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4" ]
      }
   }
   ```

   Ausführliche Informationen über das Anfrageobjekt für `Update`-Anfragen finden Sie im Thema [Referenz für Anfrage und Antwort](crpg-ref.md) .

1. <a name="crpg-walkthrough-stack-updates-provider-response"></a>Der benutzerdefinierte Ressourcenanbieter verarbeitet die von CloudFormation gesendeten Daten. Die benutzerdefinierte Ressource führt das Update durch und sendet eine Antwort entweder `SUCCESS` oder `FAILED` an die S3-URL. CloudFormation vergleicht dann `PhysicalResourceIDs` die alten und neuen benutzerdefinierten Ressourcen. Wenn sie unterschiedlich sind, CloudFormation erkennt, dass für das Update ein Ersatz erforderlich ist, und sendet eine Löschanforderung an die alte Ressource. Das folgende Beispiel zeigt die custom resource provider-Antwort auf eine `Update`-Anforderung.

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester2"
   }
   ```

   Ausführliche Informationen über das Antwortobjekt für `Update`-Anfragen finden Sie im Thema [Referenz für Anfrage und Antwort](crpg-ref.md) .

   Die `StackId`, `RequestId` und `LogicalResourceId`-Felder müssen wörtlich aus der Anforderung kopiert werden.

1. <a name="crpg-walkthrough-stack-updates-stack-status"></a>CloudFormation deklariert den Stack-Status als `UPDATE_COMPLETE` oder`UPDATE_FAILED`. Wenn das Update fehlschlägt, wird der Stack zurückgesetzt. Wenn der Stack erfolgreich aktualisiert wurde, kann der template developer auf neue Ausgabewerte der erstellten benutzerdefinierten mit `Fn::GetAtt` zugreifen.

### Schritt 3: Löschen des Stacks
<a name="crpg-walkthrough-stack-deletion"></a>

1. <a name="crpg-walkthrough-stack-deletion-customer-template"></a>Der Vorlagen-Entwickler löscht einen Stack, der eine benutzerdefinierte Ressource enthält. CloudFormation ruft die aktuellen Eigenschaften, die in der Stack-Vorlage angegeben sind, zusammen mit dem SNS-Thema ab und bereitet sich darauf vor, eine Anforderung an den benutzerdefinierten Ressourcenanbieter zu stellen.

1. <a name="crpg-walkthrough-stack-deletion-provider-request"></a>CloudFormation sendet eine Amazon SNS SNS-Benachrichtigung an den Ressourcenanbieter mit einer`"RequestType" : "Delete"`, die aktuelle Informationen über den Stack, die benutzerdefinierten Ressourceneigenschaften aus der Stack-Vorlage und eine S3-URL für die Antwort enthält.

   Immer wenn Sie einen Stapel löschen oder ein Update vornehmen, bei dem die benutzerdefinierte Ressource entfernt oder ersetzt wird, werden `PhysicalResourceId` die alten und neuen benutzerdefinierten Ressourcen CloudFormation verglichen. Wenn sie unterschiedlich sind, CloudFormation erkennt das Update als Ersatz und sendet eine Löschanforderung für die alte Ressource (`OldPhysicalResource`), wie im folgenden Beispiel für eine `Delete` Anfrage gezeigt.

   ```
   {
      "RequestType" : "Delete",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "ResponseURL" : "http://pre-signed-S3-url-for-response",
      "ResourceType" : "Custom::SeleniumTester",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1",
      "ResourceProperties" : {
         "seleniumTester" : "SeleniumTest()",
         "endpoints" : [ "http://mysite.com", "http://myecommercesite.com/", "http://search.mysite.com",
            "http://mynewsite.com" ],
         "frequencyOfTestsPerHour" : [ "3", "2", "4", "3" ]
      }
   }
   ```

   Ausführliche Informationen über das Anfrageobjekt für `Delete`-Anfragen finden Sie im Thema [Referenz für Anfrage und Antwort](crpg-ref.md) .

   `DescribeStackResource`, `DescribeStackResources` und `ListStackResources` zeigen den benutzerdefinierten Namen an, wenn er angegeben wurde.

1. <a name="crpg-walkthrough-stack-deletion-provider-response"></a>Der benutzerdefinierte Ressourcenanbieter verarbeitet die von gesendeten Daten CloudFormation und stellt fest, ob die `Delete` Anfrage erfolgreich war. Der Ressourcenanbieter verwendet dann die von gesendete S3-URL CloudFormation , um eine Antwort entweder `SUCCESS` oder zu senden`FAILED`. Wenn Sie eine benutzerdefinierte Ressource löschen möchten, muss custom resource provider erfolgreich auf eine Löschenanfrage antworten.

   Das folgende Beispiel zeigt die custom resource provider-Antwort auf eine `Delete`-Anforderung.

   ```
   {
      "Status" : "SUCCESS",
      "RequestId" : "unique-request-id",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MySeleniumTester",
      "PhysicalResourceId" : "Tester1"
   }
   ```

   Ausführliche Informationen über das Antwortobjekt für `Delete`-Anfragen finden Sie im Thema [Referenz für Anfrage und Antwort](crpg-ref.md) .

   Die `StackId`, `RequestId` und `LogicalResourceId`-Felder müssen wörtlich aus der Anforderung kopiert werden.

1. <a name="crpg-walkthrough-stack-updates-stack-status-delete"></a>CloudFormation deklariert den Stack-Status als `DELETE_COMPLETE` oder`DELETE_FAILED`.