

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.

# Mit CloudFormation Vorlagen arbeiten
<a name="template-guide"></a>

Eine AWS CloudFormation Vorlage definiert die AWS Ressourcen, die Sie als Teil eines Stacks erstellen, aktualisieren oder löschen möchten. Sie besteht aus mehreren Abschnitten, aber der einzige erforderliche Abschnitt ist der Abschnitt [Resources](resources-section-structure.md), in dem mindestens eine Ressource deklariert werden muss. 

Sie können Vorlagen mit den folgenden Methoden erstellen:
+ **AWS Infrastructure Composer**- Eine visuelle Schnittstelle für die Gestaltung von Vorlagen.
+ **Text Editor**- Schreiben Sie Vorlagen direkt in JSON- oder YAML-Syntax.
+ **IaC-Generator — Generieren** Sie Vorlagen aus Ressourcen, die in Ihrem Konto bereitgestellt werden und derzeit nicht von verwaltet werden. CloudFormation Der IaC-Generator arbeitet mit einer breiten Palette von Ressourcentypen, die von der Cloud Control API in Ihrer Region unterstützt werden.

Dieser Abschnitt enthält eine umfassende Anleitung zur Verwendung der verschiedenen Abschnitte einer CloudFormation Vorlage und zum Erstellen von Stack-Vorlagen. Es werden folgende Themen behandelt:

**Topics**
+ [Wo Vorlagen gespeichert werden](#where-they-get-stored)
+ [Vorlagen validieren](#template-validation)
+ [Erste Schritte mit Vorlagen](#getting-started)
+ [Mustervorlagen](#sample-templates)
+ [Format der Vorlage](template-formats.md)
+ [Abschnitte einer Vorlage](template-anatomy.md)
+ [Infrastructure Composer](infrastructure-composer-for-cloudformation.md)
+ [AWS CloudFormation Sprachserver](ide-extension.md)
+ [IaC-Generator](generate-IaC.md)
+ [In anderen Diensten gespeicherte Werte abrufen](dynamic-references.md)
+ [Werte abrufen AWS](pseudo-parameter-reference.md)
+ [Stapelausgaben abrufen](using-cfn-stack-exports.md)
+ [Vorhandene Ressourcen zur Laufzeit spezifizieren](cloudformation-supplied-parameter-types.md)
+ [Anleitungen](walkthroughs.md)
+ [Vorlagenausschnitte](template-snippets.md)
+ [Windows-basierte Stapel](cfn-windows-stacks.md)
+ [Verwenden Sie von CloudFormation -bereitgestellte Ressourcentypen](cloudformation-supplied-resource-types.md)
+ [Erstellen Sie wiederverwendbare Ressourcenkonfigurationen mit Modulen](modules.md)

## Wo Vorlagen gespeichert werden
<a name="where-they-get-stored"></a>

**Amazon-S3-Bucket**  
Sie können CloudFormation Vorlagen in einem Amazon S3 S3-Bucket speichern. Wenn Sie einen Stapel erstellen oder aktualisieren, können Sie die S3-URL der Vorlage angeben, anstatt sie direkt hochzuladen.

Wenn Sie Vorlagen direkt über das AWS-Managementkonsole oder hochladen AWS CLI, wird automatisch ein S3-Bucket für Sie erstellt. Weitere Informationen finden Sie unter [Einen Stack von der CloudFormation Konsole aus erstellen](cfn-console-create-stack.md).

**Git-Repository**  
Mit [Git sync](git-sync.md)können Sie Vorlagen in einem Git-Repository speichern. Wenn Sie einen Stack erstellen oder aktualisieren, können Sie den Speicherort und den Branch des Git-Repositorys angeben, der die Vorlage enthält, anstatt sie direkt hochzuladen oder auf eine S3-URL zu verweisen. CloudFormation überwacht das angegebene Repository und den angegebenen Branch automatisch auf Vorlagenänderungen. Weitere Informationen finden Sie unter [Erstellen Sie einen Stack aus dem Repository-Quellcode mit Git-Synchronisierung](git-sync-create-stack-from-repository-source-code.md).

## Vorlagen validieren
<a name="template-validation"></a>

**Überprüfung der Syntax**  
Sie können die JSON- oder YAML-Syntax Ihrer Vorlage überprüfen, indem Sie den CLI-Befehl [validate-template](service_code_examples.md#validate-template-sdk) verwenden oder Ihre Vorlage in der Konsole angeben. Die Konsole führt die Validierung automatisch durch. Weitere Informationen finden Sie unter [Einen Stack von der CloudFormation Konsole aus erstellen](cfn-console-create-stack.md). 

Diese Methoden überprüfen jedoch nur die Syntax Ihrer Vorlage und nicht die Eigenschaftswerte, die Sie für eine Ressource angegeben haben.

**Zusätzliche Validierungswerkzeuge**  
Für komplexere Validierungen und Best-Practice-Prüfungen können Sie zusätzliche Tools verwenden, z. B:
+ [CloudFormation Linter (cfn-lint)](https://github.com/aws-cloudformation/cfn-lint) — Validiert Vorlagen anhand der Schemas des [CloudFormation Ressourcenanbieters](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/resource-type-schemas.html). Umfasst die Überprüfung gültiger Werte für Ressourceneigenschaften und bewährte Verfahren.
+ [CloudFormation Rain (rain fmt)](https://github.com/aws-cloudformation/rain) — Formatieren Sie Ihre CloudFormation Vorlagen nach einem konsistenten Standard oder formatieren Sie eine Vorlage von JSON nach YAML (oder YAML nach JSON) neu. Bei der Verwendung von YAML werden Kommentare beibehalten und die Verwendung von intrinsischen Funktionen wird nach Möglichkeit auf die kurze Syntax umgestellt.

## Erste Schritte mit Vorlagen
<a name="getting-started"></a>

Gehen Sie wie folgt vor, um mit der Erstellung einer CloudFormation Vorlage zu beginnen:

1. **Ressourcen auswählen** — Identifizieren Sie die AWS Ressourcen, die Sie in Ihren Stack aufnehmen möchten, z. B. EC2 Instanzen VPCs, Sicherheitsgruppen und mehr.

1. **Schreiben Sie die Vorlage**- Schreiben Sie die Vorlage im JSON- oder YAML-Format und definieren Sie die Ressourcen und ihre Eigenschaften.

1. **Speichern Sie die Vorlage**- Speichern Sie die Vorlage lokal mit einer Dateierweiterung wie,`.json` `.yaml`oder `.txt`.

1. **Validieren Sie die Vorlage**- Validieren Sie die Vorlage mit den im Abschnitt [Vorlagen validieren](#template-validation) beschriebenen Methoden.

1. **Einen Stack erstellen**- Erstellen Sie einen Stack unter Verwendung der validierten Vorlage. 

### Planen Sie, die CloudFormation Vorlagenreferenz zu verwenden
<a name="additional-resources"></a>

Wenn Sie Ihre Vorlagen schreiben, finden Sie die Dokumentation für die detaillierte Syntax für die verschiedenen Ressourcentypen in der [AWS Ressourcen- und Eigenschaftstypen-Referenz](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html).

Häufig benötigen Ihre Stack-Vorlagen intrinsische Funktionen, um Eigenschaftswerte zuzuweisen, die erst zur Laufzeit verfügbar sind, sowie spezielle Attribute, um das Verhalten von Ressourcen zu steuern. Wenn Sie Ihre Vorlage schreiben, können Sie sich an den folgenden Ressourcen orientieren:
+ [Referenz auf eine intrinsische Funktion](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html)- Einige häufig verwendete intrinsische Funktionen sind:
  + `Ref`- Ruft den Wert eines Parameters oder die physische ID einer Ressource ab.
  + `Sub`- Ersetzt Platzhalter in Zeichenketten durch tatsächliche Werte.
  + `GetAtt`- Gibt den Wert eines Attributs aus einer Ressource in der Vorlage zurück.
  + `Join`- Verbindet eine Reihe von Werten zu einer einzigen Zeichenkette.
+ [Ressourcenattribut-Referenz](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-product-attribute-reference.html)- Einige häufig verwendete spezielle Attribute sind:
  + `DependsOn`- Verwenden Sie dieses Attribut, um anzugeben, dass eine Ressource nach einer anderen erstellt werden muss.
  + `DeletionPolicy`— Verwenden Sie dieses Attribut, um anzugeben, wie mit dem Löschen einer Ressource umgegangen werden CloudFormation soll.

## Mustervorlagen
<a name="sample-templates"></a>

CloudFormation stellt Open-Source-Stack-Vorlagen bereit, die Sie für den Einstieg verwenden können. Weitere Informationen finden Sie unter [CloudFormation Beispielvorlagen](https://github.com/aws-cloudformation/aws-cloudformation-templates) auf der GitHub Website.

Beachten Sie, dass diese Vorlagen nicht für die Produktion geeignet sind. Sie sollten sich die Zeit nehmen, um zu lernen, wie sie funktionieren, sie an Ihre Bedürfnisse anzupassen und sicherzustellen, dass sie den Compliance-Standards Ihres Unternehmens entsprechen.

Jede Vorlage in diesem Repository besteht die [CloudFormation Linter-Prüfungen](https://github.com/aws-cloudformation/cfn-lint) (cfn-lint) sowie ein grundlegendes AWS CloudFormation Guard Regelwerk, das auf den Center for Internet Security (CIS) Top 20 basiert, mit Ausnahmen für einige Regeln, bei denen es sinnvoll war, das Beispiel auf einen einzigen Anwendungsfall zu konzentrieren.

# CloudFormation Vorlagenformat
<a name="template-formats"></a>

Sie können CloudFormation Vorlagen in den Formaten JSON oder YAML erstellen. Beide Formate dienen dem gleichen Zweck, bieten aber deutliche Vorteile in Bezug auf Lesbarkeit und Komplexität.
+ **JSON**- JSON ist ein leichtgewichtiges Datenaustauschformat, das von Maschinen leicht geparst und generiert werden kann. Allerdings kann es für Menschen mühsam werden, sie zu lesen und zu schreiben, insbesondere bei komplexen Konfigurationen. In JSON wird die Vorlage durch verschachtelte geschweifte Klammern `{}` und Klammern `[]` strukturiert, um Ressourcen, Parameter und andere Komponenten zu definieren. Ihre Syntax erfordert die explizite Deklaration jedes Elements, was die Vorlage zwar langatmig machen kann, aber die strikte Einhaltung eines strukturierten Formats gewährleistet. 
+ **YAML**- YAML ist besser lesbar und weniger ausführlich als JSON. Es verwendet Einrückungen anstelle von geschweiften Klammern und Klammern, um Verschachtelungen zu kennzeichnen, was die Hierarchie der Ressourcen und Parameter leichter sichtbar macht. YAML wird oft wegen seiner Klarheit und Benutzerfreundlichkeit bevorzugt, insbesondere wenn es um komplexere Vorlagen geht. Da sich YAML jedoch auf die Einrückung verlässt, kann es zu Fehlern kommen, wenn die Abstände nicht konsistent sind, was sorgfältige Aufmerksamkeit erfordert, um die Genauigkeit zu wahren.

## Struktur der Vorlage
<a name="template-structure"></a>

CloudFormation Vorlagen sind in verschiedene Abschnitte unterteilt, und jeder Abschnitt ist so konzipiert, dass er eine bestimmte Art von Informationen enthält. Einige Abschnitte müssen in einer bestimmten Reihenfolge angegeben werden, bei anderen spielt die Reihenfolge keine Rolle. Bei der Erstellung Ihrer Vorlage kann es jedoch hilfreich sein, die in den folgenden Beispielen gezeigte logische Reihenfolge zu verwenden, da sich die Werte in einem Abschnitt auf Werte aus einem früheren Abschnitt beziehen können. 

Verwenden Sie beim Erstellen von Vorlagen keine doppelten Hauptabschnitte, wie beispielsweise den Abschnitt `Resources` . Sie akzeptiert CloudFormation zwar die Vorlage, verhält sich aber bei der Verarbeitung der Vorlage undefiniert und stellt möglicherweise Ressourcen falsch bereit oder gibt unerklärliche Fehler zurück.

### JSON
<a name="template-structure.json"></a>

Das folgende Beispiel zeigt die Struktur einer JSON-formatierten Vorlage mit allen verfügbaren Abschnitten.

```
{
  "AWSTemplateFormatVersion" : "version date",

  "Description" : "JSON string",

  "Metadata" : {
    template metadata
  },

  "Parameters" : {
    set of parameters
  },
  
  "Rules" : {
    set of rules
  },

  "Mappings" : {
    set of mappings
  },

  "Conditions" : {
    set of conditions
  },

  "Transform" : {
    set of transforms
  },

  "Resources" : {
    set of resources
  },
  
  "Outputs" : {
    set of outputs
  }
}
```

### YAML
<a name="template-structure.yaml"></a>

Das folgende Beispiel zeigt die Struktur einer YAML-formatierten Vorlage mit allen verfügbaren Abschnitten.

```
---
AWSTemplateFormatVersion: version date

Description:
  String

Metadata:
  template metadata

Parameters:
  set of parameters

Rules:
  set of rules

Mappings:
  set of mappings

Conditions:
  set of conditions

Transform:
  set of transforms

Resources:
  set of resources

Outputs:
  set of outputs
```

## Kommentare
<a name="template-comments"></a>

In JSON-formatierten Vorlagen werden Kommentare nicht unterstützt. JSON enthält von Haus aus keine Syntax für Kommentare, also Sie können keine Kommentare direkt in die JSON-Struktur einfügen. Wenn Sie jedoch Erklärungen oder Dokumentationen einfügen müssen, können Sie Metadaten hinzufügen. Weitere Informationen finden Sie unter [Metadata-Attribut](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).

In YAML-formatierte Vorlagen können Sie Inline-Kommentare einfügen, indem Sie das Symbol `#` verwenden.

Das folgende Beispiel zeigt eine YAML-Vorlage mit eingebundenen Kommentaren.

```
AWSTemplateFormatVersion: 2010-09-09
Description: A sample CloudFormation template with YAML comments.
# Resources section
Resources:
  MyEC2Instance: 
    Type: AWS::EC2::Instance
    Properties: 
      # Linux AMI
      ImageId: ami-1234567890abcdef0 
      InstanceType: t2.micro
      KeyName: MyKey
      BlockDeviceMappings:
        - DeviceName: /dev/sdm
          Ebs:
            VolumeType: io1
            Iops: 200
            DeleteOnTermination: false
            VolumeSize: 20
```

## Technische Daten
<a name="template-formats.supported-specifications"></a>

CloudFormation unterstützt die folgenden JSON- und YAML-Spezifikationen:

JSON  
CloudFormation folgt dem ECMA-404 JSON-Standard. Weitere Informationen zum JSON-Format finden Sie unter [http://www.json.org](http://www.json.org).

YAML  
CloudFormation unterstützt die YAML-Spezifikation Version 1.1 mit wenigen Ausnahmen. CloudFormation unterstützt die folgenden Funktionen nicht:  
+ Die Tags `binary``omap`, `pairs`, `set` und `timestamp`
+ Aliase
+ Hash-Zusammenführungen
Weitere Informationen zu YAML finden Sie unter [https://yaml.org/](https://yaml.org/).

## Weitere Informationen
<a name="template-formats.learnmore"></a>

Für jede Ressource, die Sie in Ihrer Vorlage angeben, definieren Sie deren Eigenschaften und Werte anhand der spezifischen Syntaxregeln von JSON oder YAML. Weitere Informationen zur Vorlagensyntax der einzelnen Formate finden Sie unter [CloudFormation Vorlagenabschnitte](template-anatomy.md).

# Reguläre Ausdrücke in CloudFormation Vorlagen verwenden
<a name="cfn-regexes"></a>

[Sie können reguläre Ausdrücke (allgemein als reguläre Ausdrücke bezeichnet) an einer Reihe von Stellen in Ihren CloudFormation Vorlagen verwenden, z. B. für die `AllowedPattern` Eigenschaft, wenn Sie einen Vorlagenparameter erstellen.](parameters-section-structure.md)

Alle regulären Ausdrücke CloudFormation entsprechen der Java-Regex-Syntax. Eine umfassende Beschreibung der Java Regex-Syntax und ihrer Konstrukte finden Sie unter [java.util.regex.Pattern](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/regex/Pattern.html).

Wenn Sie Ihre CloudFormation Vorlage in JSON-Syntax schreiben, müssen Sie alle Backslash-Zeichen (\$1) in Ihrem regulären Ausdruck maskieren, indem Sie einen zusätzlichen Backslash hinzufügen. Der Grund dafür ist, dass JSON Backslashes als Escape-Zeichen interpretiert und Sie sie als Escape-Zeichen verwenden müssen, damit sie im regulären Ausdruck als buchstäbliche Backslashes behandelt werden.

Wenn Sie beispielsweise in Ihrem regulären Ausdruck ein `\d` für eine Ziffer einschließen, müssen Sie in Ihrer JSON-Vorlage `\\d` verwenden.

Im folgenden Beispiel gibt die Eigenschaft `AllowedPattern` einen regulären Ausdruck an, der auf vier aufeinanderfolgende Ziffern (`\d{4}`) passt. Da der reguläre Ausdruck jedoch in einer JSON-Vorlage definiert ist, muss das Backslash-Zeichen mit einem zusätzlichen Backslash (`\\d`) escaped werden.

```
{
  "Parameters": {
    "MyParameter": {
      "Type": "String",
      "AllowedPattern": "\\d{4}"
    }
  }
}
```

Wenn Sie Ihre CloudFormation Vorlage in YAML-Syntax schreiben, müssen Sie den regulären Ausdruck in einfache Anführungszeichen („) setzen. Es ist kein zusätzliches Escaping erforderlich.

```
Parameters:
  MyParameter:
    Type: String
    AllowedPattern: '\d{4}'
```

**Anmerkung**  
Reguläre Ausdrücke in CloudFormation werden nur zu Validierungszwecken in bestimmten Kontexten unterstützt, wie z. `AllowedPattern` Sie werden nicht als Mustervergleichsoperationen CloudFormation in systemeigenen Funktionen unterstützt, z. B.`Fn::Equals`, die nur einen exakten Zeichenkettenvergleich und keinen Mustervergleich durchführen.

# CloudFormation Vorlagenabschnitte
<a name="template-anatomy"></a>

Jede CloudFormation Vorlage besteht aus einem oder mehreren Abschnitten, die jeweils einem bestimmten Zweck dienen. 

Der Abschnitt **Ressourcen** ist in jeder CloudFormation Vorlage erforderlich und bildet den Kern der Vorlage. In diesem Abschnitt werden die Stack-Ressourcen und ihre Eigenschaften angegeben, z. B. eine EC2 Amazon-Instance oder ein Amazon S3-Bucket. Jede Ressource wird mit einer eindeutigen logischen ID, einem Typ und spezifischen Konfigurationsdetails definiert. 

Der Abschnitt **Parameter** ist zwar optional, spielt aber eine wichtige Rolle bei der Flexibilisierung von Vorlagen. Es ermöglicht Benutzern, bei der Erstellung oder Aktualisierung eines Stapels Werte zur Laufzeit zu übergeben. Auf diese Parameter kann in den Abschnitten `Resources` und `Outputs` verwiesen werden, so dass eine Anpassung möglich ist, ohne die Vorlage selbst zu ändern. Sie können zum Beispiel Parameter verwenden, um Instancetypen oder Umgebungseinstellungen festzulegen, die sich zwischen den Einsätzen unterscheiden.

Der ebenfalls optionale Abschnitt **Outputs** definiert die Werte, die bei der Anzeige der Eigenschaften eines Stacks zurückgegeben werden. Die Ausgaben enthalten nützliche Informationen wie Ressourcen-Identifikatoren oder URLs, die für betriebliche Zwecke oder zur Integration mit anderen Stacks genutzt werden können. In diesem Abschnitt können Benutzer wichtige Details zu den von der Vorlage erstellten Ressourcen abrufen und verwenden.

Weitere optionale Abschnitte sind **Mappings**, die wie Nachschlagetabellen funktionieren, um bedingte Werte zu verwalten. Mit Mappings definieren Sie Schlüssel-Wert-Paare und verwenden diese mit der intrinsischen Funktion `Fn::FindInMap` in den Abschnitten `Resources` und `Outputs` . Dies ist nützlich für Szenarien, in denen Sie Konfigurationen auf der Grundlage von Bedingungen wie AWS-Region der Umgebung anpassen müssen.

Die Abschnitte**Metadaten** und **Regeln** werden zwar weniger häufig verwendet, bieten jedoch zusätzliche Funktionen. `Metadata` kann zusätzliche Informationen über die Vorlage enthalten, während `Rules` einen Parameter oder eine Kombination von Parametern bei der Erstellung oder Aktualisierung von Stapeln validiert und sicherstellt, dass sie bestimmte Kriterien erfüllen. Der Abschnitt **Bedingungen** erhöht die Flexibilität weiter, indem er steuert, ob bestimmte Ressourcen erstellt werden oder Eigenschaften einen Wert zugewiesen bekommen, der auf Bedingungen wie dem Umgebungstyp basiert.

Der Abschnitt **Transform** schließlich wird verwendet, um Makros während der Verarbeitung der Vorlage anzuwenden. Für serverlose Anwendungen (auch als Lambda-Anwendungen bezeichnet) gibt es die Version des [AWS Serverless Application Model (AWS SAM)](https://github.com/awslabs/serverless-application-specification) an, die verwendet werden soll. Wenn Sie eine Transformation angeben, können Sie die AWS SAM Syntax verwenden, um Ressourcen in Ihrer Vorlage zu deklarieren. Das Modell definiert, welche Syntax verwendet werden darf und wie diese Syntax verarbeitet wird. Sie können die `AWS::Include` Transformation auch verwenden, um Vorlagenausschnitte einzubeziehen, die getrennt von der CloudFormation Hauptvorlage gespeichert werden. 

Die folgenden Themen enthalten weitere Informationen und Beispiele für die Verwendung der einzelnen Abschnitte.

**Topics**
+ [Resources](resources-section-structure.md)
+ [Parameters](parameters-section-structure.md)
+ [Outputs](outputs-section-structure.md)
+ [Mappings](mappings-section-structure.md)
+ [Metadata](metadata-section-structure.md)
+ [Rules](rules-section-structure.md)
+ [Conditions](conditions-section-structure.md)
+ [Transform](transform-section-structure.md)
+ [Formatversion](format-version-structure.md)
+ [Description](template-description-structure.md)

# CloudFormation ResourcesVorlagensyntax
<a name="resources-section-structure"></a>

Der `Resources` Abschnitt ist ein erforderlicher Abschnitt auf oberster Ebene in einer CloudFormation Vorlage. Er deklariert die AWS Ressourcen, die Sie als Teil Ihres Stacks bereitstellen und konfigurieren möchten CloudFormation .

## Syntax
<a name="resources-section-structure-syntax"></a>

Der Abschnitt `Resources` verwendet die folgende Syntax:

### JSON
<a name="resources-section-structure-syntax.json"></a>

```
"Resources" : {
    "LogicalResourceName1" : {
        "Type" : "AWS::ServiceName::ResourceType",
        "Properties" : {
            "PropertyName1" : "PropertyValue1",
            ...
        }
    },

    "LogicalResourceName2" : {
        "Type" : "AWS::ServiceName::ResourceType",
        "Properties" : {
            "PropertyName1" : "PropertyValue1",
            ...
        }
    }
}
```

### YAML
<a name="resources-section-structure-syntax.yaml"></a>

```
Resources:
  LogicalResourceName1:
    Type: AWS::ServiceName::ResourceType
    Properties:
      PropertyName1: PropertyValue1
      ...

  LogicalResourceName2:
    Type: AWS::ServiceName::ResourceType
    Properties:
      PropertyName1: PropertyValue1
      ...
```

## Logische ID (auch *logischer Name*genannt)
<a name="resources-section-logical-id"></a>

Innerhalb einer CloudFormation Vorlage werden Ressourcen anhand ihrer logischen Ressourcennamen identifiziert. Diese Namen müssen alphanumerisch sein (A-Za-z0-9) und innerhalb der Vorlage eindeutig sein. Logische Namen werden verwendet, um auf Ressourcen aus anderen Abschnitten der Vorlage zu verweisen. 

## Ressourcentyp
<a name="resources-section-resource-type"></a>

Jede Ressource muss ein `Type`-Attribut haben, das die Art der AWS -Ressource definiert. Das Attribut `Type` hat das Format `AWS::ServiceName::ResourceType`. Das Attribut `Type` für einen Amazon S3-Bucket lautet zum Beispiel `AWS::S3::Bucket`. 

Eine vollständige Liste der unterstützten Ressourcentypen finden Sie in der Referenz [AWS Ressourcen- und Eigenschaftstypen](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html).

## ResourceProperties
<a name="resources-section-resource-properties"></a>

Ressourceneigenschaften sind zusätzliche Optionen, die Sie angeben können, um Konfigurationsdetails für den spezifischen Ressourcentyp zu definieren. Einige Eigenschaften sind erforderlich, während andere optional sind. Einige Eigenschaften haben Standardwerte, so dass die Angabe dieser Eigenschaften optional ist.

Einzelheiten zu den Eigenschaften, die für jeden Ressourcentyp unterstützt werden, finden Sie in den Themen unter [AWS Ressourcen- und Eigenschaftstypen Referenz](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html).

Eigenschaftswerte können literale Strings, Listen von Strings, Boolesche Werte, dynamische Referenzen, Parameterreferenzen, Pseudoreferenzen oder der von einer Funktion zurückgegebene Wert sein. Die folgenden Beispiele zeigen Ihnen, wie Sie verschiedene Arten von Eigenschaftswerten deklarieren können:

### JSON
<a name="resource-properties-example.json"></a>

```
"Properties" : {
    "String" : "A string value",
    "Number" : 123,
    "LiteralList" : [ "first-value", "second-value" ],
    "Boolean" : true
}
```

### YAML
<a name="resource-properties-example.yaml"></a>

```
Properties:
  String: A string value 
  Number: 123
  LiteralList:
    - first-value
    - second-value
  Boolean: true
```

## Physische ID
<a name="resources-section-physical-id"></a>

Neben einer logischen ID haben bestimmte Ressourcen auch eine physische ID. Sie ist der tatsächliche Name, der dieser Ressource zugewiesen ist, zum Beispiel die ID einer EC2-Instance oder der Name eines S3-Buckets. Verwenden Sie die physischen IDs, um Ressourcen außerhalb von CloudFormation Vorlagen zu identifizieren, jedoch erst, nachdem die Ressourcen erstellt wurden. Angenommen, Sie geben einer EC2-Instance-Ressource eine logische ID von `MyEC2Instance`. Beim CloudFormation Erstellen der Instanz CloudFormation wird automatisch eine physische ID (z. B.`i-1234567890abcdef0`) generiert und der Instanz zugewiesen. Diese physische ID können Sie verwenden, um die Instance zu referenzieren und ihre Eigenschaften (beispielsweise den DNS-Namen) über die Amazon-EC2-Konsole abzurufen. 

Generiert für Amazon S3 S3-Buckets und viele andere Ressourcen CloudFormation automatisch einen eindeutigen physischen Namen für die Ressource, wenn Sie keinen explizit angeben. Dieser physische Name basiert auf einer Kombination aus dem Namen des CloudFormation Stacks, dem in der CloudFormation Vorlage angegebenen logischen Namen der Ressource und einer eindeutigen ID. Wenn Sie beispielsweise einen Amazon S3 S3-Bucket mit dem logischen Namen `MyBucket` in einem Stack namens haben`MyStack`, CloudFormation könnten Sie den Bucket mit dem folgenden physischen Namen benennen`MyStack-MyBucket-abcdefghijk1`.

Für Ressourcen, die benutzerdefinierte Namen unterstützen, können Sie Ihre eigenen physischen Namen vergeben, damit Sie die Ressourcen schnell identifizieren können. So können Sie einem S3-Bucket, in dem Protokolle gespeichert werden, zum Beispiel den Namen `MyPerformanceLogs` geben. Weitere Informationen finden Sie unter [Namenstyp](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-name.html).

## Ressourcen referenzieren
<a name="using-cross-resource-references"></a>

Oft müssen Sie die Eigenschaften einer Ressource auf der Grundlage des Namens oder der Eigenschaft einer anderen Ressource festlegen. Sie könnten beispielsweise eine EC2-Instance erstellen, die EC2-Sicherheitsgruppen verwendet, oder eine CloudFront Distribution, die von einem S3-Bucket unterstützt wird. All diese Ressourcen können in derselben CloudFormation Vorlage erstellt werden. 

CloudFormation stellt systemeigene Funktionen bereit, mit denen Sie auf andere Ressourcen und deren Eigenschaften verweisen können. Mit diesen Funktionen können Sie Abhängigkeiten zwischen Ressourcen erstellen und Werte von einer Ressource an eine andere übergeben.

### Die Funktion `Ref`
<a name="resource-properties-ref"></a>

Die `Ref` Funktion wird häufig verwendet, um eine identifizierende Eigenschaft von Ressourcen abzurufen, die in derselben CloudFormation Vorlage definiert sind. Was er zurückgibt, hängt von der Art der Ressource ab. Für die meisten Ressourcen gibt es den physischen Namen der Ressource zurück. Für einige Ressourcentypen wird jedoch möglicherweise ein anderer Wert zurückgegeben, z. B. eine IP-Adresse für eine `AWS::EC2::EIP`-Ressource oder ein Amazon Resource Name (ARN) für ein Amazon SNS-Thema. 

Die folgenden Beispiele zeigen, wie Sie die Funktion `Ref` in Eigenschaften verwenden können. In jedem dieser Beispiele gibt die Funktion `Ref` den tatsächlichen Namen der an anderer Stelle in der Vorlage deklarierten Ressource `LogicalResourceName` zurück. Das `!Ref`-Syntaxbeispiel im YAML-Beispiel ist nur eine kürzere Schreibweise für die `Ref`-Funktion.

#### JSON
<a name="resource-properties-ref-example.json"></a>

```
"Properties" : {
    "PropertyName" : { "Ref" : "LogicalResourceName" }
}
```

#### YAML
<a name="resource-properties-ref-example.yaml"></a>

```
Properties:
  PropertyName1:
    Ref: LogicalResourceName
  PropertyName2: !Ref LogicalResourceName
```

Ausführlichere Informationen über die Funktion `Ref` finden Sie unter [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-ref.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-ref.html). 

### Die Funktion `Fn::GetAtt`
<a name="resource-properties-getatt"></a>

Die Funktion `Ref` ist hilfreich, wenn der Parameter oder der für eine Ressource zurückgegebene Wert genau das ist, was Sie wollen. Es kann jedoch sein, dass Sie andere Attribute einer Ressource benötigen. Wenn Sie beispielsweise eine CloudFront Distribution mit einem S3-Ursprung erstellen möchten, müssen Sie den Bucket-Standort mithilfe einer Adresse im DNS-Stil angeben. Eine Reihe von Ressourcen haben zusätzliche Attribute, deren Werte Sie in Ihrer Vorlage verwenden können. Um diese Attribute zu erhalten, verwenden Sie die Funktion `Fn::GetAtt` .

Die folgenden Beispiele zeigen, wie Sie die Funktion `GetAtt` in Eigenschaften verwenden können. Die Funktion `Fn::GetAtt` benötigt zwei Parameter, den logischen Namen der Ressource und den Namen des Attributs, das abgerufen werden soll. Das `!GetAtt`-Syntaxbeispiel im YAML-Beispiel ist nur eine kürzere Schreibweise für die `GetAtt`-Funktion.

#### JSON
<a name="resource-properties-getatt-example.json"></a>

```
"Properties" : {
    "PropertyName" : {
        "Fn::GetAtt" : [ "LogicalResourceName", "AttributeName" ]
    }
}
```

#### YAML
<a name="resource-properties-getatt-example.yaml"></a>

```
Properties:
  PropertyName1:
    Fn::GetAtt:
      - LogicalResourceName
      - AttributeName
  PropertyName2: !GetAtt LogicalResourceName.AttributeName
```

Ausführlichere Informationen über die Funktion `GetAtt` finden Sie unter [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-getatt.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-getatt.html).

## Beispiele
<a name="resources-section-structure-examples"></a>

Die folgenden Beispiele veranschaulichen, wie Ressourcen deklariert werden und wie CloudFormation Vorlagen auf andere Ressourcen verweisen können, die in derselben Vorlage definiert sind, und auf vorhandene AWS Ressourcen.

**Topics**
+ [Deklarieren einer einzelnen Ressource mit einem benutzerdefinierten Namen](#resources-section-structure-examples-single-resource)
+ [Verweis auf andere Ressourcen mit der Funktion `Ref` .](#resources-section-structure-examples-ref)
+ [Referenzieren von Ressourcenattributen mit der Funktion `Fn::GetAtt` .](#resources-section-structure-examples-getatt)

### Deklarieren einer einzelnen Ressource mit einem benutzerdefinierten Namen
<a name="resources-section-structure-examples-single-resource"></a>

Die folgenden Beispiele deklarieren eine einzelne Ressource vom Typ `AWS::S3::Bucket` mit dem logischen Namen `MyBucket`. Die Eigenschaft `BucketName` ist auf *amzn-s3-demo-bucket*eingestellt, die Sie durch den gewünschten Namen für Ihren S3-Bucket ersetzen sollten.

Wenn Sie diese Ressourcendeklaration verwenden, um einen Stack zu erstellen, CloudFormation wird ein Amazon S3 S3-Bucket mit Standardeinstellungen erstellt. Für andere Ressourcen, z. B. eine Amazon EC2 EC2-Instance oder eine Auto Scaling Scaling-Gruppe, CloudFormation sind weitere Informationen erforderlich.

#### JSON
<a name="resources-section-structure-examples-single-resource.json"></a>

```
{
    "Resources": {
        "MyBucket": {
            "Type": "AWS::S3::Bucket",
            "Properties": {
                "BucketName": "amzn-s3-demo-bucket"
            }
        }
    }
}
```

#### YAML
<a name="resources-section-structure-examples-single-resource.yaml"></a>

```
Resources:
  MyBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: amzn-s3-demo-bucket
```

### Verweis auf andere Ressourcen mit der Funktion `Ref` .
<a name="resources-section-structure-examples-ref"></a>

Die folgenden Beispiele zeigen eine Ressourcendeklaration, die eine EC2-Instance und eine Sicherheitsgruppe definiert. Die `Ec2Instance`-Ressource referenziert die `InstanceSecurityGroup`-Ressource als Teil ihrer `SecurityGroupIds`-Eigenschaft unter Verwendung der `Ref`-Funktion. Sie enthält auch eine bestehende Sicherheitsgruppe (`sg-12a4c434`), die nicht in der Vorlage deklariert ist. Verwenden Sie Literalzeichenfolgen, um auf eine vorhandene AWS -Ressource zu verweisen.

#### JSON
<a name="resources-section-structure-examples-ref.json"></a>

```
{
    "Resources": {
        "Ec2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "SecurityGroupIds": [
                    {
                        "Ref": "InstanceSecurityGroup"
                    },
                    "sg-12a4c434"
                ],
                "KeyName": "MyKey",
                "ImageId": "ami-1234567890abcdef0"
            }
        },
        "InstanceSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable SSH access via port 22",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 22,
                        "ToPort": 22,
                        "CidrIp": "0.0.0.0/0"
                    }
                ]
            }
        }
    }
}
```

#### YAML
<a name="resources-section-structure-examples-ref.yaml"></a>

```
Resources:
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      SecurityGroupIds:
        - !Ref InstanceSecurityGroup
        - sg-12a4c434
      KeyName: MyKey
      ImageId: ami-1234567890abcdef0
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access via port 22
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
```

### Referenzieren von Ressourcenattributen mit der Funktion `Fn::GetAtt` .
<a name="resources-section-structure-examples-getatt"></a>

Die folgenden Beispiele zeigen eine Ressourcendeklaration, die eine CloudFront Verteilungsressource und einen S3-Bucket definiert. Die `MyDistribution`-Ressource gibt den DNS-Namen der `MyBucket`-Ressource an und verwendet die `Fn::GetAtt`-Funktion, um das `DomainName`-Attribut des Buckets zu erhalten. Sie werden feststellen, dass die Funktion `Fn::GetAtt` ihre beiden Parameter in einem Array auflistet. Bei Funktionen mit mehreren Parametern werden diese in einem Array angegeben.

#### JSON
<a name="resources-section-structure-examples-getatt.json"></a>

```
{
  "Resources": {
    "MyBucket": {
      "Type": "AWS::S3::Bucket"
    },
    "MyDistribution": {
      "Type": "AWS::CloudFront::Distribution",
      "Properties": {
        "DistributionConfig": {
          "Origins": [
            {
              "DomainName": {
                "Fn::GetAtt": [
                  "MyBucket",
                  "DomainName"
                ]
              },
              "Id": "MyS3Origin",
              "S3OriginConfig": {}
            }
          ],
          "Enabled": "true",
          "DefaultCacheBehavior": {
            "TargetOriginId": "MyS3Origin",
            "ForwardedValues": {
              "QueryString": "false"
            },
            "ViewerProtocolPolicy": "allow-all"
          }
        }
      }
    }
  }
}
```

#### YAML
<a name="resources-section-structure-examples-getatt.yaml"></a>

```
Resources:
  MyBucket:
    Type: AWS::S3::Bucket
  MyDistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        Origins:
          - DomainName: !GetAtt 
              - MyBucket
              - DomainName
            Id: MyS3Origin
            S3OriginConfig: {}
        Enabled: 'true'
        DefaultCacheBehavior:
          TargetOriginId: MyS3Origin
          ForwardedValues:
            QueryString: 'false'
          ViewerProtocolPolicy: allow-all
```

# CloudFormation ParametersVorlagensyntax
<a name="parameters-section-structure"></a>

Mit dem optionalen Abschnitt `Parameters` können Sie Ihre Vorlagen anpassen. Mit Parametern können Sie jedes Mal, wenn Sie einen Stapel erstellen oder aktualisieren, benutzerdefinierte Werte in Ihre Vorlage eingeben. Durch die Verwendung von Parametern in Ihren Vorlagen können Sie wiederverwendbare und flexible Vorlagen erstellen, die auf bestimmte Szenarien zugeschnitten werden können. 

Durch die Definition von Parametern des entsprechenden Typs können Sie aus einer Liste von Bezeichnern vorhandener Ressourcen wählen, wenn Sie die Konsole zur Erstellung Ihres Stapels verwenden. Weitere Informationen finden Sie unter [Geben Sie vorhandene Ressourcen zur Laufzeit mit von CloudFormation -bereitgestellten Parametertypen an](cloudformation-supplied-parameter-types.md).

Parameter sind eine beliebte Methode, um Eigenschaftswerte von Stack-Ressourcen anzugeben. Es kann jedoch Einstellungen geben, die von der Region abhängen oder die für den Benutzer aufgrund anderer Bedingungen oder Abhängigkeiten etwas kompliziert zu verstehen sind. In diesen Fällen möchten Sie vielleicht eine Logik in die Vorlage selbst einbauen, damit die Benutzer einfachere Werte (oder gar keine) angeben können, um die gewünschten Ergebnisse zu erhalten, z. B. durch Verwendung einer Zuordnung. Weitere Informationen finden Sie unter [CloudFormation MappingsVorlagensyntax](mappings-section-structure.md).

## Syntax
<a name="parameters-section-structure-syntax"></a>

Sie deklarieren Parameter im Abschnitt `Parameters` einer Vorlage, der die folgende allgemeine Syntax verwendet:

### JSON
<a name="parameters-section-structure-syntax.json"></a>

```
"Parameters" : {
  "ParameterLogicalID" : {
    "Description": "Information about the parameter",
    "Type" : "DataType",
    "Default" : "value",
    "AllowedValues" : ["value1", "value2"]
  }
}
```

### YAML
<a name="parameters-section-structure-syntax.yaml"></a>

```
Parameters:
  ParameterLogicalID:
    Description: Information about the parameter
    Type: DataType
    Default: value
    AllowedValues:
      - value1
      - value2
```

Ein Parameter enthält eine Liste von Attributen, die seinen Wert sowie Einschränkungen für diesen Wert definieren. Das einzige erforderliche Attribut ist`Type`, bei dem es sich um einen `String``Number`, oder CloudFormation angegebenen Parametertyp handeln kann. Sie können auch ein `Description`-Attribut hinzufügen, das beschreibt, welche Art von Wert Sie angeben sollten. Der Name und die Beschreibung des Parameters erscheinen auf der Seite **Parameter angeben** wenn Sie die Vorlage im Assistenten **Stapel erstellen** verwenden.

**Anmerkung**  
Standardmäßig listet die CloudFormation Konsole Eingabeparameter alphabetisch nach ihrer logischen ID auf. Um diese Standardreihenfolge außer Kraft zu setzen und verwandte Parameter zu gruppieren, können Sie den Metadatenschlüssel `AWS::CloudFormation::Interface` in Ihrer Vorlage verwenden. Weitere Informationen finden Sie unter [Organisieren von CloudFormation Parametern mit `AWS::CloudFormation::Interface` Metadaten](aws-cloudformation-interface.md).

 CloudFormation Verwendet für Parameter mit Standardwerten die Standardwerte, sofern die Benutzer keinen anderen Wert angeben. Wenn Sie das Standardattribut weglassen, müssen die Benutzer einen Wert für diesen Parameter angeben. Die Aufforderung an den Benutzer, einen Wert einzugeben, stellt jedoch nicht sicher, dass der Wert gültig ist. Um den Wert eines Parameters zu überprüfen, können Sie Einschränkungen deklarieren oder einen AWS-spezifischen Parametertyp angeben.

Für Parameter ohne Standardwerte müssen die Benutzer bei der Stack-Erstellung einen Wert für den Schlüsselnamen angeben. Ist dies nicht der Fall, CloudFormation schlägt die Erstellung des Stacks fehl und es wird eine Ausnahme ausgelöst:

```
Parameters: [KeyName] must have values
```

## Eigenschaften
<a name="parameters-section-structure-properties"></a>

`AllowedPattern`  
Gibt einen regulären Ausdruck an, der die zulässigen Muster für `String`- oder `CommaDelimitedList`-Typen beschreibt. Bei der Anwendung auf einen Parameter des Typs `String` muss das Muster mit dem gesamten angegebenen Parameterwert übereinstimmen. Wenn das Muster auf einen Parameter des Typs `CommaDelimitedList` angewendet wird, muss es mit jedem Wert in der Liste übereinstimmen.  
*Required*: No

`AllowedValues`  
Gibt ein Array mit einer Liste der für den Parameter zulässigen Werte an. Wenn der Parameterwert auf einen Parameter des Typs `String` angewendet wird, muss er einer der zulässigen Werte sein. Wenn der Parameterwert auf einen Parameter des Typs `CommaDelimitedList` angewendet wird, muss jeder Wert in der Liste einer der ausgewählten zulässigen Werte sein.  
*Required*: No  
Wenn Sie YAML verwenden und `Yes`- und `No`-Zeichenfolgen für `AllowedValues` nutzen möchten, geben Sie einfache Anführungszeichen ein, um zu verhindern, dass diese booleschen Werte vom YAML-Parser berücksichtigt werden.

`ConstraintDescription`  
Gibt eine Zeichenfolge als Beschreibung für eine Einschränkung an. Diese Beschreibung wird bei Verstößen gegen die Einschränkung angezeigt. Für einen Parameter mit einem zulässigen Muster `[A-Za-z0-9]+` beispielsweise wird ohne Einschränkungsbeschreibung die folgende Fehlermeldung angezeigt, wenn der Benutzer einen ungültigen Wert angibt:  
`Malformed input-Parameter MyParameter must match pattern [A-Za-z0-9]+`  
Durch das Hinzufügen der Beschreibung einer Einschränkung, wie z. B. *dürfen nur Groß- und Kleinbuchstaben und Zahlen enthalten*, können Sie die folgende benutzerdefinierte Fehlermeldung anzeigen:  
`Malformed input-Parameter MyParameter must only contain uppercase and lowercase letters and numbers`  
*Required*: No

`Default`  
Gibt einen Wert des entsprechenden Typs an, den die Vorlage nutzen soll, wenn zum Zeitpunkt der Stack-Erstellung kein Wert angegeben wird. Wenn Sie Einschränkungen für den Parameter definieren, müssen Sie einen Wert angeben, der diese Einschränkungen einhält.  
*Required*: No

`Description`  
Gibt eine Zeichenfolge mit maximal 4 000 Zeichen an, die den Parameter beschreibt.  
*Required*: No

`MaxLength`  
Gibt einen Ganzzahlwert an, der festlegt, wie viele Zeichen maximal für `String`-Typen zulässig sind.  
*Required*: No

`MaxValue`  
Gibt einen numerischen Wert an, der den zulässigen numerischen Maximalwert für `Number`-Typen definiert.  
*Required*: No

`MinLength`  
Gibt einen Ganzzahlwert an, der die zulässige Mindestzeichenzahl für `String`-Typen definiert.  
*Required*: No

`MinValue`  
Gibt einen numerischen Wert an, der den zulässigen numerischen Mindestwert für `Number`-Typen definiert.  
*Required*: No

`NoEcho`  
Gibt an, ob der Parameterwert maskiert werden soll, damit er in der Konsole, in Befehlszeilen-Tools und in der API nicht angezeigt wird. Wenn Sie das `NoEcho` Attribut auf setzen`true`, wird der als Sternchen (\$1\$1\$1\$1\$1) maskierte Parameterwert für alle Aufrufe CloudFormation zurückgegeben, die den Stack oder die Stack-Ereignisse beschreiben, mit Ausnahme von Informationen, die an den unten angegebenen Speicherorten gespeichert sind.  
*Required*: No  
Durch die Verwendung des `NoEcho`-Attributs werden keine Informationen maskiert, die im Folgenden gespeichert sind:  
+ Der Vorlagenbereich. `Metadata` CloudFormation transformiert, modifiziert oder redigiert keine Informationen, die Sie in den `Metadata` Abschnitt aufnehmen. Weitere Informationen finden Sie unter [Metadaten](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html).
+ Der `Outputs`-Vorlagenabschnitt. Weitere Informationen finden Sie unter [Ausgaben](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html):
+ Das `Metadata`-Attribut einer Ressourcendefinition. Weitere Informationen finden Sie unter [`Metadata`-Attribut](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).
Es wird dringend empfohlen, diese Mechanismen nicht zu verwenden, um vertrauliche Informationen wie Passwörter oder Geheimnisse einzugeben.
Anstatt vertrauliche Informationen direkt in Ihre CloudFormation Vorlagen einzubetten, empfehlen wir Ihnen, dynamische Parameter in der Stack-Vorlage zu verwenden, um auf vertrauliche Informationen zu verweisen, die außerhalb von gespeichert und verwaltet werden CloudFormation, z. B. im AWS Systems Manager Parameterspeicher oder. AWS Secrets Manager  
Weitere Informationen finden Sie in den bewährten Methoden zu [Keine Anmeldeinformationen in Ihre Vorlagen einbetten](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/security-best-practices.html#creds).
Wir empfehlen dringend davon ab, `NoEcho`-Parameter oder vertrauliche Daten in Ressourceneigenschaften, die Teil der primären ID einer Ressource sind.  
Wenn ein `NoEcho` Parameter in einer Eigenschaft enthalten ist, die eine primäre Ressourcen-ID bildet, CloudFormation kann der *tatsächliche Klartext-Wert* in der primären Ressourcen-ID verwendet werden. Diese Ressourcen-ID kann in allen abgeleiteten Ausgaben oder Zielen vorkommen.  
Um festzustellen, welche Ressourceneigenschaften den primären Bezeichner eines Ressourcentyps umfassen, lesen Sie die Dokumentation der Ressourcenreferenz für diese Ressource in der [AWS Ressourcen- und Eigenschaftstypenreferenz](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html). Im Abschnitt **Return values** (Rückgbewerte) stellt der Rückgabewert der `Ref`-Funktion die Ressourceneigenschaften dar, welche die primäre Kennung des Ressourcentyps bilden.

`Type`  <a name="parameters-section-structure-properties-type"></a>
Gibt den Datentyp des Parameters an (`DataType`).  
*Erforderlich*: Ja  
CloudFormation unterstützt die folgenden Parametertypen:    
`String`  
Gibt eine Literalzeichenfolge an. Sie können die folgenden Attribute verwenden, um Constraints zu deklarieren:,`MinLength`,`MaxLength`,`Default` `AllowedValues`und `AllowedPattern`.   
Zum Beispiel könnten Benutzer `"MyUserName"` angeben.  
`Number`  
Eine Ganzzahl oder ein Fließkommawert. CloudFormation validiert den Parameterwert als Zahl. Wenn Sie den Parameter jedoch an einer anderen Stelle in Ihrer Vorlage verwenden (z. B. mithilfe der `Ref` systeminternen Funktion), wird der Parameterwert zu einer Zeichenfolge.  
Sie können die folgenden Attribute verwenden, um Beschränkungen zu deklarieren:,`MinValue`,`MaxValue` `Default`und `AllowedValues`.  
Zum Beispiel könnten Benutzer `"8888"` angeben.  
`List<Number>`  
Ein Array aus Ganzzahlen oder Gleitkommazahlen, die durch Kommas getrennt sind. CloudFormation validiert den Parameterwert als Zahlen; wenn Sie den Parameter jedoch an anderer Stelle in Ihrer Vorlage verwenden (z. B. mit der intrinsischen `Ref`-Funktion), wird der Parameterwert zu einer Liste von Zeichenfolgen.  
Zum Beispiel könnten Benutzer `"80,20"` angeben. `Ref` würde dann `["80","20"]` zurückgeben.  
`CommaDelimitedList`  
Gibt ein Array von Literalzeichenfolgen an, jeweils durch Komma getrennt. Die Gesamtanzahl von Zeichenfolgen sollte um 1 höher sein als die Gesamtanzahl von Kommas. Jede Mitgliedszeichenfolge wird zudem gekürzt.  
Zum Beispiel könnten Benutzer `"test,dev,prod"` angeben. `Ref` würde dann `["test","dev","prod"]` zurückgeben.  
AWS-spezifische Parametertypen  
AWS Werte wie Amazon EC2 EC2-Schlüsselpaarnamen und IDs VPC. Weitere Informationen finden Sie unter [Vorhandene Ressourcen zur Laufzeit spezifizieren](cloudformation-supplied-parameter-types.md).  
Systems Manager Parameter-Typen  
Parameter, die vorhandenen Parametern im Systems Manager Parameter Store entsprechen. Sie geben einen Systems Manager Manager-Parameterschlüssel als Wert des Systems Manager Manager-Parametertyps an und CloudFormation rufen den neuesten Wert aus dem Parameterspeicher ab, um ihn für den Stack zu verwenden. Weitere Informationen finden Sie unter [Vorhandene Ressourcen zur Laufzeit spezifizieren](cloudformation-supplied-parameter-types.md).

## Allgemeine Anforderungen für Parameter
<a name="parameters-section-structure-requirements"></a>

Die folgenden Anforderungen gelten bei der Verwendung von Parametern:
+ Eine CloudFormation Vorlage kann maximal 200 Parameter enthalten.
+ Jedem Parameter muss ein logischer Name (auch logische ID genannt) gegeben werden, der alphanumerisch und unter allen logischen Namen innerhalb der Vorlage eindeutig sein muss.
+ Jedem Parameter muss ein Parametertyp zugewiesen werden, der von unterstützt wird CloudFormation. Weitere Informationen finden Sie unter [ Type](#parameters-section-structure-properties-type).
+ Jedem Parameter muss zur Laufzeit ein Wert zugewiesen werden CloudFormation , damit der Stack erfolgreich bereitgestellt werden kann. Sie können optional einen Standardwert angeben, der verwendet werden CloudFormation soll, sofern kein anderer Wert angegeben wird.
+ Die Parameter innerhalb derselben Vorlage deklariert und referenziert werden. Sie können Parameter aus den Vorlagenabschnitten `Resources` und `Outputs` der Vorlage referenzieren.

## Beispiele
<a name="parameters-section-examples"></a>

**Topics**
+ [Einfacher String-Parameter](#parameters-section-structure-example-1)
+ [Parameter Passwort](#parameters-section-structure-example-2)
+ [Parameter referenzieren](#parameters-section-structure-example-3)
+ [Komma-getrennte Listenparameter](#parameters-section-structure-example-4)
+ [Zurückgeben eines Werts aus einem Parameter für Komma-getrennte Listen](#parameters-section-structure-example-5)

### Einfacher String-Parameter
<a name="parameters-section-structure-example-1"></a>

Das folgende Beispiel deklariert einen Parameter mit dem Namen `InstanceTypeParameter` vom Typ `String`. Mit diesem Parameter können Sie den Amazon EC2-Instancetyp für den Stack angeben. Wenn bei der Erstellung oder Aktualisierung des Stacks kein Wert angegeben wird, wird der Standardwert von CloudFormation verwendet`t2.micro`.

#### JSON
<a name="parameters-section-structure-example-1.json"></a>

```
"Parameters" : {
  "InstanceTypeParameter" : {
    "Description" : "Enter t2.micro, m1.small, or m1.large. Default is t2.micro.",
    "Type" : "String",
    "Default" : "t2.micro",
    "AllowedValues" : ["t2.micro", "m1.small", "m1.large"]
  }
}
```

#### YAML
<a name="parameters-section-structure-example-1.yaml"></a>

```
Parameters:
  InstanceTypeParameter:
    Description: Enter t2.micro, m1.small, or m1.large. Default is t2.micro.
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - m1.small
      - m1.large
```

### Parameter Passwort
<a name="parameters-section-structure-example-2"></a>

Das folgende Beispiel deklariert einen Parameter namens `DBPwd` vom Typ `String` ohne Standardwert. Die Eigenschaft `NoEcho` wird auf `true` gesetzt, um zu verhindern, dass der Parameterwert in Stapelbeschreibungen angezeigt wird. Die zulässige Mindestlänge ist `1`, die zulässige Maximallänge `41`. Das Muster erlaubt die Verwendung von Klein- und Großbuchstaben sowie Ziffern. Dieses Beispiel veranschaulicht auch die Verwendung eines regulären Ausdrucks für die Eigenschaft `AllowedPattern` .

#### JSON
<a name="parameters-section-structure-example-2.json"></a>

```
"Parameters" : {
  "DBPwd" : {
    "NoEcho" : "true",
    "Description" : "The database admin account password",
    "Type" : "String",
    "MinLength" : "1",
    "MaxLength" : "41",
    "AllowedPattern" : "^[a-zA-Z0-9]*$"
  }
}
```

#### YAML
<a name="parameters-section-structure-example-2.yaml"></a>

```
Parameters: 
  DBPwd: 
    NoEcho: true
    Description: The database admin account password
    Type: String
    MinLength: 1
    MaxLength: 41
    AllowedPattern: ^[a-zA-Z0-9]*$
```

### Parameter referenzieren
<a name="parameters-section-structure-example-3"></a>

Sie verwenden die intrinsische Funktion `Ref`, um auf einen Parameter zu verweisen, und CloudFormation verwendet den Wert des Parameters für die Bereitstellung des Stacks. Sie können Parameter aus den Vorlagenabschnitten `Resources` und `Outputs` derselben Vorlage referenzieren.

Im folgenden Beispiel referenziert die Eigenschaft `InstanceType` der EC2-Instance-Ressource den Parameterwert `InstanceTypeParameter`:

#### JSON
<a name="parameters-section-structure-example-3.json"></a>

```
"Ec2Instance" : {
  "Type" : "AWS::EC2::Instance",
  "Properties" : {
    "InstanceType" : { "Ref" : "InstanceTypeParameter" },
    "ImageId" : "ami-0ff8a91507f77f867"
  }
}
```

#### YAML
<a name="parameters-section-structure-example-3.yaml"></a>

```
Ec2Instance:
  Type: AWS::EC2::Instance
  Properties:
    InstanceType:
      Ref: InstanceTypeParameter
    ImageId: ami-0ff8a91507f77f867
```

### Komma-getrennte Listenparameter
<a name="parameters-section-structure-example-4"></a>

Der Parametertyp `CommaDelimitedList` kann nützlich sein, wenn Sie mehrere Werte für eine einzelne Eigenschaft angeben müssen. Das folgende Beispiel deklariert einen Parameter namens `DbSubnetIpBlocks` mit einem Standardwert von drei durch Kommas getrennten CIDR-Blöcken.

#### JSON
<a name="parameters-section-structure-example-4.json"></a>

```
"Parameters" : {
  "DbSubnetIpBlocks": {
    "Description": "Comma-delimited list of three CIDR blocks",
    "Type": "CommaDelimitedList",
    "Default": "10.0.48.0/24, 10.0.112.0/24, 10.0.176.0/24"
  }
}
```

#### YAML
<a name="parameters-section-structure-example-4.yaml"></a>

```
Parameters: 
  DbSubnetIpBlocks: 
    Description: "Comma-delimited list of three CIDR blocks"
    Type: CommaDelimitedList
    Default: "10.0.48.0/24, 10.0.112.0/24, 10.0.176.0/24"
```

### Zurückgeben eines Werts aus einem Parameter für Komma-getrennte Listen
<a name="parameters-section-structure-example-5"></a>

Um auf einen bestimmten Wert in der kommagetrennten Liste eines Parameters zu verweisen, verwenden Sie die intrinsische Funktion `Fn::Select` im Abschnitt `Resources` Ihrer Vorlage. Übergeben Sie den Indexwert des gewünschten Objekts und eine Liste von Objekten, wie im folgenden Beispiel gezeigt.

#### JSON
<a name="parameters-section-structure-example-5.json"></a>

```
{
    "Parameters": {
        "VPC": {
            "Type": "String",
            "Default": "vpc-123456"
        },
        "VpcAzs": {
            "Type": "CommaDelimitedList",
            "Default": "us-west-2a, us-west-2b, us-west-2c"
        },
        "DbSubnetIpBlocks": {
            "Type": "CommaDelimitedList",
            "Default": "172.16.0.0/26, 172.16.0.64/26, 172.16.0.128/26"
        }
    },
    "Resources": {
        "DbSubnet1": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "AvailabilityZone": {
                    "Fn::Select": [
                      0,
                      { 
                        "Ref": "VpcAzs" 
                      }
                   ]
                },
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Fn::Select": [
                        0,
                        { "Ref": "DbSubnetIpBlocks" }
                    ]
                }
            }
        },
        "DbSubnet2": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "AvailabilityZone": {
                    "Fn::Sub": [
                        "${AWS::Region}${AZ}",
                        {
                            "AZ": {
                                "Fn::Select": [
                                    1,
                                    { "Ref": "VpcAzs" }
                                ]
                            }
                        }
                    ]
                },
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Fn::Select": [
                        1,
                        { "Ref": "DbSubnetIpBlocks" }
                    ]
                }
            }
        },
        "DbSubnet3": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "AvailabilityZone": {
                    "Fn::Sub": [
                        "${AWS::Region}${AZ}",
                        {
                            "AZ": {
                                "Fn::Select": [
                                    2,
                                    { "Ref": "VpcAzs" }
                                ]
                            }
                        }
                    ]
                },
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": {
                    "Fn::Select": [
                        2,
                        { "Ref": "DbSubnetIpBlocks" }
                    ]
                }
            }
        }
    }
}
```

#### YAML
<a name="parameters-section-structure-example-5.yaml"></a>

```
Parameters:
  VPC:
    Type: String
    Default: vpc-123456
  VpcAzs:
    Type: CommaDelimitedList
    Default: us-west-2a, us-west-2b, us-west-2c
  DbSubnetIpBlocks:
    Type: CommaDelimitedList
    Default: 172.16.0.0/26, 172.16.0.64/26, 172.16.0.128/26
Resources:
  DbSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Select
        - 0 
        - !Ref VpcAzs
      VpcId: !Ref VPC
      CidrBlock: !Select
        - 0
        - !Ref DbSubnetIpBlocks
  DbSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Sub
        - ${AWS::Region}${AZ}
        - AZ: !Select
            - 1
            - !Ref VpcAzs
      VpcId: !Ref VPC
      CidrBlock: !Select
        - 1
        - !Ref DbSubnetIpBlocks
  DbSubnet3:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: !Sub
        - ${AWS::Region}${AZ}
        - AZ: !Select
            - 2
            - !Ref VpcAzs
      VpcId: !Ref VPC
      CidrBlock: !Select
        - 2
        - !Ref DbSubnetIpBlocks
```

## Zugehörige Ressourcen
<a name="parameters-section-structure-related-resources"></a>

CloudFormation unterstützt auch die Verwendung dynamischer Verweise zur dynamischen Angabe von Eigenschaftswerten. Sie müssen zum Beispiel auf sichere Strings verweisen, die im Systems Manager Parameter Store gespeichert sind. Weitere Informationen finden Sie unter [Abrufen von in anderen Diensten gespeicherten Werten mit Hilfe von dynamischen Referenzen](dynamic-references.md).

Sie können auch Pseudoparameter innerhalb einer `Ref`- oder `Sub`-Funktion verwenden, um Werte dynamisch zu füllen. Weitere Informationen finden Sie unter [AWS Werte mithilfe von Pseudo-Parametern abrufen](pseudo-parameter-reference.md). 

# CloudFormation OutputsVorlagensyntax
<a name="outputs-section-structure"></a>

Der optionale Abschnitt `Outputs` deklariert Ausgabewerte für den Stack. Diese Ausgabewerte können auf verschiedene Weise verwendet werden:
+ **Erfassen Sie wichtige Details über Ihre Ressourcen**- Eine Ausgabe ist eine bequeme Möglichkeit, wichtige Informationen über Ihre Ressourcen zu erfassen. Beispielsweise können Sie den Namen des S3-Buckets eines Stacks ausgeben lassen, um den Bucket einfacher zu finden. Sie können Ausgabewerte auf der Registerkarte **Ausgaben** der CloudFormation Konsole oder mithilfe des [describe-stacks](service_code_examples.md#describe-stacks-sdk)CLI-Befehls anzeigen. 
+ **Stackübergreifende Referenzen**- Sie können Ausgabewerte in andere Stack importieren, um [Referenzen zwischen Stackn herzustellen](using-cfn-stack-exports.md). Dies ist hilfreich, wenn Sie Ressourcen oder Konfigurationen über mehrere Stacks hinweg gemeinsam nutzen müssen.

**Wichtig**  
CloudFormation redigiert oder verschleiert keine Informationen, die Sie in den Abschnitt aufnehmen. `Outputs` Es wird dringend empfohlen, diesen Abschnitt nicht für die Ausgabe vertraulicher Informationen wie Passwörter oder Secrets zu verwenden.  
Ausgabewerte sind verfügbar, nachdem der Stack-Vorgang abgeschlossen ist. Stack-Ausgabewerte sind nicht verfügbar, wenn sich ein Stack-Status in einem der `IN_PROGRESS`-[Status](view-stack-events.md#cfn-console-view-stack-data-resources-status-codes) befindet. Wir empfehlen nicht, Abhängigkeiten zwischen einer Servicelaufzeit und dem Stack-Ausgabewert festzulegen, da Ausgabewerte möglicherweise nicht immer verfügbar sind.

## Syntax
<a name="outputs-section-syntax"></a>

Der Abschnitt `Outputs` besteht aus dem Schlüsselnamen `Outputs`. Sie können maximal 200 Ausgaben in einer Vorlage deklarieren.

Das folgende Beispiel veranschaulicht die Struktur des Abschnitts `Outputs`.

### JSON
<a name="outputs-section-structure-syntax.json"></a>

Schließen Sie alle Ausgabedeklarationen in Klammern ein. Trennen Sie bei mehreren Ausgaben die einzelnen Ausgaben jeweils durch ein Komma voneinander.

```
"Outputs" : {
  "OutputLogicalID" : {
    "Description" : "Information about the value",
    "Value" : "Value to return",
    "Export" : {
      "Name" : "Name of resource to export"
    }
  }
}
```

### YAML
<a name="outputs-section-structure-syntax.yaml"></a>

```
Outputs:
  OutputLogicalID:
    Description: Information about the value
    Value: Value to return
    Export:
      Name: Name of resource to export
```

### Ausgabefelder
<a name="outputs-section-structure-output-fields"></a>

Der Abschnitt `Outputs` kann die folgenden Felder enthalten:

**Logische ID (auch *logischer Name*genannt)**  
Gibt den Bezeichner der aktuellen Ausgabe an. Die logische ID muss alphanumerisch (`a–z`, `A–Z`, `0–9`) und innerhalb der Vorlage eindeutig sein.

**`Description` (optional)**  
Gibt einen `String`-Typ an, der den Ausgabewert beschreibt. Der Wert für die Deklaration der Beschreibung muss eine Literalzeichenfolge mit einer Länge zwischen 0 und 1 024 Byte sein. Parameter oder Funktionen dürfen nicht zur Angabe der Beschreibung verwendet werden. 

**`Value` (Erforderlich)**  
Der Wert der Eigenschaft, die durch den Befehl [describe-stacks](service_code_examples.md#describe-stacks-sdk) zurückgegeben wird. Der Wert einer Ausgabe kann Literale, Parameterreferenzen, Pseudoparameter, einen Mapping-Wert oder intrinsische Funktionen enthalten.

**`Export` (optional)**  
Gibt den Namen der Ressourcenausgabe an, wie er für eine Stack-übergreifende Referenzierung exportiert werden soll.  
Sie können den `Name`-Wert eines Exports mithilfe intrinsischer Funktionen individuell anpassen.  
Weitere Informationen finden Sie unter [Holen Sie sich exportierte Ausgaben aus einem bereitgestellten CloudFormation Stack](using-cfn-stack-exports.md).

Wenn Sie eine Bedingung mit einer Ausgabe verknüpfen möchten, müssen Sie die Bedingung im Abschnitt [Conditions](conditions-section-structure.md) der Vorlage definieren.

## Beispiele
<a name="outputs-section-structure-examples"></a>

Die folgenden Beispiele veranschaulichen die Funktionsweise von Stack-Ausgaben.

**Topics**
+ [Stack-Ausgabe](#outputs-section-structure-examples-stack-output)
+ [Exportname mit `Fn::Sub`anpassen](#outputs-section-structure-examples-cross-stack)
+ [Exportname mit `Fn::Join`anpassen](#outputs-section-structure-examples-join-export-name)
+ [Gibt eine URL zurück, die mit `Fn::Join`erstellt wurde.](#outputs-section-structure-examples-join-export-url)

### Stack-Ausgabe
<a name="outputs-section-structure-examples-stack-output"></a>

Im folgenden Beispiel gibt die Ausgabe `BackupLoadBalancerDNSName` den DNS-Namen der Ressource mit der logischen ID `BackupLoadBalancer` zurück, und zwar nur, wenn die Bedingung `CreateProdResources` als wahr identifiziert wird. Die Ausgabe mit dem Namen `InstanceID` gibt die ID der EC2-Instance mit der logischen ID `EC2Instance`zurück.

#### JSON
<a name="outputs-section-structure-example.json"></a>

```
"Outputs" : {
  "BackupLoadBalancerDNSName" : {
    "Description": "The DNSName of the backup load balancer",  
    "Value" : { "Fn::GetAtt" : [ "BackupLoadBalancer", "DNSName" ]},
    "Condition" : "CreateProdResources"
  },
  "InstanceID" : {
    "Description": "The Instance ID",  
    "Value" : { "Ref" : "EC2Instance" }
  }
}
```

#### YAML
<a name="outputs-section-structure-example.yaml"></a>

```
Outputs:
  BackupLoadBalancerDNSName:
    Description: The DNSName of the backup load balancer
    Value: !GetAtt BackupLoadBalancer.DNSName
    Condition: CreateProdResources
  InstanceID:
    Description: The Instance ID
    Value: !Ref EC2Instance
```

### Exportname mit `Fn::Sub`anpassen
<a name="outputs-section-structure-examples-cross-stack"></a>

In den folgenden Beispielen gibt die Ausgabe mit dem Namen `StackVPC` die ID einer VPC zurück. Anschließend exportiert sie den Wert für Stack-übergreifende Referenzierungen, wobei sie dem Stack-Namen den Namen `VPCID` anfügt.

#### JSON
<a name="outputs-section-structure-cross-stack-example.json"></a>

```
"Outputs" : {
  "StackVPC" : {
    "Description" : "The ID of the VPC",
    "Value" : { "Ref" : "MyVPC" },
    "Export" : {
      "Name" : {"Fn::Sub": "${AWS::StackName}-VPCID" }
    }
  }
}
```

#### YAML
<a name="outputs-section-structure-cross-stack-example.yaml"></a>

```
Outputs:
  StackVPC:
    Description: The ID of the VPC
    Value: !Ref MyVPC
    Export:
      Name: !Sub "${AWS::StackName}-VPCID"
```

Weitere Informationen zur Funktion `Fn::Sub` finden Sie unter [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html).

### Exportname mit `Fn::Join`anpassen
<a name="outputs-section-structure-examples-join-export-name"></a>

Sie können die Funktion `Fn::Join` auch verwenden, um Werte auf der Grundlage von Parametern, Ressourcenattributen und anderen Zeichenfolgen zu konstruieren.

In den folgenden Beispielen wird die Funktion `Fn::Join` anstelle der Funktion `Fn::Sub` verwendet, um den Exportnamen anzupassen. Die Beispielfunktion `Fn::Join` verkettet den Stapelnamen mit dem Namen `VPCID` mit einem Doppelpunkt als Trennzeichen.

#### JSON
<a name="outputs-section-structure-join-export-name-example.json"></a>

```
"Outputs" : {
  "StackVPC" : {
    "Description" : "The ID of the VPC",
    "Value" : { "Ref" : "MyVPC" },
    "Export" : {
      "Name" : { "Fn::Join" : [ ":", [ { "Ref" : "AWS::StackName" }, "VPCID" ] ] }
    }
  }
}
```

#### YAML
<a name="outputs-section-structure-join-export-name-example.yaml"></a>

```
Outputs:
  StackVPC:
    Description: The ID of the VPC
    Value: !Ref MyVPC
    Export:
      Name: !Join [ ":", [ !Ref "AWS::StackName", VPCID ] ]
```

Weitere Informationen zur Funktion `Fn::Join` finden Sie unter [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-join.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-join.html).

### Gibt eine URL zurück, die mit `Fn::Join`erstellt wurde.
<a name="outputs-section-structure-examples-join-export-url"></a>

Im folgenden Beispiel für eine Vorlage, die eine WordPress Site erstellt, `InstallURL` ist die Zeichenfolge, die von einem `Fn::Join` Funktionsaufruf zurückgegeben wird, der verkettet`http://`, den DNS-Namen der Ressource und. `ElasticLoadBalancer` `/wp-admin/install.php` Der Ausgabewert sollte folgendermaßen oder ähnlich aussehen:

```
http://mywptests-elasticl-1gb51l6sl8y5v-206169572.aws-region.elb.amazonaws.com/wp-admin/install.php
```

#### JSON
<a name="outputs-section-structure-examples-join-export-url.json"></a>

```
{
    "Outputs": {
        "InstallURL": {
            "Value": {
                "Fn::Join": [
                    "",
                    [
                        "http://",
                        {
                            "Fn::GetAtt": [
                                "ElasticLoadBalancer",
                                "DNSName"
                            ]
                        },
                        "/wp-admin/install.php"
                    ]
                ]
            },
            "Description": "Installation URL of the WordPress website"
        }
    }
}
```

#### YAML
<a name="outputs-section-structure-examples-join-export-url.yaml"></a>

```
Outputs:
  InstallURL:
    Value: !Join 
      - ''
      - - 'http://'
        - !GetAtt 
          - ElasticLoadBalancer
          - DNSName
        - /wp-admin/install.php
    Description: Installation URL of the WordPress website
```

Weitere Informationen zur Funktion `Fn::Join` finden Sie unter [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-join.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-join.html).

# CloudFormation MappingsVorlagensyntax
<a name="mappings-section-structure"></a>

Der optionale Abschnitt `Mappings` hilft Ihnen bei der Erstellung von Schlüssel-Wert-Paaren, mit denen Sie Werte basierend auf bestimmten Bedingungen oder Abhängigkeiten angeben können. 

Ein üblicher Anwendungsfall für den Abschnitt `Mappings` ist die Festlegung von Werten auf der Grundlage von AWS-Region , wo der Stack eingesetzt wird. Dies kann durch die Verwendung des Pseudoparameters `AWS::Region` erreicht werden. Der `AWS::Region` Pseudo-Parameter ist ein Wert, der in die Region CloudFormation aufgelöst wird, in der der Stack erstellt wurde. Pseudo-Parameter werden aufgelöst, CloudFormation wenn Sie den Stack erstellen. 

Um Werte in einer Map abzurufen, können Sie die intrinsische Funktion `Fn::FindInMap` im Abschnitt `Resources` Ihrer Vorlage verwenden. 

## Syntax
<a name="mappings-section-structure-syntax"></a>

Der Abschnitt `Mappings` verwendet die folgende Syntax:

### JSON
<a name="mappings-section-structure-syntax.json"></a>

```
"Mappings" : {
  "MappingLogicalName" : {
    "Key1" : {
      "Name" : "Value1"
    },
    "Key2" : {
      "Name" : "Value2"
    },
    "Key3" : {
      "Name" : "Value3"
    }
  }
}
```

### YAML
<a name="mappings-section-structure-syntax.yaml"></a>

```
Mappings: 
  MappingLogicalName: 
    Key1: 
      Name: Value1
    Key2: 
      Name: Value2
    Key3: 
      Name: Value3
```
+ `MappingLogicalName` ist der logische Name für die Zuordnung.
+ Innerhalb der Zuordnung ist jede Karte ein Schlüssel, gefolgt von einer anderen Zuordnung.
+ Der Schlüssel muss eine Zuordnung von Name-Wert-Paaren darstellen und innerhalb der Zuordnung eindeutig sein.
+ Das Name-Wert-Paar ist ein Etikett und der Zuweisungswert. Durch die Benennung der Werte können Sie einem Schlüssel mehr als einen Satz Werte zuweisen.
+ Die Schlüssel in Zuweisungen müssen Literalzeichenfolgen sein.
+ Die Werte können vom Typ `String` oder `List`sein.

**Anmerkung**  
Im Abschnitt `Mappings` dürfen keine Parameter, Pseudoparameter oder intrinsischen Funktionen verwendet werden.   
Wenn die Werte in einem Mapping derzeit nicht von Ihrem Stack verwendet werden, können Sie das Mapping nicht allein aktualisieren. Sie müssen Änderungen einbeziehen, die Ressourcen hinzufügen, ändern oder löschen.

## Beispiele
<a name="mappings-section-structure-examples"></a>

**Topics**
+ [Grundlegende Zuweisungen](#mappings-section-structure-basic-example)
+ [Zuweisung mit mehreren Werten](#mappings-section-structure-multiple-values-example)
+ [Zurückgeben eines Werts aus einer Zuweisung](#mappings-section-structure-return-value-example)
+ [Eingabeparameter und `Fn::FindInMap`](#mappings-section-structure-input-parameter-example)

### Grundlegende Zuweisungen
<a name="mappings-section-structure-basic-example"></a>

Das folgende Beispiel zeigt einen `Mappings`-Abschnitt mit einer Map `RegionToInstanceType`, die fünf Schlüssel enthält. Diesen Schlüsseln sind Name-Wert-Paare mit jeweils einem einzigen Zeichenfolgewert zugewiesen. Die Schlüssel sind Namen von Regionen. Jedes Name-Wert-Paar ist ein Instancetyp aus der T-Familie, der in der Region verfügbar ist, die durch den Schlüssel repräsentiert wird. Die Name-Wert-Paare haben einen Namen (`InstanceType` in diesem Beispiel) und einen Wert. 

#### JSON
<a name="mappings-section-structure-basic-example.json"></a>

```
"Mappings" : {
  "RegionToInstanceType" : {
    "us-east-1"      : { "InstanceType" : "t2.micro" },
    "us-west-1"      : { "InstanceType" : "t2.micro" },
    "eu-west-1"      : { "InstanceType" : "t2.micro" },
    "eu-north-1"     : { "InstanceType" : "t3.micro" },
    "me-south-1"     : { "InstanceType" : "t3.micro" }
  }
}
```

#### YAML
<a name="mappings-section-structure-basic-example.yaml"></a>

```
Mappings:
  RegionToInstanceType:
    us-east-1:
      InstanceType: t2.micro
    us-west-1:
      InstanceType: t2.micro
    eu-west-1:
      InstanceType: t2.micro
    eu-north-1:
      InstanceType: t3.micro
    me-south-1:
      InstanceType: t3.micro
```

### Zuweisung mit mehreren Werten
<a name="mappings-section-structure-multiple-values-example"></a>

Das folgende Beispiel hat Regionsschlüssel, die zwei Gruppen von Werten zugeordnet sind: eine mit dem Namen `MyAMI1` und die andere mit `MyAMI2`.

**Anmerkung**  
Die in diesen Beispielen IDs gezeigten AMI sind Platzhalter zu Demonstrationszwecken. Wann immer möglich, sollten Sie dynamische Verweise auf AWS Systems Manager -Parameter als Alternative zum `Mappings`-Abschnitt verwenden. Um zu vermeiden, dass alle Ihre Vorlagen bei jeder Änderung des AMI, das Sie verwenden möchten, mit einer neuen ID aktualisiert werden, verwenden Sie einen AWS Systems Manager Parameter, um die neueste AMI-ID abzurufen, wenn der Stack erstellt oder aktualisiert wird. Die neuesten Versionen von häufig verwendeten AMIs sind auch als öffentliche Parameter in Systems Manager verfügbar. Weitere Informationen finden Sie unter [Abrufen von in anderen Diensten gespeicherten Werten unter Verwendung dynamischer Referenzen](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html). 

#### JSON
<a name="mappings-section-structure-multiple-values-example"></a>

```
"Mappings" : {
  "RegionToAMI" : {
    "us-east-1"        : { "MyAMI1" : "ami-12345678901234567", "MyAMI2" : "ami-23456789012345678" },
    "us-west-1"        : { "MyAMI1" : "ami-34567890123456789", "MyAMI2" : "ami-45678901234567890" },
    "eu-west-1"        : { "MyAMI1" : "ami-56789012345678901", "MyAMI2" : "ami-67890123456789012" },
    "ap-southeast-1"   : { "MyAMI1" : "ami-78901234567890123", "MyAMI2" : "ami-89012345678901234" },
    "ap-northeast-1"   : { "MyAMI1" : "ami-90123456789012345", "MyAMI2" : "ami-01234567890123456" }
  }
}
```

#### YAML
<a name="mappings-section-structure-multiple-values-example.yaml"></a>

```
Mappings:
  RegionToAMI:
    us-east-1:
      MyAMI1: ami-12345678901234567
      MyAMI2: ami-23456789012345678
    us-west-1:
      MyAMI1: ami-34567890123456789
      MyAMI2: ami-45678901234567890
    eu-west-1:
      MyAMI1: ami-56789012345678901
      MyAMI2: ami-67890123456789012
    ap-southeast-1:
      MyAMI1: ami-78901234567890123
      MyAMI2: ami-89012345678901234
    ap-northeast-1:
      MyAMI1: ami-90123456789012345
      MyAMI2: ami-01234567890123456
```

### Zurückgeben eines Werts aus einer Zuweisung
<a name="mappings-section-structure-return-value-example"></a>

Sie können die Funktion `Fn::FindInMap` verwenden, um einen benannten Wert auf Basis eines angegebenen Schlüssels zurückzugeben. Die folgende Beispielvorlage enthält eine Amazon EC2-Ressource, deren Eigenschaft `InstanceType` durch die Funktion `FindInMap` festgelegt wird. Die `FindInMap` Funktion gibt Schlüssel als den AWS-Region Ort an, an dem der Stack erstellt wird (unter Verwendung des `AWS::Region` Pseudo-Parameters) und `InstanceType` als Namen des Werts, dem die Zuordnung erfolgen soll, an. Der `ImageId` verwendet einen Systems Manager-Parameter, um dynamisch das neueste Amazon Linux 2 AMI abzurufen. Weitere Informationen zu Pseudoparametern finden Sie unter [AWS Werte mithilfe von Pseudo-Parametern abrufen](pseudo-parameter-reference.md).

#### JSON
<a name="mappings-section-structure-return-value-example.json"></a>

```
{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Mappings" : {
    "RegionToInstanceType" : {
      "us-east-1"      : { "InstanceType" : "t2.micro" },
      "us-west-1"      : { "InstanceType" : "t2.micro" },
      "eu-west-1"      : { "InstanceType" : "t2.micro" },
      "eu-north-1"     : { "InstanceType" : "t3.micro" },
      "me-south-1"     : { "InstanceType" : "t3.micro" }
    }
  },
  "Resources" : {
    "myEC2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
        "InstanceType" : { "Fn::FindInMap" : [ "RegionToInstanceType", { "Ref" : "AWS::Region" }, "InstanceType" ]}
      }
    }
  }
}
```

#### YAML
<a name="mappings-section-structure-return-value-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Mappings: 
  RegionToInstanceType: 
    us-east-1:
      InstanceType: t2.micro
    us-west-1:
      InstanceType: t2.micro
    eu-west-1:
      InstanceType: t2.micro
    eu-north-1:
      InstanceType: t3.micro
    me-south-1:
      InstanceType: t3.micro
Resources: 
  myEC2Instance: 
    Type: AWS::EC2::Instance
    Properties: 
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
      InstanceType: !FindInMap [RegionToInstanceType, !Ref 'AWS::Region', InstanceType]
```

### Eingabeparameter und `Fn::FindInMap`
<a name="mappings-section-structure-input-parameter-example"></a>

Die folgende Beispielvorlage zeigt, wie Sie eine EC2-Instance mit mehreren Mappings erstellen. Die Vorlage verwendet verschachtelte Zuordnungen, um automatisch den geeigneten Instanztyp und die entsprechende Sicherheitsgruppe basierend auf dem Ziel- AWS-Region und Umgebungstyp (oder) auszuwählen. `Dev` `Prod` Außerdem verwendet es einen Systems Manager-Parameter, um dynamisch das neueste Amazon Linux 2 AMI abzurufen.

#### JSON
<a name="mappings-section-structure-input-parameter-example.json"></a>

```
{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Parameters" : {
    "EnvironmentType" : {
      "Description" : "The environment type (Dev or Prod)",
      "Type" : "String",
      "Default" : "Dev",
      "AllowedValues" : [ "Dev", "Prod" ]
    }
  },
  "Mappings" : {
    "RegionAndEnvironmentToInstanceType" : {
      "us-east-1"        : { "Dev" : "t3.micro", "Prod" : "c5.large" },
      "us-west-1"        : { "Dev" : "t2.micro", "Prod" : "m5.large" }
    },
    "RegionAndEnvironmentToSecurityGroup" : {
      "us-east-1"        : { "Dev" : "sg-12345678", "Prod" : "sg-abcdef01" },
      "us-west-1"        : { "Dev" : "sg-ghijkl23", "Prod" : "sg-45678abc" }
    }
  },
  "Resources" : {
    "Ec2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "ImageId" : "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
        "InstanceType" : { "Fn::FindInMap": [ "RegionAndEnvironmentToInstanceType", { "Ref": "AWS::Region" }, { "Ref": "EnvironmentType" } ]},
        "SecurityGroupIds" : [{ "Fn::FindInMap" : [ "RegionAndEnvironmentToSecurityGroup", { "Ref" : "AWS::Region" }, { "Ref" : "EnvironmentType" } ]}]
      }
    }
  }
}
```

#### YAML
<a name="mappings-section-structure-input-parameter-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EnvironmentType: 
    Description: The environment type (Dev or Prod)
    Type: String
    Default: Dev
    AllowedValues: 
      - Dev
      - Prod
Mappings:
  RegionAndEnvironmentToInstanceType:
    us-east-1: 
      Dev: t3.micro
      Prod: c5.large
    us-west-1: 
      Dev: t2.micro
      Prod: m5.large
  RegionAndEnvironmentToSecurityGroup: 
    us-east-1: 
      Dev: sg-12345678
      Prod: sg-abcdef01
    us-west-1: 
      Dev: sg-ghijkl23
      Prod: sg-45678abc
Resources:
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
      InstanceType: !FindInMap [RegionAndEnvironmentToInstanceType, !Ref 'AWS::Region', !Ref EnvironmentType]
      SecurityGroupIds:
        - !FindInMap [RegionAndEnvironmentToSecurityGroup, !Ref 'AWS::Region', !Ref EnvironmentType]
```

## Zugehörige Ressourcen
<a name="mappings-section-related-resources"></a>

Diese verwandten Themen können hilfreich sein, wenn Sie Vorlagen entwickeln, die die Funktion `Fn::FindInMap` verwenden.
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-findinmap.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-findinmap.html)
+ [Fn::FindInMap-Verbesserungen](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-findinmap-enhancements.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html)

# CloudFormation MetadataVorlagensyntax
<a name="metadata-section-structure"></a>

`Metadata` speichert zusätzliche Informationen in Form von JSON- oder YAML-Objekten. Zu den Arten von Metadaten auf Vorlagenebene, die Sie in Ihrer Vorlage verwenden können, gehören:

Benutzerdefinierte Metadaten  
Speichert benutzerdefinierte Schlüssel-Werte-Paare. Sie können zum Beispiel zusätzliche Informationen bereitstellen, die sich nicht auf die Erstellung von Ressourcen auswirken, aber zusätzlichen Kontext über die Infrastruktur, das Team oder die Besonderheiten der Bereitstellung bieten.

`AWS::CloudFormation::Interface`  
Definiert die Gruppierung und Reihenfolge von Eingabeparametern, wenn sie in der CloudFormation Konsole angezeigt werden. Standardmäßig sortiert die CloudFormation Konsole Parameter alphabetisch nach ihrer logischen ID. 

`AWS::CloudFormation::Designer`  
CloudFormation Designer (Designer) hat am 5. Februar 2025 das Ende seiner Nutzungsdauer erreicht.



**Wichtig**  
Der Abschnitt `Metadata` kann während einer Stack-Aktualisierung nicht allein aktualisiert werden. Sie können ihn nur aktualisieren, wenn Sie Änderungen einschließen, die Ressourcen hinzufügen, ändern oder löschen.  
CloudFormation transformiert, modifiziert oder redigiert keine Informationen, die Sie in den `Metadata` Abschnitt aufnehmen. Aus diesem Grund wird dringend empfohlen, diesen Abschnitt nicht zu verwenden, um vertrauliche Informationen wie Passwörter oder Secrets zu speichern.

## Syntax
<a name="metadata-section-structure-syntax"></a>

Verwenden Sie die folgende Syntax, um benutzerdefinierte Metadaten in Ihrer CloudFormation Vorlage zu deklarieren:

### JSON
<a name="metadata-section-structure-syntax.json"></a>

```
"Metadata" : {
  "Instances" : {"Description" : "Information about the instances"},
  "Databases" : {"Description" : "Information about the databases"}
}
```

### YAML
<a name="metadata-section-structure-syntax.yaml"></a>

```
Metadata:
  Instances:
    Description: "Information about the instances"
  Databases: 
    Description: "Information about the databases"
```

Für die Syntax für `AWS::CloudFormation::Interface`siehe [Organisieren von CloudFormation Parametern mit `AWS::CloudFormation::Interface` Metadaten](aws-cloudformation-interface.md).

# Organisieren von CloudFormation Parametern mit `AWS::CloudFormation::Interface` Metadaten
<a name="aws-cloudformation-interface"></a>

`AWS::CloudFormation::Interface`ist ein Metadatenschlüssel, der definiert, wie Parameter in der CloudFormation Konsole gruppiert und sortiert werden. Standardmäßig listet die Konsole Eingabeparameter in alphabetischer Reihenfolge nach ihren logischen IDs auf, wenn Sie Stapel in der Konsole erstellen oder aktualisieren. Mit diesem Schlüssel können Sie Ihre eigenen Parameter zum Gruppieren und Sortieren definieren, damit Benutzer effizient Parameterwerte angeben können. Sie können beispielsweise alle EC2-bezogenen Parameter in einer Gruppe zusammenfassen und alle VPC-Parameter in einer anderen Gruppe.

Im Metadatenschlüssel können Sie angeben, welche Gruppen erstellt werden sollen, welche Parameter in die jeweiligen Gruppen eingeschlossen werden sollen und in welcher Reihenfolge die Parameter innerhalb der einzelnen Gruppen in der Konsole angezeigt werden sollen. 

Sie können auch Beschriftungen für Parameter definieren. Eine Bezeichnung ist ein Anzeigename oder eine Beschreibung, den die Konsole anstelle der logischen Parameter-ID anzeigt. Anhand von Bezeichnungen können Benutzer die Werte, die für Parameter angegeben werden, einfacher verstehen. Sie können z. B. einen `KeyPair`-Parameter mit `Select an EC2 key pair` bezeichnen.

Alle Parameter, die Sie im Metadatenschlüssel referenzieren, müssen im Abschnitt `Parameters` der Vorlage deklariert sein.

**Anmerkung**  
Nur die CloudFormation Konsole verwendet den `AWS::CloudFormation::Interface` Metadatenschlüssel. AWS CLI und API-Aufrufe verwenden diesen Schlüssel nicht.

## Syntax
<a name="aws-resource-cloudformation-interface-syntax"></a>

Verwenden Sie die folgende Syntax, um diese Entität in Ihrer CloudFormation Vorlage zu deklarieren:

### JSON
<a name="aws-resource-cloudformation-interface-syntax.json"></a>

```
"Metadata" : {
  "AWS::CloudFormation::Interface" : {
    "ParameterGroups": [
      {
        "Label": {
          "default": "Group Label"
        },
        "Parameters": [
          "Parameter1",
          "Parameter2"
        ]
      }
    ],
    "ParameterLabels": {
      "Parameter1": {
        "default": "Friendly Name for Parameter1"
      }
    }
  }
}
```

### YAML
<a name="aws-resource-cloudformation-interface-syntax.yaml"></a>

```
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: Group Label
        Parameters:
          - Parameter1
          - Parameter2
    ParameterLabels:
      Parameter1:
        default: Friendly Name for Parameter1
```

## Eigenschaften
<a name="w2aac11c23c29c17c17"></a>

`ParameterGroups`  
Eine Liste der Parameter-Gruppentypen, für die Sie Gruppennamen, die Parameter in jeder Gruppe und die Reihenfolge, in der die Parameter angezeigt werden, angeben.  
*Required*: No    
`Label`  
Ein Name für die Parametergruppe.  
*Required*: No  
`default`  
Das Standardlabel, das die CloudFormation Konsole verwendet, um eine Parametergruppe zu benennen.  
*Required*: No  
*Typ:* Zeichenfolge  
`Parameters`  
Eine Liste von Parametern, bei denen Groß- und Kleinschreibung beachtet wird IDs , die logisch in die Gruppe aufgenommen werden sollen. Parameter müssen bereits im `Parameters`-Abschnitt der Vorlage definiert sein. Ein Parameter kann nur in eine Parametergruppe eingeschlossen werden.  
In der Konsole werden die Parameter, die nicht mit einer Parametergruppe verknüpft werden, in alphabetischer Reihenfolge in der `Other parameters`-Gruppe aufgeführt.  
*Required*: No  
*Typ*: Liste von Zeichenfolgenwerten

`ParameterLabels`  
Eine Zuordnung von Parametern und ihren benutzerfreundlichen Namen, die in der CloudFormation Konsole angezeigt wird, wenn ein Stack erstellt oder aktualisiert wird.  
*Required*: No    
Parameterbezeichnung  
Eine Bezeichnung für einen Parameter. Das Label definiert einen benutzerfreundlichen Namen oder eine Beschreibung, die die CloudFormation Konsole auf der Seite „**Parameter angeben**“ anzeigt, wenn ein Stack erstellt oder aktualisiert wird. Die Parameterbezeichnung muss die logische ID eines gültigen Parameters sein, der im Abschnitt `Parameters` der Vorlage deklariert wurde.  
*Required*: No  
`default`  
Das Standardlabel, das die CloudFormation Konsole zur Benennung eines Parameters verwendet.  
*Required*: No  
*Typ:* Zeichenfolge

## Beispiel
<a name="w2aac11c23c29c17c19"></a>

Im folgenden Beispiel werden zwei Parametergruppen definiert: `Network Configuration` und `Amazon EC2 Configuration`. Die `Network Configuration`-Gruppe enthält die Parameter `VPCID``SubnetId` und `SecurityGroupID`, die im Bereich `Parameters` der Vorlage (nicht dargestellt) definiert werden. Die Reihenfolge, in der die Konsole diese Parameter anzeigt, wird durch die Reihenfolge bestimmt, in der die Parameter beginnend mit dem `VPCID`-Parameter aufgeführt sind. Im Beispiel werden die `Amazon EC2 Configuration`-Parameter auf ähnliche Weise gruppiert und sortiert.

Außerdem wird eine Bezeichnung für den `VPCID`-Parameter definiert. Die Konsole zeigt **Welchen VPCs sollten diese bereitgestellt werden?** statt der logischen ID des Parameters (`VPCID`).

### JSON
<a name="aws-cloudformation-interface-example.json"></a>

```
"Metadata" : {
  "AWS::CloudFormation::Interface" : {
    "ParameterGroups" : [
      {
        "Label" : { "default" : "Network Configuration" },
        "Parameters" : [ "VPCID", "SubnetId", "SecurityGroupID" ]
      },
      {
        "Label" : { "default":"Amazon EC2 Configuration" },
        "Parameters" : [ "InstanceType", "KeyName" ]
      }
    ],
    "ParameterLabels" : {
      "VPCID" : { "default" : "Which VPC should this be deployed to?" }
    }
  }
}
```

### YAML
<a name="aws-cloudformation-interface-example.yaml"></a>

```
Metadata: 
  AWS::CloudFormation::Interface: 
    ParameterGroups: 
      - Label: 
          default: "Network Configuration"
        Parameters: 
          - VPCID
          - SubnetId
          - SecurityGroupID
      - Label: 
          default: "Amazon EC2 Configuration"
        Parameters: 
          - InstanceType
          - KeyName
    ParameterLabels: 
      VPCID: 
        default: "Which VPC should this be deployed to?"
```

### Parametergruppen in der Konsole
<a name="w2aac11c23c29c17c19c11"></a>

In der folgenden Abbildung wird dargestellt, wie die Konsole die Parametergruppen unter Verwendung des Metadatenschlüssels anzeigt, wenn ein Stack erstellt oder aktualisiert wird: **Parametergruppen in der Konsole** 

![\[Konsole mit Parametergruppen für dieses Beispiel.\]](http://docs.aws.amazon.com/de_de/AWSCloudFormation/latest/UserGuide/images/console-create-stack-parameter-groups.png)


# CloudFormation RulesVorlagensyntax
<a name="rules-section-structure"></a>

Der `Rules` Abschnitt ist ein optionaler Teil einer CloudFormation Vorlage, der eine benutzerdefinierte Validierungslogik ermöglicht. Sofern enthalten, enthält dieser Abschnitt Regelfunktionen, die Parameterwerte validieren, bevor Ressourcen CloudFormation erstellt oder aktualisiert werden.

Regeln sind nützlich, wenn die Standard-Parameterbeschränkungen nicht ausreichen. Wenn zum Beispiel SSL aktiviert ist, müssen sowohl ein Zertifikat als auch ein Domainnname angegeben werden. Eine Regel kann sicherstellen, dass diese Abhängigkeiten erfüllt werden.

## Syntax
<a name="template-constraint-rules-syntax"></a>

Der Abschnitt `Rules` verwendet die folgende Syntax:

### JSON
<a name="rules-section-structure-syntax.json"></a>

Der Abschnitt `Rules` einer Vorlage besteht aus dem Schlüsselnamen `Rules`, gefolgt von einem einzigen Doppelpunkt. Sie müssen Klammern verwenden, um alle Regeldeklarationen einzuschließen. Wenn Sie mehrere Regeln deklarieren, werden diese durch Kommas voneinander getrennt. Für jede Regel deklarieren Sie einen logischen Namen in Anführungszeichen gefolgt von einem Doppelpunkt und Klammern, die die Regelbedingung und Assertionen umschließen.

```
{
    "Rules": {
        "LogicalRuleName1": {
            "RuleCondition": {
                "rule-specific intrinsic function": "Value"
            },
            "Assertions": [
                {
                    "Assert": {
                        "rule-specific intrinsic function": "Value"
                    },
                    "AssertDescription": "Information about this assert"
                },
                {
                    "Assert": {
                        "rule-specific intrinsic function": "Value"
                    },
                    "AssertDescription": "Information about this assert"
                }
            ]
        },
        "LogicalRuleName2": {
            "Assertions": [
                {
                    "Assert": {
                        "rule-specific intrinsic function": "Value"
                    },
                    "AssertDescription": "Information about this assert"
                }
            ]
        }
    }
}
```

### YAML
<a name="rules-section-structure-syntax.yaml"></a>

```
Rules:
  LogicalRuleName1:
    RuleCondition:
      rule-specific intrinsic function: Value
    Assertions:
      - Assert:
          rule-specific intrinsic function: Value
        AssertDescription: Information about this assert
      - Assert:
          rule-specific intrinsic function: Value
        AssertDescription: Information about this assert
  LogicalRuleName2:
    Assertions:
      - Assert:
          rule-specific intrinsic function: Value
        AssertDescription: Information about this assert
```

### Felder für Regeln
<a name="rules-section-fields"></a>

Der Abschnitt `Rules` kann die folgenden Felder enthalten:

**Logische ID (auch *logischer Name*genannt)**  
Ein eindeutiger Bezeichner für jede Regel.

**`RuleCondition` (optional)**  
Eine Eigenschaft, die bestimmt, wann eine Regel in Kraft tritt. Wenn Sie keine Regelbedingung definieren, werden die Assertions der Regel immer wirksam. Für jede Regel können Sie nur eine Regelbedingung definieren. 

**`Assertions` (Erforderlich)**  
Eine oder mehrere Anweisungen, die die akzeptablen Werte für einen bestimmten Parameter angeben.

**`Assert`**  
Eine Bedingung, die zu `true`ausgewertet werden muss.

**`AssertDescription`**  
Eine Meldung, die angezeigt wird, wenn eine Assertion fehlschlägt.

## Regelspezifische intrinsische Funktionen
<a name="rules-specific-intrinsic-section-structure"></a>

Um Ihre Regeln zu definieren, müssen Sie die *regelspezifischen Funktionen* verwenden, d.h. Funktionen, die nur im Abschnitt `Rules` einer Vorlage verwendet werden können. Diese Funktionen können zwar verschachtelt werden, aber das Endergebnis einer Regelbedingung oder Behauptung muss entweder `true` oder `false`sein.

Die folgenden Regelfunktionen sind verfügbar:
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-and](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-and)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-contains](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-contains)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-eachmemberequals](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-eachmemberequals)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-eachmemberin](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-eachmemberin)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-equals](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-equals)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-not](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-not)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-refall](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-refall)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-valueof](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-valueof)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-valueofall](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-rules.html#fn-valueofall)

Diese Funktionen werden in den Bedingungen oder Behauptungen einer Regel verwendet. Die Eigenschaft condition bestimmt, ob die Assertionen CloudFormation angewendet werden. Wenn die Bedingung zu ausgewertet wird`true`, werden die Assertionen CloudFormation ausgewertet, um zu überprüfen, ob ein Parameterwert gültig ist, wenn ein bereitgestelltes Produkt erstellt oder aktualisiert wird. Wenn ein Parameterwert ungültig ist, wird der Stack von CloudFormation nicht erstellt oder aktualisiert. Wenn die Bedingung als 0 ausgewertet wird`false`, wird der Parameterwert CloudFormation nicht überprüft und der Stack-Vorgang wird fortgesetzt.

## Beispiele
<a name="template-constraint-rules-example"></a>

**Topics**
+ [Bedingtes Überprüfen eines Parameterwerts](#template-constraint-rules-example-verify)
+ [Parameterübergreifende Validierung](#template-cross-parameter-rules-example)

### Bedingtes Überprüfen eines Parameterwerts
<a name="template-constraint-rules-example-verify"></a>

Im folgenden Beispiel überprüfen die beiden Regeln den Wert des Parameters `InstanceType`. Abhängig vom Wert des Umgebungsparameters (`test` oder `prod`) muss der Benutzer `t3.medium` oder `t3.large` für den Parameter `InstanceType` angeben. Die Parameter `InstanceType` und `Environment` müssen im `Parameters`-Abschnitt derselben Vorlage deklariert sein.

#### JSON
<a name="rules-section-example-conditionally-verify.json"></a>

```
{
  "Rules": {
    "testInstanceType": {
      "RuleCondition": {
        "Fn::Equals": [
          {"Ref": "Environment"},
          "test"
        ]
      },
      "Assertions": [
        {
          "Assert": {
            "Fn::Contains": [
              ["t3.medium"],
              {"Ref": "InstanceType"}
            ]
          },
          "AssertDescription": "For a test environment, the instance type must be t3.medium"
        }
      ]
    },
    "prodInstanceType": {
      "RuleCondition": {
        "Fn::Equals": [
          {"Ref": "Environment"},
          "prod"
        ]
      },
      "Assertions": [
        {
          "Assert": {
            "Fn::Contains": [
              ["t3.large"],
              {"Ref": "InstanceType"}
            ]
          },
          "AssertDescription": "For a production environment, the instance type must be t3.large"
        }
      ]
    }
  }
}
```

#### YAML
<a name="rules-section-example-conditionally-verify.yaml"></a>

```
Rules:
  testInstanceType:
    RuleCondition: !Equals 
      - !Ref Environment
      - test
    Assertions:
      - Assert:
          'Fn::Contains':
            - - t3.medium
            - !Ref InstanceType
        AssertDescription: 'For a test environment, the instance type must be t3.medium'
  prodInstanceType:
    RuleCondition: !Equals 
      - !Ref Environment
      - prod
    Assertions:
      - Assert:
          'Fn::Contains':
            - - t3.large
            - !Ref InstanceType
        AssertDescription: 'For a production environment, the instance type must be t3.large'
```

### Parameterübergreifende Validierung
<a name="template-cross-parameter-rules-example"></a>

Die folgenden Beispielvorlagen veranschaulichen die Verwendung von Regeln für parameterübergreifende Überprüfungen. Sie erstellen eine Beispiel-Website, die auf einer Auto Scaling-Gruppe hinter einem Load Balancer läuft. Die Website ist je nach Eingabeparametern auf Port 80 oder 443 verfügbar. Die Instances in der Auto Scaling-Gruppe können so konfiguriert werden, dass sie auf einem beliebigen Port lauschen (8888 ist die Standardeinstellung).

Die Regeln in dieser Vorlage validieren die Eingabeparameter vor der Erstellung des Stapels. Sie überprüfen, ob alle Subnetze zur angegebenen VPC gehören und stellen sicher, dass, wenn der Parameter `UseSSL` auf `Yes`gesetzt wird, sowohl ein SSL-Zertifikat-ARN als auch ein Name der gehosteten Zone angegeben werden.

**Anmerkung**  
Wenn Sie einen Stack anhand dieser Vorlage erstellen, werden Ihnen die verwendeten AWS Ressourcen in Rechnung gestellt.

#### JSON
<a name="rules-section-example-cross-parameter-validation.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters": {
    "VpcId": {
      "Type": "AWS::EC2::VPC::Id",
      "Description": "VpcId of your existing Virtual Private Cloud (VPC)",
      "ConstraintDescription": "must be the VPC Id of an existing Virtual Private Cloud."
    },
    "Subnets": {
      "Type": "List<AWS::EC2::Subnet::Id>",
      "Description": "The list of SubnetIds in your Virtual Private Cloud (VPC)",
      "ConstraintDescription": "must be a list of at least two existing subnets associated with at least two different availability zones."
    },
    "InstanceType": {
      "Description": "WebServer EC2 instance type",
      "Type": "String",
      "Default": "t2.micro",
      "AllowedValues": ["t2.micro", "t3.micro"],
      "ConstraintDescription": "must be a valid EC2 instance type."
    },
    "KeyName": {
      "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instances",
      "Type": "AWS::EC2::KeyPair::KeyName",
      "ConstraintDescription": "must be the name of an existing EC2 KeyPair."
    },
    "SSHLocation": {
      "Description": "The IP address range that can be used to SSH to the EC2 instances",
      "Type": "String",
      "MinLength": "9",
      "MaxLength": "18",
      "Default": "0.0.0.0/0",
      "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
      "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x."
    },
    "UseSSL": {
      "AllowedValues": ["Yes", "No"],
      "Default": "No",
      "Description": "Select \"Yes\" to implement SSL, \"No\" to skip (default).",
      "Type": "String"
    },
    "ALBSSLCertificateARN": {
      "Default": "",
      "Description": "[Optional] The ARN of the SSL certificate to be used for the Application Load Balancer",
      "Type": "String"
    },
    "HostedZoneName": {
      "AllowedPattern": "^$|(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$",
      "Default": "",
      "Description": "[Optional] The domain name of a valid Hosted Zone on AWS.",
      "Type": "String"
    }
  },
  "Conditions": {
    "UseALBSSL": {"Fn::Equals": [{"Ref": "UseSSL"}, "Yes"]}
  },
  "Rules": {
    "SubnetsInVPC": {
      "Assertions": [
        {
          "Assert": {"Fn::EachMemberEquals": [{"Fn::ValueOf": ["Subnets", "VpcId"]}, {"Ref": "VpcId"}]},
          "AssertDescription": "All subnets must be in the VPC"
        }
      ]
    },
    "ValidateHostedZone": {
      "RuleCondition": {"Fn::Equals": [{"Ref": "UseSSL"}, "Yes"]},
      "Assertions": [
        {
          "Assert": {"Fn::Not": [{"Fn::Equals": [{"Ref": "ALBSSLCertificateARN"}, ""]}]},
          "AssertDescription": "ACM Certificate value cannot be empty if SSL is required"
        },
        {
          "Assert": {"Fn::Not": [{"Fn::Equals": [{"Ref": "HostedZoneName"}, ""]}]},
          "AssertDescription": "Route53 Hosted Zone Name is mandatory when SSL is required"
        }
      ]
    }
  },
  "Resources": {
    "WebServerGroup": {
      "Type": "AWS::AutoScaling::AutoScalingGroup",
      "Properties": {
        "VPCZoneIdentifier": {"Ref": "Subnets"},
        "LaunchTemplate": {
          "LaunchTemplateId": {"Ref": "LaunchTemplate"},
          "Version": {"Fn::GetAtt": ["LaunchTemplate","LatestVersionNumber"]}
        },
        "MinSize": "2",
        "MaxSize": "2",
        "TargetGroupARNs": [{"Ref": "ALBTargetGroup"}]
      },
      "CreationPolicy": {
        "ResourceSignal": {"Timeout": "PT15M"}
      },
      "UpdatePolicy": {
        "AutoScalingRollingUpdate": {
          "MinInstancesInService": "1",
          "MaxBatchSize": "1",
          "PauseTime": "PT15M",
          "WaitOnResourceSignals": true
        }
      }
    },
    "LaunchTemplate": {
      "Type": "AWS::EC2::LaunchTemplate",
      "Metadata": {
        "Comment": "Install a simple application",
        "AWS::CloudFormation::Init": {
          "config": {
            "packages": {"yum": {"httpd": []}},
            "files": {
              "/var/www/html/index.html": {
                "content": {"Fn::Join": ["\n", ["<h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>"]]},
                "mode": "000644",
                "owner": "root",
                "group": "root"
              },
              "/etc/cfn/cfn-hup.conf": {
                "content": {"Fn::Join": ["", [
                  "[main]\n",
                  "stack=", {"Ref": "AWS::StackId"}, "\n",
                  "region=", {"Ref": "AWS::Region"}, "\n"
                ]]},
                "mode": "000400",
                "owner": "root",
                "group": "root"
              },
              "/etc/cfn/hooks.d/cfn-auto-reloader.conf": {
                "content": {"Fn::Join": ["", [
                  "[cfn-auto-reloader-hook]\n",
                  "triggers=post.update\n",
                  "path=Resources.LaunchTemplate.Metadata.AWS::CloudFormation::Init\n",
                  "action=/opt/aws/bin/cfn-init -v ",
                  "         --stack ", {"Ref": "AWS::StackName"},
                  "         --resource LaunchTemplate ",
                  "         --region ", {"Ref": "AWS::Region"}, "\n",
                  "runas=root\n"
                ]]},
                "mode": "000400",
                "owner": "root",
                "group": "root"
              }
            },
            "services": {
              "sysvinit": {
                "httpd": {
                  "enabled": "true",
                  "ensureRunning": "true"
                },
                "cfn-hup": {
                  "enabled": "true",
                  "ensureRunning": "true",
                  "files": [
                    "/etc/cfn/cfn-hup.conf",
                    "/etc/cfn/hooks.d/cfn-auto-reloader.conf"
                  ]
                }
              }
            }
          }
        }
      },
      "Properties": {
        "LaunchTemplateName": {"Fn::Sub": "${AWS::StackName}-launch-template"},
        "LaunchTemplateData": {
          "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
          "SecurityGroupIds": [{"Ref": "InstanceSecurityGroup"}],
          "InstanceType": {"Ref": "InstanceType"},
          "KeyName": {"Ref": "KeyName"},
          "UserData": {
            "Fn::Base64": {"Fn::Join": ["", [
              "#!/bin/bash\n",
              "yum install -y aws-cfn-bootstrap\n",
              "/opt/aws/bin/cfn-init -v ",
              "         --stack ", {"Ref": "AWS::StackName"},
              "         --resource LaunchTemplate ",
              "         --region ", {"Ref": "AWS::Region"}, "\n",
              "/opt/aws/bin/cfn-signal -e $? ",
              "         --stack ", {"Ref": "AWS::StackName"},
              "         --resource WebServerGroup ",
              "         --region ", {"Ref": "AWS::Region"}, "\n"
            ]]}
          }
        }
      }
    },
    "ELBSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupDescription": "Allow access to the ELB",
        "VpcId": {"Ref": "VpcId"},
        "SecurityGroupIngress": [{
          "Fn::If": [
            "UseALBSSL",
            {
              "IpProtocol": "tcp",
              "FromPort": 443,
              "ToPort": 443,
              "CidrIp": "0.0.0.0/0"
            },
            {
              "IpProtocol": "tcp",
              "FromPort": 80,
              "ToPort": 80,
              "CidrIp": "0.0.0.0/0"
            }
          ]
        }]
      }
    },
    "ApplicationLoadBalancer": {
      "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
      "Properties": {
        "Subnets": {"Ref": "Subnets"},
        "SecurityGroups": [{"Ref": "ELBSecurityGroup"}]
      }
    },
    "ALBListener": {
      "Type": "AWS::ElasticLoadBalancingV2::Listener",
      "Properties": {
        "DefaultActions": [{
          "Type": "forward",
          "TargetGroupArn": {"Ref": "ALBTargetGroup"}
        }],
        "LoadBalancerArn": {"Ref": "ApplicationLoadBalancer"},
        "Port": {"Fn::If": ["UseALBSSL", 443, 80]},
        "Protocol": {"Fn::If": ["UseALBSSL", "HTTPS", "HTTP"]},
        "Certificates": [{
          "Fn::If": [
            "UseALBSSL",
            {"CertificateArn": {"Ref": "ALBSSLCertificateARN"}},
            {"Ref": "AWS::NoValue"}
          ]
        }]
      }
    },
    "ALBTargetGroup": {
      "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties": {
        "HealthCheckIntervalSeconds": 30,
        "HealthCheckTimeoutSeconds": 5,
        "HealthyThresholdCount": 3,
        "Port": 80,
        "Protocol": "HTTP",
        "UnhealthyThresholdCount": 5,
        "VpcId": {"Ref": "VpcId"}
      }
    },
    "InstanceSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupDescription": "Enable SSH access and HTTP access on the inbound port",
        "SecurityGroupIngress": [
          {
            "IpProtocol": "tcp",
            "FromPort": 80,
            "ToPort": 80,
            "SourceSecurityGroupId": {"Fn::Select": [0, {"Fn::GetAtt": ["ApplicationLoadBalancer", "SecurityGroups"]}]}
          },
          {
            "IpProtocol": "tcp",
            "FromPort": 22,
            "ToPort": 22,
            "CidrIp": {"Ref": "SSHLocation"}
          }
        ],
        "VpcId": {"Ref": "VpcId"}
      }
    },
    "RecordSet": {
      "Type": "AWS::Route53::RecordSetGroup",
      "Condition": "UseALBSSL",
      "Properties": {
        "HostedZoneName": {"Fn::Join": ["", [{"Ref": "HostedZoneName"}, "."]]},
        "RecordSets": [{
          "Name": {"Fn::Join": ["", [
            {"Fn::Select": ["0", {"Fn::Split": [".", {"Fn::GetAtt": ["ApplicationLoadBalancer", "DNSName"]}]}]},
            ".",
            {"Ref": "HostedZoneName"},
            "."
          ]]},
          "Type": "A",
          "AliasTarget": {
            "DNSName": {"Fn::GetAtt": ["ApplicationLoadBalancer", "DNSName"]},
            "EvaluateTargetHealth": true,
            "HostedZoneId": {"Fn::GetAtt": ["ApplicationLoadBalancer", "CanonicalHostedZoneID"]}
          }
        }]
      }
    }
  },
  "Outputs": {
    "URL": {
      "Description": "URL of the website",
      "Value": {"Fn::Join": ["", [
        {"Fn::If": [
          "UseALBSSL",
          {"Fn::Join": ["", [
            "https://",
            {"Fn::Join": ["", [
              {"Fn::Select": ["0", {"Fn::Split": [".", {"Fn::GetAtt": ["ApplicationLoadBalancer", "DNSName"]}]}]},
              ".",
              {"Ref": "HostedZoneName"},
              "."
            ]]}
          ]]},
          {"Fn::Join": ["", [
            "http://",
            {"Fn::GetAtt": ["ApplicationLoadBalancer", "DNSName"]}
          ]]}
        ]}
      ]]}
    }
  }
}
```

#### YAML
<a name="rules-section-example-syntax.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  VpcId:
    Type: AWS::EC2::VPC::Id
    Description: VpcId of your existing Virtual Private Cloud (VPC)
    ConstraintDescription: must be the VPC Id of an existing Virtual Private Cloud.
  Subnets:
    Type: List<AWS::EC2::Subnet::Id>
    Description: The list of SubnetIds in your Virtual Private Cloud (VPC)
    ConstraintDescription: >-
      must be a list of at least two existing subnets associated with at least
      two different availability zones. They should be residing in the selected
      Virtual Private Cloud.
  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t3.micro
    ConstraintDescription: must be a valid EC2 instance type.
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instances
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  UseSSL:
    AllowedValues:
      - 'Yes'
      - 'No'
    ConstraintDescription: Select Yes to create a HTTPS Listener
    Default: 'No'
    Description: 'Select "Yes" to implement SSL, "No" to skip (default).'
    Type: String
  ALBSSLCertificateARN:
    Default: ''
    Description: >-
      [Optional] The ARN of the SSL certificate to be used for the Application
      Load Balancer
    Type: String
  HostedZoneName:
    AllowedPattern: >-
      ^$|(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$
    Default: ''
    Description: '[Optional] The domain name of a valid Hosted Zone on AWS.'
    Type: String
Conditions:
  UseALBSSL: !Equals 
    - !Ref UseSSL
    - 'Yes'
Rules:
  SubnetsInVPC:
    Assertions:
      - Assert:
          'Fn::EachMemberEquals':
            - 'Fn::ValueOf':
                - Subnets
                - VpcId
            - Ref: VpcId
        AssertDescription: All subnets must be in the VPC
  ValidateHostedZone:
    RuleCondition: !Equals 
      - !Ref UseSSL
      - 'Yes'
    Assertions:
      - Assert: !Not 
          - !Equals 
            - !Ref ALBSSLCertificateARN
            - ''
        AssertDescription: ACM Certificate value cannot be empty if SSL is required
      - Assert: !Not 
          - !Equals 
            - !Ref HostedZoneName
            - ''
        AssertDescription: Route53 Hosted Zone Name is mandatory when SSL is required
Resources:
  WebServerGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      VPCZoneIdentifier: !Ref Subnets
      LaunchTemplate:
        LaunchTemplateId: !Ref LaunchTemplate
        Version: !GetAtt LaunchTemplate.LatestVersionNumber
      MinSize: '2'
      MaxSize: '2'
      TargetGroupARNs:
        - !Ref ALBTargetGroup
    CreationPolicy:
      ResourceSignal:
        Timeout: PT15M
    UpdatePolicy:
      AutoScalingRollingUpdate:
        MinInstancesInService: '1'
        MaxBatchSize: '1'
        PauseTime: PT15M
        WaitOnResourceSignals: 'true'
  LaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Metadata:
      Comment: Install a simple application
      AWS::CloudFormation::Init:
        config:
          packages:
            yum:
              httpd: []
          files:
            /var/www/html/index.html:
              content: !Join 
                - |+
                - - >-
                    <h1>Congratulations, you have successfully launched the AWS
                    CloudFormation sample.</h1>
              mode: '000644'
              owner: root
              group: root
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |-
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.LaunchTemplate.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchTemplate --region ${AWS::Region}
                runas=root
              mode: '000400'
              owner: root
              group: root
          services:
            sysvinit:
              httpd:
                enabled: 'true'
                ensureRunning: 'true'
              cfn-hup:
                enabled: 'true'
                ensureRunning: 'true'
                files:
                  - /etc/cfn/cfn-hup.conf
                  - /etc/cfn/hooks.d/cfn-auto-reloader.conf
    Properties:
      LaunchTemplateName: !Sub ${AWS::StackName}-launch-template
      LaunchTemplateData:
        ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
        SecurityGroupIds:
        - !Ref InstanceSecurityGroup
        InstanceType: !Ref InstanceType
        KeyName: !Ref KeyName
        UserData: !Base64
          Fn::Sub: |
            #!/bin/bash
            yum install -y aws-cfn-bootstrap
            /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchTemplate --region ${AWS::Region}
            /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}
  ELBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow access to the ELB
      VpcId: !Ref VpcId
      SecurityGroupIngress:
        - !If 
          - UseALBSSL
          - IpProtocol: tcp
            FromPort: 443
            ToPort: 443
            CidrIp: 0.0.0.0/0
          - IpProtocol: tcp
            FromPort: 80
            ToPort: 80
            CidrIp: 0.0.0.0/0
  ApplicationLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Subnets: !Ref Subnets
      SecurityGroups:
        - !Ref ELBSecurityGroup
  ALBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref ALBTargetGroup
      LoadBalancerArn: !Ref ApplicationLoadBalancer
      Port: !If
        - UseALBSSL
        - 443
        - 80
      Protocol: !If 
        - UseALBSSL
        - HTTPS
        - HTTP
      Certificates:
        - !If 
          - UseALBSSL
          - CertificateArn: !Ref ALBSSLCertificateARN
          - !Ref 'AWS::NoValue'
  ALBTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 30
      HealthCheckTimeoutSeconds: 5
      HealthyThresholdCount: 3
      Port: 80
      Protocol: HTTP
      UnhealthyThresholdCount: 5
      VpcId: !Ref VpcId
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access and HTTP access on the inbound port
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          SourceSecurityGroupId: !Select 
            - 0
            - !GetAtt 
              - ApplicationLoadBalancer
              - SecurityGroups
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref SSHLocation
      VpcId: !Ref VpcId
  RecordSet:
    Type: AWS::Route53::RecordSetGroup
    Condition: UseALBSSL
    Properties:
      HostedZoneName: !Join 
        - ''
        - - !Ref HostedZoneName
          - .
      RecordSets:
        - Name: !Join 
            - ''
            - - !Select 
                - '0'
                - !Split 
                  - .
                  - !GetAtt 
                    - ApplicationLoadBalancer
                    - DNSName
              - .
              - !Ref HostedZoneName
              - .
          Type: A
          AliasTarget:
            DNSName: !GetAtt 
              - ApplicationLoadBalancer
              - DNSName
            EvaluateTargetHealth: true
            HostedZoneId: !GetAtt 
              - ApplicationLoadBalancer
              - CanonicalHostedZoneID
Outputs:
  URL:
    Description: URL of the website
    Value: !Join 
      - ''
      - - !If 
          - UseALBSSL
          - !Join 
            - ''
            - - 'https://'
              - !Join 
                - ''
                - - !Select 
                    - '0'
                    - !Split 
                      - .
                      - !GetAtt 
                        - ApplicationLoadBalancer
                        - DNSName
                  - .
                  - !Ref HostedZoneName
                  - .
          - !Join 
            - ''
            - - 'http://'
              - !GetAtt 
                - ApplicationLoadBalancer
                - DNSName
```

# CloudFormation ConditionsVorlagensyntax
<a name="conditions-section-structure"></a>

Der optionale Abschnitt `Conditions` enthält Anweisungen, die die Bedingungen definieren, unter denen Entitäten erstellt oder konfiguriert werden. Sie können beispielsweise eine Bedingung erstellen und sie einer Ressource oder Ausgabe zuordnen, sodass die Ressource oder Ausgabe nur CloudFormation erstellt wird, wenn die Bedingung erfüllt ist. Ebenso können Sie einer Eigenschaft eine Bedingung zuordnen, sodass die CloudFormation Eigenschaft nur dann auf einen bestimmten Wert gesetzt wird, wenn die Bedingung erfüllt ist. Wenn die Bedingung falsch ist, wird die CloudFormation Eigenschaft auf einen alternativen Wert gesetzt, den Sie angeben.

Sie können Bedingungen verwenden, wenn Sie eine Vorlage wiederverwenden möchten, um Ressourcen in unterschiedlichen Kontexten zu erstellen, z. B. in Test- und Produktionsumgebungen. Sie können zum Beispiel in Ihrer Vorlage einen Eingabeparameter `EnvironmentType` hinzufügen, der entweder `prod` oder `test` als Eingabe akzeptiert. Für die `prod`-Umgebung können Sie EC2-Instances mit bestimmten Funktionen einbeziehen, während Sie für die `test`-Umgebung vielleicht reduzierte Funktionen verwenden, um Geld zu sparen. Mit dieser Bedingungsdefinition können Sie festlegen, welche Ressourcen erstellt werden und wie sie für jeden Umgebungstyp konfiguriert werden.

## Syntax
<a name="conditions-section-structure-syntax"></a>

Der Abschnitt `Conditions` besteht aus dem Schlüsselnamen `Conditions`. Jede Bedingungsdeklaration enthält eine logische ID und eine oder mehrere intrinsische Funktionen. 

### JSON
<a name="conditions-section-structure-syntax.json"></a>

```
"Conditions": {
  "LogicalConditionName1": {
    "Intrinsic function": ...[
  },

  "LogicalConditionName2": {
    "Intrinsic function": ...
  }
}
```

### YAML
<a name="conditions-section-structure-syntax.yaml"></a>

```
Conditions:
  LogicalConditionName1:
    Intrinsic function:
      ...

  LogicalConditionName2:
    Intrinsic function:
      ...
```

## Wie Bedingungen funktionieren
<a name="conditions-section-structure-overview"></a>

Um die Bedingungen zu verwenden, gehen Sie folgendermaßen vor:

1. **Fügen Sie eine Parameterdefinition hinzu**- Definieren Sie die Eingaben, die Ihre Bedingungen auswerten werden, im Abschnitt `Parameters` Ihrer Vorlage. Die Bedingungen werden auf der Grundlage der Werte dieser Eingabeparameter als wahr oder falsch ausgewertet. Beachten Sie, dass Pseudo-Parameter automatisch verfügbar sind und keine explizite Definition im Abschnitt `Parameters` erfordern. Weitere Informationen zu Pseudoparametern finden Sie unter [AWS Werte mithilfe von Pseudo-Parametern abrufen](pseudo-parameter-reference.md).

1. **Fügen Sie eine Bedingungsdefinition hinzu**- Definieren Sie Bedingungen im Abschnitt `Conditions` mit Hilfe von intrinsischen Funktionen wie `Fn::If` oder `Fn::Equals`. Diese Bedingungen bestimmen, wann die zugehörigen Ressourcen CloudFormation erstellt werden. Die Bedingungen können sich auf Folgendes beziehen:
   + Eingabe oder Pseudo-Parameterwerte
   + Andere Bedingungen
   + Werte mappen

   Sie können jedoch in Bedingungen nicht auf logische Ressourcen IDs oder deren Attribute verweisen.

1. **Bedingungen mit Ressourcen oder Ausgängen verknüpfen**- Bedingungen in Ressourcen oder Ausgängen mit dem Schlüssel `Condition` und der logischen ID einer Bedingung referenzieren. Verwenden Sie optional `Fn::If` in anderen Teilen der Vorlage (z. B. bei Eigenschaftswerten), um Werte auf der Grundlage einer Bedingung festzulegen. Weitere Informationen finden Sie unter [Verwendung der Taste `Condition` .](#using-conditions-in-templates).

CloudFormation wertet Bedingungen aus, wenn ein Stack erstellt oder aktualisiert wird. CloudFormation erstellt Entitäten, die mit einer wahren Bedingung verknüpft sind, und ignoriert Entitäten, die einer falschen Bedingung zugeordnet sind. CloudFormation bewertet diese Bedingungen außerdem bei jedem Stack-Update neu, bevor Ressourcen geändert werden. Entitäten, die mit einer wahren Bedingung verbunden bleiben, werden aktualisiert, während diejenigen, die mit einer falschen Bedingung verbunden werden, gelöscht werden.

**Wichtig**  
Bedingungen können während einer Stack-Aktualisierung nicht allein aktualisiert werden. Sie können Bedingungen nur aktualisieren, wenn Sie Änderungen einschließen, die Ressourcen hinzufügen, ändern oder löschen.

## Intrinsische Bedingungsfunktionen
<a name="conditions-section-structure-functions"></a>

Sie können die folgenden intrinsischen Funktionen verwenden, um Bedingungen zu definieren:
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-and](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-and)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-equals](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-equals)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-foreach.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-foreach.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-not](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-not)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-or)

**Anmerkung**  
`Fn::If` wird nur im Metadatenattribut, Aktualisierungsrichtlinienattribut und Eigenschaftswerte im Bereich `Resources` und den Bereichen `Outputs` einer Vorlage unterstützt.

## Verwendung der Taste `Condition` .
<a name="using-conditions-in-templates"></a>

Sobald eine Bedingung definiert ist, können Sie sie an mehreren Stellen in der Vorlage anwenden, beispielsweise `Resources` und `Outputs`, indem Sie den Schlüssel `Condition` verwenden. Der Schlüssel `Condition` verweist auf den logischen Namen einer Bedingung und gibt das ausgewertete Ergebnis der angegebenen Bedingung zurück.

**Topics**
+ [Bedingungen mit Ressourcen verknüpfen](#associate-conditions-with-resources)
+ [Bedingungen mit Ausgaben verknüpfen](#associate-conditions-with-outputs)
+ [Referenzbedingungen in anderen Bedingungen](#reference-conditions-in-other-conditions)
+ [Bedingte Rückgabe von Eigenschaftswerten mit `Fn::If`](#conditional-return-property-values-using-fn-if)

### Bedingungen mit Ressourcen verknüpfen
<a name="associate-conditions-with-resources"></a>

Um Ressourcen bedingt zu erstellen, fügen Sie der Ressource den `Condition` Schlüssel und die logische ID der Bedingung als Attribut hinzu. CloudFormation erstellt die Ressource nur, wenn die Bedingung als wahr ausgewertet wird.

#### JSON
<a name="associate-conditions-with-resources.json"></a>

```
"NewVolume" : {
  "Type" : "AWS::EC2::Volume",
  "Condition" : "IsProduction",
  "Properties" : {
     "Size" : "100",
     "AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]}
  }
}
```

#### YAML
<a name="associate-conditions-with-resources.yaml"></a>

```
NewVolume:
  Type: AWS::EC2::Volume
  Condition: IsProduction
  Properties:
    Size: 100
    AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone
```

### Bedingungen mit Ausgaben verknüpfen
<a name="associate-conditions-with-outputs"></a>

Sie können auch Bedingungen mit Ausgaben verknüpfen. CloudFormation erstellt die Ausgabe nur, wenn die zugehörige Bedingung als wahr ausgewertet wird.

#### JSON
<a name="associate-conditions-with-outputs.json"></a>

```
"Outputs" : {
  "VolumeId" : {
    "Condition" : "IsProduction",
    "Value" : { "Ref" : "NewVolume" }
  }
}
```

#### YAML
<a name="associate-conditions-with-outputs.yaml"></a>

```
Outputs:
  VolumeId:
    Condition: IsProduction
    Value: !Ref NewVolume
```

### Referenzbedingungen in anderen Bedingungen
<a name="reference-conditions-in-other-conditions"></a>

Wenn Sie Bedingungen im Abschnitt `Conditions` definieren, können Sie mit dem Schlüssel `Condition` auf andere Bedingungen verweisen. Damit können Sie eine komplexere bedingte Logik erstellen, indem Sie mehrere Bedingungen kombinieren.

Im folgenden Beispiel wird die Bedingung `IsProdAndFeatureEnabled` nur dann als wahr bewertet, wenn die Bedingungen `IsProduction` und `IsFeatureEnabled` als wahr bewertet werden.

#### JSON
<a name="reference-conditions-in-other-conditions.json"></a>

```
"Conditions": {
  "IsProduction" : {"Fn::Equals" : [{"Ref" : "Environment"}, "prod"]},
  "IsFeatureEnabled" : { "Fn::Equals" : [{"Ref" : "FeatureFlag"}, "enabled"]},
  "IsProdAndFeatureEnabled" : {
    "Fn::And" : [
      {"Condition" : "IsProduction"},
      {"Condition" : "IsFeatureEnabled"}
    ]
  }
}
```

#### YAML
<a name="reference-conditions-in-other-conditions.yaml"></a>

```
Conditions:
  IsProduction:
    !Equals [!Ref Environment, "prod"]
  IsFeatureEnabled:
    !Equals [!Ref FeatureFlag, "enabled"]
  IsProdAndFeatureEnabled: !And
    - !Condition IsProduction
    - !Condition IsFeatureEnabled
```

### Bedingte Rückgabe von Eigenschaftswerten mit `Fn::If`
<a name="conditional-return-property-values-using-fn-if"></a>

Für eine genauere Kontrolle können Sie die intrinsische Funktion `Fn::If` verwenden, um bedingt einen von zwei Eigenschaftswerten innerhalb von Ressourcen oder Ausgaben zurückzugeben. Diese Funktion wertet eine Bedingung aus und gibt einen Wert zurück, wenn die Bedingung wahr ist, und einen anderen Wert, wenn die Bedingung falsch ist.

#### Bedingte Eigenschaftswerte
<a name="using-fn-if-for-conditional-values"></a>

Das folgende Beispiel zeigt, wie Sie einen EC2-Instance-Typ auf der Grundlage einer Umgebungsbedingung festlegen. Wenn die Bedingung `IsProduction` als wahr ausgewertet wird, wird der Instancetyp auf `c5.xlarge`gesetzt. Andernfalls wird er auf `t3.small`gesetzt.

##### JSON
<a name="using-fn-if-for-conditional-values.json"></a>

```
"Properties" : {
  "InstanceType" : {
    "Fn::If" : [
      "IsProduction",
      "c5.xlarge",
      "t3.small"
    ]
  }
}
```

##### YAML
<a name="using-fn-if-for-conditional-values.yaml"></a>

```
Properties:
  InstanceType: !If
    - IsProduction
    - c5.xlarge
    - t3.small
```

#### Bedingte Entfernung von Eigentum
<a name="using-fn-if-with-novalue"></a>

Sie können auch den Pseudoparameter `AWS::NoValue` als Rückgabewert verwenden, um die entsprechende Eigenschaft zu entfernen, wenn eine Bedingung falsch ist.

##### JSON
<a name="using-fn-if-with-novalue.json"></a>

```
"DBSnapshotIdentifier" : {
  "Fn::If" : [
    "UseDBSnapshot",
    {"Ref" : "DBSnapshotName"},
    {"Ref" : "AWS::NoValue"}
  ]
}
```

##### YAML
<a name="using-fn-if-with-novalue.yaml"></a>

```
DBSnapshotIdentifier: !If
  - UseDBSnapshot
  - !Ref DBSnapshotName
  - !Ref "AWS::NoValue"
```

## Beispiele
<a name="conditions-section-structure-examples"></a>

**Topics**
+ [Umweltbasierte Ressourcenerstellung](#environment-based-resource-creation)
+ [Ressourcenbereitstellung unter mehreren Bedingungen](#multi-condition-resource-provisioning)

### Umweltbasierte Ressourcenerstellung
<a name="environment-based-resource-creation"></a>

In den folgenden Beispielen wird eine EC2-Instance bereitgestellt und ein neues EBS-Volume nur dann erstellt und angehängt, wenn der Umgebungstyp `prod`ist. Wenn die Umgebung `test`ist, wird die EC2-Instance einfach ohne das zusätzliche Volume erstellt.

#### JSON
<a name="conditions-section-example-resource-creation.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "EnvType": {
            "Description": "Environment type",
            "Default": "test",
            "Type": "String",
            "AllowedValues": [
                "prod",
                "test"
            ],
            "ConstraintDescription": "must specify prod or test"
        }
    },
    "Conditions": {
        "IsProduction": {
            "Fn::Equals": [
                {
                    "Ref": "EnvType"
                },
                "prod"
            ]
        }
    },
    "Resources": {
        "EC2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": "ami-1234567890abcdef0",
                "InstanceType": "c5.xlarge"
            }
        },
        "MountPoint": {
            "Type": "AWS::EC2::VolumeAttachment",
            "Condition": "IsProduction",
            "Properties": {
                "InstanceId": {
                    "Ref": "EC2Instance"
                },
                "VolumeId": {
                    "Ref": "NewVolume"
                },
                "Device": "/dev/sdh"
            }
        },
        "NewVolume": {
            "Type": "AWS::EC2::Volume",
            "Condition": "IsProduction",
            "Properties": {
                "Size": 100,
                "AvailabilityZone": {
                    "Fn::GetAtt": [
                        "EC2Instance",
                        "AvailabilityZone"
                    ]
                }
            }
        }
    }
}
```

#### YAML
<a name="conditions-section-example-resource-creation.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EnvType:
    Description: Environment type
    Default: test
    Type: String
    AllowedValues:
      - prod
      - test
    ConstraintDescription: must specify prod or test
Conditions:
  IsProduction: !Equals
    - !Ref EnvType
    - prod
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-1234567890abcdef0
      InstanceType: c5.xlarge
  MountPoint:
    Type: AWS::EC2::VolumeAttachment
    Condition: IsProduction
    Properties:
      InstanceId: !Ref EC2Instance
      VolumeId: !Ref NewVolume
      Device: /dev/sdh
  NewVolume:
    Type: AWS::EC2::Volume
    Condition: IsProduction
    Properties:
      Size: 100
      AvailabilityZone: !GetAtt
        - EC2Instance
        - AvailabilityZone
```

### Ressourcenbereitstellung unter mehreren Bedingungen
<a name="multi-condition-resource-provisioning"></a>

Die folgenden Beispiele erstellen einen S3-Bucket, wenn ein Bucket-Name angegeben wird, und fügen nur dann eine Bucket-Richtlinie hinzu, wenn die Umgebung auf `prod`eingestellt ist. Wenn kein Bucket-Name angegeben wird oder die Umgebung `test`lautet, werden keine Ressourcen erstellt.

#### JSON
<a name="conditions-section-example-multi-condition.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "EnvType": {
            "Type": "String",
            "AllowedValues": [
                "prod",
                "test"
            ]
        },
        "BucketName": {
            "Default": "",
            "Type": "String"
        }
    },
    "Conditions": {
        "IsProduction": {
            "Fn::Equals": [
                {
                    "Ref": "EnvType"
                },
                "prod"
            ]
        },
        "CreateBucket": {
            "Fn::Not": [
                {
                    "Fn::Equals": [
                        {
                            "Ref": "BucketName"
                        },
                        ""
                    ]
                }
            ]
        },
        "CreateBucketPolicy": {
            "Fn::And": [
                {
                    "Condition": "IsProduction"
                },
                {
                    "Condition": "CreateBucket"
                }
            ]
        }
    },
    "Resources": {
        "Bucket": {
            "Type": "AWS::S3::Bucket",
            "Condition": "CreateBucket",
            "Properties": {
                "BucketName": {
                    "Ref": "BucketName"
                }
            }
        },
        "Policy": {
            "Type": "AWS::S3::BucketPolicy",
            "Condition": "CreateBucketPolicy",
            "Properties": {
                "Bucket": {
                    "Ref": "Bucket"
                },
                "PolicyDocument": { ... }
            }
        }
    }
}
```

#### YAML
<a name="conditions-section-example-multi-condition.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  EnvType:
    Type: String
    AllowedValues:
      - prod
      - test
  BucketName:
    Default: ''
    Type: String
Conditions:
  IsProduction: !Equals
    - !Ref EnvType
    - prod
  CreateBucket: !Not
    - !Equals
      - !Ref BucketName
      - ''
  CreateBucketPolicy: !And
    - !Condition IsProduction
    - !Condition CreateBucket
Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Condition: CreateBucket
    Properties:
      BucketName: !Ref BucketName
  Policy:
    Type: AWS::S3::BucketPolicy
    Condition: CreateBucketPolicy
    Properties:
      Bucket: !Ref Bucket
      PolicyDocument: ...
```

In diesem Beispiel zeigt die Bedingung `CreateBucketPolicy`, wie Sie mit dem Schlüssel `Condition` auf andere Bedingungen verweisen können. Die Richtlinie wird nur erstellt, wenn die Bedingungen `IsProduction` und `CreateBucket` als wahr bewertet werden.

**Anmerkung**  
Komplexere Beispiele für die Verwendung von Bedingungen finden Sie im Thema [Condition Attribut](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-condition.html) im *CloudFormation Template Reference Guide*.

# CloudFormation TransformAbschnitt „Vorlage“
<a name="transform-section-structure"></a>

Im optionalen `Transform` Abschnitt werden ein oder mehrere Makros angegeben, die CloudFormation verwendet werden, um Ihre Vorlage auf irgendeine Weise zu verarbeiten. 

Makros können einfache Aufgaben wie das Suchen und Ersetzen von Text ausführen, oder sie können umfangreichere Transformationen an der gesamten Vorlage vornehmen. CloudFormation führt Makros in der Reihenfolge aus, in der sie angegeben sind. Wenn Sie einen Änderungssatz erstellen, CloudFormation generiert er einen Änderungssatz, der den verarbeiteten Vorlageninhalt enthält. Sie können dann die Änderungen überprüfen und den Änderungssatz ausführen. Weitere Informationen über die Funktionsweise von Makros finden Sie unter [Führen Sie eine benutzerdefinierte Verarbeitung von CloudFormation Vorlagen mit Vorlagenmakros durch](template-macros.md).

CloudFormation unterstützt auch *Transformationen*, bei denen es sich um Makros handelt, die von bereitgestellt werden. CloudFormation CloudFormation behandelt diese Transformationen in Bezug auf Ausführungsreihenfolge und Umfang genauso wie alle Makros, die Sie erstellen. Weitere Informationen finden Sie unter [Transform-Referenz](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-reference.html).

Um mehrere Makros zu deklarieren, verwenden Sie ein Listenformat und geben Sie ein oder mehrere Makros an.

Im folgenden Vorlagenbeispiel wird beispielsweise CloudFormation ausgewertet `MyMacro` und dann`AWS::Serverless`, beide können den Inhalt der gesamten Vorlage verarbeiten, da sie im Abschnitt enthalten sind. `Transform`

```
# Start of processable content for MyMacro and AWS::Serverless
Transform:
  - MyMacro
  - 'AWS::Serverless'
Resources:
  WaitCondition:
    Type: AWS::CloudFormation::WaitCondition
  MyBucket:
    Type: AWS::S3::Bucket
    Properties: 
      BucketName: amzn-s3-demo-bucket
      Tags: [{"key":"value"}]
      CorsConfiguration: []
  MyEc2Instance:
    Type: AWS::EC2::Instance 
    Properties:
      ImageId: ami-1234567890abcdef0
# End of processable content for MyMacro and AWS::Serverless
```

# CloudFormation Versionssyntax für das Vorlagenformat
<a name="format-version-structure"></a>

Der Abschnitt `AWSTemplateFormatVersion` (optional) gibt die Version des Vorlagenformats an, mit dem die Vorlage übereinstimmt. Die neueste Vorlagenformatversion ist die Version `2010-09-09`. Dies ist derzeit der einzige gültige Wert.

Die Version des Vorlagenformats ist nicht die gleiche wie die API-Version. Die Version des Vorlagenformats kann sich unabhängig von den API-Versionen ändern.

Der zur Deklarierung der Vorlagenformatversion verwendete Wert muss eine Literalzeichenfolge sein. Parameter oder Funktionen dürfen nicht zur Angabe der Vorlagenformatversion verwendet werden. Wenn Sie keinen Wert angeben, CloudFormation wird von der neuesten Version des Vorlagenformats ausgegangen. Der folgende Codeausschnitt ist ein Beispiel für eine gültige Deklaration der Vorlagenformatversion:

## JSON
<a name="format-version-structure-example.json"></a>

```
"AWSTemplateFormatVersion" : "2010-09-09"
```

## YAML
<a name="format-version-structure-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
```

# CloudFormation DescriptionVorlagensyntax
<a name="template-description-structure"></a>

Der Abschnitt `Description` (optional) ermöglicht es Ihnen, eine Textzeichenfolge einzufügen, die die Vorlage beschreibt. Dieser Abschnitt muss immer auf den Abschnitt folgen, der die Vorlagenformatversion festlegt.

Der Wert für die Deklaration der Beschreibung muss eine Literalzeichenfolge mit einer Länge zwischen 0 und 1 024 Byte sein. Parameter oder Funktionen dürfen nicht zur Angabe der Beschreibung verwendet werden. Der folgende Codeausschnitt ist ein Beispiel für die Deklaration einer Beschreibung:

**Wichtig**  
Der Abschnitt `Description` kann während einer Stack-Aktualisierung nicht allein aktualisiert werden. Sie können ihn nur aktualisieren, wenn Sie Änderungen einschließen, die Ressourcen hinzufügen, ändern oder löschen.

## JSON
<a name="template-description-structure-example.json"></a>

```
"Description" : "Here are some details about the template."
```

## YAML
<a name="template-description-structure-example.yaml"></a>

```
Description: > Here are some details about the template.
```

# Visuelle Erstellung von Vorlagen mit Infrastructure Composer
<a name="infrastructure-composer-for-cloudformation"></a>

AWS Infrastructure Composer (früher bekannt als **Application Composer**) hilft Ihnen dabei, moderne Anwendungen visuell zu erstellen und zu konfigurieren AWS. Anstatt Code zu schreiben, können Sie verschiedene Ressourcen per Drag & Drop verschieben, um Ihre Anwendung visuell zu erstellen. 

*Infrastructure Composer im CloudFormation Konsolenmodus* ist das empfohlene Tool für die visuelle Arbeit mit CloudFormation Vorlagen. Diese Version von Infrastructure Composer, auf die Sie von der CloudFormation Konsole aus zugreifen können, ist eine Verbesserung gegenüber einem älteren Tool namens CloudFormation Designer. 

Mit Infrastructure Composer im CloudFormation Konsolenmodus können Sie eine Vielzahl von Ressourcen, so genannten *Karten*, auf eine visuelle Leinwand ziehen, dort ablegen, konfigurieren und verbinden. Dieser visuelle Ansatz macht es einfach, Ihre Anwendungsarchitektur zu entwerfen und zu bearbeiten, ohne direkt mit Vorlagen arbeiten zu müssen. Um von der [CloudFormation Konsole](https://console.aws.amazon.com/cloudformation/) aus auf diesen Modus zuzugreifen, wählen Sie im Navigationsmenü auf der linken Seite **Infrastructure Composer** aus.

Weitere Informationen finden Sie unter [Wie man in AWS Infrastructure Composer](https://docs.aws.amazon.com/infrastructure-composer/latest/dg/using-composer-basics.html) komponiert, im *AWS Infrastructure Composer Entwicklerhandbuch*.

## Warum Infrastructure Composer im CloudFormation Konsolenmodus verwenden?
<a name="app-composer-for-cloudformation-why-use"></a>

Die Visualisierung Ihrer Vorlagen in Infrastructure Composer hilft Ihnen dabei, Lücken und Verbesserungsmöglichkeiten in Ihren CloudFormation Vorlagen und Ihrer Anwendungsarchitektur zu identifizieren. Infrastructure Composer verbessert Ihre Entwicklungserfahrung durch die einfache und effiziente visuelle Erstellung und Änderung von CloudFormation Stacks. Sie können mit einem ersten Entwurf beginnen, einsatzfähigen Code erstellen und Ihre Entwickler-Workflows mit dem visuellen Designer im Infrastructure Composer einbinden.

## Wie unterscheidet sich dieser Modus von dem der Infrastructure Composer-Konsole?
<a name="app-composer-for-cloudformation-differences"></a>

Die CloudFormation Konsolenversion von Infrastructure Composer hat zwar ähnliche Funktionen wie die Infrastructure Composer-Standardkonsole, es gibt jedoch einige Unterschiede. Lambda-bezogene Karten (**Lambda Function und Lambda** **Layer**) erfordern Code-Builds und Paketierungslösungen, die in Infrastructure Composer im Konsolenmodus nicht verfügbar sind. CloudFormation Auch die lokale Synchronisierung ist in diesem Modus nicht verfügbar.

Sie können jedoch diese Lambda-bezogenen Karten und das lokale Synchronisierungsfeature in der [Infrastructure Composer-Konsole](https://console.aws.amazon.com/composer/home) oder in der AWS Toolkit for Visual Studio Code verwenden. Weitere Informationen finden Sie im [AWS Infrastructure Composer Entwicklerhandbuch](https://docs.aws.amazon.com/infrastructure-composer/latest/dg/what-is-composer.html) und [Infrastructure Composer](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/appcomposer.html) im *AWS Toolkit for Visual Studio Code -Benutzerhandbuch*.

# AWS CloudFormation Sprachserver
<a name="ide-extension"></a>

Der AWS CloudFormation Language Server bietet Funktionen zur Beschleunigung der Inhaltserstellung infrastructure-as-code (IaC) und zur sicheren und zuverlässigen Bereitstellung von AWS Ressourcen. Es folgt dem [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) (LSP) und bietet Dokumentation zu Hover, Autovervollständigung, Diagnose über statische Validierung, Go-to-Definitions- und Code-Aktionen. Zusätzlich zu diesen herkömmlichen Sprachserverfunktionen bietet der Server Online-Funktionen, mit denen Sie Ressourcen erkunden und bereitstellen können AWS . CloudFormation Dazu gehören die Möglichkeit, Vorlagen mithilfe von Änderungssätzen zu validieren und bereitzustellen, Stack-Diffs, Ereignisse, Ressourcen und Ausgaben anzuzeigen, Stapel aufzulisten und Ressourcen nach Typ zu durchsuchen sowie den aktuellen Ressourcenstatus direkt in CloudFormation Vorlagen einzufügen.

**Topics**
+ [IDEs Integration mit dem Language Server AWS CloudFormation](#ide-extension-supported-ides)
+ [Erste Schritte](#ide-extension-getting-started)
+ [Initialisieren eines CloudFormation Projekts in der IDE (nur VS Code)](#ide-extension-initialize-project)
+ [Open-Source](#ide-extension-open-source)
+ [Benötigen Sie Hilfe?](#ide-extension-need-help)

## IDEs Integration mit dem Language Server AWS CloudFormation
<a name="ide-extension-supported-ides"></a>

AWS ermöglicht die off-the-shelf Integration mit dem CloudFormation Language Server über das AWS Toolkit für Folgendes: IDEs
+ [Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.aws-toolkit-vscode)
+ [JetBrains IDEs](https://plugins.jetbrains.com/plugin/11349-aws-toolkit)(Version 2025.3 oder höher), einschließlich IntelliJ IDEA, und WebStorm PyCharm

Folgendes unterstützt IDEs auch den Language Server: CloudFormation 
+ [Kiro](https://kiro.dev/downloads/)
+ [Mauszeiger](https://cursor.com/)
+ Die meisten VS Code Forks und Distributionen

Der CloudFormation Language Server hält sich an das [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) (LSP), weshalb andere Integrationen konfigurierbar sind. [Anweisungen zur Integration des Sprachservers mit anderen Editoren finden Sie in der Installationsanleitung.](https://github.com/aws-cloudformation/cloudformation-languageserver/blob/main/INSTALLATION.md)

## Erste Schritte
<a name="ide-extension-getting-started"></a>

**Topics**
+ [Voraussetzungen](#ide-extension-prerequisites)
+ [Schritt 1: Installieren oder aktualisieren Sie das Toolkit AWS](#ide-extension-install-toolkit)
+ [Schritt 2: Zugriff CloudFormation im Toolkit AWS](#ide-extension-access-toolkit-panel)
+ [Schritt 3: Validieren, testen und verfeinern Sie Ihre Vorlage](#ide-extension-validate-test-refine)
+ [Schritt 4: Navigieren Sie durch die Vorlage](#ide-extension-navigate-template)
+ [Schritt 5: Validieren und bereitstellen](#ide-extension-validate-deploy)

### Voraussetzungen
<a name="ide-extension-prerequisites"></a>

Bevor Sie beginnen, stellen Sie Folgendes sicher:
+ Sie verwenden eine unterstützte IDE auf einem unterstützten Betriebssystem (macOSWindows, oderLinux).
+ Sie haben die neueste Version des AWS Toolkits für Ihre IDE installiert oder auf diese aktualisiert.

Für einige Funktionen im AWS CloudFormation Language Server sind aktive AWS-Konto und konfigurierte Anmeldeinformationen erforderlich. Sie müssen AWS-Konto über das AWS Toolkit mit gültigen Zugangsdaten bei Ihrem angemeldet sein.

### Schritt 1: Installieren oder aktualisieren Sie das Toolkit AWS
<a name="ide-extension-install-toolkit"></a>

Installieren oder aktualisieren Sie das AWS Toolkit über den Erweiterungs- oder Plugin-Manager Ihrer IDE auf die neueste Version und starten Sie dann Ihre IDE neu.

Nach der Installation aktiviert das AWS Toolkit automatisch die CloudFormation IDE-Unterstützung. Wenn Sie das AWS Toolkit zum ersten Mal mit dem AWS CloudFormation Language Server installieren oder aktualisieren, werden Sie aufgefordert, die Erlaubnis zur Erfassung anonymer Nutzungsdaten AWS zu erteilen. Diese Daten tragen dazu bei, den CloudFormation Language Server AWS zu verbessern und das Authoring-Erlebnis zu verbessern. Es werden keine vertraulichen Informationen gesammelt und AWS es werden keine Vorlageninhalte, Ressourcenkonfigurationen oder identifizierbare Kundendaten aufgezeichnet oder gespeichert. Sie können Ihre Telemetrieeinstellungen jederzeit in den IDE-Einstellungen ändern. Starten Sie die IDE neu, damit die Änderungen wirksam werden. Die gesammelten Nutzungsdaten konzentrieren sich nur auf Funktionsinteraktionen und Leistungskennzahlen. Diese Erkenntnisse helfen dabei, Verbesserungen wie schnellere Validierung, verbesserte automatische Vervollständigung und bessere Fehlerdiagnose zu AWS identifizieren und zu priorisieren.

### Schritt 2: Zugriff CloudFormation im Toolkit AWS
<a name="ide-extension-access-toolkit-panel"></a>

Öffnen Sie nach der Installation des AWS Toolkits das CloudFormation Panel in Ihrer IDE. **Öffnen Sie in VS Code das AWS Toolkit-Bedienfeld in der Aktivitätsleiste und wählen Sie CLOUDFORMATION.** Öffnen Sie in JetBrains IDEs der Seitenleiste das **AWS Toolkit-Toolfenster** und wählen Sie die Registerkarte aus. **CloudFormation**

Das CloudFormation Panel enthält die folgenden Abschnitte:
+ **Region**: Zeigt den aktuellen Wert an AWS-Region. In VS Code können Sie ihn ändern, indem Sie den Namen der Region auswählen oder den Befehl **AWS CloudFormation: Region auswählen in** der Befehlspalette verwenden. In JetBrains IDEs wird die Region über die AWS Toolkit-Verbindungseinstellungen konfiguriert.
+ **Stacks**: Zeigt eine paginierte Liste der CloudFormation Stacks in Ihrem Konto an. Erweitern Sie einen Stapel, um seinen Knoten „**Änderungssätze**“ anzuzeigen, in dem die mit diesem Stapel verknüpften Änderungssätze aufgeführt sind. Verwenden Sie die Aktion „Stack-Details anzeigen“, um die Stack-Detailansicht zu öffnen, in der die Stack-Übersicht, Ereignisse, Ausgaben und Ressourcen angezeigt werden.
+ **Ressourcen**: Nachdem Sie einen Ressourcentyp hinzugefügt haben, werden im Bereich die AWS Ressourcen dieses Typs in Ihrem Konto angezeigt. Sie können sie anzeigen, aktualisieren, kopieren oder in Ihre Vorlage importieren.

In JetBrains IDEs bietet die Werkzeugleiste über der Baumstruktur schnellen Zugriff auf häufig verwendete Aktionen wie **Validieren und Bereitstellen****, Erneut ausführen**, **Ressourcentyp hinzufügen** und **Aktualisieren**. Aktionen sind auch über Kontextmenüs mit der rechten Maustaste auf Baumknoten verfügbar.

### Schritt 3: Validieren, testen und verfeinern Sie Ihre Vorlage
<a name="ide-extension-validate-test-refine"></a>

Während Sie Ihre CloudFormation Vorlage schreiben, bietet die IDE intelligente Authoring-Unterstützung, damit Sie schneller eine genaue und konforme Infrastruktur erstellen können. Der CloudFormation Language Server läuft im Hintergrund und bietet die folgenden Authoring-Funktionen:
+ Codevervollständigung: Schlägt Ressourcentypen, Parameter und Eigenschaften auf der Grundlage von CloudFormation Schemas vor.
+ Bestehende AWS Ressourcen hinzufügen: Ermöglicht es Ihnen, vorhandene Ressourcen aus Ihrem AWS-Konto in Ihre Vorlage zu importieren. Die IDE verwendet die [AWS -Cloud-Control- API (CCAPI)](https://docs.aws.amazon.com/cloudcontrolapi/latest/userguide/what-is-cloudcontrolapi.html), um die Live-Konfiguration und die Eigenschaften der Ressource abzurufen, sodass Sie die bestehende Infrastruktur innerhalb Ihrer Vorlage klonen oder wiederverwenden können.
+ In Parameter extrahieren: Wenn sich der Cursor auf einem Literalwert in einer Vorlage befindet (z. B. einer Zeichenfolge wie`t2.micro`), bietet die IDE eine Refactoring-Aktion an, um den Wert in den `Parameters` Abschnitt zu extrahieren und das Literal durch ein für den neuen Parameter zu ersetzen. `!Ref` Wenn derselbe Literalwert an mehreren Stellen vorkommt, können Sie festlegen, dass alle Vorkommen auf einmal extrahiert werden.

#### Um Ihrer Vorlage Ressourcen hinzuzufügen
<a name="ide-extension-add-resources-to-template"></a>
+ **Einen Ressourcentyp hinzufügen**: Fügen Sie im AWS CloudFormation Toolkit-Bereich unter **Ressourcen** einen Ressourcentyp zum Durchsuchen hinzu. Klicken Sie in VS Code auf das Symbol „**\$1 hinzufügen**“ oder verwenden Sie den Befehl **AWS CloudFormation: Ressourcentypen hinzufügen** in der Befehlspalette. Klicken Sie in JetBrains der Werkzeugleiste auf die Schaltfläche **Ressourcentyp hinzufügen** oder klicken Sie mit der rechten Maustaste auf den Knoten **Ressourcen**.
+ **Suchen Sie nach einem Ressourcentyp: Geben** Sie im Suchdialogfeld den AWS Ressourcentyp ein, den Sie hinzufügen möchten. Beispiel:
  + `AWS::S3::Bucket`
  + `AWS::Lambda::Function`
+ **Ressourcen durchsuchen**: Im Bereich **Ressourcen** wird eine paginierte Liste der erkannten AWS Ressourcen in Ihrem Konto angezeigt. Wenn Sie über viele Ressourcen verfügen, wird nur die erste Seite angezeigt. Verwenden Sie die Navigationssteuerelemente, um sich durch weitere Seiten zu bewegen und alle verfügbaren Ressourcen anzuzeigen.
+ Wählen Sie die Ressource aus, die Sie in Ihre Vorlage aufnehmen möchten.
+ Sie können eine Ressource auf zwei Arten in Ihre Vorlage einfügen, abhängig von Ihrem Ziel:
  + **Klonen Sie eine vorhandene Ressource**: Erstellen Sie eine neue Ressource in Ihrer Vorlage, indem Sie die Live-Konfiguration und die Eigenschaften einer vorhandenen AWS Ressource verwenden.
  + **Importieren Sie eine vorhandene Ressource**: Fügen Sie die tatsächliche Ressource in Ihren Stapel ein, indem Sie sie unter Verwendung ihres Live-Status zu Ihrer Vorlage hinzufügen.

**Tipps**
+ Sie können den Abschnitt **Ressourcen** jederzeit aktualisieren, um die aktuelle Liste der in Ihrem Konto oder Ihrer Region verfügbaren Ressourcen einzusehen.
+ Wenn Sie Ressourcen importieren, fügen Sie keine Ressource hinzu, die bereits zu einem vorhandenen CloudFormation Stack in demselben Konto gehört.
+ Um zu überprüfen, ob eine Ressource bereits von verwaltet wird CloudFormation, verwenden Sie die Informationsaktion neben der Ressource. Klicken Sie in VS Code auf das **i-Symbol**. Klicken Sie in JetBrains IDEs mit der rechten Maustaste auf die Ressource und wählen Sie **Get Stack Management Info** aus.

##### Fügen Sie verwandte Ressourcen hinzu
<a name="ide-extension-add-related-resources"></a>

In VS Code können Sie der ausgewählten Ressource verwandte Ressourcen hinzufügen, indem Sie den folgenden Befehl verwenden **AWS CloudFormation: Verwandte Ressourcen nach Typ hinzufügen**. Sobald Sie einen Ressourcentyp aus den bereits in Ihrer Vorlage definierten ausgewählt haben, zeigt die IDE eine Liste von Ressourcen an, die normalerweise mit diesem Typ verknüpft sind oder von diesem abhängig sind. Wenn Sie beispielsweise einen auswählen`AWS::EC2::Instance`, schlägt die IDE möglicherweise vor, verwandte Ressourcen wie `AWS::EC2::SecurityGroup` oder hinzuzufügen`AWS::EC2::Subnet`. Mit dieser Funktion können Sie schnell verbundene Infrastrukturkomponenten erstellen, ohne manuell nach kompatiblen Ressourcentypen suchen zu müssen. Diese Funktion wird derzeit in nicht unterstützt JetBrains IDEs.

#### Statische Validierung
<a name="ide-extension-static-validation"></a>

Der CloudFormation Language Server bietet eine integrierte statische Validierung, die von [AWS CloudFormation Linter (cfn-lint](https://github.com/aws-cloudformation/cfn-lint)) und unterstützt wird. [AWS CloudFormation Guard](https://docs.aws.amazon.com/cfn-guard/latest/ug/what-is-guard.html) Diese Validierungen laufen im Hintergrund ab, während Sie Vorlagen erstellen, und helfen Ihnen dabei, Syntaxfehler, Compliance-Lücken und Probleme mit bewährten Verfahren vor der Implementierung zu identifizieren.

**Überblick über die statische Validierung**

In der IDE werden Sie zwei Arten von statischen Echtzeitvalidierungen sehen:
+ CloudFormation Linter (`cfn-lint`): Validiert Ihre Vorlage anhand von CloudFormation Ressourcenspezifikationen und Schemaregeln.
+ Guard (`cfn-guard`): Überprüft Ihre Vorlage anhand von Compliance-Regeln und organisatorischen Policy-Paketen.

##### CloudFormation Linter (cfn-lint)
<a name="ide-extension-cfn-linter-details"></a>

Der CloudFormation Linter ist in die IDE integriert, um die Syntax und Struktur Ihrer Vorlage während der Eingabe automatisch zu überprüfen.
+ **Schemavalidierung**: Erkennt Syntax- und Schemafehler, um sicherzustellen, dass Ihre Vorlagen dem CloudFormation Ressourcenschema entsprechen.
+ **Fehlerhervorhebung**: Zeigt Inline-Markierungen unter Problemen an, die für Blockierungen oder Warnungen bei der Bereitstellung stehen.
+ **Hilfe beim Bewegen des Mauszeigers**: Wenn Sie mit der Maus auf einen Fehler zeigen, zeigt die IDE die zu diesem Problem gehörende Diagnosemeldung an. Wenn eine schnelle Lösung verfügbar ist, wird diese ebenfalls angeboten.

##### Integration von Guard
<a name="ide-extension-cfn-guard-integration"></a>

Guard validiert Ihre Vorlagen anhand von Regelsätzen, die Compliance- und Sicherheitsrichtlinien definieren. Die IDE führt Guard-Validierungen in Echtzeit über den CloudFormation Language Server durch, sodass Sie bei der Erstellung von Vorlagen sofort Feedback erhalten.
+ **Standardregelpakete**: Die IDE enthält einen vorregistrierten Satz von Guard-Regeln, die sich auf grundlegende bewährte Methoden für Ressourcensicherheit und Konfigurationshygiene konzentrieren. Weitere Informationen finden Sie in [der Guard-Rule-Registrierung](https://github.com/aws-cloudformation/aws-guard-rules-registry).
+ **Regelpakete hinzufügen**: Um Regelsätze hinzuzufügen oder zu ändern, öffnen Sie Ihre IDE-Einstellungen und navigieren Sie zum Abschnitt Guard-Konfiguration, um weitere Guard-Regelpakete auszuwählen oder hochzuladen.

**Tipps**: Diagnoseindikatoren verstehen
+ Blaue Indikatoren: Hinweise zu bewährten Verfahren oder Optimierungsempfehlungen.
+ Gelbe Indikatoren: Warnungen vor Problemen, die nicht blockieren (z. B. fehlende Tags oder Parameter).
+ Rote Indikatoren: Blockieren der Bereitstellung, z. B. ungültige Eigenschaftsnamen, fehlende Pflichtfelder oder Schemakonflikte.

### Schritt 4: Navigieren Sie durch die Vorlage
<a name="ide-extension-navigate-template"></a>

Die IDE bietet eine strukturierte, hierarchische Ansicht Ihrer CloudFormation Vorlage, die in Abschnitte wie, `Parameters` `Resources` `Outputs``Mappings`, und unterteilt ist und jeden Ressourcentyp und jede logische ID anzeigt. Auf diese Weise können Sie innerhalb umfangreicher Vorlagen schnell nach bestimmten Ressourcen oder Parametern suchen und zu ihnen navigieren. In VS Code zeigt das **Gliederungsfenster** in der **Explorer-Seitenleiste** diese Struktur an. Öffnen Sie in das **Strukturwerkzeugfenster JetBrains IDEs**, um die Vorlagenstruktur für die aktuell geöffnete Datei anzuzeigen.

Sie können „**Gehe zu Definition**“ für systeminterne Funktionen wie `GetAtt` und verwenden`Ref`, sodass Sie direkt zu der Ressource oder dem Parameter in Ihrer Vorlage springen können, auf die verwiesen wird. Auf diese Weise können Sie Abhängigkeiten nachverfolgen, Ressourcenbeziehungen verstehen und Änderungen effizienter vornehmen.

### Schritt 5: Validieren und bereitstellen
<a name="ide-extension-validate-deploy"></a>

Wenn Sie bereit sind, Ihre CloudFormation Vorlage bereitzustellen, verwenden Sie die Funktion Validieren und Bereitstellen, um einen Änderungssatz zu erstellen. Die IDE validiert Ihre Vorlage, und wenn keine Blockierungsfehler gefunden werden, erstellt sie einen Änderungssatz, der [Änderungen berücksichtigt.](drift-aware-change-sets.md) Die IDE zeigt dann eine Vergleichsansicht an, sodass Sie alle vorgeschlagenen Änderungen überprüfen können, bevor Sie den Änderungssatz ausführen.

Öffnen Sie in VS Code die Befehlspalette und führen Sie Folgendes aus **AWS CloudFormation: Validieren und Bereitstellen**. Die Befehlspalette führt Sie Schritt für Schritt durch die Auswahl einer Vorlage, eines Stack-Namens, von Parametern, Funktionen und anderen Bereitstellungsoptionen. Klicken Sie in in JetBrains IDEs der Werkzeugleiste auf die Schaltfläche **Validieren und Bereitstellen**, klicken Sie mit der rechten Maustaste auf eine Vorlagendatei im Editor oder klicken Sie mit der rechten Maustaste auf einen Stapel in der Baumstruktur. JetBrains öffnet ein Assistentendialogfeld, in dem Sie alle Bereitstellungsoptionen konfigurieren können, einschließlich der Vorlagenauswahl, des Stack-Namens, der Parameter, Funktionen, Tags und erweiterten Optionen.

#### Wie funktioniert die Validierung
<a name="ide-extension-how-validation-works"></a>

Die IDE führt [vor der Bereitstellung automatisch eine Validierungsprüfung](validate-stack-deployments.md) durch und validiert Ihre Vorlage anhand gängiger Fehlerursachen, darunter:
+ Ungültige Eigenschaftssyntax oder falsche Schemaübereinstimmungen: Diese Probleme treten normalerweise `cfn-lint` beim Authoring auf. Wenn Sie jedoch mit der Bereitstellung fortfahren, ohne sie zu beheben, werden bei CloudFormation der Validierung während der Bereitstellung dieselben Fehler angezeigt, bevor der Stack erstellt oder aktualisiert wird.
+ Der Ressourcenname steht in Konflikt mit vorhandenen Ressourcen in Ihrem Konto.
+ Dienstspezifische Einschränkungen, wie z. B. Konflikte mit S3-Bucket-Namen oder fehlende Verschlüsselung.

Wenn bei der Überprüfung Fehler erkannt werden, hebt die IDE die Probleme direkt in Ihrer Vorlage hervor und listet die Fehler im Diagnosebereich auf. Jedes Problem enthält die spezifische Eigenschaft oder Ressource, die den Fehler verursacht hat, sowie einen Lösungsvorschlag. Wenn keine Blockierungsfehler vorliegen, können Sie mit der Bereitstellungsphase fortfahren.

Wenn Warnungen gefunden werden (nicht blockierende Probleme), wird ein Dialogfeld angezeigt, in dem Sie entweder mit der Bereitstellung fortfahren oder den Vorgang abbrechen und Korrekturen vornehmen können.

Die IDE öffnet einen [Änderungssatz, der](drift-aware-change-sets.md) Änderungen berücksichtigt und alle Unterschiede zwischen Ihrer aktuellen Vorlage und der bereitgestellten Stack-Konfiguration anzeigt. Auf diese Weise können Sie den Änderungssatz vor der Ausführung überprüfen, bestätigen oder stornieren. Wenn Sie die Bereitstellung abbrechen, wird der Änderungssatz gelöscht.

Änderungssätze, die Änderungen berücksichtigen, verbessern den CloudFormation Bereitstellungsprozess, indem sie es Ihnen ermöglichen, Stack-Drift sicher zu handhaben. Stack-Drift tritt auf, wenn der tatsächliche Status Ihrer Ressourcen von dem abweicht, der in Ihrer CloudFormation Vorlage definiert ist, was häufig auf manuelle Änderungen zurückzuführen ist AWS-Managementkonsole, die über die CLI oder das SDK vorgenommen wurden. CloudFormation Bei [Änderungssätzen, bei denen Abweichungen berücksichtigt werden, wird Ihre verarbeitete Stack-Konfiguration](drift-aware-change-sets.md) mit dem aktuellen Ressourcenstatus verglichen, und die IDE deckt diese Unterschiede auf, sodass Sie die Ressourcen vor der Bereitstellung wieder an die Richtlinien anpassen können.

#### Stack-Ereignisse ansehen
<a name="ide-extension-view-stack-events"></a>

Wenn die Bereitstellung beginnt, können Sie den Fortschritt in Echtzeit vom Panel aus verfolgen. CloudFormation Unter **Stack-Ereignisse** sehen Sie eine Liste der während der Bereitstellung ausgeführten Operationen. Jedes Ereignis enthält Details wie:
+ **Zeitstempel**: Der Zeitpunkt, zu dem das Ereignis eingetreten ist
+ **Ressource**: Die spezifische AWS Ressource, die erstellt, aktualisiert oder gelöscht wird
+ **Status**: Der aktuelle Status des Vorgangs (z. B.`CREATE_IN_PROGRESS`,`UPDATE_COMPLETE`, oder`ROLLBACK_IN_PROGRESS`)
+ **Grund**: Zusätzliche Kontext- oder Fehlermeldungen, falls zutreffend

In diesem Bereich können Sie sich auch die **Ressourcen** und **Ausgaben** des Stacks ansehen. In der Ansicht **Stack-Ereignisse** können Sie den Bereitstellungsfortschritt verfolgen, potenzielle Probleme identifizieren und überprüfen, wann Ihr Stack erfolgreich abgeschlossen wurde.

## Initialisieren eines CloudFormation Projekts in der IDE (nur VS Code)
<a name="ide-extension-initialize-project"></a>

Durch die Initialisierung eines CloudFormation Projekts in der IDE können Sie einen strukturierten Arbeitsbereich mit den richtigen Ordnern, der richtigen Umgebungskonfiguration und den richtigen AWS Anmeldeinformationen einrichten, sodass Sie Ihre Vorlagen zuverlässig validieren und bereitstellen können. Sie können ein neues CloudFormation Projekt direkt von der IDE aus initialisieren, um dieses empfohlene Setup zu erstellen. Diese Funktion ist derzeit nur in VS Code verfügbar und wird in JetBrains IDEs nicht unterstützt.

**Um ein CloudFormation Projekt zu initialisieren:**
+ **Öffnen Sie die Befehlspalette**
  + Öffnen Sie in VS Code die Befehlspalette (`Ctrl+Shift+P`oder `Cmd+Shift+P` aktiviertmacOS).
  + Wählen Sie **AWS CloudFormation: CFN Init: Projekt initialisieren**.
+ **Wählen Sie ein Projektverzeichnis**
  + Standardmäßig verwendet die IDE Ihr aktuelles Arbeitsverzeichnis.
  + Sie können diesen Pfad in einen beliebigen Ordner ändern, in dem Sie Ihre CloudFormation Vorlagen speichern möchten.
+ **Wählen Sie Ihr AWS Anmeldeinformationsprofil aus**
  + Sie werden aufgefordert, ein AWS Anmeldeinformationsprofil auszuwählen. Das ausgewählte Profil wird für die Erkennung, Validierung und Bereitstellung von Umgebungen verwendet.
+ **Richten Sie Ihre Umgebung ein**
  + Sie werden aufgefordert, eine Umgebung zu erstellen oder auszuwählen.
  + Umgebungen definieren, wo und wie Ihre Vorlagen bereitgestellt oder validiert werden (z. B. Entwicklung, Beta oder Produktion). Sie können **AWS CloudFormation: CFN Init: Add Environment verwenden, um Ihre Umgebung** auszuwählen oder zu ändern.
  + Sie können **AWS CloudFormation: CFN Init: Remove Environment** verwenden, um die von Ihnen ausgewählte Umgebung zu entfernen.
+ **(Optional) Parameterdateien importieren**
  + Wenn Sie bereits über vorhandene Parameterdateien verfügen, ermöglicht Ihnen die IDE, diese während der Initialisierung zu importieren.
  + Die IDE erkennt automatisch kompatible Dateien und verknüpft sie mit Ihrem Projekt, sodass sie bei der Validierung und Bereitstellung von Vorlagen verwendet werden können.
+ **Benennen Sie das Projekt und schließen Sie es ab**
  + Geben Sie einen Projektnamen ein, z. B. Beta-Umgebung, und schließen Sie das Setup ab.
  + Die IDE erstellt die anfängliche Projektstruktur und die Konfigurationsdatei für Sie.

Sie können direkt von der IDE aus Validierungen ausführen, Bereitstellungen in der Vorschau anzeigen oder zwischen Umgebungen wechseln.

## Open-Source
<a name="ide-extension-open-source"></a>

Der AWS CloudFormation Language Server ist im Rahmen der Apache-2.0 Lizenz als Open-Source-Software verfügbar, sodass Kunden volle Transparenz darüber haben, wie Vorlagendiagnosen, Schemavalidierung und statische Analysen durchgeführt werden. Dies reduziert die Probleme bei Sicherheit und Compliance für Kunden, die vor der Einführung von Tools Transparenz auf Quellenebene benötigen.

[Die Codebasis ist öffentlich verfügbar unter: cloudformation-languageserver/ GitHub. https://github.com/aws-cloudformation/](https://github.com/aws-cloudformation/cloudformation-languageserver/)

## Benötigen Sie Hilfe?
<a name="ide-extension-need-help"></a>

[CloudFormation AWS re:Post Probiere](https://repost.aws/tags/TAm3R3LNU3RfSX9L23YIpo3w) die Community an.

# Erzeugen Sie Vorlagen aus vorhandenen Ressourcen mit dem IaC-Generator
<a name="generate-IaC"></a>

Mit dem CloudFormation Infrastructure-as-Code-Generator (IaC-Generator) können Sie eine Vorlage mithilfe von AWS Ressourcen generieren, die in Ihrem Konto bereitgestellt und noch nicht von verwaltet werden. CloudFormation 

Im Folgenden finden Sie die Vorteile des IaC-Generators:
+  CloudFormation Verwalte ganze Anwendungen oder migriere sie in eine AWS CDK App.
+ Generieren Sie Vorlagen, ohne dass Sie eine Ressourceneigenschaft einzeln beschreiben und diese dann in JSON- oder YAML-Syntax übersetzen müssen.
+ Verwenden Sie die Vorlage, um Ressourcen in einem neuen Konto oder einer neuen Region zu replizieren.

Der Prozess der IaC-Generierung besteht aus den folgenden Schritten:

1. **Ressourcen scannen**- Der erste Schritt besteht darin, einen Scan Ihrer Ressourcen zu starten. Dieser Scan ist regionsweit und läuft nach 30 Tagen ab. Während dieser Zeit können Sie mehrere Vorlagen aus demselben Scan erstellen.

1. **Erstellen Sie Ihre Vorlage**- Um die Vorlage zu erstellen, haben Sie zwei Möglichkeiten:
   + Erstellen Sie eine neue Vorlage von Grund auf und fügen Sie die gescannten und zugehörigen Ressourcen hinzu.
   + Verwenden Sie einen vorhandenen CloudFormation Stapel als Ausgangspunkt und fügen Sie die gescannten Ressourcen und die zugehörigen Ressourcen zu seiner Vorlage hinzu.

1. **Ressourcen importieren** — Verwenden Sie Ihre Vorlage, um die Ressourcen als CloudFormation Stapel zu importieren oder sie in eine AWS CDK App zu migrieren.

Das IaC-Generatorfeature ist in allen kommerziellen Regionen verfügbar und unterstützt viele gängige AWS -Ressourcentypen. Eine vollständige Liste der unterstützten Ressourcen finden Sie unter [Unterstützung für Ressourcentypen](resource-import-supported-resources.md).

**Topics**
+ [Überlegungen](#iac-generator-considerations)
+ [Für das Scannen von Ressourcen erforderliche IAM-Berechtigungen](#iac-generator-permissions)
+ [Häufig verwendete Befehle zur Erstellung, Verwaltung und Löschung von Vorlagen](#iac-generator-commonly-used-commands)
+ [Migrieren Sie eine Vorlage auf die AWS CDK](#iac-generator-cdk-migrate)
+ [Starten Sie einen Ressourcenscan mit dem CloudFormation IaC-Generator](iac-generator-start-resource-scan.md)
+ [Die Scan-Zusammenfassung in der CloudFormation Konsole anzeigen](generate-IaC-view-scan-summary.md)
+ [Erstellen Sie eine CloudFormation Vorlage aus Ressourcen, die mit dem IaC-Generator gescannt wurden](iac-generator-create-template-from-scanned-resources.md)
+ [Erstellen Sie einen CloudFormation Stapel aus gescannten Ressourcen](iac-generator-create-stack-from-scanned-resources.md)
+ [Auflösen von schreibgeschützten Eigenschaften](generate-IaC-write-only-properties.md)

## Überlegungen
<a name="iac-generator-considerations"></a>

Sie können JSON- oder YAML-Vorlagen für AWS Ressourcen generieren, auf die Sie Lesezugriff haben. Die Vorlagen für die IaC-Generator-Fähigkeit modellieren Cloud-Ressourcen zuverlässig und schnell, ohne eine Ressource Eigenschaft für Eigenschaft beschreiben zu müssen.

In der folgenden Tabelle sind die für das IaC-Generierungsfeature verfügbaren Quoten aufgeführt.


| Name | Vollständiger Scan | Teilweiser Scan | 
| --- | --- | --- | 
|  Maximale Anzahl von Ressourcen, die in einem Scan verarbeitet werden können  |  100 000  |  100 000  | 
|  Anzahl der Scans pro Tag (für Scans mit weniger als 10.000 Ressourcen)  |  10  |  10  | 
|  Anzahl der Scans pro Tag (für Scans mit mehr als 10.000 Ressourcen)  |  1  |  1  | 
|  Gleichzeitige Anzahl von Vorlagen, die pro Konto erstellt werden  |  5  |  5  | 
|  Gleichzeitige Anzahl von Ressourcen, die für eine Vorlagenerstellung modelliert werden  |  5  |  5  | 
|  Gesamtzahl der Ressourcen, die in einer Vorlage modelliert werden können  |  500  |  500  | 
|  Maximale Anzahl von generierten Vorlagen pro Konto  |  1.000  |  1.000  | 

**Wichtig**  
Der IaC-Generator unterstützt nur AWS Ressourcen, die von der Cloud Control API in Ihrer Region unterstützt werden. Weitere Informationen finden Sie unter [Unterstützung für Ressourcentypen](resource-import-supported-resources.md).

## Für das Scannen von Ressourcen erforderliche IAM-Berechtigungen
<a name="iac-generator-permissions"></a>

Um Ressourcen mit dem IaC-Generator zu scannen, muss Ihr IAM-Prinzipal (Benutzer, Rolle oder Gruppe) über Folgendes verfügen:
+ CloudFormation Berechtigungen zum Scannen
+ Leseberechtigungen für AWS Zieldienste

Der Scanbereich ist auf Ressourcen beschränkt, auf die Sie Lesezugriff haben. Fehlende Berechtigungen führen nicht zum Scheitern des Scans, aber zum Ausschluss dieser Ressourcen.

Ein Beispiel für eine IAM-Richtlinie, die Berechtigungen zum Scannen und zur Vorlagenverwaltung erteilt, finden Sie unter [Erlauben Sie alle IaC-Generatoroperationen](security_iam_id-based-policy-examples.md#iam-policy-example-for-iac-generator).

## Häufig verwendete Befehle zur Erstellung, Verwaltung und Löschung von Vorlagen
<a name="iac-generator-commonly-used-commands"></a>

Zu den häufig verwendeten Befehlen für die Arbeit mit dem IaC-Generator gehören: 
+ [start-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/start-resource-scan.html)um einen Scan der Ressourcen im Konto in einem zu starten AWS-Region. 
+ [describe-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-resource-scan.html)um den Fortschritt eines Ressourcenscans zu überwachen. 
+ [list-resource-scans](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scans.html)um die Ressourcenscans in einem aufzulisten AWS-Region.
+ [list-resource-scan-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-resources.html)um die beim Ressourcenscan gefundenen Ressourcen aufzulisten.
+  [list-resource-scan-related-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-related-resources.html), um die Ressourcen aufzulisten, die sich auf Ihre gescannten Ressourcen beziehen.
+ [create-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-generated-template.html)um eine CloudFormation Vorlage aus einer Reihe gescannter Ressourcen zu generieren.
+ [update-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-generated-template.html)um die generierte Vorlage zu aktualisieren.
+ [describe-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-generated-template.html)um Informationen über eine generierte Vorlage zurückzugeben.
+ [list-generated-templates](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-generated-templates.html)um alle generierten Vorlagen in Ihrem Konto und Ihrer aktuellen Region aufzulisten.
+ [delete-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/delete-generated-template.html)um eine generierte Vorlage zu löschen.

## Migrieren Sie eine Vorlage auf die AWS CDK
<a name="iac-generator-cdk-migrate"></a>

Das AWS Cloud Development Kit (AWS CDK) ist ein Open-Source-Framework für die Softwareentwicklung, mit dem Sie CloudFormation Ressourcen mithilfe gängiger Programmiersprachen entwickeln, verwalten und bereitstellen können.

Die AWS CDK CLI bietet eine Integration mit dem IaC-Generator. Verwenden Sie den AWS CDK `cdk migrate` CLI-Befehl, um die CloudFormation Vorlage zu konvertieren und eine neue CDK-App zu erstellen, die Ihre Ressourcen enthält. Anschließend können Sie die verwenden, AWS CDK um Ihre Ressourcen zu verwalten und bereitzustellen. CloudFormation

Weitere Informationen finden Sie unter [Migrieren zu AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/migrate.html) im *AWS Cloud Development Kit (AWS CDK) Entwicklerhandbuch*.

# Starten Sie einen Ressourcenscan mit dem CloudFormation IaC-Generator
<a name="iac-generator-start-resource-scan"></a>

Bevor Sie eine Vorlage aus vorhandenen Ressourcen erstellen, müssen Sie zunächst eine Ressourcenprüfung durchführen, um Ihre aktuellen Ressourcen und deren Beziehungen zu ermitteln.

Sie können eine Ressourcenprüfung mit einer der folgenden Optionen starten. Wenn Sie den IaC-Generator zum ersten Mal verwenden, empfehlen wir Ihnen die erste Option.
+ **Alle Ressourcen scannen (vollständiger Scan)**- Scannt alle vorhandenen Ressourcen im aktuellen Konto und in der Region. Dieser Scanvorgang kann bei 1.000 Ressourcen bis zu 10 Minuten dauern.
+ **Bestimmte Ressourcen scannen (Teilscan)**- Wählen Sie manuell aus, welche Ressourcentypen im aktuellen Konto und in der Region gescannt werden sollen. Diese Option ermöglicht einen schnelleren und gezielteren Scanprozess und ist daher ideal für die iterative Entwicklung von Vorlagen.

Nach Abschluss des Scans können Sie auswählen, welche Ressourcen und die damit verbundenen Ressourcen bei der Erstellung Ihrer Vorlage berücksichtigt werden sollen. Bei der Verwendung der partiellen Überprüfung sind verwandte Ressourcen bei der Vorlagenerstellung nur dann verfügbar, wenn entweder:
+ Sie haben sie vor dem Start des Scans speziell ausgewählt, oder
+ Sie wurden benötigt, um Ihre ausgewählten Ressourcentypen zu entdecken. 

Wenn Sie beispielsweise `AWS::EKS::Nodegroup` auswählen, ohne `AWS::EKS::Cluster`auszuwählen, bezieht der IaC-Generator automatisch `AWS::EKS::Cluster`-Ressourcen in den Scan mit ein, da für die Erkennung der Knotengruppe zuerst der Cluster erkannt werden muss. In allen anderen Fällen wird der Scan nur die von Ihnen ausgewählten Ressourcen berücksichtigen.

**Anmerkung**  
Bevor Sie fortfahren, vergewissern Sie sich, dass Sie über die erforderlichen Berechtigungen für die Arbeit mit dem IaC-Generator verfügen. Weitere Informationen finden Sie unter [Für das Scannen von Ressourcen erforderliche IAM-Berechtigungen](generate-IaC.md#iac-generator-permissions).

**Topics**
+ [Starten Sie eine Ressourcenprüfung (Konsole)](#start-resource-scan-console)
+ [Starten Sie eine Ressourcenprüfung (AWS CLI)](#start-resource-scan-cli)

## Starten Sie eine Ressourcenprüfung (Konsole)
<a name="start-resource-scan-console"></a>

**So starten Sie einen Ressourcenscan für alle Ressourcentypen (vollständiger Scan)**

1. Öffnen Sie die [IaC-Generator-Seite](https://console.aws.amazon.com/cloudformation/home?#iac-generator) der CloudFormation Konsole.

1. Wählen Sie in der Navigationsleiste am oberen Rand des Bildschirms das AWS-Region , das die zu scannenden Ressourcen enthält.

1. Wählen Sie im Bereich **Scans** die Option **Einen neuen Scan starten** und dann **Alle Ressourcen scannen**. 

**So starten Sie einen Ressourcenscan für bestimmte Ressourcentypen (Teilscan)**

1. Öffnen Sie die [IaC-Generatorseite](https://console.aws.amazon.com/cloudformation/home?#iac-generator) der CloudFormation Konsole.

1. Wählen Sie in der Navigationsleiste am oberen Rand des Bildschirms das AWS-Region , das die zu scannenden Ressourcen enthält.

1. Wählen Sie im Bereich **Scans** die Option **Einen neuen Scan starten** und dann **Bestimmte Ressourcen scannen**. 

1. Wählen Sie im Dialogfeld **Teilweise Überprüfung starten** bis zu 100 Ressourcentypen aus und wählen Sie dann **Überprüfung starten**. 

## Starten Sie eine Ressourcenprüfung (AWS CLI)
<a name="start-resource-scan-cli"></a>

**So starten Sie einen Ressourcenscan für alle Ressourcentypen (vollständiger Scan)**  
Verwenden Sie den folgenden [start-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/start-resource-scan.html)-Befehl. *us-east-1*Ersetzen Sie es durch das AWS-Region , das die zu scannenden Ressourcen enthält.

```
aws cloudformation start-resource-scan --region us-east-1
```

Bei Erfolg gibt dieser Befehl die ARN des Scans zurück. Beachten Sie die ARN in der Eigenschaft `ResourceScanId` . Sie benötigen sie, um Ihre Vorlage zu erstellen.

```
{
    "ResourceScanId":
      "arn:aws:cloudformation:region:account-id:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60"
}
```

**So starten Sie einen Ressourcenscan für bestimmte Ressourcentypen (Teilscan)**

1. Verwenden Sie den folgenden Befehl [cat](https://en.wikipedia.org/wiki/Cat_(Unix)) um die Ressourcentypen, die Sie scannen möchten, in einer JSON-Datei mit dem Namen `config.json` in Ihrem Home-Verzeichnis zu speichern. Nachfolgend sehen Sie eine Beispielkonfiguration, die nach Amazon EC2-Instances, Sicherheitsgruppen und allen Amazon S3-Ressourcen scannt.

   ```
   $ cat > config.json
   [
     {
       "Types":[
         "AWS::EC2::Instance",
         "AWS::EC2::SecurityGroup",
         "AWS::S3::*"
       ]
     }
   ]
   ```

1. Verwenden Sie den [start-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/start-resource-scan.html)Befehl mit der `--scan-filters` Option zusammen mit der `config.json` Datei, die Sie erstellt haben, um den Teilscan zu starten. *us-east-1*Ersetzen Sie es durch AWS-Region das, das die zu scannenden Ressourcen enthält.

   ```
   aws cloudformation start-resource-scan --scan-filters file://config.json --region us-east-1
   ```

   Bei Erfolg gibt dieser Befehl die ARN des Scans zurück. Beachten Sie die ARN in der Eigenschaft `ResourceScanId` . Sie benötigen sie, um Ihre Vorlage zu erstellen.

   ```
   {
       "ResourceScanId":
         "arn:aws:cloudformation:region:account-id:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60"
   }
   ```

**So überwachen Sie den Fortschritt einer Ressourcenprüfung**  
Verwenden Sie den Befehl [describe-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-resource-scan.html). Ersetzen Sie bei der Option `--resource-scan-id` die Beispiel-ARN durch die tatsächliche ARN.

```
aws cloudformation describe-resource-scan --region us-east-1 \
  --resource-scan-id arn:aws:cloudformation:us-east-1:123456789012:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60
```

Ist der Befehl erfolgreich, wird eine Ausgabe zurückgegeben, die wie folgt aussehen sollte: 

```
{
    "ResourceScanId": "arn:aws:cloudformation:region:account-id:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60",
    "Status": "COMPLETE",
    "StartTime": "2023-08-21T03:10:38.485000+00:00",
    "EndTime": "2023-08-21T03:20:28.485000+00:00",
    "PercentageCompleted": 100.0,
    "ResourceTypes": [
        "AWS::CloudFront::CachePolicy",
        "AWS::CloudFront::OriginRequestPolicy",
        "AWS::EC2::DHCPOptions",
        "AWS::EC2::InternetGateway",
        "AWS::EC2::KeyPair",
        "AWS::EC2::NetworkAcl",
        "AWS::EC2::NetworkInsightsPath",
        "AWS::EC2::NetworkInterface",
        "AWS::EC2::PlacementGroup",
        "AWS::EC2::Route",
        "AWS::EC2::RouteTable",
        "AWS::EC2::SecurityGroup",
        "AWS::EC2::Subnet",
        "AWS::EC2::SubnetCidrBlock",
        "AWS::EC2::SubnetNetworkAclAssociation",
        "AWS::EC2::SubnetRouteTableAssociation",
        ...
    ],
    "ResourcesRead": 676
}
```

Bei einem Teil-Scan sieht die Ausgabe ähnlich aus wie die folgende: 

```
{
    "ResourceScanId": "arn:aws:cloudformation:region:account-id:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60",
    "Status": "COMPLETE",
    "StartTime": "2025-03-06T18:24:19.542000+00:00",
    "EndTime": "2025-03-06T18:25:23.142000+00:00",
    "PercentageCompleted": 100.0,
    "ResourceTypes": [
        "AWS::EC2::Instance",
        "AWS::EC2::SecurityGroup",
        "AWS::S3::Bucket",
        "AWS::S3::BucketPolicy"
    ],
    "ResourcesRead": 65,
    "ScanFilters": [
        {
            "Types": [
                "AWS::EC2::Instance",
                "AWS::EC2::SecurityGroup",
                "AWS::S3::*"
            ]
        }
    ]
}
```

Eine Beschreibung der Felder in der Ausgabe finden Sie [DescribeResourceScan](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeResourceScan.html)in der *AWS CloudFormation API-Referenz*.

# Die Scan-Zusammenfassung in der CloudFormation Konsole anzeigen
<a name="generate-IaC-view-scan-summary"></a>

Nach Abschluss der Prüfung können Sie eine Visualisierung der bei der Prüfung gefundenen Ressourcen anzeigen, um die Konzentration der Ressourcen in den verschiedenen Produkttypen zu ermitteln.

**Um Informationen über die bei der Suche gefundenen Ressourcen anzuzeigen**

1. Öffnen Sie die [IaC-Generatorseite](https://console.aws.amazon.com/cloudformation/home?#iac-generator) der CloudFormation Konsole.

1. Wählen Sie in der Navigationsleiste oben auf dem Bildschirm die Datei aus, AWS-Region die den anzuzeigenden Ressourcenscan enthält.

1. Wählen Sie im Navigationsbereich **IaC-Generator**.

1. Unter **Aufschlüsselung der gescannten Ressourcen**finden Sie eine visuelle Aufschlüsselung der gescannten Ressourcen nach Produkttyp, zum Beispiel **Compute** und **Storage**. 

1. Um die Anzahl der angezeigten Produkttypen anzupassen, wählen Sie **Angezeigte Daten filtern**. So können Sie die Visualisierung auf die Produkttypen zuschneiden, an denen Sie am meisten interessiert sind.

1. Auf der rechten Seite der Seite befindet sich das Feld **Details der Scan-Zusammenfassung** . Um das Panel zu öffnen, wählen Sie das Symbol **Panel öffnen** .

![\[Die Konsole des IaC-Generators bietet eine visuelle Aufschlüsselung der gescannten Ressourcen.\]](http://docs.aws.amazon.com/de_de/AWSCloudFormation/latest/UserGuide/images/IaC-generator-scan-summary.png)


# Erstellen Sie eine CloudFormation Vorlage aus Ressourcen, die mit dem IaC-Generator gescannt wurden
<a name="iac-generator-create-template-from-scanned-resources"></a>

In diesem Thema wird erklärt, wie Sie eine Vorlage aus Ressourcen erstellen, die mit dem IaC-Generatorfeature gescannt wurden. 

## Erstellen Sie eine Vorlage aus gescannten Ressourcen (Konsole)
<a name="create-template-from-scanned-resources-console"></a>

**So erstellen Sie eine Stapelvorlage aus gescannten Ressourcen**

1. Öffnen Sie die [IaC-Generatorseite](https://console.aws.amazon.com/cloudformation/home?#iac-generator) der CloudFormation Konsole.

1. Wählen Sie in der Navigationsleiste am oberen Rand des Bildschirms das AWS-Region , das die gescannten Ressourcen enthält.

1. Wählen Sie im Bereich **Vorlagen** die Option **Vorlage erstellen**. 

1. Wählen Sie **Von einer neuen Vorlage beginnen**.

   1. Geben Sie für **Vorlagenname**einen Namen für Ihre Vorlage ein.

   1. (Optional) Konfigurieren Sie Ihre **Löschrichtlinie** und **Update-Ersatzrichtlinie**.

   1. Wählen Sie **Weiter** um gescannte Ressourcen zur Vorlage hinzuzufügen.

1. Unter **Gescannte Ressourcen hinzufügen**durchsuchen Sie die Liste der gescannten Ressourcen und wählen die Ressourcen aus, die Sie zu Ihrer Vorlage hinzufügen möchten. Sie können die Ressourcen nach Ressourcenbezeichner, Ressourcentyp oder Tags filtern. Die Filter schließen sich gegenseitig ein.

1. Wenn Sie alle benötigten Ressourcen zu Ihrer Vorlage hinzugefügt haben, wählen Sie **Weiter** um die Seite **Gescannte Ressourcen hinzufügen** zu verlassen und zur Seite **Verwandte Ressourcen hinzufügen** zu gelangen.

1. Sehen Sie sich eine empfohlene Liste mit verwandten Ressourcen an. Zusammenhängende Ressourcen, wie Amazon EC2-Instances und Sicherheitsgruppen, sind voneinander abhängig und gehören in der Regel zur gleichen Arbeitslast. Wählen Sie die zugehörigen Ressourcen aus, die Sie in die generierte Vorlage aufnehmen möchten.
**Anmerkung**  
Wir schlagen vor, dass Sie alle zugehörigen Ressourcen zu dieser Vorlage hinzufügen.

1. Sehen Sie sich die Details der Vorlage, die gescannten Ressourcen und die verwandten Ressourcen an. 

1. Wählen Sie **Vorlage erstellen** um die Seite **Überprüfen und erstellen** zu verlassen und die Vorlage zu erstellen.

## Erstellen Sie eine Vorlage aus gescannten Ressourcen (AWS CLI)
<a name="create-template-from-scanned-resources-cli"></a>

**So erstellen Sie eine Stapelvorlage aus gescannten Ressourcen**

1. Verwenden Sie den [list-resource-scan-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-resources.html)Befehl, um die beim Scan gefundenen Ressourcen aufzulisten, und geben Sie optional die `--resource-identifier` Option zur Begrenzung der Ausgabe an. Ersetzen Sie bei der Option `--resource-scan-id` die Beispiel-ARN durch die tatsächliche ARN.

   ```
   aws cloudformation list-resource-scan-resources \
     --resource-scan-id arn:aws:cloudformation:us-east-1:123456789012:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60 \
     --resource-identifier MyApp
   ```

   Im Folgenden finden Sie ein Antwortbeispiel, das `ManagedByStack` angibt, ob die Ressource bereits CloudFormation verwaltet wird. Kopieren Sie die Ausgabe. Sie benötigen sie für den nächsten Schritt.

   ```
   {
       "Resources": [
           {
               "ResourceType": "AWS::EKS::Cluster",
               "ResourceIdentifier": {
                   "ClusterName": "MyAppClusterName"
               },
               "ManagedByStack": false
           },
           {
               "ResourceType": "AWS::AutoScaling::AutoScalingGroup",
               "ResourceIdentifier": {
                   "AutoScalingGroupName": "MyAppASGName"
               },
               "ManagedByStack": false
           }
       ]
   }
   ```

   Eine Beschreibung der Felder in der Ausgabe finden Sie [ScannedResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ScannedResource.html)in der *AWS CloudFormation API-Referenz*.

1. Verwenden Sie den Befehl `cat`, um die Ressourcentypen und Bezeichner in einer JSON-Datei namens `resources.json` in Ihrem Home-Verzeichnis zu speichern. Im Folgenden finden Sie ein JSON-Beispiel, das auf der Beispielausgabe im vorherigen Schritt basiert.

   ```
   $ cat > resources.json
   [
       {
           "ResourceType": "AWS::EKS::Cluster",
           "ResourceIdentifier": {
               "ClusterName": "MyAppClusterName"
           }
       },
       {
           "ResourceType": "AWS::AutoScaling::AutoScalingGroup",
           "ResourceIdentifier": {
               "AutoScalingGroupName": "MyAppASGName"
           }
       }
   ]
   ```

1. Verwenden Sie den Befehl [list-resource-scan-related-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-related-resources.html) zusammen mit der von Ihnen erstellten `resources.json` Datei, um die Ressourcen aufzulisten, die sich auf Ihre gescannten Ressourcen beziehen.

   ```
   aws cloudformation list-resource-scan-related-resources \
     --resource-scan-id arn:aws:cloudformation:us-east-1:123456789012:resourceScan/0a699f15-489c-43ca-a3ef-3e6ecfa5da60 \
     --resources file://resources.json
   ```

   Im Folgenden finden Sie ein Antwortbeispiel, das `ManagedByStack` angibt, ob die Ressource bereits CloudFormation verwaltet wird. Fügen Sie diese Ressourcen zu der JSON-Datei hinzu, die Sie im vorherigen Schritt erstellt haben. Sie benötigen sie, um Ihre Vorlage zu erstellen.

   ```
   {
       "RelatedResources": [
           {
               "ResourceType": "AWS::EKS::Nodegroup",
               "ResourceIdentifier": {
                   "NodegroupName": "MyAppNodegroupName"
               },
               "ManagedByStack": false
           },
           {
               "ResourceType": "AWS::IAM::Role",
               "ResourceIdentifier": {
                   "RoleId": "arn:aws::iam::account-id:role/MyAppIAMRole"
               },
               "ManagedByStack": false
           }
       ]
   }
   ```

   Eine Beschreibung der Felder in der Ausgabe finden Sie [ScannedResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ScannedResource.html)in der *AWS CloudFormation API-Referenz*.
**Anmerkung**  
Die Eingabeliste der Ressourcen darf eine Länge von 100 nicht überschreiten. Um verwandte Ressourcen für mehr als 100 Ressourcen aufzulisten, führen Sie den Befehl **list-resource-scan-related-resources** in Stapeln von 100 Ressourcen aus und konsolidieren die Ergebnisse.  
Beachten Sie, dass die Ausgabe möglicherweise doppelte Ressourcen in der Liste enthält.

1. Verwenden Sie den [create-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-generated-template.html)Befehl, um wie folgt eine neue Stack-Vorlage mit den folgenden Änderungen zu erstellen:
   + `us-east-1`Ersetzen Sie es durch das AWS-Region , das die gescannten Ressourcen enthält.
   + Ersetzen Sie `MyTemplate` durch den Namen der zu erstellenden Vorlage.

   ```
   aws cloudformation create-generated-template --region us-east-1 \
    --generated-template-name MyTemplate \
     --resources file://resources.json
   ```

   Im Folgenden sehen Sie ein Beispiel für eine `resources.json`-Datei.

   ```
   [
       {
           "ResourceType": "AWS::EKS::Cluster",
           "LogicalResourceId":"MyCluster",
           "ResourceIdentifier": {
               "ClusterName": "MyAppClusterName"
           }
       },
       {
           "ResourceType": "AWS::AutoScaling::AutoScalingGroup",
           "LogicalResourceId":"MyASG",
           "ResourceIdentifier": {
               "AutoScalingGroupName": "MyAppASGName"
           }
       },
       {
           "ResourceType": "AWS::EKS::Nodegroup",
           "LogicalResourceId":"MyNodegroup",
           "ResourceIdentifier": {
               "NodegroupName": "MyAppNodegroupName"
           }
       },
       {
           "ResourceType": "AWS::IAM::Role",
           "LogicalResourceId":"MyRole",
           "ResourceIdentifier": {
               "RoleId": "arn:aws::iam::account-id:role/MyAppIAMRole"
           }
       }
   ]
   ```

   Bei Erfolg gibt dieser Befehl Folgendes zurück.

   ```
   {
     "Arn":
       "arn:aws:cloudformation:region:account-id:generatedtemplate/7fc8512c-d8cb-4e02-b266-d39c48344e48",
     "Name": "MyTemplate"
   }
   ```

# Erstellen Sie einen CloudFormation Stapel aus gescannten Ressourcen
<a name="iac-generator-create-stack-from-scanned-resources"></a>

Nachdem Sie Ihre Vorlage erstellt haben, können Sie mit Infrastructure Composer eine Vorschau der generierten Vorlage anzeigen, bevor Sie den Stack erstellen und die gescannten Ressourcen importieren. So können Sie die gesamte Anwendungsarchitektur mit den Ressourcen und ihren Beziehungen visualisieren. Weitere Informationen über Infrastructure Composer finden Sie unter [Visuelle Erstellung von Vorlagen mit Infrastructure Composer](infrastructure-composer-for-cloudformation.md).

**So erstellen Sie den Stapel und importieren die gescannten Ressourcen**

1. Öffnen Sie die [IaC-Generatorseite](https://console.aws.amazon.com/cloudformation/home?#iac-generator) der CloudFormation Konsole.

1. Wählen Sie in der Navigationsleiste oben auf dem Bildschirm das AWS-Region für Ihre Vorlage aus.

1. Wählen Sie die Registerkarte **Vorlagen** und wählen Sie dann den Namen Ihrer Vorlage, um weitere Informationen anzuzeigen.

1. Auf der Registerkarte **Schablonendefinition** oben im Abschnitt **Schablone** können Sie die Schablone je nach Vorliebe von der YAML- zur JSON-Syntax umschalten. 

1. Überprüfen Sie die Details Ihrer Vorlage, um sicherzustellen, dass alles richtig eingestellt ist. Um das Überprüfen und Verstehen der Vorlage zu erleichtern, können Sie mit dem Infrastructure Composer von der Standard-Codeansicht zu einer grafischen Ansicht der in der Vorlage beschriebenen Infrastruktur wechseln. Wählen Sie dazu unter **Vorlage**die Option **Leinwand** anstelle von **Vorlage**.

    **Leinwand-Aktionen** 
   + Wenn Sie sich auf die Details einer bestimmten Ressource innerhalb Ihrer Vorlage konzentrieren möchten, doppelklicken Sie auf eine Karte, um das Panel **Ressourceneigenschaften** aufzurufen.
   + Um die Karten auf der Leinwand visuell anzuordnen und zu organisieren, wählen Sie **Anordnen** oben links auf der Leinwand. 
   + Um Ihre Leinwand zu vergrößern oder zu verkleinern, verwenden Sie die Zoomsteuerung unten rechts auf der Leinwand. 

1. Um eine bestimmte Ressource in der Konsole anzuzeigen, wählen Sie die Registerkarte **Vorlagenressourcen** und dann die physische ID der Ressource, die Sie sich ansehen möchten. Dadurch gelangen Sie zur Konsole für diese spezielle Ressource. Sie können auch Ressourcen in der Vorlagendefinition auf der Registerkarte **Vorlagenressourcen** hinzufügen, entfernen und neu synchronisieren. 

1. Auf der Registerkarte **Vorlagendefinition** gibt der IaC-Generator möglicherweise Warnungen zu Ressourcen aus, die schreibgeschützte Eigenschaften enthalten. Nachdem Sie die Warnungen überprüft haben, können Sie die generierte Vorlage herunterladen und die erforderlichen Änderungen vornehmen. Weitere Informationen finden Sie unter [Auflösen von schreibgeschützten Eigenschaften](generate-IaC-write-only-properties.md).

1. Wenn Sie mit Ihrer Vorlagendefinition zufrieden sind, wählen Sie auf der Registerkarte **Vorlagendefinition** die Option **In Stapel importieren** und dann **Weiter**.

1. Geben Sie auf der Seite **Stack-Details angeben** im Bereich **Stack angeben** den Namen Ihres Stacks ein und wählen Sie anschließend **Weiter**.

1. Überprüfen Sie die Parameter für den Stapel und geben Sie sie ein. Wählen Sie **Weiter** aus.

1. Überprüfen Sie Ihre Optionen auf der Seite **Änderungen überprüfen** und wählen Sie **Weiter**.

1. Überprüfen Sie Ihre Angaben auf der Seite **Überprüfen und importieren** und wählen Sie **Ressourcen importieren**. 

# Auflösen von schreibgeschützten Eigenschaften
<a name="generate-IaC-write-only-properties"></a>

Mit dem CloudFormation IaC-Generator können Sie eine Vorlage mithilfe von Ressourcen generieren, die in Ihrem Konto bereitgestellt wurden und die noch nicht von verwaltet werden. CloudFormation Bestimmte Ressourceneigenschaften sind jedoch als *schreibgeschützt* gekennzeichnet, was bedeutet, dass sie zwar geschrieben, aber nicht gelesen werden können CloudFormation, z. B. mit einem Datenbankkennwort. 

Beim Generieren von CloudFormation Vorlagen aus vorhandenen Ressourcen stellen schreibgeschützte Eigenschaften eine Herausforderung dar. CloudFormation Konvertiert diese Eigenschaften in den meisten Fällen in Parameter in der generierten Vorlage. Damit können Sie die Eigenschaften als Parameterwerte bei Importvorgängen eingeben. Es gibt jedoch Szenarien, in denen diese Konvertierung nicht möglich ist, und CloudFormation behandelt diese Fälle unterschiedlich.

## Sich gegenseitig ausschließende Eigenschaften
<a name="write-only-mutually-exclusive-properties"></a>

Einige Ressourcen haben mehrere Sätze von sich gegenseitig ausschließenden Eigenschaften, von denen zumindest einige schreibgeschützt sind. In diesen Fällen kann der IaC-Generator nicht feststellen, welcher Satz von exklusiven Eigenschaften bei der Erstellung auf die Ressource angewendet wurde. Sie können zum Beispiel den Code für [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html) mit einer dieser Eigenschaftsgruppen angeben. 
+ `Code/S3Bucket`,,`Code/S3Key` und optional `Code/S3ObjectVersion`
+ `Code/ImageUri`
+ `Code/ZipFile`

Alle diese Eigenschaften sind schreibgeschützt. Der IaC-Generator wählt eine der exklusiven Eigenschaftsgruppen aus und fügt sie der generierten Vorlage hinzu. Für jede der schreibgeschützten Eigenschaften werden Parameter hinzugefügt. Die Parameternamen enthalten `OneOf` und die Parameterbeschreibungen geben an, dass die entsprechende Eigenschaft durch andere exklusive Eigenschaften ersetzt werden kann. Der IaC-Generator setzt den Warnungstyp `MUTUALLY_EXCLUSIVE_PROPERTIES` für die enthaltenen Eigenschaften.

## Sich gegenseitig ausschließende Typen
<a name="write-only-mutually-exclusive-types"></a>

In manchen Fällen kann eine schreibgeschützte Eigenschaft mehrere Datentypen haben. Zum Beispiel kann die Eigenschaft `Body` von [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html) entweder ein `object` oder ein `string`sein. Wenn dies der Fall ist, fügt der IaC-Generator die Eigenschaft in die generierte Vorlage mit dem Typ `string` ein und setzt einen Warnungstyp `MUTUALLY_EXCLUSIVE_TYPES`.

## Array-Eigenschaften
<a name="write-only-array-properties"></a>

Wenn eine schreibgeschützte Eigenschaft den Typ `array`hat, kann der IaC-Generator sie nicht in die generierte Vorlage aufnehmen, da Parameter nur skalare Werte sein können. In diesem Fall wird die Eigenschaft in der Vorlage weggelassen und ein Warnungstyp `UNSUPPORTED_PROPERTIES` festgelegt.

## Optionale Eigenschaften
<a name="write-only-optional-properties"></a>

Bei optionalen schreibgeschützten Eigenschaften kann der IaC-Generator nicht erkennen, ob die Eigenschaft beim Einrichten der Ressource verwendet wurde. In diesem Fall wird die Eigenschaft in der generierten Vorlage weggelassen und der Warnungstyp `UNSUPPORTED_PROPERTIES` wird festgelegt.

## Warnungen und nächste Schritte
<a name="write-only-properties-warnings-and-next-steps"></a>

Um festzustellen, welche Eigenschaften schreibgeschützt sind, müssen Sie sich die Warnungen ansehen, die die Konsole des IaC-Generators ausgibt. Die Referenz [AWS Ressourcen- und Eigenschaftstypen](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html) zeigt nicht an, ob eine Eigenschaft schreibgeschützt ist oder ob sie mehrere Typen unterstützt.

Alternativ können Sie in den Schemata der Ressourcenanbieter sehen, welche Eigenschaften schreibgeschützt sind. Informationen zum Herunterladen der Ressourcenanbieter-Schemas finden Sie in den [CloudFormation Ressourcenanbieter-Schemas](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/resource-type-schemas.html). 

**So lösen Sie Probleme mit schreibgeschützten Eigenschaften**

1. Öffnen Sie die [IaC-Generatorseite der Konsole](https://console.aws.amazon.com/cloudformation/home?#iac-generator). CloudFormation 

1. Wählen Sie in der Navigationsleiste oben auf dem Bildschirm das AWS-Region für Ihre Vorlage aus.

1. Wählen Sie die Registerkarte **Vorlagen** und wählen Sie dann den Namen der von Ihnen erstellten Vorlage.

1. Wenn die generierte Vorlage Ressourcen mit schreibgeschützten Eigenschaften enthält, zeigt die Konsole des IaC-Generators auf der Registerkarte **Vorlagendefinition** eine Warnung mit einer Zusammenfassung der Art der Probleme an. Beispiel:  
![\[Konsolenwarnung des IaC-Generators über schreibgeschützte Eigenschaften in der generierten Vorlage\]](http://docs.aws.amazon.com/de_de/AWSCloudFormation/latest/UserGuide/images/IaC-generator-write-only-property-warning.png)

1. Wählen Sie **Details zur Warnung anzeigen** für weitere Details. Die Ressourcen mit schreibgeschützten Eigenschaften werden durch die in der generierten Vorlage verwendete logische ID und den Ressourcentyp identifiziert.

   Verwenden Sie die Liste der Warnungen, um Ressourcen mit schreibgeschützten Eigenschaften zu identifizieren, und sehen Sie sich jede Ressource an, um festzustellen, welche Änderungen (wenn überhaupt) an der generierten Vorlage vorgenommen werden müssen.  
![\[Die Konsole des IaC-Generators warnt ausführlich vor schreibgeschützten Eigenschaften in der generierten Vorlage\]](http://docs.aws.amazon.com/de_de/AWSCloudFormation/latest/UserGuide/images/IaC-generator-write-only-property-resource-warning.png)

1. Wenn Ihre Vorlage aktualisiert werden muss, um Probleme mit schreibgeschützten Eigenschaften zu beheben, gehen Sie wie folgt vor: 

   1. Wählen Sie **Download** um eine Kopie der Vorlage herunterzuladen.

   1. Bearbeiten Sie Ihre Vorlage.

   1. Wenn die Änderungen abgeschlossen sind, können Sie auf die Schaltfläche **Bearbeitete Vorlage importieren** klicken, um den Importvorgang fortzusetzen.

# Wie Sie Probleme mit schreibgeschützten Eigenschaften in AWS::ApiGateway::RestAPI-Ressourcen beheben
<a name="generate-IaC-apigateway-restapi"></a>

In diesem Thema wird erklärt, wie Sie Probleme mit schreibgeschützten Eigenschaften in [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-apigateway-restapi.html)-Ressourcen beheben, wenn Sie den IaC-Generator verwenden.

## Problem
<a name="apigateway-restapi-write-only-properties-issue"></a>

Wenn eine generierte Vorlage `AWS::ApiGateway::RestApi`-Ressourcen enthält, werden Warnungen erzeugt, die besagen, dass die Eigenschaften,`Body` `BodyS3Location`und `CloneFrom` als `UNSUPPORTED_PROPERTIES`identifiziert werden. Dies liegt daran, dass es sich um optionale schreibgeschützte Eigenschaften handelt. Der IaC-Generator weiß nicht, ob diese Eigenschaften jemals auf die Ressource angewendet wurden. Daher lässt es diese Eigenschaften in der generierten Vorlage weg.

## Auflösung
<a name="apigateway-restapi-write-only-properties-resolution"></a>

Um die Eigenschaft `Body` für Ihre REST-API festzulegen, aktualisieren Sie Ihre generierte Vorlage.

1. Verwenden Sie die Amazon API Gateway [https://docs.aws.amazon.com/apigateway/latest/api/API_GetExport.html](https://docs.aws.amazon.com/apigateway/latest/api/API_GetExport.html) API-Aktion, um die API herunterzuladen. Zum Beispiel mit dem [https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-export.html](https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-export.html) AWS CLI Befehl. Weitere Informationen finden Sie unter [Exportieren einer REST-API aus API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-export-api.html) im *API-Gateway-Entwicklerleitfaden*.

1. Rufen Sie die Eigenschaft `Body` aus der Antwort der API-Aktion `GetExport` ab. Laden Sie sie in einen Amazon S3-Bucket hoch.

1. Laden Sie die generierte Vorlage herunter.

1. Fügen Sie die Eigenschaften `BodyS3Location/Bucket` und `BodyS3Location/Key` zur Vorlage hinzu und geben Sie den Bucket-Namen und den Schlüssel an, in dem `Body` gespeichert ist.

1. Öffnen Sie die generierte Vorlage in der Konsole des IaC-Generators und wählen Sie **Bearbeitete Vorlage importieren**.

# Wie Sie Probleme mit schreibgeschützten Eigenschaften in AWS::Lambda::Function-Ressourcen beheben
<a name="generate-IaC-lambda-function"></a>

In diesem Thema wird erklärt, wie Sie Probleme mit schreibgeschützten Eigenschaften in [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html)-Ressourcen beheben, wenn Sie den IaC-Generator verwenden.

## Problem
<a name="lambda-function-mutually-exclusive-properties-issue"></a>

Die Ressource `AWS::Lambda::Function` hat drei sich gegenseitig ausschließende Sätze von Eigenschaften zur Angabe des Lambda-Codes:
+ die Eigenschaften`Code/S3Bucket` und `Code/S3Key` und optional die Eigenschaft `Code/S3ObjectVersion` .
+ `Code/ImageUri` Eigenschaft
+ `Code/ZipFile` Eigenschaft

Für eine bestimmte `AWS::Lambda::Function`-Ressource kann nur eines dieser Sets verwendet werden.

Der IaC-Generator kann nicht feststellen, welcher Satz von exklusiven schreibgeschützten Eigenschaften zum Erstellen oder Aktualisieren der Ressource verwendet wurde. Daher wird nur der erste Satz von Eigenschaften in die generierte Vorlage aufgenommen. Die Eigenschaften `Code/ImageUri` und `Code/ZipFile` werden weggelassen. 

Außerdem gibt der IaC-Generator die folgenden Warnungen aus:
+ **`MUTUALLY_EXCLUSIVE_PROPERTIES`**- warnt davor, dass `Code/S3Bucket` und `Code/S3Key` als sich gegenseitig ausschließende Eigenschaften identifiziert werden.
+ **`UNSUPPORTED_PROPERTIES`**- Warnt, dass die Eigenschaft `Code/S3ObjectVersion` nicht unterstützt wird.

Um `AWS::Lambda::Function`-Ressourcen in eine generierte Vorlage aufzunehmen, müssen Sie die Vorlage herunterladen und mit den richtigen Code-Eigenschaften aktualisieren.

## Auflösung
<a name="lambda-function-mutually-exclusive-properties-resolution"></a>

**Wenn Sie Ihren Lambda-Code in einem Amazon S3-Bucket speichern und die `S3ObjectVersion` Eigenschaft**nicht verwenden, können Sie die generierte Vorlage ohne Änderungen importieren. Der IaC-Generator wird Sie während des Importvorgangs nach dem Amazon S3-Bucket und dem Schlüssel als Vorlagenparameter fragen.

****Wenn Sie Ihren Lambda-Code in einem Amazon ECR-Repository speichern**, können Sie Ihre Vorlage anhand der folgenden Anweisungen aktualisieren:**

1. Laden Sie die generierte Vorlage herunter.

1. Entfernen Sie die Eigenschaften und die entsprechenden Parameter für die Eigenschaften `Code/S3Bucket` und `Code/S3Key` aus der generierten Vorlage.

1. Ersetzen Sie die entfernten Eigenschaften in der generierten Vorlage durch die Eigenschaft `Code/ImageUri`, die die URL für das Amazon ECR-Repository angibt.

1. Öffnen Sie die generierte Vorlage in der IaC-Generator-Konsole und wählen Sie die Schaltfläche **Bearbeitete Vorlage importieren** .

****Wenn Sie Ihren Lambda-Code in einer Zip-Datei speichern**, können Sie Ihre Vorlage anhand der folgenden Anweisungen aktualisieren:**

1. Laden Sie die generierte Vorlage herunter.

1. Entfernen Sie die Eigenschaften und die entsprechenden Parameter für die Eigenschaften `Code/S3Bucket` und `Code/S3Key` aus der generierten Vorlage.

1. Ersetzen Sie die entfernten Eigenschaften in der generierten Vorlage durch die Eigenschaft `Code/ZipFile` .

1. Öffnen Sie die generierte Vorlage in der IaC-Generator-Konsole und wählen Sie die Schaltfläche **Bearbeitete Vorlage importieren** .

****Wenn Sie keine Kopie Ihres Lambda-Codes haben**, können Sie Ihre Vorlage anhand der folgenden Anweisungen aktualisieren:**

1. Verwenden Sie die AWS Lambda [https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html)API-Aktion (z. B. mithilfe des [https://docs.aws.amazon.com/cli/latest/reference/lambda/get-function.html](https://docs.aws.amazon.com/cli/latest/reference/lambda/get-function.html) AWS CLI Befehls).

1. In der Antwort lautet der Parameter `RepositoryType` `S3`, wenn sich der Code in einem Amazon S3-Bucket befindet, oder `ECR`, wenn sich der Code in einem Amazon ECR-Repository befindet.

1. In der Antwort enthält der Parameter `Location` eine vorsignierte URL, mit der Sie das Bereitstellungspaket für 10 Minuten herunterladen können. Laden Sie den Code herunter.

1. Laden Sie den Code in einen Amazon S3-Bucket hoch.

1. Führen Sie einen Importvorgang mit der generierten Vorlage aus und geben Sie den Bucketnamen und den Schlüssel als Parameterwerte an.

# Abrufen von in anderen Diensten gespeicherten Werten mit Hilfe von dynamischen Referenzen
<a name="dynamic-references"></a>

Dynamische Verweise bieten Ihnen eine bequeme Möglichkeit, externe Werte anzugeben, die in anderen Diensten gespeichert und verwaltet werden, und vertrauliche Informationen von Ihren Vorlagen zu entkoppeln. infrastructure-as-code CloudFormation ruft den Wert der angegebenen Referenz ab, falls dies bei Stack- und Change-Set-Vorgängen erforderlich ist.

Mit dynamischen Referenzen können Sie:
+ **Sichere Zeichenketten verwenden** — Verwenden Sie für vertrauliche Daten immer sichere Zeichenkettenparameter im AWS Systems Manager Parameter Store oder Secrets in, AWS Secrets Manager um sicherzustellen, dass Ihre Daten im Ruhezustand verschlüsselt sind.
+ **Zugriff beschränken**- Beschränken Sie den Zugriff auf die Parameter des Parameterspeichers oder die Secrets Manager-Geheimnisse auf autorisierte Principals und Rollen.
+ **Zugangsdaten rotieren**- Rotieren Sie regelmäßig Ihre sensiblen Daten, die in Parameter Store oder Secrets Manager gespeichert sind, um ein hohes Maß an Sicherheit zu gewährleisten.
+ **Automatisierte Rotation**- Nutzen Sie die automatischen Rotationsfeatures von Secrets Manager, um Ihre sensiblen Daten regelmäßig zu aktualisieren und über Ihre Anwendungen und Umgebungen zu verteilen.

## Allgemeine Überlegungen
<a name="dynamic-references-considerations"></a>

Die folgenden allgemeinen Überlegungen sollten Sie berücksichtigen, bevor Sie dynamische Verweise in Ihren CloudFormation Vorlagen angeben:
+ Vermeiden Sie es, dynamische Verweise oder sensible Daten in Ressourceneigenschaften aufzunehmen, die Teil der primären Kennung einer Ressource sind. CloudFormation verwendet möglicherweise den tatsächlichen Klartext-Wert in der primären Ressourcen-ID, was ein Sicherheitsrisiko darstellen könnte. Diese Ressourcen-ID kann in allen abgeleiteten Ausgaben oder Zielen vorkommen.

  Um herauszufinden, welche Ressourceneigenschaften den primären Bezeichner eines Ressourcentyps enthalten, lesen Sie die Dokumentation der Ressourcenreferenz für diese Ressource in [AWS Ressource und Eigenschaftstypen referenzieren](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html). Im Abschnitt **Return values** (Rückgbewerte) stellt der Rückgabewert der `Ref`-Funktion die Ressourceneigenschaften dar, welche die primäre Kennung des Ressourcentyps bilden.
+ Sie können bis zu 60 dynamische Referenzen in eine Stack-Vorlage aufnehmen.
+ Wenn Sie Transformationen (wie `AWS::Include` oder`AWS::Serverless`) verwenden, löst dynamische Verweise CloudFormation nicht auf, bevor die Transformation angewendet wird. Stattdessen wird die Zeichenkette des dynamischen Verweises an die Transformation übergeben und die Verweise werden aufgelöst, wenn Sie den Änderungssatz mithilfe der Vorlage ausführen.
+ Dynamische Referenzen können nicht für sichere Werte (wie die im Parameter Store oder Secrets Manager gespeicherten) in benutzerdefinierten Ressourcen verwendet werden. 
+ Dynamische Referenzen werden auch in `AWS::CloudFormation::Init`-Metadaten und Amazon EC2 `UserData`-Eigenschaften nicht unterstützt.
+ Erstellen Sie keine dynamische Referenz, die mit einem umgekehrten Schrägstrich (\$1) endet. CloudFormationkann diese Verweise nicht auflösen, was dazu führen wird, dass Stack-Operationen fehlschlagen.

Die folgenden Themen enthalten Informationen und andere Überlegungen zur Verwendung dynamischer Referenzen.

**Topics**
+ [Allgemeine Überlegungen](#dynamic-references-considerations)
+ [Abrufen eines Klartextwertes aus dem Systems Manager Parameter Store](dynamic-references-ssm.md)
+ [Abrufen eines sicheren String-Wertes aus dem Systems Manager Parameter Store](dynamic-references-ssm-secure-strings.md)
+ [Holen Sie ein Geheimnis oder einen geheimen Wert aus dem Secrets Manager](dynamic-references-secretsmanager.md)

# Abrufen eines Klartextwertes aus dem Systems Manager Parameter Store
<a name="dynamic-references-ssm"></a>

Wenn Sie eine CloudFormation Vorlage erstellen, möchten Sie möglicherweise Klartextwerte verwenden, die im Parameter Store gespeichert sind. Parameter Store ist eine Funktion von. AWS Systems Manager Eine Einführung in den Parameterspeicher finden Sie unter [AWS Systems Manager Parameterspeicher](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) im *AWS Systems Manager -Benutzerhandbuch*. 

Um einen Klartextwert aus dem Parameterspeicher in Ihrer Vorlage zu verwenden, verwenden Sie eine dynamische Referenz `ssm` . Diese Referenz ermöglicht Ihnen den Zugriff auf Werte von Parametern des Typs `String` oder `StringList` im Parameter Store. 

Um zu überprüfen, welche Version einer dynamischen Referenz `ssm` in einer Stapeloperation verwendet wird, erstellen Sie ein Änderungsset für die Stapeloperation. Überprüfen Sie dann die verarbeitete Vorlage auf der Registerkarte **Vorlage** . Weitere Informationen finden Sie unter [Einen Änderungssatz für einen CloudFormation Stapel erstellen](using-cfn-updating-stacks-changesets-create.md).

Bei der Verwendung von dynamischen `ssm`-Referenzen gibt es einige wichtige Dinge zu beachten:
+ CloudFormation unterstützt keine Drifterkennung bei dynamischen Referenzen. Bei dynamischen `ssm`-Referenzen, bei denen Sie die Parameterversion nicht angegeben haben, empfehlen wir, dass Sie, wenn Sie die Parameterversion in Systems Manager aktualisieren, auch einen Stackaktualisierungsvorgang für alle Stack durchführen, die die dynamische `ssm`-Referenz enthalten, um die neueste Parameterversion zu erhalten.
+ Um eine `ssm` dynamische Referenz im `Parameters` Abschnitt Ihrer CloudFormation Vorlage zu verwenden, müssen Sie eine Versionsnummer angeben. CloudFormation erlaubt es Ihnen nicht, auf einen Parameter Store-Wert ohne Versionsnummer in diesem Abschnitt zu verweisen. Alternativ können Sie Ihren Parameter auch als Systemmanager-Parametertyp in Ihrer Vorlage definieren. Wenn Sie dies tun, können Sie einen Systems Manager Manager-Parameterschlüssel als Standardwert für Ihren Parameter angeben. CloudFormation ruft dann die neueste Version des Parameterwerts aus dem Parameter Store ab, ohne dass Sie eine Versionsnummer angeben müssen. Dies kann Ihre Vorlagen einfacher und leichter zu pflegen machen. Weitere Informationen finden Sie unter [Geben Sie vorhandene Ressourcen zur Laufzeit mit von CloudFormation -bereitgestellten Parametertypen an](cloudformation-supplied-parameter-types.md).
+  CloudFormation Löst bei benutzerdefinierten Ressourcen die `ssm` dynamischen Verweise auf, bevor die Anforderung an die benutzerdefinierte Ressource gesendet wird.
+ CloudFormation unterstützt nicht die Verwendung dynamischer Verweise zum Verweisen auf einen Parameter, der von einem anderen AWS-Konto gemeinsam genutzt wird.
+ CloudFormation unterstützt die Verwendung von Systems Manager Manager-Parameterbeschriftungen in dynamischen Verweisen nicht.

## Berechtigungen
<a name="dynamic-references-ssm-permissions"></a>

Um einen im Systems Manager Parameter Store gespeicherten Parameter anzugeben, müssen Sie die Berechtigung haben, [https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html) für den angegebenen Parameter aufzurufen. Wie Sie IAM-Richtlinien erstellen, die den Zugriff auf bestimmte Systems Manager-Parameter ermöglichen, erfahren Sie unter [Einschränkung des Zugriffs auf Systems Manager-Parameter mit IAM-Richtlinien](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-access.html) im *AWS Systems Manager -Benutzerhandbuch*.

## Referenzmuster
<a name="dynamic-references-ssm-pattern"></a>

Verwenden Sie das folgende Referenzmuster, um auf einen Klartextwert zu `ssm` verweisen, der in Ihrer CloudFormation Vorlage im Systems Manager Parameter Store gespeichert ist.

```
{{resolve:ssm:parameter-name:version}}
```

Ihre Referenz muss sich an das folgende reguläre Ausdrucksmuster für Parametername und Version halten:

```
{{resolve:ssm:[a-zA-Z0-9_.\-/]+(:\d+)?}}
```

`parameter-name`  
Der Name des Parameters im Parameter Store. Der Parametername unterscheidet Groß- und Kleinschreibung.  
Erforderlich

`version`  
Eine ganze Zahl, die die Version des zu verwendenden Parameters angibt. Wenn Sie nicht die genaue Version angeben, CloudFormation verwendet immer die neueste Version des Parameters, wenn Sie den Stack erstellen oder aktualisieren. Weitere Informationen finden Sie unter [Arbeiten mit Parameterversionen](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-versions.html) im *AWS Systems Manager -Benutzerhandbuch*.  
Optional.

## Beispiele
<a name="dynamic-references-ssm-examples"></a>

**Topics**
+ [Öffentlicher AMI ID Parameter](#dynamic-references-ssm-public-ami-example)
+ [Benutzerdefinierter AMI-ID-Parameter](#dynamic-references-ssm-custom-ami-example)

### Öffentlicher AMI ID Parameter
<a name="dynamic-references-ssm-public-ami-example"></a>

Das folgende Beispiel erstellt eine EC2-Instance, die auf einen öffentlichen AMI-Parameter verweist. Die dynamische Referenz ruft die neueste Amazon Linux 2023 AMI ID aus dem öffentlichen Parameter ab. Weitere Informationen über öffentliche Parameter finden Sie unter [Entdecken öffentlicher Parameter im Parameterspeicher](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html) im *AWS Systems Manager -Benutzerhandbuch*.

#### JSON
<a name="dynamic-references-ssm-public-ami-example.json"></a>

```
{
    "Resources": {
        "MyInstance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}",
                "InstanceType": "t2.micro"
            }
        }
    }
}
```

#### YAML
<a name="dynamic-references-ssm-public-ami-example.yaml"></a>

```
Resources:
  MyInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}'
      InstanceType: t2.micro
```

### Benutzerdefinierter AMI-ID-Parameter
<a name="dynamic-references-ssm-custom-ami-example"></a>

Das folgende Beispiel erstellt eine EC2-Startvorlage, die auf eine benutzerdefinierte AMI-ID verweist, die im Parameter Store gespeichert ist. Die dynamische Referenz ruft die AMI-ID aus der Version *`2`* des Parameters `golden-ami` jedes Mal ab, wenn eine Instance aus der Startvorlage gestartet wird.

#### JSON
<a name="dynamic-references-ssm-custom-ami-example.json"></a>

```
{
    "Resources": {
        "MyLaunchTemplate": {
            "Type": "AWS::EC2::LaunchTemplate",
            "Properties": {
                "LaunchTemplateName": {
                    "Fn::Sub": "${AWS::StackName}-launch-template"
                },
                "LaunchTemplateData": {
                    "ImageId": "{{resolve:ssm:golden-ami:2}}",
                    "InstanceType": "t2.micro"
                }
            }
        }
    }
}
```

#### YAML
<a name="dynamic-references-ssm-custom-ami-example.yaml"></a>

```
Resources:
  MyLaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties: 
      LaunchTemplateName: !Sub ${AWS::StackName}-launch-template
      LaunchTemplateData:
        ImageId: '{{resolve:ssm:golden-ami:2}}'
        InstanceType: t2.micro
```

# Abrufen eines sicheren String-Wertes aus dem Systems Manager Parameter Store
<a name="dynamic-references-ssm-secure-strings"></a>

In können Sie vertrauliche Daten wie Passwörter oder Lizenzschlüssel verwenden CloudFormation, ohne sie direkt in Ihren Vorlagen verfügbar zu machen, indem Sie die sensiblen Daten als „sichere Zeichenfolge“ im AWS Systems Manager Parameter Store speichern. Eine Einführung in den Parameterspeicher finden Sie unter [AWS Systems Manager Parameterspeicher](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) im *AWS Systems Manager -Benutzerhandbuch*.

Um eine sichere Zeichenfolge für den Parameter Store in Ihrer Vorlage zu verwenden, verwenden Sie eine `ssm-secure` dynamische Referenz. CloudFormation speichert niemals den tatsächlichen Wert einer sicheren Zeichenfolge. Stattdessen speichert es nur die wörtliche dynamische Referenz, die den Klartext-Parameternamen der sicheren Zeichenfolge enthält. 

 CloudFormation Greift bei der Stackerstellung oder bei Aktualisierungen nach Bedarf auf den sicheren Zeichenkettenwert zu, ohne den tatsächlichen Wert preiszugeben. Sichere Zeichenfolgen können nur für Ressourceneigenschaften verwendet werden, die das dynamische Referenzmuster `ssm-secure` unterstützen. Weitere Informationen finden Sie unter [Ressourcen, die dynamische Parametermuster für sichere Zeichenfolgen unterstützen](#template-parameters-dynamic-patterns-resources).

CloudFormation gibt bei API-Aufrufen nicht den tatsächlichen Parameterwert für sichere Zeichenketten zurück. Sie gibt nur die wörtliche dynamische Referenz zurück. Beim Vergleich von Änderungen mithilfe von Änderungssätzen wird CloudFormation nur die wörtliche dynamische Referenzzeichenfolge verglichen. Es löst die tatsächlichen sicheren String-Werte nicht auf und vergleicht sie nicht.

Bei der Verwendung von dynamischen `ssm-secure`-Referenzen gibt es einige wichtige Dinge zu beachten:
+ CloudFormation kann nicht auf Parameter Store-Werte von anderen AWS-Konten zugreifen.
+ CloudFormation unterstützt nicht die Verwendung von Systems Manager Manager-Parameterbeschriftungen oder öffentlichen Parametern in dynamischen Verweisen.
+ In den Regionen `cn-north-1` und `cn-northwest-1` werden sichere Zeichenfolgen von Systems Manager nicht unterstützt.
+ Dynamische Verweise für sichere Werte, wie z. B.`ssm-secure`, werden derzeit in benutzerdefinierten Ressourcen nicht unterstützt.
+ Wenn ein Stack-Update rückgängig gemacht CloudFormation werden muss und die zuvor angegebene Version eines sicheren Zeichenkettenparameters nicht mehr verfügbar ist, schlägt der Rollback-Vorgang fehl. In solchen Fällen haben Sie zwei Möglichkeiten:
  + Verwenden Sie `CONTINUE_UPDATE_ROLLBACK`, um die Ressource zu überspringen.
  + Erstellen Sie den sicheren String-Parameter im Systems Manager Parameter Store neu und aktualisieren Sie ihn, bis die Parameterversion die in der Vorlage verwendete Version erreicht. Dann verwenden Sie `CONTINUE_UPDATE_ROLLBACK`, ohne die Ressource zu überspringen.

## Ressourcen, die dynamische Parametermuster für sichere Zeichenfolgen unterstützen
<a name="template-parameters-dynamic-patterns-resources"></a>

Zu den Ressourcen, die das dynamische Referenzmuster `ssm-secure` unterstützen, gehören:


| Ressource | Eigenschaftstyp | Eigenschaften | 
| --- | --- | --- | 
| [AWS::DirectoryService::MicrosoftAD](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-directoryservice-microsoftad.html) |  | `Password` | 
| [AWS::DirectoryService::SimpleAD](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-directoryservice-simplead.html) |  | `Password` | 
| [AWS::ElastiCache::ReplicationGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticache-replicationgroup.html) |  | `AuthToken` | 
| [AWS::IAM::User](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) | [LoginProfile](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-iam-user-loginprofile.html) | `Password` | 
| [AWS::KinesisFirehose::DeliveryStream](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-kinesisfirehose-deliverystream.html) | [RedshiftDestinationConfiguration](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-kinesisfirehose-deliverystream-redshiftdestinationconfiguration.html) | `Password` | 
| [AWS::OpsWorks::App](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-opsworks-app.html) | [Quelle](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-opsworks-app-source.html) | `Password` | 
| [AWS::OpsWorks::Stack](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-opsworks-stack.html) | [CustomCookbooksSource](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-opsworks-stack-source.html) | `Password` | 
| [AWS::OpsWorks::Stack](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-opsworks-stack.html) | [RdsDbInstances](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-opsworks-stack-rdsdbinstance.html) | `DbPassword` | 
| [AWS: :RDS: DBCluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbcluster.html) |  | `MasterUserPassword` | 
| [AWS: :RDS: DBInstance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html) |  | `MasterUserPassword`  | 
| [AWS::Redshift::Cluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-redshift-cluster.html) |  | `MasterUserPassword` | 

## Referenzmuster
<a name="dynamic-references-ssm-secure-pattern"></a>

Verwenden Sie das folgende Referenzmuster, um in Ihrer CloudFormation Vorlage auf einen sicheren Zeichenkettenwert aus dem Systems Manager Parameter Store zu `ssm-secure` verweisen.

```
{{resolve:ssm-secure:parameter-name:version}}
```

Ihre Referenz muss sich an das folgende reguläre Ausdrucksmuster für Parametername und Version halten:

```
{{resolve:ssm-secure:[a-zA-Z0-9_.\-/]+(:\d+)?}}
```

`parameter-name`  
Der Name des Parameters im Parameter Store. Der Parametername unterscheidet Groß- und Kleinschreibung.  
Erforderlich

`version`  
Eine ganze Zahl, die die Version des zu verwendenden Parameters angibt. Wenn Sie nicht die genaue Version angeben, CloudFormation verwendet immer die neueste Version des Parameters, wenn Sie den Stack erstellen oder aktualisieren. Weitere Informationen finden Sie unter [Arbeiten mit Parameterversionen](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-versions.html) im *AWS Systems Manager -Benutzerhandbuch*.  
Optional.

## Beispiel
<a name="dynamic-references-ssm-secure-example"></a>

Das folgende Beispiel verwendet eine dynamische Referenz `ssm-secure`, um das Passwort für einen IAM-Benutzer auf eine sichere Zeichenkette zu setzen, die im Parameterspeicher gespeichert ist. Wie angegeben, CloudFormation wird die Version *`10`* des `IAMUserPassword` Parameters für Stack- und Change-Set-Operationen verwendet.

### JSON
<a name="dynamic-references-ssm-secure-example.json"></a>

```
  "MyIAMUser": {
    "Type": "AWS::IAM::User",
    "Properties": {
      "UserName": "MyUserName",
      "LoginProfile": {
        "Password": "{{resolve:ssm-secure:IAMUserPassword:10}}"
      }
    }
  }
```

### YAML
<a name="dynamic-references-ssm-secure-example.yaml"></a>

```
  MyIAMUser:
    Type: AWS::IAM::User
    Properties:
      UserName: 'MyUserName'
      LoginProfile:
        Password: '{{resolve:ssm-secure:IAMUserPassword:10}}'
```

# Holen Sie ein Geheimnis oder einen geheimen Wert aus dem Secrets Manager
<a name="dynamic-references-secretsmanager"></a>

Secrets Manager ist ein Dienst, mit dem Sie Geheimnisse wie Datenbankanmeldedaten, Passwörter und API-Schlüssel von Drittanbietern sicher speichern und verwalten können. Mit Secrets Manager können Sie den Zugriff auf diese Geheimnisse zentral speichern und steuern, sodass Sie hartcodierte Anmeldeinformationen in Ihrem Code (einschließlich Passwörtern) durch einen API-Aufruf an Secrets Manager ersetzen können, um das Geheimnis programmgesteuert abzurufen. Weitere Informationen finden Sie unter [Was ist AWS Secrets Manager?](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) im *AWS Secrets Manager Benutzerhandbuch*.

Um ganze Geheimnisse oder geheime Werte, die in Secrets Manager gespeichert sind, in Ihren CloudFormation Vorlagen zu verwenden, verwenden Sie `secretsmanager` dynamische Verweise.

## Best Practices
<a name="dynamic-references-secretsmanager-best-practices"></a>

Folgen Sie diesen bewährten Methoden, wenn Sie dynamische Secrets Manager Manager-Referenzen in Ihren CloudFormation Vorlagen verwenden:
+ **Verwenden Sie versionslose Referenzen für Ihre CloudFormation Vorlagen** — Speichern Sie Anmeldeinformationen in Secrets Manager und verwenden Sie dynamische Verweise ohne Angabe von `version-stage` `version-id` Parametern, um korrekte Workflows für die geheime Rotation zu unterstützen.
+ **Nutzen Sie die automatische Rotation**- Verwenden Sie das automatische Rotationsfeature von Secrets Manager mit versionslosen dynamischen Referenzen für die Verwaltung von Zugangsdaten. Dadurch wird sichergestellt, dass Ihre Anmeldedaten regelmäßig aktualisiert werden, ohne dass Änderungen an der Vorlage erforderlich sind. Weitere Informationen finden Sie unter [Drehen von AWS Secrets Manager Geheimnissen](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html).
+ **Verwenden Sie versionierte Referenzen sparsam**- Geben Sie explizite `version-stage` oder `version-id` Parameter nur für bestimmte Szenarien wie Tests oder Rollback-Situationen an.

## Überlegungen
<a name="dynamic-references-secretsmanager-considerations"></a>

Bei der Verwendung von dynamischen `secretsmanager`-Referenzen sind einige wichtige Punkte zu beachten:
+ CloudFormation verfolgt nicht, welche Version eines Secrets in früheren Bereitstellungen verwendet wurde. Planen Sie Ihre Strategie zur Verwaltung von Geheimnissen sorgfältig, bevor Sie dynamische Referenzen einführen. Verwenden Sie nach Möglichkeit versionslose Referenzen, um die automatische Rotation von Geheimnissen zu nutzen. Überwachen und validieren Sie Ressourcenaktualisierungen, wenn Sie Änderungen an dynamischen Referenzkonfigurationen vornehmen, beispielsweise beim Übergang von nicht versionierten zu versionierten dynamischen Referenzen und umgekehrt.
+ Wenn nur der geheime Wert in Secrets Manager aktualisiert wird CloudFormation , wird der neue Wert nicht automatisch abgerufen. CloudFormation ruft den geheimen Wert nur bei der Ressourcenerstellung oder bei Aktualisierungen ab, bei denen die Ressource geändert wird, die die dynamische Referenz enthält. 

  Nehmen wir zum Beispiel an, Ihre Vorlage enthält eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html)-Ressource, bei der die `MasterPassword`-Eigenschaft auf eine dynamische Referenz von Secrets Manager eingestellt ist. Nachdem Sie einen Stapel aus dieser Vorlage erstellt haben, aktualisieren Sie den Wert des Geheimnisses in Secrets Manager. Die Eigenschaft `MasterPassword` behält jedoch den alten Kennwortwert bei. 

  Um den neuen geheimen Wert anzuwenden, müssen Sie die `AWS::RDS::DBInstance` Ressource in Ihrer CloudFormation Vorlage ändern und ein Stack-Update durchführen. 

  Um diesen manuellen Prozess in Zukunft zu vermeiden, sollten Sie den Secrets Manager verwenden, um das Geheimnis automatisch zu drehen. 
+ Dynamische Verweise auf sichere Werte, wie z. B.`secretsmanager`, werden derzeit in benutzerdefinierten Ressourcen nicht unterstützt.
+ Die dynamische `secretsmanager`-Referenz kann in allen Ressourceneigenschaften verwendet werden. Die Verwendung der `secretsmanager` dynamischen Referenz bedeutet, dass weder Secrets Manager noch CloudFormation Protokolle einen aufgelösten geheimen Wert beibehalten sollten. Der Geheimnis-Wert kann jedoch in dem Service erscheinen, in dessen Ressource er verwendet wird. Überprüfen Sie Ihre Nutzung um zu vermeiden, dass Geheimnis-Daten preisgegeben werden.

## Berechtigungen
<a name="dynamic-references-secretsmanager-permissions"></a>

Um ein in Secrets Manager gespeichertes Geheimnis anzugeben, müssen Sie die Berechtigung haben, [https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html) für das Geheimnis aufzurufen.

## Referenzmuster
<a name="dynamic-references-secretsmanager-pattern"></a>

Verwenden Sie das folgende Referenzmuster, um Secrets Manager-Geheimnisse in Ihrer CloudFormation Vorlage zu `secretsmanager` referenzieren.

```
{{resolve:secretsmanager:secret-id:secret-string:json-key:version-stage:version-id}}
```

`secret-id`  
Der Name oder ARN des Secrets.  
Um auf ein Geheimnis in Ihrem zuzugreifen AWS-Konto, müssen Sie nur den geheimen Namen angeben. Um auf ein Geheimnis in einem anderen zuzugreifen AWS-Konto, geben Sie den vollständigen ARN des Geheimnisses an.  
Erforderlich

`secret-string`  
Der einzige unterstützte Wert ist `SecretString`. Der Standardwert ist `SecretString`.

`json-key`  
Der Schlüsselname des Schlüssel/Wert-Paares, dessen Wert Sie abrufen möchten. Wenn Sie kein a angeben`json-key`, wird der gesamte geheime Text CloudFormation abgerufen.  
Dieses Segment darf nicht das Doppelpunktzeichen (`:`) enthalten.

`version-stage`  
Das Staging-Label der zu verwendenden Version des Geheimnisses. Secrets Manager verwendet Staging-Markierungen, um während des Rotationsprozesses den Überblick über verschiedene Versionen zu behalten. Wenn Sie `version-stage` verwenden, geben Sie `version-id` nicht an. Wenn Sie weder `version-stage` noch `version-id` angeben, dann ist der Standard die `AWSCURRENT`-Version.  
Dieses Segment darf nicht das Doppelpunktzeichen (`:`) enthalten.

`version-id`  
Die eindeutige ID der Version des zu verwendenden Secrets. Wenn Sie `version-id` angeben, dürfen Sie `version-stage` nicht angeben. Wenn Sie weder `version-stage` noch `version-id` angeben, dann ist der Standard die `AWSCURRENT`-Version.  
Dieses Segment darf nicht das Doppelpunktzeichen (`:`) enthalten.

## Beispiele
<a name="dynamic-references-secretsmanager-examples"></a>

**Topics**
+ [Abrufen von Benutzernamen und Passwort aus einem Geheimnis](#dynamic-references-secretsmanager-examples-user-name-and-password)
+ [Abrufen der gesamten SecretString](#dynamic-references-secretsmanager-examples-entire-secretstring)
+ [Abrufen eines Wertes aus einer bestimmten Version eines Geheimnisses](#dynamic-references-secretsmanager-examples-specific-version)
+ [Abrufen von Geheimnissen von einem anderen AWS-Konto](#dynamic-references-secretsmanager-examples-secrets-from-another-account)

### Abrufen von Benutzernamen und Passwort aus einem Geheimnis
<a name="dynamic-references-secretsmanager-examples-user-name-and-password"></a>

Das folgende [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html) Beispiel ruft die im `MySecret`-Geheimnis gespeicherten Werte für Benutzernamen und Kennwort ab. Dieses Beispiel zeigt das empfohlene Muster für versionslose dynamische Referenzen, das automatisch die `AWSCURRENT`-Version verwendet und Secrets Manager Rotationsworkflows unterstützt, ohne dass Vorlagenänderungen erforderlich sind.

#### JSON
<a name="dynamic-references-secretsmanager-examples-user-name-and-password.json"></a>

```
{
    "MyRDSInstance": {
        "Type": "AWS::RDS::DBInstance",
        "Properties": {
            "DBName": "MyRDSInstance",
            "AllocatedStorage": "20",
            "DBInstanceClass": "db.t2.micro",
            "Engine": "mysql",
            "MasterUsername": "{{resolve:secretsmanager:MySecret:SecretString:username}}",
            "MasterUserPassword": "{{resolve:secretsmanager:MySecret:SecretString:password}}"
        }
    }
}
```

#### YAML
<a name="dynamic-references-secretsmanager-examples-user-name-and-password.yaml"></a>

```
  MyRDSInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      DBName: MyRDSInstance
      AllocatedStorage: '20'
      DBInstanceClass: db.t2.micro
      Engine: mysql
      MasterUsername: '{{resolve:secretsmanager:MySecret:SecretString:username}}'
      MasterUserPassword: '{{resolve:secretsmanager:MySecret:SecretString:password}}'
```

### Abrufen der gesamten SecretString
<a name="dynamic-references-secretsmanager-examples-entire-secretstring"></a>

Die folgende dynamische Referenz ruft die `SecretString` für `MySecret`ab.

```
{{resolve:secretsmanager:MySecret}}
```

Alternative Vorgehensweise:

```
{{resolve:secretsmanager:MySecret::::}}
```

### Abrufen eines Wertes aus einer bestimmten Version eines Geheimnisses
<a name="dynamic-references-secretsmanager-examples-specific-version"></a>

Die folgende dynamische Referenz ruft den Wert `password` für die Version `AWSPREVIOUS` von `MySecret`ab.

```
{{resolve:secretsmanager:MySecret:SecretString:password:AWSPREVIOUS}}
```

### Abrufen von Geheimnissen von einem anderen AWS-Konto
<a name="dynamic-references-secretsmanager-examples-secrets-from-another-account"></a>

Der folgende dynamische Verweis ruft das `SecretString` für `MySecret` ab, das in einem anderen AWS-Konto enthalten ist. Sie müssen den vollständigen geheimen ARN angeben, um auf Geheimnisse in einem anderen zugreifen zu können AWS-Konto.

```
{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret}}
```

Der folgende dynamische Verweis ruft den Wert `password` für `MySecret` ab, der in einem anderen AWS-Konto enthalten ist. Sie müssen den vollständigen geheimen ARN angeben, um auf Geheimnisse in einem anderen zugreifen zu können AWS-Konto.

```
{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret:SecretString:password}}
```

# AWS Werte mithilfe von Pseudo-Parametern abrufen
<a name="pseudo-parameter-reference"></a>

Pseudo-Parameter sind integrierte Variablen, die Zugriff auf wichtige AWS Umgebungsinformationen wie Konten IDs, Regionsnamen und Stack-Details bieten, die sich zwischen Bereitstellungen oder Umgebungen ändern können.

Sie können Pseudo-Parameter anstelle von fest codierten Werten verwenden, um Ihre Vorlagen portabler zu machen und sie in verschiedenen Regionen leichter wiederzuverwenden. AWS-Konten 

## Syntax
<a name="pseudo-parameter-syntax"></a>

Sie können Pseudoparameter entweder mit der Funktion `Ref` intrinsisch oder mit der Funktion `Fn::Sub` intrinsisch referenzieren. 

### Punkt
<a name="pseudo-parameter-ref-syntax"></a>

Die Funktion `Ref` verwendet die folgende allgemeine Syntax. Weitere Informationen finden Sie unter [Ref](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-ref.html).

#### JSON
<a name="pseudo-parameter-ref-syntax.json"></a>

```
{ "Ref" : "AWS::PseudoParameter" }
```

#### YAML
<a name="pseudo-parameter-ref-syntax.yaml"></a>

```
!Ref AWS::PseudoParameter
```

### Fn::Sub
<a name="pseudo-parameter-sub-syntax"></a>

Die `Fn::Sub`-Funktion verwendet ein anderes Format, das die `${}`-Syntax um den Pseudoparameter herum enthält. Weitere Informationen finden Sie unter [Fn::Sub](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-sub.html).

#### JSON
<a name="pseudo-parameter-sub-syntax.json"></a>

```
{ "Fn::Sub" : "${AWS::PseudoParameter}" }
```

#### YAML
<a name="pseudo-parameter-sub-syntax.yaml"></a>

```
!Sub '${AWS::PseudoParameter}'
```

## Verfügbare Pseudoparameter
<a name="available-pseudo-parameters"></a>

### `AWS::AccountId`
<a name="cfn-pseudo-param-accountid"></a>

Gibt die AWS-Konto ID des Kontos zurück, in dem der Stack erstellt wird, z. B. `123456789012`

Dieser Pseudo-Parameter wird häufig bei der Definition von IAM-Rollen, Richtlinien und anderen Ressourcenrichtlinien verwendet, die kontospezifische Richtlinien beinhalten. ARNs

### `AWS::NotificationARNs`
<a name="cfn-pseudo-param-notificationarns"></a>

Gibt die Liste der Amazon-Ressourcennamen (ARNs) für die Amazon SNS-Themen zurück, die Stack-Ereignisbenachrichtigungen erhalten. Sie können diese ARNs über die `--notification-arns` Option in der AWS CLI oder über die Konsole angeben, während Sie Ihren Stack erstellen oder aktualisieren.

Im Gegensatz zu anderen Pseudo-Parametern, die einen einzelnen Wert zurückgeben, `AWS::NotificationARNs` gibt dies eine Liste von ARNs zurück. Um auf eine bestimmte ARN in der Liste zuzugreifen, verwenden Sie die Funktion `Fn::Select` intrinsic. Weitere Informationen finden Sie unter [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-select.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-select.html).

### `AWS::NoValue`
<a name="cfn-pseudo-param-novalue"></a>

Entfernt die entsprechende Ressourceneigenschaft, wenn als Rückgabewert in der intrinsischen Funktion `Fn::If` angegeben. Weitere Informationen finden Sie unter [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-conditions.html#intrinsic-function-reference-conditions-if).

Dieser Pseudoparameter ist besonders nützlich, um bedingte Ressourceneigenschaften zu erstellen, die nur unter bestimmten Bedingungen einbezogen werden sollen.

### `AWS::Partition`
<a name="cfn-pseudo-param-partition"></a>

Gibt die Partition zurück, in der sich die Ressource befindet. Standardmäßig ist AWS-Regionen die Partition`aws`. Für Ressourcen in anderen Partitionen lautet die Partition `aws-`*partitionname*. Zum Beispiel ist die Partition für Ressourcen in den Regionen China (Peking und Ningxia) `aws-cn` und die Partition für Ressourcen in der Region AWS GovCloud (USA West). `aws-us-gov`

Die Partition ist Teil des ARN für Ressourcen. Durch die Verwendung `AWS::Partition` wird sichergestellt, dass Ihre Vorlagen auf verschiedenen AWS Partitionen korrekt funktionieren.

### `AWS::Region`
<a name="cfn-pseudo-param-region"></a>

Gibt eine Zeichenfolge zurück, die die Region repräsentiert, in der die umfassende Ressource erstellt wird, z. B. `us-west-2`.

Dies ist einer der am häufigsten verwendeten Pseudo-Parameter, da er es Vorlagen ermöglicht, sich AWS-Regionen ohne Änderung an andere anzupassen.

### `AWS::StackId`
<a name="cfn-pseudo-param-stackid"></a>

Gibt die ID (ARN) des Stacks zurück, beispielsweise `arn:aws:cloudformation:us-west-2:123456789012:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123`.

### `AWS::StackName`
<a name="cfn-pseudo-param-stackname"></a>

Gibt den Namen des Stacks zurück, beispielsweise `teststack`.

Der Stapelname wird üblicherweise verwendet, um eindeutige Ressourcennamen zu erstellen, die leicht als zu einem bestimmten Stapel gehörig identifiziert werden können.

### `AWS::URLSuffix`
<a name="cfn-pseudo-param-urlsuffix"></a>

Gibt das Suffix für die AWS Domain zurück, AWS-Region in der der Stack bereitgestellt wird. Das Suffix ist normalerweise,`amazonaws.com` aber für die Region China (Beijing) lautet das Suffix `amazonaws.com.cn`.

Dieser Parameter ist besonders nützlich bei der Konstruktion URLs für AWS Dienstendpunkte.

## Beispiele
<a name="pseudo-parameter-examples"></a>

**Topics**
+ [Grundlegende Verwendung](#pseudo-parameter-basic-example)
+ [Verwenden von AWS::NotificationARNs](#pseudo-parameter-notification-example)
+ [Bedingte Eigenschaften mit AWS::NoValue](#pseudo-parameter-novalue-example)

### Grundlegende Verwendung
<a name="pseudo-parameter-basic-example"></a>

In den folgenden Beispielen werden zwei Ressourcen erstellt: ein Amazon SNS SNS-Thema und ein CloudWatch Alarm, der Benachrichtigungen zu diesem Thema sendet. Sie verwenden`AWS::StackName`, und`AWS::Region`, `AWS::AccountId` um den Stacknamen, die aktuelle AWS-Region ID und die Konto-ID dynamisch in Ressourcennamen, Beschreibungen und ARNs einzufügen.

#### JSON
<a name="pseudo-parameter-basic-example.json"></a>

```
{
    "Resources": {
        "MyNotificationTopic": {
            "Type": "AWS::SNS::Topic",
            "Properties": {
                "DisplayName": { "Fn::Sub": "Notifications for ${AWS::StackName}" }
            }
        },
        "CPUAlarm": {
            "Type": "AWS::CloudWatch::Alarm",
            "Properties": {
                "AlarmDescription": { "Fn::Sub": "Alarm for high CPU in ${AWS::Region}" },
                "AlarmName": { "Fn::Sub": "${AWS::StackName}-HighCPUAlarm" },
                "MetricName": "CPUUtilization",
                "Namespace": "AWS/EC2",
                "Statistic": "Average",
                "Period": 300,
                "EvaluationPeriods": 1,
                "Threshold": 80,
                "ComparisonOperator": "GreaterThanThreshold",
                "AlarmActions": [{ "Fn::Sub": "arn:aws:sns:${AWS::Region}:${AWS::AccountId}:${MyNotificationTopic}" }]
            }
        }
    }
}
```

#### YAML
<a name="pseudo-parameter-basic-example.yaml"></a>

```
Resources:
  MyNotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      DisplayName: !Sub Notifications for ${AWS::StackName}
  CPUAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: !Sub Alarm for high CPU in ${AWS::Region}
      AlarmName: !Sub ${AWS::StackName}-HighCPUAlarm
      MetricName: CPUUtilization
      Namespace: AWS/EC2
      Statistic: Average
      Period: 300
      EvaluationPeriods: 1
      Threshold: 80
      ComparisonOperator: GreaterThanThreshold
      AlarmActions:
        - !Sub arn:aws:sns:${AWS::Region}:${AWS::AccountId}:${MyNotificationTopic}
```

### Verwenden von AWS::NotificationARNs
<a name="pseudo-parameter-notification-example"></a>

In den folgenden Beispielen wird eine Auto Scaling-Gruppe so konfiguriert, dass sie Benachrichtigungen für Instancestart-Ereignisse und Startfehler sendet. Die Konfiguration verwendet den `AWS::NotificationARNs` Pseudo-Parameter, der eine Liste der Amazon SNS-Themen bereitstellt ARNs , die bei der Stack-Erstellung angegeben wurden. Die Funktion `Fn::Select` wählt den ersten ARN aus dieser Liste aus.

#### JSON
<a name="pseudo-parameter-notification-example.json"></a>

```
"myASG": {
   "Type": "AWS::AutoScaling::AutoScalingGroup",
   "Properties": {
      "LaunchTemplate": {
         "LaunchTemplateId": { "Ref": "myLaunchTemplate" },
         "Version": { "Fn::GetAtt": [ "myLaunchTemplate", "LatestVersionNumber" ] }
       },
       "MaxSize": "1",
       "MinSize": "1",
       "VPCZoneIdentifier": [
          "subnetIdAz1",
          "subnetIdAz2",
          "subnetIdAz3"
      ],
      "NotificationConfigurations" : [{
         "TopicARN" : { "Fn::Select" : [ "0", { "Ref" : "AWS::NotificationARNs" } ] },
         "NotificationTypes" : [ "autoscaling:EC2_INSTANCE_LAUNCH", "autoscaling:EC2_INSTANCE_LAUNCH_ERROR" ]
      }]
   }
}
```

#### YAML
<a name="pseudo-parameter-notification-example.yaml"></a>

```
myASG:
  Type: AWS::AutoScaling::AutoScalingGroup
  Properties:
    LaunchTemplate:
      LaunchTemplateId: !Ref myLaunchTemplate
      Version: !GetAtt myLaunchTemplate.LatestVersionNumber
    MinSize: '1'
    MaxSize: '1'
    VPCZoneIdentifier:
      - subnetIdAz1
      - subnetIdAz2
      - subnetIdAz3
    NotificationConfigurations:
      - TopicARN:
          Fn::Select:
          - '0'
          - Ref: AWS::NotificationARNs
        NotificationTypes:
        - autoscaling:EC2_INSTANCE_LAUNCH
        - autoscaling:EC2_INSTANCE_LAUNCH_ERROR
```

### Bedingte Eigenschaften mit AWS::NoValue
<a name="pseudo-parameter-novalue-example"></a>

Die folgenden Beispiele erstellen eine Amazon RDS DB-Instance, die nur dann einen Snapshot verwendet, wenn eine Snapshot-ID angegeben wird. Wenn die `UseDBSnapshot` Bedingung als wahr ausgewertet wird, wird der `DBSnapshotName` Parameterwert für die Eigenschaft CloudFormation verwendet. `DBSnapshotIdentifier` Wenn die Bedingung als falsch ausgewertet wird, CloudFormation wird die `DBSnapshotIdentifier` Eigenschaft entfernt. 

#### JSON
<a name="pseudo-parameter-novalue-example.json"></a>

```
"MyDB" : {
  "Type" : "AWS::RDS::DBInstance",
  "Properties" : {
    "AllocatedStorage" : "5",
    "DBInstanceClass" : "db.t2.small",
    "Engine" : "MySQL",
    "EngineVersion" : "5.5",
    "MasterUsername" : { "Ref" : "DBUser" },
    "MasterUserPassword" : { "Ref" : "DBPassword" },
    "DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" },
    "DBSnapshotIdentifier" : {
      "Fn::If" : [
        "UseDBSnapshot",
        {"Ref" : "DBSnapshotName"},
        {"Ref" : "AWS::NoValue"}
      ]
    }
  }
}
```

#### YAML
<a name="pseudo-parameter-novalue-example.yaml"></a>

```
MyDB:
  Type: AWS::RDS::DBInstance
  Properties:
    AllocatedStorage: '5'
    DBInstanceClass: db.t2.small
    Engine: MySQL
    EngineVersion: '5.5'
    MasterUsername:
      Ref: DBUser
    MasterUserPassword:
      Ref: DBPassword
    DBParameterGroupName:
      Ref: MyRDSParamGroup
    DBSnapshotIdentifier:
      Fn::If:
        - UseDBSnapshot
        - Ref: DBSnapshotName
        - Ref: AWS::NoValue
```

# Holen Sie sich exportierte Ausgaben aus einem bereitgestellten CloudFormation Stack
<a name="using-cfn-stack-exports"></a>

Wenn Sie mehrere Stapel in derselben AWS-Konto Region haben, möchten Sie möglicherweise Informationen zwischen ihnen austauschen. Dies ist nützlich, wenn ein Stack die von einem anderen Stack erstellten Ressourcen verwenden muss.

Sie könnten zum Beispiel einen Stack haben, der Netzwerkressourcen wie Subnetze und Sicherheitsgruppen für Ihre Webserver erstellt. Andere Stacks, die die eigentlichen Webserver erstellen, können dann die vom ersten Stack erstellten Netzwerkressourcen nutzen. Sie müssen die Ressourcen nicht IDs in der Vorlage des Stacks fest codieren oder IDs als Eingabeparameter übergeben.

Um Informationen zwischen Stackn auszutauschen, *exportieren* Sie Ausgabewerte aus einem Stack und *importieren* sie in einen anderen Stack. Funktionsweise:

1. In der Vorlage des ersten Stacks (beispielsweise des NetzwerkStacks) definieren Sie bestimmte Werte für den Export, indem Sie das Feld `Export` im Abschnitt `Outputs` verwenden. Weitere Informationen finden Sie unter [CloudFormation OutputsVorlagensyntax](outputs-section-structure.md).

1. Wenn Sie diesen Stapel erstellen oder aktualisieren, werden die CloudFormation Ausgabewerte exportiert AWS-Konto und sie anderen Stacks in derselben Region zur Verfügung gestellt.

1. In der Vorlage des anderen Stacks verwenden Sie die Funktion [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-importvalue.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-importvalue.html), um die exportierten Werte aus dem ersten Stack zu importieren.

1. Wenn Sie den zweiten Stack (z. B. den Webserver-Stack) erstellen oder aktualisieren, CloudFormation werden die exportierten Werte automatisch aus dem ersten Stapel abgerufen und verwendet.

Eine Anleitung sowie Beispielvorlagen finden Sie unter [Verweisen Sie auf Ressourcenausgaben in einem anderen CloudFormation Stack](walkthrough-crossstackref.md).

## Exportieren von Stack-Ausgabewerten im Vergleich zur Verwendung geschachtelter Stacks
<a name="output-vs-nested"></a>

Ein geschachtelter Stack ist ein Stack, den Sie innerhalb eines anderes Stacks mithilfe der `AWS::CloudFormation::Stack`-Ressource erstellen können. Bei geschachtelten Stacks können Sie alle Ressourcen aus einem einzigen Stack bereitstellen und verwalten. Sie können Ausgaben aus einem Stack in den geschachtelten Stack-Gruppen als Eingaben für einen anderen Stack in der Gruppe verwenden. Dies unterscheidet sich vom Exportieren von Werten.

Wenn Sie den Informationsaustausch auf innerhalb einer geschachtelten Stack-Gruppe isolieren möchten, wird empfohlen, geschachtelte Stacks zu verwenden. Um Informationen mit anderen Stacks (nicht nur innerhalb der Gruppe geschachtelter Stacks) auszutauschen, exportieren Sie Werte. Sie können z. B. einen einzelnen Stack mit einem Subnetz erstellen und dann seine ID exportieren. Andere Stacks können dieses Teilnetz verwenden, indem sie seine ID importieren. Jeder Stack muss nicht sein eigenes Subnetz erstellen. Solange Stacks die Subnetz-ID importieren, können sie nicht geändert oder gelöscht werden.

Weitere Informationen über verschachtelte Stapel finden Sie unter [Aufteilung einer Vorlage in wiederverwendbare Teile mit verschachtelten Stapeln](using-cfn-nested-stacks.md).

## Überlegungen
<a name="using-cfn-stack-exports-considerations"></a>

Die folgenden Einschränkungen gelten für Cross-Stack-Referenzen:
+ Jeder AWS-Konto`Export` Name muss innerhalb einer Region eindeutig sein.
+ Cross-Stack-Referenzen können nicht regionsübergreifend erstellt werden. Sie können die intrinsische Funktion `Fn::ImportValue` verwenden, um nur Werte zu importieren, die innerhalb derselben Region exportiert wurden.
+ Für Ausgaben kann der Wert der `Name`-Eigenschaft eines `Export` keine `Ref`- oder `GetAtt`-Funktionen verwenden, die von einer Ressource abhängen.

  Ebenso darf die `ImportValue`-Funktion keine `Ref`- oder `GetAtt`-Funktionen enthalten, die von einer Ressource abhängen.
+ Nachdem ein anderer Stack einen Ausgabewert importiert hat, können Sie den Stack, der den Ausgabewert exportiert, nicht löschen oder den exportierten Ausgabewert ändern. Alle Importe müssen entfernt werden, bevor Sie den exportierenden Stack löschen oder den Ausgabewert ändern können.

## Auflistung von exportierten Ausgabewerten
<a name="using-cfn-stack-exports-listing"></a>

Wenn Sie die exportierten Ausgabewerte aus Ihren Stapeln anzeigen möchten, verwenden Sie eine der folgenden Methoden:

**So listen Sie exportierte Ausgabewerte auf (Konsole)**

1. Öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Wählen Sie in der Navigationsleiste am oberen Rand des Bildschirms Ihren AWS-Region.

1. Wählen Sie im linken Navigationsbereich **Exporte**.

**So listen Sie exportierte Ausgabewerte auf (AWS CLI)**  
Verwenden Sie den folgenden [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-exports.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-exports.html)-Befehl. Ersetze es durch *us-east-1* dein. AWS-Region

```
aws cloudformation list-exports --region us-east-1
```

Es folgt eine Beispielausgabe.

```
{
    "Exports": [
        {
            "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800",
            "Name": "private-vpc-subnet-a",
            "Value": "subnet-07b410xmplddcfa03"
        },
        {
            "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800",
            "Name": "private-vpc-subnet-b",
            "Value": "subnet-075ed3xmplebd2fb1"
        },
        {
            "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800",
            "Name": "private-vpc-vpcid",
            "Value": "vpc-011d7xmpl100e9841"
        }
    ]
}
```

CloudFormation zeigt die Namen und Werte der exportierten Ausgaben für die aktuelle Region und den Stack, aus dem sie exportiert wurden. Um einen exportierten Ausgabewert in der Vorlage eines anderen Stacks zu verwenden, können Sie ihn mit dem Exportnamen und der Funktion `Fn::ImportValue` referenzieren.

## Auflistung von Stacks, die einen exportierten Ausgabewert importieren
<a name="using-cfn-stack-imports"></a>

Um exportierte Ausgabewerte zu löschen oder zu ändern, müssen Sie zunächst herausfinden, von welchen Stapeln sie importiert werden.

Um die Stapel anzuzeigen, die einen exportierten Ausgabewert importieren, verwenden Sie eine der folgenden Methoden:

**Auflisten von Stacks, die einen exportierten Ausgabewert importieren (Konsole)**

1. Öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Wählen Sie im linken Navigationsbereich **Exporte**.

1. Um zu sehen, welche Stacks einen bestimmten Exportwert importieren, wählen Sie den **Exportnamen** für diesen Exportwert. CloudFormation zeigt die Seite mit den Exportdetails an, auf der alle Stapel aufgeführt sind, die den Wert importieren.

**Auflisten von Stacks, die einen exportierten Ausgabewert importieren (AWS CLI)**  
Verwenden Sie den Befehl [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-imports.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-imports.html). *us-east-1*Ersetzen Sie es durch Ihren AWS-Region und `private-vpc-vpcid` durch den Namen des exportierten Ausgabewerts.

```
aws cloudformation list-imports --region us-east-1 \
    --export-name private-vpc-vpcid
```

CloudFormation gibt eine Liste von Stacks zurück, die den Wert importieren.

```
{
    "Imports": [
        "my-app-stack"
    ]
}
```

Sobald Sie wissen, welche Stack einen bestimmten exportierten Wert importieren, müssen Sie diese Stack ändern, um die `Fn::ImportValue`-Funktionen zu entfernen, die auf die Ausgabewerte verweisen. Sie müssen alle Importe entfernen, die auf exportierte Ausgabewerte verweisen, bevor Sie die exportierten Ausgabewerte löschen oder ändern können. 

# Geben Sie vorhandene Ressourcen zur Laufzeit mit von CloudFormation -bereitgestellten Parametertypen an
<a name="cloudformation-supplied-parameter-types"></a>

Beim Erstellen Ihrer Vorlage können Sie Parameter erstellen, bei denen Benutzer Kennungen vorhandener AWS Ressourcen oder Systems Manager Manager-Parameter eingeben müssen, indem Sie spezielle Parametertypen verwenden, die von CloudFormation bereitgestellt werden. 

**Topics**
+ [-Übersicht](#cloudformation-supplied-parameter-types-overview)
+ [Beispiel](#cloudformation-supplied-parameter-types-example)
+ [Überlegungen](#cloudformation-supplied-parameter-types-considerations)
+ [Unterstützte AWS-spezifische Parametertypen](#aws-specific-parameter-types-supported)
+ [Unterstützte Systems Manager Parametertypen](#systems-manager-parameter-types-supported)
+ [Nicht unterstützte Systems Manager Parametertypen](#systems-manager-parameter-types-unsupported)

## -Übersicht
<a name="cloudformation-supplied-parameter-types-overview"></a>

In können Sie Parameter verwenden CloudFormation, um Ihre Stapel anzupassen, indem Sie bei der Erstellung oder Aktualisierung des Stacks Eingabewerte angeben. Dieses Feature macht Ihre Vorlagen wiederverwendbar und flexibel für verschiedene Szenarien. 

Parameter werden im `Parameters` Abschnitt einer CloudFormation Vorlage definiert. Jeder Parameter hat einen Namen und einen Typ und kann zusätzliche Einstellungen wie einen Standardwert und zulässige Werte haben. Weitere Informationen finden Sie unter [CloudFormation ParametersVorlagensyntax](parameters-section-structure.md). 

Der Parametertyp bestimmt die Art des Eingabewerts, den der Parameter akzeptieren kann. Zum Beispiel akzeptiert `Number` nur numerische Werte, während `String` auch Texteingaben akzeptiert. 

CloudFormation stellt mehrere zusätzliche Parametertypen bereit, die Sie in Ihren Vorlagen verwenden können, um auf vorhandene AWS Ressourcen und Systems Manager Manager-Parameter zu verweisen. 

Diese Parametertypen fallen in zwei Kategorien:
+ **AWS-spezifische Parametertypen** — CloudFormation stellt eine Reihe von Parametertypen bereit, mit deren Hilfe ungültige Werte beim Erstellen oder Aktualisieren eines Stacks erkannt werden können. Wenn Sie diese Parametertypen verwenden, muss jeder, der Ihre Vorlage verwendet, gültige Werte aus der AWS-Konto Region angeben, in der der Stack erstellt wird.

  Wenn sie den verwenden AWS-Managementkonsole, CloudFormation wird eine vorausgefüllte Liste mit vorhandenen Werten aus ihrem Konto und ihrer Region bereitgestellt. Auf diese Weise muss sich der Benutzer nicht an einen bestimmten Namen oder eine ID erinnern und diese korrekt eingeben. Stattdessen wählen sie einfach Werte aus einer Dropdown-Liste aus. In einigen Fällen können Sie sogar nach Werten über ID, Name oder `Name`-Tag-Wert suchen.
+ **Systems Manager-Parametertypen** — stellt CloudFormation auch Parametertypen bereit, die vorhandenen Parametern im Systems Manager Parameter Store entsprechen. Wenn Sie diese Parametertypen verwenden, muss jeder, der Ihre Vorlage verwendet, einen Parameter Store-Schlüssel als Wert für den Systems Manager Manager-Parametertyp angeben und CloudFormation dann den neuesten Wert aus dem Parameter Store abrufen, um ihn in seinem Stack zu verwenden. Dies kann nützlich sein, wenn Sie Anwendungen häufig mit neuen Eigenschaftswerten aktualisieren müssen, z. B. mit einem neuen Amazon Machine Image (AMI) IDs. Informationen über den Parameterspeicher finden Sie unter [Systems Manager Parameterspeicher](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html).

Sobald Ihre Parameter im `Parameters` Abschnitt definiert sind, können Sie mithilfe der `Ref` Funktion in Ihrer gesamten CloudFormation Vorlage auf Parameterwerte verweisen.

## Beispiel
<a name="cloudformation-supplied-parameter-types-example"></a>

Das folgende Beispiel zeigt eine Vorlage, die die folgenden Parametertypen verwendet. 
+ `AWS::EC2::VPC::Id`
+ `AWS::EC2::Subnet::Id`
+ `AWS::EC2::KeyPair::KeyName`
+ `AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>`

Um einen Stack aus dieser Vorlage zu erstellen, müssen Sie eine vorhandene VPC-ID, Subnetz-ID und einen Schlüsselpaar-Namen aus Ihrem Konto angeben. Sie können auch einen vorhandenen Parameterspeicherschlüssel angeben, der auf die gewünschte AMI-ID verweist, oder den Standardwert `/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2`beibehalten. Dieser öffentliche Parameter ist ein Alias für die regionale AMI-ID für das neueste Amazon Linux 2 AMI. Weitere Informationen über öffentliche Parameter finden Sie unter [Entdecken öffentlicher Parameter im Parameterspeicher](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html) im *AWS Systems Manager -Benutzerhandbuch*.

### JSON
<a name="cloudformation-supplied-parameter-types-example.json"></a>

```
{
    "Parameters": {
        "VpcId": {
            "Description": "ID of an existing Virtual Private Cloud (VPC).",
            "Type": "AWS::EC2::VPC::Id"
        },
        "PublicSubnetId": {
            "Description": "ID of an existing public subnet within the specified VPC.",
            "Type": "AWS::EC2::Subnet::Id"
        },
        "KeyName": {
            "Description": "Name of an existing EC2 key pair to enable SSH access to the instance.",
            "Type": "AWS::EC2::KeyPair::KeyName"
        },
        "AMIId": {
            "Description": "Name of a Parameter Store parameter that stores the ID of the Amazon Machine Image (AMI).",
            "Type": "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
            "Default": "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
        }
    },
    "Resources": {
        "InstanceSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable SSH access via port 22",
                "VpcId": { "Ref": "VpcId" },
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 22,
                        "ToPort": 22,
                        "CidrIp": "0.0.0.0/0"
                    }
                ]
            }
        },
        "Ec2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "KeyName": { "Ref": "KeyName" },
                "ImageId": { "Ref": "AMIId" },
                "NetworkInterfaces": [
                    {
                        "AssociatePublicIpAddress": "true",
                        "DeviceIndex": "0",
                        "SubnetId": { "Ref": "PublicSubnetId" },
                        "GroupSet": [{ "Ref": "InstanceSecurityGroup" }]
                    }
                ]
            }
        }
    },
    "Outputs": {
        "InstanceId": {
            "Value": { "Ref": "Ec2Instance" }
        }
    }
}
```

### YAML
<a name="cloudformation-supplied-parameter-types-example.yaml"></a>

```
Parameters:
  VpcId:
    Description: ID of an existing Virtual Private Cloud (VPC).
    Type: AWS::EC2::VPC::Id
  PublicSubnetId:
    Description: ID of an existing public subnet within the specified VPC.
    Type: AWS::EC2::Subnet::Id
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance.
    Type: AWS::EC2::KeyPair::KeyName
  AMIId:
    Description: Name of a Parameter Store parameter that stores the ID of the Amazon Machine Image (AMI).
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
Resources:
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable SSH access via port 22
      VpcId: !Ref VpcId
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      KeyName: !Ref KeyName
      ImageId: !Ref AMIId
      NetworkInterfaces:
        - AssociatePublicIpAddress: "true"
          DeviceIndex: "0"
          SubnetId: !Ref PublicSubnetId
          GroupSet:
            - !Ref InstanceSecurityGroup
Outputs:
  InstanceId:
    Value: !Ref Ec2Instance
```

### AWS CLI Befehl zum Erstellen des Stacks
<a name="cloudformation-supplied-parameter-types-cli-command"></a>

Der folgende Befehl [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html) erstellt einen Stapel auf der Grundlage der Beispielvorlage. 

```
aws cloudformation create-stack --stack-name MyStack \
  --template-body file://sampletemplate.json \
  --parameters \
ParameterKey="VpcId",ParameterValue="vpc-a123baa3" \
ParameterKey="PublicSubnetId",ParameterValue="subnet-123a351e" \
ParameterKey="KeyName",ParameterValue="MyKeyName" \
ParameterKey="AMIId",ParameterValue="MyParameterKey"
```

Um einen Parametertyp zu verwenden, der eine Liste von Zeichenketten akzeptiert, wie beispielsweise `List<AWS::EC2::Subnet::Id>`, müssen Sie die Kommas innerhalb von `ParameterValue` mit einem doppelten Backslash entwerten, wie im folgenden Beispiel gezeigt.

```
--parameters ParameterKey="SubnetIDs",ParameterValue="subnet-5ea0c127\\,subnet-6194ea3b\\,subnet-c87f2be0"
```

## Überlegungen
<a name="cloudformation-supplied-parameter-types-considerations"></a>

Es wird dringend empfohlen, dynamische Verweise zu verwenden, um den Zugriff auf sensible Konfigurationsdefinitionen, wie beispielsweise Zugangsdaten von Drittanbietern, zu beschränken. Weitere Informationen finden Sie unter [Abrufen von in anderen Diensten gespeicherten Werten mit Hilfe von dynamischen Referenzen](dynamic-references.md).

Wenn Sie Vorlagenbenutzern die Möglichkeit geben möchten, Werte aus verschiedenen Werten anzugeben AWS-Konten, verwenden Sie keine AWS-spezifischen Parametertypen. Definieren Sie stattdessen Parameter vom Typ `String` oder `CommaDelimitedList`. 

Bei den Parametertypen von Systems Manager gibt es einige Dinge zu beachten:
+ Sie können die aufgelösten Parameterwerte auf der Registerkarte **Parameter** des Stacks in der Konsole sehen, oder indem Sie [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html) oder [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-change-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-change-set.html)ausführen. Denken Sie daran, dass diese Werte festgelegt werden, wenn der Stapel erstellt oder aktualisiert wird. Sie können sich also von den aktuellen Werten im Parameter Store unterscheiden.
+ Wenn Sie bei Stack-Updates die Option **Bestehenden Wert verwenden** (oder `UsePreviousValue` auf true setzen) verwenden, bedeutet dies, dass Sie weiterhin denselben Parameter Store-Schlüssel verwenden möchten, nicht seinen Wert. CloudFormation ruft immer den neuesten Wert ab.
+ Wenn Sie zulässige Werte oder andere Einschränkungen angeben, werden diese anhand der von Ihnen angegebenen Parameterschlüssel CloudFormation überprüft, nicht jedoch anhand ihrer Werte. Sie sollten die Werte im Parameterspeicher selbst validieren.
+  CloudFormation Verwendet beim Erstellen oder Aktualisieren von Stacks und beim Erstellen von Änderungssätzen den Wert, der zu diesem Zeitpunkt im Parameterspeicher vorhanden ist. Wenn ein angegebener Parameter nicht im Parameter Store unter dem des Aufrufers vorhanden ist AWS-Konto, wird ein Validierungsfehler CloudFormation zurückgegeben.
+ Wenn Sie einen Änderungssatz ausführen, CloudFormation verwendet die Werte, die im Änderungssatz angegeben sind. Sie sollten diese Werte vor der Ausführung des Änderungssatzes prüfen, da sie sich im Parameter Store zwischen dem Zeitpunkt, an dem der Änderungssatz erstellt wurde, und dem Zeitpunkt, an dem er ausgeführt wird, ändern können.
+ Für Parameter Store-Parameter, die in demselben gespeichert sind AWS-Konto, müssen Sie den Parameternamen angeben. Für Parameterspeicher-Parameter, die von einem anderen AWS-Konto gemeinsam genutzt werden, müssen Sie den vollständigen ARN des Parameters angeben.

## Unterstützte AWS-spezifische Parametertypen
<a name="aws-specific-parameter-types-supported"></a>

CloudFormation unterstützt die folgenden AWS-spezifischen Typen:

`AWS::EC2::AvailabilityZone::Name`  
Gibt eine Availability Zone an (zum Beispiel `us-west-2a`).

`AWS::EC2::Image::Id`  
Gibt die ID eines Amazon-EC2-Images an (zum Beispiel `ami-0ff8a91507f77f867`). Beachten Sie, dass die CloudFormation Konsole keine Dropdownliste mit Werten für diesen Parametertyp anzeigt.

`AWS::EC2::Instance::Id`  
Gibt die ID einer Amazon EC2-Instance an (zum Beispiel `i-1e731a32`).

`AWS::EC2::KeyPair::KeyName`  
Gibt den Namen eines Amazon EC2-Schlüsselpaars an.

`AWS::EC2::SecurityGroup::GroupName`  
Ein Standardname der VPC-Sicherheitsgruppe, beispielsweise `my-sg-abc`.

`AWS::EC2::SecurityGroup::Id`  
Gibt die ID einer Sicherheitsgruppe an (zum Beispiel `sg-a123fd85`).

`AWS::EC2::Subnet::Id`  
Gibt eine Subnetz-ID an (zum Beispiel `subnet-123a351e`).

`AWS::EC2::Volume::Id`  
Gibt die ID eines Amazon-EBS-Volumes an (zum Beispiel `vol-3cdd3f56`).

`AWS::EC2::VPC::Id`  
Gibt eine VPC-ID an (zum Beispiel `vpc-a123baa3`).

`AWS::Route53::HostedZone::Id`  
Gibt die ID einer gehosteten Amazon Route 53-Zone an (zum Beispiel `Z23YXV4OVPL04A`).

`List<AWS::EC2::AvailabilityZone::Name>`  
Gibt ein Array von Availability Zones in einer Region an (zum Beispiel `us-west-2a, us-west-2b`).

`List<AWS::EC2::Image::Id>`  
Eine Reihe von Amazon EC2 EC2-Images IDs, z. B. `ami-0ff8a91507f77f867, ami-0a584ac55a7631c0c` Beachten Sie, dass die CloudFormation Konsole keine Dropdownliste mit Werten für diesen Parametertyp anzeigt.

`List<AWS::EC2::Instance::Id>`  
Ein Array von Amazon EC2 EC2-Instances IDs, z. B. `i-1e731a32, i-1e731a34`

`List<AWS::EC2::SecurityGroup::GroupName>`  
Ein Array von Standard-VPC-Sicherheitsgruppennamen, z. B. `my-sg-abc, my-sg-def`.

`List<AWS::EC2::SecurityGroup::Id>`  
Eine Reihe von Sicherheitsgruppen IDs, wie `sg-a123fd85, sg-b456fd85` z.

`List<AWS::EC2::Subnet::Id>`  
Ein Array von Subnetzen IDs, z. B. `subnet-123a351e, subnet-456b351e`

`List<AWS::EC2::Volume::Id>`  
Eine Reihe von Amazon EBS-Volumes IDs, wie `vol-3cdd3f56, vol-4cdd3f56` z.

`List<AWS::EC2::VPC::Id>`  
Ein Array von VPC IDs, wie `vpc-a123baa3, vpc-b456baa3` z.

`List<AWS::Route53::HostedZone::Id>`  
Eine Reihe von von Amazon Route 53-gehosteten Zonen IDs, z. `Z23YXV4OVPL04A, Z23YXV4OVPL04B` B.

## Unterstützte Systems Manager Parametertypen
<a name="systems-manager-parameter-types-supported"></a>

CloudFormation unterstützt die folgenden Systems Manager Manager-Parametertypen:

`AWS::SSM::Parameter::Name`  
Der Name eines Systems Manager-Parameterschlüssels. Verwenden Sie diesen Parametertyp nur, um zu überprüfen, ob ein erforderlicher Parameter vorhanden ist. CloudFormation ruft den tatsächlichen Wert, der dem Parameter zugeordnet ist, nicht ab. 

`AWS::SSM::Parameter::Value<String>`  
Ein Systems Manager-Parameter, dessen Wert eine Zeichenfolge ist. Dies entspricht dem Parametertyp `String` im Parameter Store.

`AWS::SSM::Parameter::Value<List<String>>` oder `AWS::SSM::Parameter::Value<CommaDelimitedList>`  
Ein Systems Manager-Parameter, dessen Wert eine Liste von Zeichenfolgen ist. Dies entspricht dem Parametertyp `StringList` im Parameter Store.

`AWS::SSM::Parameter::Value<AWS-specific parameter type>`  
Ein Systems Manager Manager-Parameter, dessen Wert ein AWS-spezifischer Parametertyp ist.   
Das folgende Beispiel gibt z. B. den Typ `AWS::EC2::KeyPair::KeyName` an:  
+ `AWS::SSM::Parameter::Value<AWS::EC2::KeyPair::KeyName>`

`AWS::SSM::Parameter::Value<List<AWS-specific parameter type>>`  
Ein Systems Manager Manager-Parameter, dessen Wert eine Liste von AWS-spezifischen Parametertypen ist.   
Das folgende Beispiel gibt z. B. eine Liste der `AWS::EC2::KeyPair::KeyName`-Typen an:  
+ `AWS::SSM::Parameter::Value<List<AWS::EC2::KeyPair::KeyName>>`

## Nicht unterstützte Systems Manager Parametertypen
<a name="systems-manager-parameter-types-unsupported"></a>

CloudFormation unterstützt den folgenden Systems Manager Manager-Parametertyp nicht:
+ Listen von Systems Manager-Parametertypen- zum Beispiel: `List<AWS::SSM::Parameter::Value<String>>`.

Unterstützt außerdem CloudFormation nicht die Definition von Vorlagenparametern als `SecureString` Systems Manager Manager-Parametertypen. Sie können jedoch sichere Zeichenketten als Parameter *Werte* für bestimmte Ressourcen angeben. Weitere Informationen finden Sie unter [Abrufen von in anderen Diensten gespeicherten Werten mit Hilfe von dynamischen Referenzen](dynamic-references.md).

# CloudFormation Komplettlösungen
<a name="walkthroughs"></a>

Diese Dokumentation enthält eine Sammlung von Komplettlösungen, die Ihnen praktische Übungen für die Stack-Bereitstellung bieten.
+ [Verweisen Sie auf Ressourcenausgaben in einem anderen CloudFormation Stack](walkthrough-crossstackref.md)— Diese exemplarische Vorgehensweise zeigt Ihnen, wie Sie auf Ausgaben von einem CloudFormation Stapel innerhalb eines anderen Stacks verweisen. Anstatt alle Ressourcen in einem einzigen Stapel zusammenzufassen, können Sie verwandte AWS Ressourcen in separaten Stacks erstellen, um modularere und wiederverwendbarere Vorlagen zu erstellen.
+ [Bereitstellen von Anwendungen auf Amazon EC2](deploying.applications.md)— Erfahren Sie, wie CloudFormation Sie Ihre Anwendung auf EC2 Amazon-Instances automatisch installieren, konfigurieren und starten können. Auf diese Weise können Sie problemlos Implementierungen duplizieren und bestehende Installationen aktualisieren, ohne sich direkt mit den Instances zu verbinden.
+ [Einen CloudFormation Stack aktualisieren](updating.stacks.walkthrough.md)— Gehen Sie eine einfache Abfolge von Updates für einen laufenden Stack mit durch CloudFormation.
+ [Erstellen Sie eine skalierte Anwendung mit Load Balancing](walkthrough-autoscaling.md)— Erfahren Sie, wie Sie damit eine skalierbare Anwendung mit Lastenausgleich erstellen können. CloudFormation Diese Anleitung behandelt die Erstellung einer Auto Scaling-Gruppe, eines Load Balancers und anderer zugehöriger Ressourcen, um sicherzustellen, dass Ihre Anwendung unterschiedliche Verkehrslasten bewältigen und eine hohe Verfügbarkeit aufrechterhalten kann.
+ [Peern Sie mit einer VPC in einer anderen AWS-Konto](peer-with-vpc-in-another-account.md)— Diese exemplarische Vorgehensweise führt Sie durch den Prozess der Erstellung einer Virtual Private Cloud (VPC) -Peering-Verbindung zwischen zwei VPCs unterschiedlichen Anbietern. AWS-Konten Mit VPC-Peering können Sie den Datenverkehr zwischen den Ressourcen weiterleiten VPCs und darauf zugreifen, als ob sie Teil desselben Netzwerks wären.
+ [Führen Sie blue/green ECS-Bereitstellungen durch, indem Sie CodeDeploy CloudFormation](blue-green.md)— Erfahren Sie, wie CloudFormation Sie mithilfe von AWS CodeDeploy blue/green deployments on Amazon ECS. Blue/green Bereitstellungen Ihre Anwendungen oder Dienste mit minimalen Ausfallzeiten aktualisieren können.

# Verweisen Sie auf Ressourcenausgaben in einem anderen CloudFormation Stack
<a name="walkthrough-crossstackref"></a>

Diese exemplarische Vorgehensweise zeigt Ihnen, wie Sie auf Ausgaben von einem CloudFormation Stapel in einem anderen Stapel verweisen, um modularere und wiederverwendbarere Vorlagen zu erstellen. 

Anstatt alle Ressourcen in einem einzigen Stapel zusammenzufassen, erstellen Sie verwandte AWS Ressourcen in separaten Stacks. Dann können Sie auf benötigte Ressourcenausgaben aus anderen Stapeln verweisen. Durch Einschränken von Stack-übergreifenden Verweisen auf Ausgaben können Sie die Teile eines Stacks steuern, auf die von anderen Stacks verwiesen wird.

Angenommen, Sie verfügen über einen Netzwerk-Stack mit einer VPC, einer Sicherheitsgruppe und einem Subnetz für öffentliche Webanwendungen sowie über einen öffentlichen Webanwendungs-Stack. Um sicherzustellen, dass die Webanwendungen die Sicherheitsgruppe und das Subnetz aus dem Netzwerk-Stack verwenden, erstellen Sie einen Stack-übergreifenden Verweis, über den der Webanwendungs-Stack auf Ressourcenausgaben vom Netzwerk-Stack verweisen kann. Mit einem Stack-übergreifenden Verweis müssen die Besitzer der Webanwendungs-Stacks keine Netzwerkregeln oder Komponenten erstellen oder verwalten.

Um einen Stack-übergreifenden Verweis zu erstellen, verwenden Sie das `Export`-Ausgabefeld, um den Wert einer Ressourcenausgabe für den Export zu markieren. Verwenden Sie dann die intrinsische Funktion `Fn::ImportValue` , um den Wert zu importieren. Weitere Informationen finden Sie unter [Holen Sie sich exportierte Ausgaben aus einem bereitgestellten CloudFormation Stack](using-cfn-stack-exports.md).

**Anmerkung**  
CloudFormation ist ein kostenloser Service. Die AWS Ressourcen, die Sie in Ihren Stacks aufnehmen, werden Ihnen jedoch zum jeweils aktuellen Tarif in Rechnung gestellt. Weitere Informationen zu AWS -Preisen finden Sie auf der [Detailseite der einzelnen Produkte](https://aws.amazon.com/).

**Topics**
+ [Verwenden Sie eine Beispielvorlage, um einen Netzwerkstapel zu erstellen](#walkthrough-crossstackref-create-vpc-stack)
+ [Verwenden Sie eine Beispielvorlage, um einen Webanwendungsstapel zu erstellen](#walkthrough-crossstackref-create-ec2-stack)
+ [Überprüfen Sie, ob der Stack wie vorgesehen funktioniert](#walkthrough-crossstackref-verify)
+ [Fehler bei der AMI-Zuordnung beheben](#walkthrough-crossstackref-troubleshooting-ami)
+ [Bereinigen Ihrer Ressourcen](#walkthrough-crossstackref-clean-up)

## Verwenden Sie eine Beispielvorlage, um einen Netzwerkstapel zu erstellen
<a name="walkthrough-crossstackref-create-vpc-stack"></a>

Bevor Sie mit dieser exemplarischen Vorgehensweise beginnen, überprüfen Sie, ob Sie über IAM-Berechtigungen zur Nutzung aller der folgenden Dienste verfügen: Amazon VPC, Amazon EC2 und. CloudFormation

Der Netzwerk-Stack umfasst die VPC, die Sicherheitsgruppe und das Subnetz, das Sie im Webanwendungs-Stack verwenden. Zusätzlich zu diesen Regeln erstellt der Netzwerk-Stack ein Internet-Gateway und Routing-Tabellen, um den öffentlichen Zugriff zu ermöglichen.

Sie müssen diesen Stack erstellen, bevor Sie den Webanwendungs-Stack erstellen. Wenn Sie den Webanwendungs-Stack zuerst erstellen, verfügt dieser nicht über eine Sicherheitsgruppe oder ein Subnetz.

[Die Stack-Vorlage ist unter der folgenden URL verfügbar: https://s3.amazonaws.com/cloudformation-examples/ user- .template. guide/cross-stack/SampleNetworkCrossStack](https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleNetworkCrossStack.template) Um die Ressourcen zu sehen, die der Stack erstellt, wählen Sie den Link aus, woraufhin die Vorlage geöffnet wird. Im Abschnitt `Outputs` sehen Sie die Netzwerkressourcen, die die Beispielvorlage exportiert. Den Namen der exportierten Ressourcen ist der Stack-Name vorangestellt, falls Sie Netzwerkressourcen von anderen Stacks exportieren. Wenn Benutzer Netzwerkressourcen importieren, können sie angeben, von welchem Stack die Ressourcen importiert werden.

**So erstellen Sie den Netzwerk-Stack**

1. Melden Sie sich bei der an AWS-Managementkonsole und öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Wählen Sie auf der Seite **Stapel** oben rechts **Stapel erstellen** und dann **Mit neuen Ressourcen (Standard)**.

1. Wählen Sie **Vorhandene Vorlage auswählen**, und im Abschnitt **Vorlage angeben** wählen Sie **Amazon S3 URL**.

1. Für **Amazon S3 URL**, fügen Sie die folgende URL ein: **https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleNetworkCrossStack.template**.

1. Wählen Sie **Weiter** aus.

1. Geben Sie für **Stack name** **SampleNetworkCrossStack** ein und wählen Sie dann **Next** aus.
**Anmerkung**  
Notieren Sie sich den Namen dieses Stacks. Sie benötigen den Stack-Namen, wenn Sie den Webanwendungs-Stack öffnen.

1. Wählen Sie **Weiter** aus. Für diese Anleitung müssen Sie keine Tags hinzufügen oder erweiterte Einstellungen angeben.

1. Stellen Sie sicher, dass der Stack-Name und die Vorlagen-URL richtig sind und wählen Sie **Create stack (Stack erstellen)** aus.

   Es kann mehrere Minuten dauern, CloudFormation bis Ihr Stack erstellt ist. Warten Sie, bis alle Ressourcen erfolgreich erstellt wurden, bevor Sie mit der Erstellung des Webanwendungs-Stacks fortfahren.

1. Betrachten Sie die Stack-Ereignisse, um den Fortschritt zu überwachen. Weitere Informationen finden Sie unter [Fortschritt des Stapels überwachen](monitor-stack-progress.md).

## Verwenden Sie eine Beispielvorlage, um einen Webanwendungsstapel zu erstellen
<a name="walkthrough-crossstackref-create-ec2-stack"></a>

Der Webanwendungs-Stack erstellt eine EC2-Instance, die die Sicherheitsgruppe und das Subnetz aus dem Netzwerk-Stack verwendet. 

Sie müssen diesen Stack genauso AWS-Region wie den Netzwerk-Stack erstellen.

Die Stack-Vorlage ist unter der folgenden URL verfügbar: [https://s3.amazonaws.com/cloudformation-examples/user- guide/cross-stack/SampleWebAppCrossStack .template.](https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template) Um die Ressourcen zu sehen, die der Stack erstellt, wählen Sie den Link aus, woraufhin die Vorlage geöffnet wird. Im Abschnitt `Resources` sehen Sie die Eigenschaften der EC2-Instance. Mithilfe der `Fn::ImportValue`-Funktion können sehen, wie die Netzwerkressourcen von einem anderen Stack importiert werden.

**So erstellen Sie den Webanwendungs-Stack**

1. Wählen Sie auf der Seite **Stack** oben rechts **Stack erstellen** und dann **Mit neuen Ressourcen (Standard)**.

1. Wählen Sie **Vorhandene Vorlage auswählen**, und im Abschnitt **Vorlage angeben** wählen Sie **Amazon S3 URL**.

1. Für **Amazon S3 URL**, fügen Sie die folgende URL ein: **https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template**.

1. Wählen Sie **Weiter** aus.

1. Geben Sie für **Stack name** **SampleWebAppCrossStack** ein. Verwenden Sie im Abschnitt **Parameter** den Standardwert für den **NetworkStackName**Parameter und wählen Sie dann **Weiter** aus.

   Die Beispielvorlage verwendet den Parameterwert, um anzugeben, von welchem Stack Werte importiert werden sollen.

1. Wählen Sie **Weiter** aus. Für diese Anleitung müssen Sie keine Tags hinzufügen oder erweiterte Einstellungen angeben.

1. Stellen Sie sicher, dass der Stack-Name und die Vorlagen-URL richtig sind und wählen Sie **Create stack (Stack erstellen)** aus.

   Es kann mehrere Minuten dauern CloudFormation , bis Ihr Stack erstellt ist.

## Überprüfen Sie, ob der Stack wie vorgesehen funktioniert
<a name="walkthrough-crossstackref-verify"></a>

Nachdem der Stack erstellt wurde, zeigen Sie seine Ressourcen an, und notieren Sie sich die Instance-ID. Weitere Informationen zum Anzeigen von Stack-Ressourcen finden Sie unter [Stack-Informationen von der CloudFormation Konsole aus anzeigen](cfn-console-view-stack-data-resources.md).

Um die Sicherheitsgruppe und das Subnetz der Instance zu überprüfen, sehen Sie sich die Eigenschaften der Instance in der [Amazon EC2-Konsole](https://console.aws.amazon.com/ec2/) an. Wenn die Instance die Sicherheitsgruppe und das Subnetz aus dem `SampleNetworkCrossStack`-Stack verwendet, haben Sie erfolgreich einen Stack-übergreifenden Verweis erstellt.

Verwenden Sie die Konsole, um die Stack-Ausgaben und die URL der Beispiel-Website anzuzeigen, die die Webanwendung ausführt. Weitere Informationen finden Sie unter [Stack-Informationen von der CloudFormation Konsole aus anzeigen](cfn-console-view-stack-data-resources.md).

## Fehler bei der AMI-Zuordnung beheben
<a name="walkthrough-crossstackref-troubleshooting-ami"></a>

Wenn Sie den Fehler `Template error: Unable to get mapping for AWSRegionArch2AMI::[region]::HVM64`erhalten, enthält die Vorlage keine AMI-Zuordnung für Ihr AWS-Region. Anstatt das Mapping zu aktualisieren, empfehlen wir, öffentliche Parameter von Systems Manager zu verwenden, um dynamisch auf die neuesten Daten zu verweisen AMIs:

1. Laden Sie die `SampleWebAppCrossStack` Vorlage von: [https://s3.amazonaws.com/cloudformation-examples/user- guide/cross-stack/SampleWebAppCrossStack .template](https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template) auf Ihren lokalen Computer herunter.

1. Löschen Sie den gesamten Abschnitt `AWSRegionArch2AMI`-Zuordnung.

1. Fügen Sie den folgenden Systems Manager-Parameter hinzu:

   ```
   "LatestAmiId": {
     "Description": "The latest Amazon Linux 2 AMI from the Parameter Store",
       "Type": "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
       "Default": "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
     }
   ```

1. Ersetzen Sie die vorhandene Referenz `ImageId` :

   ```
   "ImageId": { "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" } , "HVM64" ] }, 
   ```

   mit:

   ```
   "ImageId": { "Ref": "LatestAmiId" },
   ```

   Mit diesem Parameter wird automatisch das neueste Amazon Linux 2 AMI für die Region ausgewählt, in der Sie den Stack bereitstellen. 

   Für andere Linux-Distributionen verwenden Sie den entsprechenden Parameterpfad. Weitere Informationen finden Sie unter [Ermitteln öffentlicher Parameter im Parameterspeicher](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html) im *AWS Systems Manager -Benutzerhandbuch*.

1. Laden Sie die geänderte Vorlage in einen S3-Bucket in Ihrem Konto hoch:

   ```
   aws s3 cp SampleWebAppCrossStack.template s3://amzn-s3-demo-bucket/
   ```

1. Geben Sie bei der Erstellung des Stacks die URL Ihrer S3-Vorlage anstelle der Beispiel-URL an.

## Bereinigen Ihrer Ressourcen
<a name="walkthrough-crossstackref-clean-up"></a>

Um sicherzustellen, dass keine Kosten für unerwünschte Services anfallen, löschen Sie die Stacks.

**So löschen Sie die Stacks**

1. Wählen Sie in der CloudFormation Konsole den `SampleWebAppCrossStack` Stack aus.

1. Wählen Sie die Option **Actions (Aktionen)** und anschließend **Delete stack (Stack löschen)** aus.

1. Wählen Sie in der Bestätigungsmitteilung die Option **Löschen** aus.

1. Nachdem Sie den Stapel gelöscht haben, wiederholen Sie die gleichen Schritte für den Stapel `SampleNetworkCrossStack` .
**Anmerkung**  
Warten Sie, bis der `SampleWebAppCrossStack` Stapel CloudFormation vollständig gelöscht ist. Wenn die EC2-Instance immer noch in der VPC läuft, CloudFormation wird die VPC im Stack nicht gelöscht. `SampleNetworkCrossStack`

# Bereitstellen von Anwendungen auf Amazon EC2
<a name="deploying.applications"></a>

Sie können CloudFormation es verwenden, um Anwendungen auf Amazon EC2 EC2-Instances automatisch zu installieren, zu konfigurieren und zu starten. Auf diese Weise können Sie auf einfache Weise Bereitstellungen übermitteln und vorhandene Installationen aktualisieren, ohne eine direkte Verbindung mit der Instance herzustellen, was Ihnen viel Zeit und Aufwand sparen kann.

CloudFormation enthält eine Reihe von Hilfsskripten (`cfn-init``cfn-signal`,`cfn-get-metadata`, und`cfn-hup`), die auf `cloud-init` basieren. Sie rufen diese Hilfsskripte aus Ihren CloudFormation Vorlagen auf, um Anwendungen auf Amazon EC2 EC2-Instances zu installieren, zu konfigurieren und zu aktualisieren, die sich in derselben Vorlage befinden. Weitere Informationen finden Sie in der [Referenz zu CloudFormation Hilfsskripten](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html) im *CloudFormation Template Reference Guide.*

Im Tutorial [Erste Schritte](gettingstarted.walkthrough.md)haben Sie einen einfachen Webserver mit `UserData` und einem einfachen Bash-Skript erstellt. Während dies für eine einfache "Hello World"-Seite funktionierte, benötigen reale Anwendungen oft eine komplexere Konfiguration, einschließlich:
+ Mehrere Softwarepakete in der richtigen Reihenfolge installiert.
+ Komplexe Konfigurationsdateien, die mit bestimmten Inhalten erstellt werden.
+ Dienste gestartet und für die automatische Ausführung konfiguriert.
+ Fehlerbehandlung und Validierung des Einrichtungsprozesses.

CloudFormationDie Hilfsskripte bieten eine robustere und wartungsfreundlichere Methode zur Konfiguration von EC2-Instances im Vergleich zu grundlegenden Bash-Skripten in. `UserData` Das Hilfsskript `cfn-init` liest Konfigurationsdaten aus den Metadaten Ihrer Vorlage und wendet sie systematisch auf Ihre Instance an.

In diesem Lernprogramm lernen Sie, wie Sie das Hilfsskript `cfn-init` verwenden und den Bootstrapping-Prozess überwachen.

**Anmerkung**  
CloudFormation ist kostenlos, aber die von Ihnen erstellten Amazon EC2 EC2-Ressourcen werden Ihnen in Rechnung gestellt. Wenn Sie jedoch noch keine Erfahrung damit haben AWS, können Sie das [kostenlose Kontingent](https://aws.amazon.com/free/) nutzen, um die Kosten während dieses Lernprozesses zu minimieren oder ganz zu vermeiden.

**Topics**
+ [Voraussetzungen](#bootstrapping-tutorial-prerequisites)
+ [Verstehen von Bootstrap-Konzepten](#bootstrapping-tutorial-understand-concepts)
+ [Beginnen Sie mit einem einfachen Bootstrap-Beispiel](#bootstrapping-tutorial-simple-example)
+ [Hinzufügen von Dateien und Befehlen](#bootstrapping-tutorial-add-complexity)
+ [Hinzufügen von Netzwerksicherheit](#bootstrapping-tutorial-security-group)
+ [Die vollständige Bootstrap-Vorlage](#bootstrapping-tutorial-complete-template)
+ [Erstellen Sie den Stapel über die Konsole](#bootstrapping-tutorial-create-stack)
+ [Überwachen Sie den Bootstrap-Prozess](#bootstrapping-tutorial-validate-bootstrap)
+ [Testen Sie den gebootstrapten Webserver](#bootstrapping-tutorial-test-web-server)
+ [Fehlerbehebung bei Bootstrap-Problemen](#bootstrapping-tutorial-troubleshooting)
+ [Bereinigen von Ressourcen](#bootstrapping-tutorial-clean-up)
+ [Nächste Schritte](#bootstrapping-tutorial-next-steps)

## Voraussetzungen
<a name="bootstrapping-tutorial-prerequisites"></a>
+ Sie müssen das [Erstellen Sie Ihren ersten Stapel](gettingstarted.walkthrough.md) Tutorial abgeschlossen haben oder über gleichwertige Erfahrung mit den CloudFormation Grundlagen verfügen.
+ Sie benötigen Zugriff auf einen Benutzer oder eine Rolle AWS-Konto mit einem IAM-Zugriff, der über Berechtigungen zur Verwendung von Amazon EC2 verfügt CloudFormation, und/oder Administratorzugriff.
+ Sie benötigen eine Virtual Private Cloud (VPC) mit Zugriff auf das Internet. Diese Übungsvorlage erfordert eine Standard-VPC, die automatisch mit newer AWS-Konten geliefert wird. Wenn Sie keine Standard-VPC haben oder diese gelöscht wurde, finden Sie im Abschnitt zur Fehlerbehebung im [Erstellen Sie Ihren ersten Stapel](gettingstarted.walkthrough.md)-Tutorial alternative Lösungen.

## Verstehen von Bootstrap-Konzepten
<a name="bootstrapping-tutorial-understand-concepts"></a>

Bevor wir die Vorlage erstellen, sollten wir die wichtigsten Konzepte verstehen, die das Bootstrapping möglich machen.

### Das `cfn-init`-Hilfsskript
<a name="bootstrapping-tutorial-cfn-init-overview"></a>

CloudFormation stellt Python-Hilfsskripte bereit, mit denen Sie Software installieren und Dienste auf einer Amazon EC2 EC2-Instance starten können. Das Skript `cfn-init` liest die Ressourcen-Metadaten aus Ihrer Vorlage und wendet die Konfiguration auf Ihre Instance an.

Das Verfahren funktioniert folgendermaßen:

1. Sie definieren die Konfiguration im Abschnitt `Metadata` Ihrer EC2-Ressource.

1. Sie rufen `cfn-init` aus dem Skript `UserData` auf.

1. `cfn-init` liest die Metadaten und wendet die Konfiguration an.

1. Ihre Instance wird nach Ihren Vorgaben konfiguriert.

### Struktur der Metadaten
<a name="bootstrapping-tutorial-metadata-structure"></a>

Die Konfiguration wird in einer bestimmten Struktur innerhalb Ihrer EC2-Instance definiert.

```
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Metadata:                       # Metadata section for the resource
      AWS::CloudFormation::Init:    # Required key that cfn-init looks for
        config:                     # Configuration name (you can have multiple)
          packages:                 # Install packages
          files:                    # Create files
          commands:                 # Run commands
          services:                 # Start/stop services
```

Das Skript `cfn-init` verarbeitet diese Abschnitte in einer bestimmten Reihenfolge: Pakete, Gruppen, Benutzer, Quellen, Dateien, Befehle und dann Dienste.

## Beginnen Sie mit einem einfachen Bootstrap-Beispiel
<a name="bootstrapping-tutorial-simple-example"></a>

Beginnen wir mit einem minimalen Bootstrap-Beispiel, das lediglich Apache installiert und startet.

```
Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:                 # Install Apache web server
            yum:
              httpd: []
          services:                 # Start Apache and enable it to start on boot
            systemd:
              httpd:
                enabled: true
                ensureRunning: true
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: !Ref InstanceType
      UserData: !Base64             # Script that runs when instance starts
        Fn::Sub: |
          #!/bin/bash
          yum install -y aws-cfn-bootstrap
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource EC2Instance --region ${AWS::Region}
```

Dieses einfache Beispiel veranschaulicht die wichtigsten Konzepte:
+ Der Abschnitt`packages` installiert das Paket `httpd` mit yum. Dies funktioniert unter Amazon Linux und anderen Linux-Distributionen, die yumverwenden.
+ Der Abschnitt`services` sorgt dafür, dass `httpd` automatisch gestartet und ausgeführt wird.
+ `UserData` installiert die neuesten Bootstrap-Tools und ruft `cfn-init`auf.

## Hinzufügen von Dateien und Befehlen
<a name="bootstrapping-tutorial-add-complexity"></a>

Lassen Sie uns nun unser Beispiel erweitern, indem wir eine benutzerdefinierte Webseite und eine Protokolldatei im Verzeichnis `/var/log` auf der EC2-Instance hinzufügen.

### Dateien erstellen
<a name="bootstrapping-tutorial-files-section"></a>

Der Abschnitt `files` ermöglicht es Ihnen, Dateien mit bestimmten Inhalten auf der Instance zu erstellen. Die vertikale Pipe (`|`) ermöglicht es Ihnen, einen wörtlichen Textblock (HTML-Code) als Inhalt der Datei zu übergeben (`/var/www/html/index.html`).

```
files:
  /var/www/html/index.html:
    content: |
      <body>
        <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>
      </body>
```

### Ausführen von Befehlen
<a name="bootstrapping-tutorial-commands-section"></a>

Im Abschnitt `commands` können Sie während des Bootstrap-Prozesses Shell-Befehle ausführen. Dieser Befehl erstellt eine Protokolldatei unter `/var/log/welcome.txt` auf der EC2-Instance. Um sie anzuzeigen, benötigen Sie ein Amazon EC2-Schlüsselpaar für den SSH-Zugang und einen IP-Adressbereich, der für SSH zur Instance verwendet werden kann (hier nicht behandelt).

```
commands:
  createWelcomeLog:
    command: "echo 'cfn-init ran successfully!' > /var/log/welcome.txt"
```

## Hinzufügen von Netzwerksicherheit
<a name="bootstrapping-tutorial-security-group"></a>

Da wir einen Webserver einrichten, müssen wir den Webverkehr (HTTP) zu unserer EC2-Instance zulassen. Dazu erstellen wir eine Sicherheitsgruppe, die eingehenden Datenverkehr auf Port 80 von Ihrer IP-Adresse zulässt. EC2-Instances müssen auch Datenverkehr ins Internet senden, zum Beispiel um Paketaktualisierungen zu installieren. Standardmäßig erlauben Sicherheitsgruppen den gesamten ausgehenden Datenverkehr. Anschließend verknüpfen wir diese Sicherheitsgruppe mit unserer EC2-Instance über die Eigenschaft `SecurityGroupIds` .

```
WebServerSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: Allow HTTP access from my IP address
    SecurityGroupIngress:
      - IpProtocol: tcp
        Description: HTTP
        FromPort: 80
        ToPort: 80
        CidrIp: !Ref MyIP
```

## Die vollständige Bootstrap-Vorlage
<a name="bootstrapping-tutorial-complete-template"></a>

Lassen Sie uns nun alle Teile zusammenfügen. Hier ist die vollständige Vorlage, die alle besprochenen Konzepte kombiniert.

```
AWSTemplateFormatVersion: 2010-09-09
Description: Bootstrap an EC2 instance with Apache web server using cfn-init

Parameters:
  LatestAmiId:
    Description: The latest Amazon Linux 2 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'

  InstanceType:
    Description: EC2 instance type
    Type: String
    Default: t2.micro
    AllowedValues:
      - t3.micro
      - t2.micro
    ConstraintDescription: must be a valid EC2 instance type.

  MyIP:
    Description: Your IP address in CIDR format (e.g. 203.0.113.1/32)
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 0.0.0.0/0
    AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.

Resources:
  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow HTTP access from my IP address
      SecurityGroupIngress:
        - IpProtocol: tcp
          Description: HTTP
          FromPort: 80
          ToPort: 80
          CidrIp: !Ref MyIP

  WebServer:
    Type: AWS::EC2::Instance
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:
            yum:
              httpd: []
          files:
            /var/www/html/index.html:
              content: |
                <body>
                  <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>
                </body>
          commands:
            createWelcomeLog:
              command: "echo 'cfn-init ran successfully!' > /var/log/welcome.txt"
          services:
            systemd:
              httpd:
                enabled: true
                ensureRunning: true
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: !Ref InstanceType
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      UserData: !Base64
        Fn::Sub: |
          #!/bin/bash
          yum install -y aws-cfn-bootstrap
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServer --region ${AWS::Region}
      Tags:
        - Key: Name
          Value: Bootstrap Tutorial Web Server

Outputs:
  WebsiteURL:
    Value: !Sub 'http://${WebServer.PublicDnsName}'
    Description: EC2 instance public DNS name
```

## Erstellen Sie den Stapel über die Konsole
<a name="bootstrapping-tutorial-create-stack"></a>

Das folgende Verfahren beinhaltet das Hochladen der Beispiel-Stack-Vorlage aus einer Datei. Öffnen Sie einen Texteditor auf Ihrem lokalen Rechner und fügen Sie die Vorlage hinzu. Speichern Sie die Datei mit dem Namen `samplelinux2stack.template`.

**So starten Sie die Stack-Vorlage**

1. Melden Sie sich bei [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) an AWS-Managementkonsole und öffnen Sie die CloudFormation Konsole.

1. Klicken Sie auf **Create stack (Stack erstellen)**, **With new resources (standard) (Mit neuen Ressourcen (Standard))**.

1. Wählen Sie unter **Vorlage angeben**, **Vorlagendatei hochladen**, **Datei auswählen** um die `samplelinux2stack.template` Datei hochzuladen. 

1. Wählen Sie **Weiter** aus.

1. Geben Sie auf der Seite **Stack-Details angeben** den Stack-Namen **BootstrapTutorialStack** ein.

1. Führen Sie unter **Parameter**folgende Schritte aus.
   + **LatestAmiId**: Behalten Sie den Standardwert bei.
   + **InstanceType**: Wählen Sie entweder **t2.micro oder **t3.micro**** für den EC2-Instance-Typ.
   + **MeineIP**: Geben Sie Ihre öffentliche IP-Adresse mit dem Suffix `/32` ein.

1. Wählen Sie zweimal **Weiter** und dann **Senden** um den Stapel zu erstellen.

## Überwachen Sie den Bootstrap-Prozess
<a name="bootstrapping-tutorial-validate-bootstrap"></a>

Bootstrap-Prozesse dauern länger als einfache EC2-Starts, da zusätzliche Software installiert und konfiguriert werden muss.

**So überwachen Sie den Bootstrap-Fortschritt**

1. **Wählen Sie in der CloudFormation Konsole Ihren Stack aus und öffnen Sie den Tab Ereignisse.**

1. Achten Sie auf das Ereignis `WebServer CREATE_IN_PROGRESS` . Der Bootstrap-Prozess beginnt, nachdem die Instance gestartet wurde.

1. Der Bootstrap-Prozess dauert in der Regel nur wenige Minuten. Sie werden `WebServer CREATE_COMPLETE` sehen, wenn es fertig ist.

Wenn Sie sehen möchten, was während des Bootstrap-Prozesses passiert, können Sie die Instanceprotokolle überprüfen.

**So zeigen Sie Bootstrap-Protokolle an (optional)**

1. Öffnen Sie die [EC2-Konsole](https://console.aws.amazon.com/ec2/) und suchen Sie Ihre Instance.

1. Wählen Sie die Instance aus und wählen Sie dann **Aktionen**, **Überwachen und Fehlerbehebung**, **Systemprotokoll abrufen** um den Bootstrap-Fortschritt zu sehen.

1. Wenn Sie die Protokolle nicht sofort sehen, warten Sie und aktualisieren Sie die Seite. 

## Testen Sie den gebootstrapten Webserver
<a name="bootstrapping-tutorial-test-web-server"></a>

Wenn Ihr Stack `CREATE_COMPLETE`anzeigt, testen Sie Ihren Webserver.

**So testen Sie den Webserver**

1. Gehen Sie in der CloudFormation Konsole zum Tab **Outputs** für Ihren Stack.

1. Klicken Sie auf den Wert **WebsiteURL** um Ihren Webserver in einer neuen Registerkarte zu öffnen.

1. Sie sollten Ihre benutzerdefinierte Webseite mit der Meldung `Congratulations, you have successfully launched the AWS CloudFormation sample`sehen.

**Anmerkung**  
Wenn die Seite nicht sofort geladen wird, warten Sie eine Minute und versuchen Sie es erneut. Der Bootstrap-Prozess wird möglicherweise noch abgeschlossen, auch wenn der Stack `CREATE_COMPLETE`anzeigt.

## Fehlerbehebung bei Bootstrap-Problemen
<a name="bootstrapping-tutorial-troubleshooting"></a>

Wenn Ihr Bootstrap-Prozess fehlschlägt oder Ihr Webserver nicht funktioniert, finden Sie hier die häufigsten Probleme und Lösungen.

### Häufige Probleme
<a name="bootstrapping-tutorial-common-issues"></a>
+ **Stackerstellung fehlgeschlagen**- Überprüfen Sie die Registerkarte **Ereignisse** auf spezifische Fehlermeldungen.
+ **Webserver nicht erreichbar**- Überprüfen Sie, ob Ihre IP-Adresse im Parameter `MyIP` korrekt ist. Denken Sie daran, am Ende `/32` einzufügen.
+ **Bootstrap-Prozess schlägt fehl**- Die Instance kann starten, aber `cfn-init` schlägt fehl. Überprüfen Sie die Systemprotokolle wie im Abschnitt Überwachung beschrieben.

## Bereinigen von Ressourcen
<a name="bootstrapping-tutorial-clean-up"></a>

Um laufende Kosten zu vermeiden, können Sie den Stapel und seine Ressourcen löschen. 

**Löschen des Stacks und der entsprechenden Ressourcen**

1. Öffnen Sie die [CloudFormation-Konsole](https://console.aws.amazon.com/cloudformation/).

1. Wählen Sie auf der Seite **Stapel** die Option neben dem Namen des von Ihnen erstellten Stapels (**BootstrapTutorialStack**) und wählen Sie dann **Löschen**.

1. Wenn Sie zur Bestätigung aufgefordert werden, wählen Sie **Delete (Löschen)**.

1. Überwachen Sie den Fortschritt des Stapel-Löschvorgangs auf der Registerkarte **Ereignis** . Der Status für **BootstrapTutorialStack** wechselt zu `DELETE_IN_PROGRESS`. Wenn das Löschen des Stacks CloudFormation abgeschlossen ist, wird der Stapel aus der Liste entfernt.

## Nächste Schritte
<a name="bootstrapping-tutorial-next-steps"></a>

Herzlichen Glückwunsch\$1 Sie haben erfolgreich gelernt, wie Sie EC2-Instances mit booten. CloudFormation Sie verstehen jetzt:
+ So verwenden Sie `cfn-init`-Hilfsskripte
+ So strukturieren Sie Metadaten für das Bootstrapping
+ Wie Sie Pakete installieren, Dateien erstellen, Befehle ausführen und Dienste verwalten
+ Wie Sie Bootstrap-Probleme überwachen

Um weiter zu lernen:
+ Erfahren Sie, wie Sie einen laufenden Stack aktualisieren und das `cfn-hup` Hilfsskript verwenden. Weitere Informationen finden Sie unter [Einen CloudFormation Stack aktualisieren](updating.stacks.walkthrough.md).
+ Lernen Sie, wie man einen Windows-Stack bootet. Weitere Informationen finden Sie unter [Bootstrapping-basierte Stacks Windows CloudFormation](cfn-windows-stacks-bootstrapping.md).
+ Erforschen Sie komplexere Bootstrap-Szenarien mit mehreren Konfigurationssätzen. Weitere Informationen finden Sie unter [cfn-init](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-init.html) und [AWS::CloudFormation::Init](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-init.html)im *CloudFormation Template* Reference Guide.
+ Erfahren Sie mehr über `cfn-signal` für die Meldung des Bootstrap-Abschlussstatus. Weitere Informationen finden Sie unter [cfn-signal](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-signal.html) im *CloudFormation Template Reference Guide*.

# Einen CloudFormation Stack aktualisieren
<a name="updating.stacks.walkthrough"></a>

**Anmerkung**  
Dieses Tutorial baut auf Konzepten aus dem [Bereitstellen von Anwendungen auf Amazon EC2](deploying.applications.md) Tutorial auf. Wenn Sie dieses Tutorial noch nicht abgeschlossen haben, empfehlen wir, dies zunächst zu tun, um das EC2 Bootstrapping mit zu verstehen. CloudFormation

In diesem Thema wird ein einfacher Ablauf der Aktualisierungen eines laufenden Stacks veranschaulicht. Wir führen Sie durch die folgenden Schritte:

1. **Den ersten Stack** erstellen — Erstellen Sie einen Stack mit einem Amazon Linux 2-AMI, installieren Sie das Apache Web Server und eine einfache PHP-Anwendung mithilfe der CloudFormation Hilfsskripte.

1. **Anwendung aktualisieren** — Aktualisieren Sie eine der Dateien in der Anwendung und stellen Sie die Software mithilfe von bereit CloudFormation.

1. **key pair hinzufügen** — Fügen Sie der Instance ein EC2 Amazon-Schlüsselpaar hinzu und aktualisieren Sie dann die Sicherheitsgruppe, um SSH-Zugriff auf die Instance zu ermöglichen.

1. **Instance-Typ aktualisieren** — Ändern Sie den Instance-Typ der zugrunde liegenden EC2 Amazon-Instance.

1. **AMI aktualisieren** — Ändern Sie das Amazon Machine Image (AMI) für die EC2 Amazon-Instance in Ihrem Stack.

**Anmerkung**  
CloudFormation ist kostenlos, aber die EC2 Amazon-Ressourcen, die Sie erstellen, werden Ihnen in Rechnung gestellt. Wenn Sie jedoch noch keine Erfahrung damit haben AWS, können Sie das [kostenlose Kontingent](https://aws.amazon.com/free/) nutzen, um die Kosten während dieses Lernprozesses zu minimieren oder ganz zu vermeiden.

**Topics**
+ [Schritt 1: Erstellen Sie den ersten Stack](#update-stack-initial-stack)
+ [Schritt 2: Aktualisieren Sie die Anwendung](#update-stack-update-application)
+ [Schritt 3: SSH-Zugriff mit einem key pair hinzufügen](#update-stack-add-key-pair)
+ [Schritt 4: Aktualisieren Sie den Instanztyp](#update-stack-update-instance-type)
+ [Schritt 5: AMI aktualisieren](#update-stack-update-ami)
+ [Verfügbarkeit und Auswirkungen](#update.walkthrough.impact)
+ [Zugehörige Ressourcen](#update.walkthrough.related)

## Schritt 1: Erstellen Sie den ersten Stack
<a name="update-stack-initial-stack"></a>

Wir beginnen mit der Erstellung eines Stacks, den wir im Rest dieses Themas verwenden können. Wir haben eine einfache Vorlage bereitgestellt, mit der eine einzelne Instanz einer PHP-Webanwendung gestartet wird, die auf einem Amazon Linux 2-AMI gehostet wird Apache Web Server und dort ausgeführt wird.

DieApache Web Server, PHP und die einfache PHP-Anwendung werden alle von den CloudFormation Hilfsskripten installiert, die standardmäßig auf dem Amazon Linux 2-AMI installiert sind. Der folgende Vorlagenausschnitt zeigt die Metadaten, die die zu installierenden Pakete und Dateien beschreiben, in diesem Fall die Apache Web Server und die PHP-Infrastruktur aus dem Yum Repository für das Amazon Linux 2-AMI. Das Snippet zeigt auch den `Services` Abschnitt, der sicherstellt, dass der läuft. Apache Web Server 

```
WebServerInstance:
  Type: AWS::EC2::Instance
  Metadata:
    AWS::CloudFormation::Init:
      config:
        packages:
          yum:
            httpd: []
            php: []
        files:
          /var/www/html/index.php:
            content: |
              <?php
              echo '<h1>Hello World!</h1>';
              ?>
            mode: '000644'
            owner: apache
            group: apache
        services:
          systemd:
            httpd:
              enabled: true
              ensureRunning: true
```

Die Anwendung selbst ist ein Beispiel für „Hello World“, das vollständig in der Vorlage definiert ist. Bei einer realen Anwendung können die Dateien auf Amazon S3 oder einem anderen Repository gespeichert und in der Vorlage referenziert werden. GitHub CloudFormation kann Pakete (wie RPMs oder RubyGems) herunterladen und auf einzelne Dateien verweisen und Dateien erweitern`.zip`, um die Anwendungsartefakte auf der EC2 Amazon-Instance zu erstellen. `.tar`

Die Vorlage aktiviert und konfiguriert den `cfn-hup` Daemon so, dass er auf Änderungen an der in den Metadaten für die EC2 Amazon-Instance definierten Konfiguration wartet. Mithilfe des `cfn-hup` Daemons können Sie Anwendungssoftware aktualisieren, z. B. die Version von Apache oder PHP, oder Sie können die PHP-Anwendungsdatei selbst von aus aktualisieren. CloudFormation Der folgende Ausschnitt aus derselben EC2 Amazon-Ressource in der Vorlage zeigt die Teile, die konfiguriert `cfn-hup` werden müssen, um `cfn-init` alle zwei Minuten aufzurufen, um Aktualisierungen der Metadaten zu bemerken und anzuwenden. Andernfalls wird der `cfn-init` nur einmal beim Start ausgeführt.

```
files:
  /etc/cfn/cfn-hup.conf:
    content: !Sub |
      [main]
      stack=${AWS::StackId}
      region=${AWS::Region}
      # The interval used to check for changes to the resource metadata in minutes. Default is 15
      interval=2
    mode: '000400'
    owner: root
    group: root
  /etc/cfn/hooks.d/cfn-auto-reloader.conf:
    content: !Sub |
      [cfn-auto-reloader-hook]
      triggers=post.update
      path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init
      action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region}
      runas=root
services:
  systemd:
    cfn-hup:
      enabled: true
      ensureRunning: true
      files:
        - /etc/cfn/cfn-hup.conf
        - /etc/cfn/hooks.d/cfn-auto-reloader.conf
```

Um den Stack zu vervollständigen, enthält die `UserData` Eigenschaft im `Properties` Abschnitt der EC2 Amazon-Instance-Definition das `cloud-init` Skript, das `cfn-init` die Installation der Pakete und Dateien aufruft. Weitere Informationen finden Sie in der [Referenz zu CloudFormation Hilfsskripten](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html) im *CloudFormation Template Reference Guide*. Die Vorlage erstellt auch eine EC2 Amazon-Sicherheitsgruppe.

```
AWSTemplateFormatVersion: 2010-09-09

Parameters:
  LatestAmiId:
    Description: The latest Amazon Linux 2 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'

  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t3.micro
    AllowedValues:
      - t3.nano
      - t3.micro
      - t3.small
      - t3.medium
      - t3a.nano
      - t3a.micro
      - t3a.small
      - t3a.medium
      - m5.large
      - m5.xlarge
      - m5.2xlarge
      - m5a.large
      - m5a.xlarge
      - m5a.2xlarge
      - c5.large
      - c5.xlarge
      - c5.2xlarge
      - r5.large
      - r5.xlarge
      - r5.2xlarge
      - r5a.large
      - r5a.xlarge
      - r5a.2xlarge
    ConstraintDescription: must be a valid EC2 instance type.
    
Resources:
  WebServerInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: !Ref InstanceType
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          # Get the latest CloudFormation package
          yum update -y aws-cfn-bootstrap
          # Run cfn-init
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region} || error_exit 'Failed to run cfn-init'        
          # Start up the cfn-hup daemon to listen for changes to the EC2 instance metadata
          /opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'
          # Signal success or failure
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region}
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:
            yum:
              httpd: []
              php: []
          files:
            /var/www/html/index.php:
              content: |
                <?php
                echo "<h1>Hello World!</h1>";
                ?>
              mode: '000644'
              owner: apache
              group: apache
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
                # The interval used to check for changes to the resource metadata in minutes. Default is 15
                interval=2
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region}
                runas=root
          services:
            systemd:
              httpd:
                enabled: true
                ensureRunning: true
              cfn-hup:
                enabled: true
                ensureRunning: true
                files:
                  - /etc/cfn/cfn-hup.conf
                  - /etc/cfn/hooks.d/cfn-auto-reloader.conf
    CreationPolicy:
      ResourceSignal:
        Timeout: PT5M

  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0

Outputs:
  WebsiteURL:
    Value: !Sub 'http://${WebServerInstance.PublicDnsName}'
    Description: URL of the web application
```

**Um einen Stack von dieser Vorlage aus zu starten**

1. Kopieren Sie die Vorlage und speichern Sie sie lokal auf Ihrem System als Textdatei. Notieren Sie sich den Speicherort, denn Sie benötigen die Datei in einem späteren Schritt.

1. Melden Sie sich bei der an AWS-Managementkonsole und öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Wählen Sie **Stack erstellen, Mit neuen Ressourcen (Standard)** aus.

1. **Wählen Sie „Bestehende Vorlage** auswählen“.

1. Wählen **Sie unter Vorlage angeben** die Option **Vorlagendatei hochladen** aus, suchen Sie nach der Datei, die Sie im ersten Schritt erstellt haben, und klicken Sie dann auf **Weiter**.

1. **Geben Sie auf der Seite „Stack-Details** angeben“ den Namen des Stacks ein**UpdateTutorial**.

1. Behalten Sie unter **Parameter** alle Parameter bei und wählen Sie zweimal **Weiter** aus.

1. Wählen Sie auf dem Bildschirm **Überprüfen und erstellen** die Option **Senden** aus.

Sobald der Status Ihres Stacks lautet`CREATE_COMPLETE`, wird auf dem Tab „**Ausgaben**“ die URL Ihrer Website angezeigt. Wenn Sie den Wert der `WebsiteURL` Ausgabe wählen, werden Sie sehen, dass Ihre neue PHP-Anwendung funktioniert.

## Schritt 2: Aktualisieren Sie die Anwendung
<a name="update-stack-update-application"></a>

Jetzt, da wir den Stack bereitgestellt haben, wollen wir die Anwendung aktualisieren. Wir nehmen eine einfache Änderung am Text vor, der durch die Anwendung ausgedruckt wird. Dazu fügen wir wie in diesem Vorlagenausschnitt dargestellt einen Echo-Befehl in die index.php-Datei ein:

```
files:
  /var/www/html/index.php:
    content: |
      <?php
      echo "<h1>Hello World!</h1>";
      echo "<p>This is an updated version of our application.</p>";
      ?>
    mode: '000644'
    owner: apache
    group: apache
```

Verwenden Sie einen Text-Editor, um die Vorlagendatei, die Sie lokal gespeichert haben, zu bearbeiten.

Aktualisieren Sie jetzt den Stack.

**Um den Stack mit Ihrer aktualisierten Vorlage zu aktualisieren**

1. Wählen Sie in der CloudFormation Konsole Ihren **UpdateTutorial** Stack aus.

1. Wählen Sie **Update, Direktes Update durchführen**.

1. Wählen Sie **Bestehende Vorlage ersetzen**.

1. Wählen **Sie unter Vorlage angeben** die Option **Eine Vorlagendatei** hochladen und Ihre geänderte Vorlagendatei hochladen aus, und klicken Sie dann auf **Weiter**.

1. Lassen Sie auf der Seite „**Stack-Details angeben**“ alle Parameter unverändert und wählen Sie zweimal „**Weiter**“.

1. **Überprüfen Sie** auf der Seite Überprüfen die Änderungen. Unter **Änderungen** sollten Sie sehen, dass die `WebServerInstance` Ressource aktualisiert CloudFormation wird.

1. Wählen Sie **Absenden** aus.

Wenn sich Ihr Stack im `UPDATE_COMPLETE` Status befindet, können Sie den `WebsiteURL` Ausgabewert erneut auswählen, um zu überprüfen, ob die Änderungen an Ihrer Anwendung wirksam wurden. Der `cfn-hup` Daemon wird alle 2 Minuten ausgeführt, sodass es bis zu 2 Minuten dauern kann, bis sich die Anwendung ändert, sobald der Stack aktualisiert wurde.

Rufen Sie die CloudFormation Konsole auf, um zu sehen, welche Ressourcen aktualisiert wurden. Betrachten Sie auf der Registerkarte **Events** die Stack-Ereignisse. In diesem speziellen Fall wurden die Metadaten für die EC2 Amazon-Instance `WebServerInstance` aktualisiert, was CloudFormation dazu führte, dass auch die anderen Ressourcen (`WebServerSecurityGroup`) neu bewertet wurden, um sicherzustellen, dass keine weiteren Änderungen vorgenommen wurden. Keine der anderen Stapelressourcen wurde modifiziert. CloudFormation aktualisiert nur die Ressourcen im Stapel, die von Änderungen am Stapel betroffen sind. Solche Änderungen können direkt sein, z. B. Änderungen an Eigenschaften oder Metadaten, oder sie können auf Abhängigkeiten oder Datenflüsse durch `Ref``GetAtt`, oder andere systeminterne Vorlagenfunktionen zurückzuführen sein. Weitere Informationen finden Sie unter [Intrinsische Funktionsreferenz](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

Dieses einfache Update veranschaulicht den Prozess. Sie können jedoch viel komplexere Änderungen an den Dateien und Paketen vornehmen, die auf Ihren EC2 Amazon-Instances bereitgestellt werden. Sie können der Instance beispielsweise eine MySQL Instance und den PHP-Support für MySQL hinzufügen. Hierzu fügen Sie einfach die zusätzlichen Pakete und Dateien sowie die zusätzlichen Services für die Konfiguration ein und aktualisieren den Stack, um die Änderungen bereitzustellen.

```
packages:
  yum:
    httpd: []
    php: []
    mysql: []
    php-mysql: []
    mysql-server: []
    mysql-libs: []

  ...

services:
  systemd:
    httpd:
      enabled: true
      ensureRunning: true
    cfn-hup:
      enabled: true
      ensureRunning: true
      files:
        - /etc/cfn/cfn-hup.conf
        - /etc/cfn/hooks.d/cfn-auto-reloader.conf
    mysqld:
      enabled: true
      ensureRunning: true
```

Sie können die CloudFormation Metadaten aktualisieren, um auf neue Versionen der von der Anwendung verwendeten Pakete zu aktualisieren. In den vorherigen Beispielen ist die Versionseigenschaft für jedes Paket leer, was bedeutet, dass die neueste Version des Pakets installiert werden `cfn-init` soll.

```
packages:
  yum:
    httpd: []
    php: []
```

Sie können optional eine Versionszeichenfolge für ein Paket festlegen. Wenn Sie die Versionszeichenfolge nachfolgenden Stack-Aktualisierungsaufrufen ändern, wird die neue Version des Pakets bereitgestellt. Hier ist ein Beispiel für die Verwendung von Versionsnummern für RubyGems Pakete. Alle Pakete, die Versioning unterstützen, können bestimmte Versionen haben.

```
packages:
  rubygems:
    mysql: []
    rubygems-update:
      - "1.6.2"
    rake:
      - "0.8.7"
    rails:
      - "2.3.11"
```

## Schritt 3: SSH-Zugriff mit einem key pair hinzufügen
<a name="update-stack-add-key-pair"></a>

Sie können auch eine Ressource in der Vorlage aktualisieren, um Eigenschaften hinzuzufügen, die ursprünglich nicht in der Vorlage angegeben wurden. Um dies zu veranschaulichen, fügen wir einer vorhandenen EC2 Instance ein EC2 Amazon-Schlüsselpaar hinzu und öffnen dann Port 22 in der EC2 Amazon-Sicherheitsgruppe, sodass Sie Secure Shell (SSH) für den Zugriff auf die Instance verwenden können.

**Um SSH-Zugriff zu einer vorhandenen EC2 Amazon-Instance hinzuzufügen**

1. Fügen Sie der Vorlage zwei zusätzliche Parameter hinzu, um den Namen eines vorhandenen EC2 Amazon-Schlüsselpaars und einen SSH-Standort zu übergeben.

   ```
   Parameters:
     KeyName:
       Description: Name of an existing EC2 KeyPair to enable SSH access to the instance
       Type: AWS::EC2::KeyPair::KeyName
       ConstraintDescription: must be the name of an existing EC2 KeyPair.
   
     SSHLocation:
       Description: The IP address that can be used to SSH to the EC2 instances in CIDR format (e.g. 203.0.113.1/32)
       Type: String
       MinLength: 9
       MaxLength: 18
       Default: 0.0.0.0/0
       AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$'
       ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
   ```

1. Fügen Sie die `KeyName` Eigenschaft zur EC2 Amazon-Instance hinzu.

   ```
   WebServerInstance:
     Type: AWS::EC2::Instance
     Properties:
       ImageId: !Ref LatestAmiId
       InstanceType: !Ref InstanceType
       KeyName: !Ref KeyName
       SecurityGroupIds:
         - !Ref WebServerSecurityGroup
   ```

1. Fügen Sie Port 22 und den SSH-Standort zu den Eingangsregeln für die EC2 Amazon-Sicherheitsgruppe hinzu.

   ```
   WebServerSecurityGroup:
     Type: AWS::EC2::SecurityGroup
     Properties:
       GroupDescription: Enable HTTP access via port 80 and SSH access via port 22
       SecurityGroupIngress:
         - IpProtocol: tcp
           FromPort: 80
           ToPort: 80
           CidrIp: 0.0.0.0/0
         - IpProtocol: tcp
           FromPort: 22
           ToPort: 22
           CidrIp: !Ref SSHLocation
   ```

1. Aktualisieren Sie den Stack mit den gleichen Schritten wie unter beschrieben. [Schritt 2: Aktualisieren Sie die Anwendung](#update-stack-update-application)

## Schritt 4: Aktualisieren Sie den Instanztyp
<a name="update-stack-update-instance-type"></a>

Lassen Sie uns nun demonstrieren, wie Sie die zugrunde liegende Infrastruktur aktualisieren, indem Sie den Instanztyp ändern.

Der Stack, den wir bisher erstellt haben, verwendet eine EC2 t3.micro-Amazon-Instance. Nehmen wir an, dass Ihre neu erstellte Website mehr Traffic erhält, als eine t3.micro-Instance verarbeiten kann, und Sie möchten jetzt zu einem Amazon-Instance-Typ m5.large wechseln. EC2 Wenn sich die Architektur des Instance-Typs ändert, muss die Instance mit einem anderen AMI erstellt werden. Sowohl t3.micro als auch m5.large verwenden jedoch dieselben CPU-Architekturen und laufen unter Amazon Linux 2 (x86\$164). AMIs Weitere Informationen finden Sie unter [Kompatibilität bei der Änderung des Instance-Typs](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/resize-limitations.html) im * EC2 Amazon-Benutzerhandbuch*.

Lassen Sie uns die Vorlage verwenden, die wir im vorherigen Schritt geändert haben, um den Instance-Typ zu ändern. Da `InstanceType` es sich um einen Eingabeparameter für die Vorlage handelte, müssen wir die Vorlage nicht ändern. Wir können den Wert des Parameters auf der Seite „**Stack-Details angeben**“ ändern.

**Um den Stack mit einem neuen Parameterwert zu aktualisieren**

1. Wählen Sie in der CloudFormation Konsole Ihren **UpdateTutorial** Stack aus.

1. Wählen Sie **Update, Direktes Update durchführen**.

1. Wählen Sie „**Bestehende Vorlage verwenden**“ und anschließend „**Weiter**“.

1. Ändern Sie auf der Seite „**Stack-Details angeben**“ den Wert des **InstanceType**Textfeldes von `t3.micro` zu`m5.large`. Wählen Sie dann zweimal **Weiter** aus.

1. **Überprüfen Sie** auf der Seite Überprüfen die Änderungen. Unter **Änderungen** sollten Sie sehen, dass die `WebServerInstance` Ressource aktualisiert CloudFormation wird.

1. Wählen Sie **Absenden** aus.

Sie können den Instance-Typ einer EBS-gestützten Amazon-Instance dynamisch ändern, indem Sie die EC2 Instance starten und stoppen. CloudFormation versucht, die Änderung zu optimieren, indem der Instance-Typ aktualisiert und die Instance neu gestartet wird, sodass sich die Instance-ID nicht ändert. Wird die Instance jedoch neu gestartet, ändert sich die öffentliche IP-Adresse der Instance. Um sicherzustellen, dass die Elastic IP-Adresse nach der Änderung korrekt gebunden ist, CloudFormation wird auch die Elastic IP-Adresse aktualisiert. Sie können die Änderungen in der CloudFormation Konsole auf der Registerkarte **Ereignisse** sehen.

Um den Instance-Typ von zu überprüfen AWS-Managementkonsole, öffnen Sie die EC2 Amazon-Konsole und suchen Sie dort nach Ihrer Instance.

## Schritt 5: AMI aktualisieren
<a name="update-stack-update-ami"></a>

Lassen Sie uns nun unseren Stack aktualisieren, um Amazon Linux 2023 zu verwenden, die nächste Generation von Amazon Linux. 

Die Aktualisierung des AMI ist eine wichtige Änderung, die den Austausch der Instance erfordert. Wir können die Instance nicht einfach starten und stoppen, um das AMI zu ändern; CloudFormation betrachtet dies als Änderung einer unveränderlichen Eigenschaft der Ressource. Um eine unveränderliche Eigenschaft zu ändern, CloudFormation muss eine Ersatzressource gestartet werden, in diesem Fall eine neue EC2 Amazon-Instance, auf der das neue AMI ausgeführt wird. 

Schauen wir uns an, wie wir unsere Stack-Vorlage aktualisieren könnten, um Amazon Linux 2023 zu verwenden. Zu den wichtigsten Änderungen gehören die Aktualisierung des AMI-Parameters und der Wechsel vom Paketmanager `yum` zum `dnf` Paketmanager.

```
AWSTemplateFormatVersion: 2010-09-09

Parameters:
  LatestAmiId:
    Description: The latest Amazon Linux 2023 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64'

  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t3.micro
    AllowedValues:
      - t3.nano
      - t3.micro
      - t3.small
      - t3.medium
      - t3a.nano
      - t3a.micro
      - t3a.small
      - t3a.medium
      - m5.large
      - m5.xlarge
      - m5.2xlarge
      - m5a.large
      - m5a.xlarge
      - m5a.2xlarge
      - c5.large
      - c5.xlarge
      - c5.2xlarge
      - r5.large
      - r5.xlarge
      - r5.2xlarge
      - r5a.large
      - r5a.xlarge
      - r5a.2xlarge
    ConstraintDescription: must be a valid EC2 instance type.

  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.

  SSHLocation:
    Description: The IP address that can be used to SSH to the EC2 instances in CIDR format (e.g. 203.0.113.1/32)
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 0.0.0.0/0
    AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
    
Resources:
  WebServerInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: !Ref InstanceType
      KeyName: !Ref KeyName
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          # Get the latest CloudFormation package
          dnf update -y aws-cfn-bootstrap
          # Run cfn-init
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region} || error_exit 'Failed to run cfn-init'        
          # Start up the cfn-hup daemon to listen for changes to the EC2 instance metadata
          /opt/aws/bin/cfn-hup || error_exit 'Failed to start cfn-hup'
          # Signal success or failure
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerInstance --region ${AWS::Region}
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:
            dnf:
              httpd: []
              php: []
          files:
            /var/www/html/index.php:
              content: |
                <?php
                echo "<h1>Hello World!</h1>";
                echo "<p>This is an updated version of our application.</p>";
                echo "<p>Running on Amazon Linux 2023!</p>";
                ?>
              mode: '000644'
              owner: apache
              group: apache
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
                # The interval used to check for changes to the resource metadata in minutes. Default is 15
                interval=2
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.WebServerInstance.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerInstance --region ${AWS::Region}
                runas=root
          services:
            systemd:
              httpd:
                enabled: true
                ensureRunning: true
              cfn-hup:
                enabled: true
                ensureRunning: true
                files:
                  - /etc/cfn/cfn-hup.conf
                  - /etc/cfn/hooks.d/cfn-auto-reloader.conf
    CreationPolicy:
      ResourceSignal:
        Timeout: PT5M

  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80 and SSH access via port 22
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref SSHLocation

Outputs:
  WebsiteURL:
    Value: !Sub 'http://${WebServerInstance.PublicDnsName}'
    Description: URL of the web application
```

Aktualisieren Sie den Stack mit den gleichen Schritten wie unter beschrieben[Schritt 2: Aktualisieren Sie die Anwendung](#update-stack-update-application).

Sobald die neue Instanz ausgeführt wird, werden die anderen Ressourcen im Stack so CloudFormation aktualisiert, dass sie auf die neue Ressource verweisen. Wenn alle neuen Ressourcen erstellt sind, wird die alte Ressource gelöscht, ein Vorgang, der als `UPDATE_CLEANUP`bekannt ist. Dieses Mal werden Sie feststellen, dass sich Instance-ID und Anwendungs-URL der Instance im Stack infolge der Aktualisierung geändert haben. Die Ereignisse in der **Ereignistabelle** enthalten die Beschreibung „Die angeforderte Aktualisierung hat eine Änderung an einer unveränderlichen Eigenschaft zur Folge und erzeugt somit eine neue physische Ressource“, die darauf hinweist, dass eine Ressource ersetzt wurde.

Alternative: Wenn Sie Anwendungscode in das AMI geschrieben haben, den Sie aktualisieren möchten, können Sie denselben Stack-Aktualisierungsmechanismus verwenden, um das AMI zu aktualisieren, um Ihre neue Anwendung zu laden.

**Um das AMI mit benutzerdefiniertem Anwendungscode zu aktualisieren**

1. Erstellen Sie Ihr neues AMI, das Ihre Anwendungs- oder Betriebssystemänderungen enthält. Weitere Informationen finden Sie unter [Erstellen eines Amazon EBS-backed AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html) im * EC2 Amazon-Benutzerhandbuch*.

1. Aktualisieren Sie Ihre Vorlage, um die neue AMI-ID zu integrieren.

1. Aktualisieren Sie den Stack mit den gleichen Schritten wie unter beschrieben[Schritt 2: Aktualisieren Sie die Anwendung](#update-stack-update-application).

Wenn Sie den Stack aktualisieren, wird CloudFormation erkannt, dass sich die AMI-ID geändert hat, und löst dann ein Stack-Update auf dieselbe Weise aus, wie wir das obige initiiert haben.

## Verfügbarkeit und Auswirkungen
<a name="update.walkthrough.impact"></a>

Verschiedene Eigenschaften haben unterschiedliche Auswirkungen auf die Ressourcen im Stack. Sie können CloudFormation verwenden, um eine beliebige Eigenschaft zu aktualisieren. Bevor Sie jedoch Änderungen vornehmen, sollten Sie sich folgende Fragen stellen:

1. Wie wirkt sich die Aktualisierung auf die Ressource selbst aus? Durch die Aktualisierung eines Schwellenwerts für einen Alarm wird beispielswiese der Alarm während der Aktualisierung inaktiv. Wie wir gesehen haben, erfordert das Ändern des Instance-Typs, dass die Instance gestoppt und neu gestartet wird. CloudFormation verwendet die Aktualisierungs- oder Änderungsaktionen für die zugrunde liegenden Ressourcen, um Änderungen an Ressourcen vorzunehmen. Um die Auswirkung von Updates zu verstehen, sollten Sie die Dokumentation für die spezifischen Ressourcen einsehen.

1. Ist die Änderung veränderlich oder unveränderlich? Einige Änderungen an den Ressourceneigenschaften, wie z. B. das Ändern des AMI auf einer EC2 Amazon-Instance, werden von den zugrunde liegenden Diensten nicht unterstützt. Bei veränderlichen Änderungen CloudFormation wird der Typ Update oder Modify APIs für die zugrunde liegenden Ressourcen verwendet. Bei unveränderlichen Eigenschaftsänderungen CloudFormation werden neue Ressourcen mit den aktualisierten Eigenschaften erstellt und diese dann mit dem Stack verknüpft, bevor die alten Ressourcen gelöscht werden. Obwohl CloudFormation versucht wird, die Ausfallzeit der Stack-Ressourcen zu reduzieren, ist das Ersetzen einer Ressource ein mehrstufiger Prozess, der einige Zeit in Anspruch nimmt. Während der Stack-Neukonfiguration ist Ihre Anwendung nicht voll betriebsbereit. Beispielsweise kann sie keine Anforderungen erfüllen oder auf eine Datenbank zugreifen.

## Zugehörige Ressourcen
<a name="update.walkthrough.related"></a>

Weitere Informationen zur Verwendung CloudFormation zum Starten von Anwendungen und zur Integration mit anderen Konfigurations- und Bereitstellungsdiensten wie Puppet und Opscode Chef finden Sie in den folgenden Whitepapers:
+ [Bootstrapping von Anwendungen über CloudFormation](https://s3.amazonaws.com/cloudformation-examples/BoostrappingApplicationsWithAWSCloudFormation.pdf)
+ [Integration mit CloudFormation Opscode Chef](https://s3.amazonaws.com/cloudformation-examples/IntegratingAWSCloudFormationWithOpscodeChef.pdf)
+ [Integration CloudFormation mit Puppet](https://s3.amazonaws.com/cloudformation-examples/IntegratingAWSCloudFormationWithPuppet.pdf)

# Erstellen Sie eine skalierte Anwendung mit Load Balancing
<a name="walkthrough-autoscaling"></a>

Für diese Anleitung erstellen Sie einen Stack, der Ihnen hilft, eine skalierte und lastverteilte Anwendung einzurichten. Die schrittweise Anleitung enthält eine Beispielvorlage, mit denen Sie den Stack erstellen können. Die Beispielvorlage stellt eine Auto-Scaling-Gruppe, einen Application Load Balancer, Sicherheitsgruppen, die den Datenverkehr zum Load Balancer und zur Auto-Scaling-Gruppe steuern, sowie eine Amazon-SNS-Benachrichtigungskonfiguration zur Veröffentlichung von Benachrichtigungen über Skalierungsaktivitäten bereit. 

Diese Vorlage erstellt eine oder mehrere Amazon-EC2-Instances, sowie einen Application Load Balancer. Ihnen werden Gebühren für die verwendeten AWS -Ressourcen berechnet, wenn Sie einen Stack aus dieser Vorlage erstellen. 

## Vollständige Stack-Vorlage
<a name="example-templates-autoscaling-full-stack-template"></a>

Fangen wir mit der Vorlage an.

**YAML**

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  InstanceType:
    Description: The EC2 instance type
    Type: String
    Default: t3.micro
    AllowedValues:
      - t3.micro
      - t3.small
      - t3.medium
  KeyName:
    Description: Name of an existing EC2 key pair to allow SSH access to the instances
    Type: AWS::EC2::KeyPair::KeyName
  LatestAmiId:
    Description: The latest Amazon Linux 2 AMI from the Parameter Store
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
  OperatorEmail:
    Description: The email address to notify when there are any scaling activities
    Type: String
  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    MinLength: 9
    MaxLength: 18
    Default: 0.0.0.0/0
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  Subnets:
    Type: 'List<AWS::EC2::Subnet::Id>'
    Description: At least two public subnets in different Availability Zones in the selected VPC
  VPC:
    Type: AWS::EC2::VPC::Id
    Description: A virtual private cloud (VPC) that enables resources in public subnets to connect to the internet
Resources:
  ELBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: ELB Security Group
      VpcId: !Ref VPC
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        CidrIp: 0.0.0.0/0
  EC2SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: EC2 Security Group
      VpcId: !Ref VPC
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        SourceSecurityGroupId:
          Fn::GetAtt:
          - ELBSecurityGroup
          - GroupId
      - IpProtocol: tcp
        FromPort: 22
        ToPort: 22
        CidrIp: !Ref SSHLocation
  EC2TargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 30
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 15
      HealthyThresholdCount: 5
      Matcher:
        HttpCode: '200'
      Name: EC2TargetGroup
      Port: 80
      Protocol: HTTP
      TargetGroupAttributes:
      - Key: deregistration_delay.timeout_seconds
        Value: '20'
      UnhealthyThresholdCount: 3
      VpcId: !Ref VPC
  ALBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref EC2TargetGroup
      LoadBalancerArn: !Ref ApplicationLoadBalancer
      Port: 80
      Protocol: HTTP
  ApplicationLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Scheme: internet-facing
      Subnets: !Ref Subnets
      SecurityGroups:
        - !GetAtt ELBSecurityGroup.GroupId
  LaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties: 
      LaunchTemplateName: !Sub ${AWS::StackName}-launch-template
      LaunchTemplateData:
        ImageId: !Ref LatestAmiId
        InstanceType: !Ref InstanceType
        KeyName: !Ref KeyName
        SecurityGroupIds: 
          - !Ref EC2SecurityGroup
        UserData:
          Fn::Base64: !Sub |
            #!/bin/bash
            yum update -y
            yum install -y httpd
            systemctl start httpd
            systemctl enable httpd
            echo "<h1>Hello World!</h1>" > /var/www/html/index.html
  NotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint: !Ref OperatorEmail
          Protocol: email
  WebServerGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      LaunchTemplate:
        LaunchTemplateId: !Ref LaunchTemplate
        Version: !GetAtt LaunchTemplate.LatestVersionNumber
      MaxSize: '3'
      MinSize: '1'
      NotificationConfigurations:
        - TopicARN: !Ref NotificationTopic
          NotificationTypes: ['autoscaling:EC2_INSTANCE_LAUNCH', 'autoscaling:EC2_INSTANCE_LAUNCH_ERROR', 'autoscaling:EC2_INSTANCE_TERMINATE', 'autoscaling:EC2_INSTANCE_TERMINATE_ERROR']
      TargetGroupARNs:
        - !Ref EC2TargetGroup
      VPCZoneIdentifier: !Ref Subnets
```

**JSON**

```
{
  "AWSTemplateFormatVersion":"2010-09-09",
  "Parameters":{
    "InstanceType":{
      "Description":"The EC2 instance type",
      "Type":"String",
      "Default":"t3.micro",
      "AllowedValues":[
        "t3.micro",
        "t3.small",
        "t3.medium"
      ]
    },
    "KeyName":{
      "Description":"Name of an existing EC2 key pair to allow SSH access to the instances",
      "Type":"AWS::EC2::KeyPair::KeyName"
    },
    "LatestAmiId":{
      "Description":"The latest Amazon Linux 2 AMI from the Parameter Store",
      "Type":"AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
      "Default":"/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
    },
    "OperatorEmail":{
      "Description":"The email address to notify when there are any scaling activities",
      "Type":"String"
    },
    "SSHLocation":{
      "Description":"The IP address range that can be used to SSH to the EC2 instances",
      "Type":"String",
      "MinLength":9,
      "MaxLength":18,
      "Default":"0.0.0.0/0",
      "ConstraintDescription":"Must be a valid IP CIDR range of the form x.x.x.x/x."
    },
    "Subnets":{
      "Type":"List<AWS::EC2::Subnet::Id>",
      "Description":"At least two public subnets in different Availability Zones in the selected VPC"
    },
    "VPC":{
      "Type":"AWS::EC2::VPC::Id",
      "Description":"A virtual private cloud (VPC) that enables resources in public subnets to connect to the internet"
    }
  },
  "Resources":{
    "ELBSecurityGroup":{
      "Type":"AWS::EC2::SecurityGroup",
      "Properties":{
        "GroupDescription":"ELB Security Group",
        "VpcId":{
          "Ref":"VPC"
        },
        "SecurityGroupIngress":[
          {
            "IpProtocol":"tcp",
            "FromPort":80,
            "ToPort":80,
            "CidrIp":"0.0.0.0/0"
          }
        ]
      }
    },
    "EC2SecurityGroup":{
      "Type":"AWS::EC2::SecurityGroup",
      "Properties":{
        "GroupDescription":"EC2 Security Group",
        "VpcId":{
          "Ref":"VPC"
        },
        "SecurityGroupIngress":[
          {
            "IpProtocol":"tcp",
            "FromPort":80,
            "ToPort":80,
            "SourceSecurityGroupId":{
              "Fn::GetAtt":[
                "ELBSecurityGroup",
                "GroupId"
              ]
            }
          },
          {
            "IpProtocol":"tcp",
            "FromPort":22,
            "ToPort":22,
            "CidrIp":{
              "Ref":"SSHLocation"
            }
          }
        ]
      }
    },
    "EC2TargetGroup":{
      "Type":"AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties":{
        "HealthCheckIntervalSeconds":30,
        "HealthCheckProtocol":"HTTP",
        "HealthCheckTimeoutSeconds":15,
        "HealthyThresholdCount":5,
        "Matcher":{
          "HttpCode":"200"
        },
        "Name":"EC2TargetGroup",
        "Port":80,
        "Protocol":"HTTP",
        "TargetGroupAttributes":[
          {
            "Key":"deregistration_delay.timeout_seconds",
            "Value":"20"
          }
        ],
        "UnhealthyThresholdCount":3,
        "VpcId":{
          "Ref":"VPC"
        }
      }
    },
    "ALBListener":{
      "Type":"AWS::ElasticLoadBalancingV2::Listener",
      "Properties":{
        "DefaultActions":[
          {
            "Type":"forward",
            "TargetGroupArn":{
              "Ref":"EC2TargetGroup"
            }
          }
        ],
        "LoadBalancerArn":{
          "Ref":"ApplicationLoadBalancer"
        },
        "Port":80,
        "Protocol":"HTTP"
      }
    },
    "ApplicationLoadBalancer":{
      "Type":"AWS::ElasticLoadBalancingV2::LoadBalancer",
      "Properties":{
        "Scheme":"internet-facing",
        "Subnets":{
          "Ref":"Subnets"
        },
        "SecurityGroups":[
          {
            "Fn::GetAtt":[
              "ELBSecurityGroup",
              "GroupId"
            ]
          }
        ]
      }
    },
    "LaunchTemplate":{
      "Type":"AWS::EC2::LaunchTemplate",
      "Properties":{
        "LaunchTemplateName":{
          "Fn::Sub":"${AWS::StackName}-launch-template"
        },
        "LaunchTemplateData":{
          "ImageId":{
            "Ref":"LatestAmiId"
          },
          "InstanceType":{
            "Ref":"InstanceType"
          },
          "KeyName":{
            "Ref":"KeyName"
          },
          "SecurityGroupIds":[
            {
              "Ref":"EC2SecurityGroup"
            }
          ],
          "UserData":{
            "Fn::Base64":{
              "Fn::Join":[
                "",
                [
                  "#!/bin/bash\n",
                  "yum update -y\n",
                  "yum install -y httpd\n",
                  "systemctl start httpd\n",
                  "systemctl enable httpd\n",
                  "echo \"<h1>Hello World!</h1>\" > /var/www/html/index.html"
                ]
              ]
            }
          }
        }
      }
    },
    "NotificationTopic":{
      "Type":"AWS::SNS::Topic",
      "Properties":{
        "Subscription":[
          {
            "Endpoint":{
              "Ref":"OperatorEmail"
            },
            "Protocol":"email"
          }
        ]
      }
    },
    "WebServerGroup":{
      "Type":"AWS::AutoScaling::AutoScalingGroup",
      "Properties":{
        "LaunchTemplate":{
          "LaunchTemplateId":{
            "Ref":"LaunchTemplate"
          },
          "Version":{
            "Fn::GetAtt":[
              "LaunchTemplate",
              "LatestVersionNumber"
            ]
          }
        },
        "MaxSize":"3",
        "MinSize":"1",
        "NotificationConfigurations":[
          {
            "TopicARN":{
              "Ref":"NotificationTopic"
            },
            "NotificationTypes":[
              "autoscaling:EC2_INSTANCE_LAUNCH",
              "autoscaling:EC2_INSTANCE_LAUNCH_ERROR",
              "autoscaling:EC2_INSTANCE_TERMINATE",
              "autoscaling:EC2_INSTANCE_TERMINATE_ERROR"
            ]
          }
        ],
        "TargetGroupARNs":[
          {
            "Ref":"EC2TargetGroup"
          }
        ],
        "VPCZoneIdentifier":{
          "Ref":"Subnets"
        }
      }
    }
  }
}
```

## Walkthrough zu Vorlagen
<a name="example-templates-autoscaling-description"></a>

Der erste Teil dieser Vorlage spezifiziert die `Parameters`. Jedem Parameter muss zur Laufzeit ein Wert zugewiesen werden CloudFormation , damit der Stack erfolgreich bereitgestellt werden kann. Später in der Vorlage angegebene Ressourcen verweisen auf diese Werte und verwenden die Daten.
+ `InstanceType`: Der Typ der EC2-Instance, die Amazon EC2 Auto Scaling bereitstellt. Wenn Sie keinen anderen Wert angeben, wird der Standardwert von `t3.micro` verwendet.
+ `KeyName`: Ein vorhandenes EC2-Schlüsselpaar, um SSH-Zugriff auf die Instances zu ermöglichen.
+ `LatestAmiId`: Das Amazon Machine Image (AMI) für die Instances. Falls nicht angegeben, werden Ihre Instances mit einem Amazon Linux 2-AMI gestartet, wobei ein AWS Systems Manager öffentlicher Parameter verwendet wird, der von verwaltet wird AWS. Weitere Informationen finden Sie unter [Öffentliche Parameter kennzeichnen](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html) im *AWS Systems Manager -Benutzerhandbuch*.
+ `OperatorEmail`: Die E-Mail-Adresse, an die Sie Skalierungsaktivitäten senden möchten.
+ `SSHLocation`: Der IP-Adressbereich, der für SSH-Verbindungen mit den Instances verwendet werden kann.
+ `Subnets`: Mindestens zwei Subnetze in verschiedenen Availability Zones. 
+ `VPC`: Eine Virtual Private Cloud (VPC) in Ihrem Konto, mit der Ressourcen in öffentlichen Subnetzen eine Verbindung zum Internet herstellen können. 
**Anmerkung**  
Sie können die Standard-VPC und die Standardsubnetze verwenden, um Instances den Zugriff auf das Internet zu ermöglichen. Stellen Sie in letzterem Fall sicher, dass Ihre VPC über ein Subnetz verfügt, das jeder Availability Zone der Region zugeordnet ist, in der Sie arbeiten. Mindestens zwei öffentliche Subnetze müssen verfügbar sein, um den Load Balancer zu erstellen.

Der nächste Teil dieser Vorlage spezifiziert die `Resources`. In diesem Abschnitt werden die Stack-Ressourcen und ihre Eigenschaften angegeben.

[https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)Ressource `ELBSecurityGroup` 
+ `SecurityGroupIngress`enthält eine TCP-Eingangsregel, die den Zugriff von *allen IP-Adressen* (“ CidrIp ": „0.0.0.0/0") auf Port 80 ermöglicht.

[https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)Ressource `EC2SecurityGroup` 
+ `SecurityGroupIngress` enthält zwei Eingangsregeln: 1) eine TCP-Eingangsregel, die den SSH-Zugriff (Port 22) von dem IP-Adressbereich aus erlaubt, den Sie für den `SSHLocation`-Eingabeparameter angeben, und 2) eine TCP-Eingangsregel, die den Zugriff vom Load Balancer aus erlaubt, indem Sie die Sicherheitsgruppe des Load Balancers angeben. Die [GetAtt](resources-section-structure.md#resource-properties-getatt)Funktion wird verwendet, um die ID der Sicherheitsgruppe mit dem logischen Namen abzurufen`ELBSecurityGroup`.

[AWS::ElasticLoadBalancingV2::TargetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html)Ressource `EC2TargetGroup`
+ `Port`, `Protocol`, und `HealthCheckProtocol` geben den Port (80) und das Protokoll (HTTP) der EC2-Instance an, an die `ApplicationLoadBalancer` den Datenverkehr weitergeleitet und die Elastic Load Balancing verwendet, um den Zustand der EC2-Instances zu überprüfen.
+ `HealthCheckIntervalSeconds` gibt an, dass die EC2-Instances einen Abstand von 30 Sekunden zwischen den Zustandsprüfungen haben. `HealthCheckTimeoutSeconds` ist definiert als die Zeitdauer, die Elastic Load Balancing auf eine Reaktion vom Ziel der Zustandsprüfung wartet (in diesem Beispiel 15 Sekunden). Nach Ablauf der Zeitüberschreitung markiert Elastic Load Balancing die Zustandsprüfung der EC2-Instance als instabil. Wenn eine EC2-Instance drei aufeinanderfolgende Zustandsprüfungen (`UnhealthyThresholdCount`) nicht besteht, stoppt Elastic Load Balancing das Weiterleiten von Datenverkehr an diese EC2-Instance, bis diese Instance fünf aufeinanderfolgende fehlerfreie Zustandsprüfungen (`HealthyThresholdCount`) hat. Zu diesem Zeitpunkt betrachtet Elastic Load Balancing die Instance als fehlerfrei und beginnt erneut, Datenverkehr an die Instance weiterzuleiten.
+ `TargetGroupAttributes` aktualisiert den Wert der Deregistrierungsverzögerung der Zielgruppe auf 20 Sekunden. Standardmäßig wartet Elastic Load Balancing 300 Sekunden, bevor der Abmeldevorgang abgeschlossen wird.

[AWS::ElasticLoadBalancingV2::Listener](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html)Ressource `ALBListener`
+ `DefaultActions` gibt den Port an, an dem Load Balancer abhört, die Zielgruppe, an die Load Balancer Anforderungen weiterleitet, sowie das Protokoll, das zum Weiterleiten von Anforderungen verwendet wird.

[AWS::ElasticLoadBalancingV2::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html)Ressource `ApplicationLoadBalancer`
+ `Subnets` verwendet den Wert des `Subnets`-Eingabeparameters als Liste der öffentlichen Subnetze, in denen die Load-Balancer-Knoten erstellt werden.
+ `SecurityGroup` ruft die ID der Sicherheitsgruppe ab, die als virtuelle Firewall für Ihre Load-Balancer-Knoten dient, um den eingehendem Datenverkehr zu steuern. Die [GetAtt](resources-section-structure.md#resource-properties-getatt)Funktion wird verwendet, um die ID der Sicherheitsgruppe mit dem logischen Namen abzurufen`ELBSecurityGroup`.

[AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)Ressource `LaunchTemplate`
+ `ImageId` verwendet den Wert des `LatestAmiId`-Eingabeparameters als das zu verwendende AMI.
+ `KeyName` verwendet den Wert des `KeyName`-Eingabeparameters als das zu verwendende EC2-Schlüsselpaar.
+ `SecurityGroupIds` ruft die ID der Sicherheitsgruppe mit dem logischen Namen `EC2SecurityGroup` ab, die als virtuelle Firewall für Ihre EC2-Instances fungiert, um den eingehenden Datenverkehr zu kontrollieren.
+ `UserData` ist ein Konfigurationsskript, das ausgeführt wird, nachdem die Instance gestartet wurde. In diesem Beispiel installiert das Skript Apache und erstellt eine index.html-Datei.

[AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html)Ressource `NotificationTopic`
+ `Subscription` verwendet den Wert des `OperatorEmail`-Eingabeparameters als E-Mail-Adresse für den Empfänger der Benachrichtigungen, wenn Skalierungsaktivitäten stattfinden. 

AWS::AutoScaling::AutoScalingRessource [gruppieren](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) `WebServerGroup`
+ `MinSize` und `MaxSize` bestimmen die Mindest- und Höchstanzahl von EC2-Instances in der Auto-Scaling-Gruppe.
+ `TargetGroupARNs` nimmt den ARN der Zielgruppe mit dem logischen Namen `EC2TargetGroup`. Bei der Skalierung dieser Auto-Scaling-Gruppe werden Instances bei dieser Zielgruppe automatisch registriert und deregistriert.
+ `VPCZoneIdentifier` verwendet den Wert des `Subnets`-Eingabeparameters als Liste der öffentlichen Subnetze, in denen die EC2-Instances erstellt werden können.

## Schritt 1: Starten des Stacks
<a name="example-templates-autoscaling-launch-stack"></a>

Bevor Sie den Stack starten, überprüfen Sie, ob Sie über AWS Identity and Access Management (IAM-) Berechtigungen zur Nutzung aller der folgenden Dienste verfügen: Amazon EC2, Amazon EC2 Auto Scaling, AWS Systems Manager Elastic Load Balancing, Amazon SNS und. CloudFormation

Das folgende Verfahren beinhaltet das Hochladen der Beispiel-Stack-Vorlage aus einer Datei. Öffnen Sie einen Texteditor auf Ihrem lokalen Computer und fügen Sie eine der Vorlagen hinzu. Speichern Sie die Datei mit dem Namen `sampleloadbalancedappstack.template`.

**So starten Sie die Stack-Vorlage**

1. [Melden Sie sich bei der an AWS-Managementkonsole und öffnen Sie die Konsole unter /cloudformation CloudFormation . https://console.aws.amazon.com](https://console.aws.amazon.com/cloudformation/)

1. Klicken Sie auf **Create stack (Stack erstellen)**, **With new resources (standard) (Mit neuen Ressourcen (Standard))**.

1. Wählen Sie unter **Vorlage angeben**, **Vorlagendatei hochladen**, **Datei auswählen** um die `sampleloadbalancedappstack.template` Datei hochzuladen. 

1. Wählen Sie **Weiter** aus.

1. Geben Sie auf der Seite **Details angeben** einen Namen für den Stack ein (beispielsweise **SampleLoadBalancedAppStack**.)

1. Überprüfen Sie unter **Parameter** die Parameter für den Stack und geben Sie Werte für alle Parameter an, die keine Standardwerte haben, einschließlich **OperatorEmail**, **SSHLocation**, **KeyName**, **VPC** und **Subnetze**.

1. Klicken Sie zweimal auf **Weiter**.

1. Überprüfen und bestätigen Sie die Einstellungen auf der Seite **Review. **

1. Wählen Sie **Absenden** aus.

   Sie können den Status des Stacks in der CloudFormation Konsole in der Spalte **Status einsehen**. Wenn CloudFormation der Stack erfolgreich erstellt wurde, erhalten Sie den Status **CREATE\$1COMPLETE**.
**Anmerkung**  
Nachdem Sie den Stack erstellt haben,müssen Sie das Abonnement bestätigen, bevor die E-Mail-Adresse Benachrichtigungen erleiden kann. Weitere Informationen finden Sie unter [Erhalten Sie Amazon-SNS-Benachrichtigungen, wenn Ihre Auto-Scaling-Gruppe skaliert](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-sns-notifications.html) im *Benutzerhandbuch für Amazon EC2 Auto Scaling*.

## Schritt 2: Bereinigen von Beispielressourcen
<a name="example-templates-autoscaling-clean-up"></a>

Um sicherzustellen, dass Ihnen keine ungenutzten Beispielressourcen berechnet werden, löschen Sie den Stack.

**So löschen Sie den Stack**

1. Wählen Sie in der CloudFormation Konsole den Stack aus. **SampleLoadBalancedAppStack**

1. Wählen Sie **Löschen** aus.

1. Wählen Sie in der Bestätigungsmitteilung die Option **Stack löschen** aus.

   Der Status für **SampleLoadBalancedAppStack**Änderungen an **DELETE\$1IN\$1PROGRESS**. Wenn das Löschen des Stacks CloudFormation abgeschlossen ist, wird der Stapel aus der Liste entfernt.

Verwenden Sie diese Beispielvorlage aus dieser Anleitung, um eigene Stacks zu erstellen. Weitere Informationen finden Sie unter [Tutorial: Einrichten einer skalierten Anwendung mit Load Balancing](https://docs.aws.amazon.com/autoscaling/ec2/userguide/tutorial-ec2-auto-scaling-load-balancer.html) im *Benutzerhandbuch zu Amazon EC2 Auto Scaling*.

# Peern Sie mit einer VPC in einer anderen AWS-Konto
<a name="peer-with-vpc-in-another-account"></a>

Sie können ein Peering mit einer Virtual Private Cloud (VPC) in einer anderen durchführen, AWS-Konto indem Sie [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpcpeeringconnection.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpcpeeringconnection.html) Dadurch wird eine Netzwerkverbindung zwischen zwei Personen hergestellt VPCs , sodass Sie den Verkehr zwischen ihnen weiterleiten können, sodass sie so kommunizieren können, als ob sie sich innerhalb desselben Netzwerks befänden. Eine VPC-Peering-Verbindung kann den Datenzugriff und die Datenübertragung erleichtern.

Um eine VPC-Peering-Verbindung herzustellen, müssen Sie zwei separate Verbindungen AWS-Konten innerhalb eines einzigen Stacks autorisieren. CloudFormation 

Weitere Informationen über VPC-Peering und dessen Einschränkungen finden Sie im [Amazon VPC Peering Guide](https://docs.aws.amazon.com/vpc/latest/peering/). 

## Voraussetzungen
<a name="peer-with-vpc-in-another-account-prerequisites"></a>

1. Sie benötigen eine Peer-VPC-ID, eine AWS-Konto Peer-ID und eine [kontoübergreifende Zugriffsrolle](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html) für die Peering-Verbindung. 
**Anmerkung**  
Diese Anleitung bezieht sich auf zwei Konten: Das erste Konto ist ein Konto, das kontenübergreifendes Peering zulässt (*annehmendes Konto*). Das zweite Konto ist das Konto, das die Peering-Verbindung anfordert (*Auftraggeberkonto*).

1. Um die VPC-Peering-Verbindung zu akzeptieren, müssen Sie die Rolle für den kontoübergreifenden Zugriff übernehmen können. Die Ressource verhält sich wie die Ressource einer VPC-Peering-Verbindung in demselben Konto. Informationen darüber, wie ein IAM-Administrator Berechtigungen zur Übernahme der kontenübergreifenden Rolle erteilt, finden Sie unter [Einem Benutzer Berechtigungen zum Rollenwechsel erteilen](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_permissions-to-switch.html) im *IAM-Benutzerhandbuch*.

## Schritt 1: Erstellen einer VPC und einer kontoübergreifenden Rolle
<a name="step-1-create-vpc-and-cross-account-role"></a>

In diesem Schritt erstellen Sie die VPC und die Rolle im *annehmenden Konto*.

**So erstellen Sie eine VPC und eine kontoübergreifende Zugriffsrolle**

1. [Melden Sie sich bei /cloudformation an AWS-Managementkonsole und öffnen Sie die CloudFormation Konsole. https://console.aws.amazon.com](https://console.aws.amazon.com/cloudformation/)

1. Wählen Sie auf der Seite **Stack** oben rechts **Stack erstellen** und dann **Mit neuen Ressourcen (Standard)**.

1. Für **Voraussetzung - Vorlage vorbereiten**, wählen Sie **Vorhandene Vorlage auswählen** und dann **Vorlagendatei hochladen**, **Datei auswählen**.

1. Öffnen Sie einen Texteditor auf Ihrem lokalen Rechner und fügen Sie eine der folgenden Vorlagen hinzu. Speichern Sie die Datei und kehren Sie zur Konsole zurück, um sie als Vorlagendatei auszuwählen.  
**Example JSON**  

   ```
   {
     "AWSTemplateFormatVersion": "2010-09-09",
     "Description": "Create a VPC and an assumable role for cross account VPC peering.",
     "Parameters": {
       "PeerRequesterAccountId": {
         "Type": "String"
       }
     },
     "Resources": {
       "vpc": {
         "Type": "AWS::EC2::VPC",
         "Properties": {
           "CidrBlock": "10.1.0.0/16",
           "EnableDnsSupport": false,
           "EnableDnsHostnames": false,
           "InstanceTenancy": "default"
         }
       },
       "peerRole": {
         "Type": "AWS::IAM::Role",
         "Properties": {
           "AssumeRolePolicyDocument": {
             "Statement": [
               {
                 "Principal": {
                   "AWS": {
                     "Ref": "PeerRequesterAccountId"
                   }
                 },
                 "Action": [
                   "sts:AssumeRole"
                 ],
                 "Effect": "Allow"
               }
             ]
           },
           "Path": "/",
           "Policies": [
             {
               "PolicyName": "root",
               "PolicyDocument": {
                 "Version": "2012-10-17",		 	 	 
                 "Statement": [
                   {
                     "Effect": "Allow",
                     "Action": "ec2:AcceptVpcPeeringConnection",
                     "Resource": "*"
                   }
                 ]
               }
             }
           ]
         }
       }
     },
     "Outputs": {
       "VPCId": {
         "Value": {
           "Ref": "vpc"
         }
       },
       "RoleARN": {
         "Value": {
           "Fn::GetAtt": [
             "peerRole",
             "Arn"
           ]
         }
       }
     }
   }
   ```  
**Example YAML**  

   ```
   AWSTemplateFormatVersion: 2010-09-09
   Description: Create a VPC and an assumable role for cross account VPC peering.
   Parameters:
     PeerRequesterAccountId:
       Type: String
   Resources:
     vpc:
       Type: AWS::EC2::VPC
       Properties:
         CidrBlock: 10.1.0.0/16
         EnableDnsSupport: false
         EnableDnsHostnames: false
         InstanceTenancy: default
     peerRole:
       Type: AWS::IAM::Role
       Properties:
         AssumeRolePolicyDocument:
           Statement:
             - Principal:
                 AWS: !Ref PeerRequesterAccountId
               Action:
                 - 'sts:AssumeRole'
               Effect: Allow
         Path: /
         Policies:
           - PolicyName: root
             PolicyDocument:
               Version: 2012-10-17 		 	 	 
               Statement:
                 - Effect: Allow
                   Action: 'ec2:AcceptVpcPeeringConnection'
                   Resource: '*'
   Outputs:
     VPCId:
       Value: !Ref vpc
     RoleARN:
       Value: !GetAtt 
         - peerRole
         - Arn
   ```

1. Wählen Sie **Weiter** aus.

1. Geben Sie dem Stack einen Namen (z. B.**VPC-owner**) und geben Sie dann die AWS-Konto ID des *Anfordererkontos* in das Feld ein. **PeerRequesterAccountId**

1. Akzeptieren Sie die Standardwerte und wählen Sie dann **Weiter** aus.

1. Wählen Sie **Ich bestätige, dass CloudFormation möglicherweise IAM-Ressourcen erstellt** werden, und wählen Sie dann Stack **erstellen** aus.

## Schritt 2: Erstellen einer Vorlage, die `AWS::EC2::VPCPeeringConnection` enthält
<a name="step-2-create-template-for-vpc-peering-connection-owner"></a>

Nachdem Sie die VPC und die kontoübergreifende Rolle erstellt haben, können Sie über ein anderes Konto AWS-Konto (das Konto des *Anforderers*) eine Peering-Verbindung mit der VPC herstellen.

**Um eine Vorlage zu erstellen, die die [AWS: :EC2:: VPCPeering Verbindungsressource](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpcpeeringconnection.html) enthält**

1. Gehen Sie zurück zur Startseite der CloudFormation Konsole.

1. Wählen Sie auf der Seite **Stack** oben rechts **Stack erstellen** und dann **Mit neuen Ressourcen (Standard)**.

1. Für **Voraussetzung - Vorlage vorbereiten**, wählen Sie **Vorhandene Vorlage auswählen** und dann **Vorlagendatei hochladen**, **Datei auswählen**.

1. Öffnen Sie einen Texteditor auf Ihrem lokalen Rechner und fügen Sie eine der folgenden Vorlagen hinzu. Speichern Sie die Datei und kehren Sie zur Konsole zurück, um sie als Vorlagendatei auszuwählen.  
**Example JSON**  

   ```
   {
     "AWSTemplateFormatVersion": "2010-09-09",
     "Description": "Create a VPC and a VPC Peering connection using the PeerRole to accept.",
     "Parameters": {
       "PeerVPCAccountId": {
         "Type": "String"
       },
       "PeerVPCId": {
         "Type": "String"
       },
       "PeerRoleArn": {
         "Type": "String"
       }
     },
     "Resources": {
       "vpc": {
         "Type": "AWS::EC2::VPC",
         "Properties": {
           "CidrBlock": "10.2.0.0/16",
           "EnableDnsSupport": false,
           "EnableDnsHostnames": false,
           "InstanceTenancy": "default"
         }
       },
       "vpcPeeringConnection": {
         "Type": "AWS::EC2::VPCPeeringConnection",
         "Properties": {
           "VpcId": {
             "Ref": "vpc"
           },
           "PeerVpcId": {
             "Ref": "PeerVPCId"
           },
           "PeerOwnerId": {
             "Ref": "PeerVPCAccountId"
           },
           "PeerRoleArn": {
             "Ref": "PeerRoleArn"
           }
         }
       }
     },
     "Outputs": {
       "VPCId": {
         "Value": {
           "Ref": "vpc"
         }
       },
       "VPCPeeringConnectionId": {
         "Value": {
           "Ref": "vpcPeeringConnection"
         }
       }
     }
   }
   ```  
**Example YAML**  

   ```
   AWSTemplateFormatVersion: 2010-09-09
   Description: Create a VPC and a VPC Peering connection using the PeerRole to accept.
   Parameters:
     PeerVPCAccountId:
       Type: String
     PeerVPCId:
       Type: String
     PeerRoleArn:
       Type: String
   Resources:
     vpc:
       Type: AWS::EC2::VPC
       Properties:
         CidrBlock: 10.2.0.0/16
         EnableDnsSupport: false
         EnableDnsHostnames: false
         InstanceTenancy: default
     vpcPeeringConnection:
       Type: AWS::EC2::VPCPeeringConnection
       Properties:
         VpcId: !Ref vpc
         PeerVpcId: !Ref PeerVPCId
         PeerOwnerId: !Ref PeerVPCAccountId
         PeerRoleArn: !Ref PeerRoleArn
   Outputs:
     VPCId:
       Value: !Ref vpc
     VPCPeeringConnectionId:
       Value: !Ref vpcPeeringConnection
   ```

1. Wählen Sie **Weiter** aus.

1. Geben Sie dem Stapel einen Namen (z. B. **VPC-peering-connection**).

1. Akzeptieren Sie die Standardwerte und wählen Sie dann **Weiter** aus.

1. Wählen Sie **Ich bestätige, dass CloudFormation möglicherweise IAM-Ressourcen erstellt** werden, und wählen Sie dann **Stack erstellen** aus.

## Erstellen Sie eine Vorlage mit einer sehr restriktiven Richtlinie
<a name="create-template-with-highly-restrictive-policy"></a>

Vielleicht möchten Sie eine stark einschränkende Richtlinie für das Peering zwischen Ihrer VPC und einer anderen AWS-Konto erstellen. 

Die folgende Beispielvorlage zeigt, wie die Vorlage des VPC-Peer-Besitzers (das *annehmende Konto*, das Sie oben in Schritt 1 erstellt haben) geändert wird, damit sie restriktiver ist.

**Example JSON**  

```
{
  "AWSTemplateFormatVersion":"2010-09-09",
  "Description":"Create a VPC and an assumable role for cross account VPC peering.",
  "Parameters":{
    "PeerRequesterAccountId":{
      "Type":"String"
    }
  },
  "Resources":{
    "peerRole":{
      "Type":"AWS::IAM::Role",
      "Properties":{
        "AssumeRolePolicyDocument":{
          "Statement":[
            {
              "Action":[
                "sts:AssumeRole"
              ],
              "Effect":"Allow",
              "Principal":{
                "AWS":{
                  "Ref":"PeerRequesterAccountId"
                }
              }
            }
          ]
        },
        "Path":"/",
        "Policies":[
          {
            "PolicyDocument":{
              "Statement":[
                {
                  "Action":"ec2:acceptVpcPeeringConnection",
                  "Effect":"Allow",
                  "Resource":{
                    "Fn::Sub":"arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}"
                  }
                },
                {
                  "Action":"ec2:acceptVpcPeeringConnection",
                  "Condition":{
                    "StringEquals":{
                      "ec2:AccepterVpc":{
                        "Fn::Sub":"arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}"
                      }
                    }
                  },
                  "Effect":"Allow",
                  "Resource":{
                    "Fn::Sub":"arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc-peering-connection/*"
                  }
                }
              ],
              "Version":"2012-10-17" 		 	 	 
            },
            "PolicyName":"root"
          }
        ]
      }
    },
    "vpc":{
      "Type":"AWS::EC2::VPC",
      "Properties":{
        "CidrBlock":"10.1.0.0/16",
        "EnableDnsHostnames":false,
        "EnableDnsSupport":false,
        "InstanceTenancy":"default"
      }
    }
  },
  "Outputs":{
    "RoleARN":{
      "Value":{
        "Fn::GetAtt":[
          "peerRole",
          "Arn"
        ]
      }
    },
    "VPCId":{
      "Value":{
        "Ref":"vpc"
      }
    }
  }
}
```

**Example YAML**  

```
AWSTemplateFormatVersion: 2010-09-09
Description: Create a VPC and an assumable role for cross account VPC peering.
Parameters:
  PeerRequesterAccountId:
    Type: String
Resources:
  peerRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Action:
              - 'sts:AssumeRole'
            Effect: Allow
            Principal:
              AWS:
                Ref: PeerRequesterAccountId
      Path: /
      Policies:
        - PolicyDocument:
            Statement:
              - Action: 'ec2:acceptVpcPeeringConnection'
                Effect: Allow
                Resource:
                  'Fn::Sub': 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}'
              - Action: 'ec2:acceptVpcPeeringConnection'
                Condition:
                  StringEquals:
                    'ec2:AccepterVpc':
                      'Fn::Sub': 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}'
                Effect: Allow
                Resource:
                  'Fn::Sub': >-
                    arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc-peering-connection/*
            Version: 2012-10-17 		 	 	 
          PolicyName: root
  vpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.1.0.0/16
      EnableDnsHostnames: false
      EnableDnsSupport: false
      InstanceTenancy: default
Outputs:
  RoleARN:
    Value:
      'Fn::GetAtt':
        - peerRole
        - Arn
  VPCId:
    Value:
      Ref: vpc
```

Um auf die VPC zuzugreifen, können Sie dieselbe Auftraggebervorlage wie in Schritt 2 oben verwenden.

Weitere Informationen finden Sie unter [Identitäts- und Zugangsverwaltung für VPC-Peering](https://docs.aws.amazon.com/vpc/latest/peering/security-iam.html) im *Amazon VPC Peering Guide*.

# Führen Sie blue/green ECS-Bereitstellungen durch, indem Sie CodeDeploy CloudFormation
<a name="blue-green"></a>

Um eine Anwendung zu aktualisieren, die auf Amazon Elastic Container Service (Amazon ECS) ausgeführt wird, können Sie eine CodeDeploy Blau/Grün-Bereitstellungsstrategie verwenden. Diese Strategie trägt dazu bei, Unterbrechungen durch wechselnde Anwendungsversionen zu minimieren. 

In einer blue/green Bereitstellung erstellen Sie neben Ihrer aktuellen Live-Umgebung (als *blau* bezeichnet) eine neue Anwendungsumgebung (als *grün* bezeichnet). So können Sie die grüne Umgebung überwachen und testen, bevor Sie den Live-Datenverkehr von der blauen Umgebung in die grüne Umgebung leiten. Nachdem die grüne Umgebung den Live-Verkehr bedient hat, können Sie die blaue Umgebung sicher beenden.

Um Bereitstellungen in CodeDeploy Blau/Grün auf ECS durchzuführen CloudFormation, nehmen Sie die folgenden Informationen in Ihre Stack-Vorlage auf:
+ Ein `Hooks`-Abschnitt, der einen `AWS::CodeDeploy::BlueGreen`-Hook beschreibt.
+  Ein `Transform`-Abschnitt, der die `AWS::CodeDeployBlueGreen`-Transformation angibt.

Die folgenden Themen führen Sie durch die Einrichtung einer CloudFormation Vorlage für eine blaue/grüne Bereitstellung auf ECS.

**Topics**
+ [Über blue/green Bereitstellungen](about-blue-green-deployments.md)
+ [Überlegungen bei der Verwaltung von blue/green ECS-Bereitstellungen mit CloudFormation](blue-green-considerations.md)
+ [`AWS::CodeDeploy::BlueGreen`-Hook-Syntax](blue-green-hook-syntax.md)
+ [Beispiel für eine blau/grüne Einsatzvorlage](blue-green-template-example.md)

# Über blue/green Bereitstellungen
<a name="about-blue-green-deployments"></a>

Dieses Thema bietet einen Überblick darüber, wie die Durchführung von blue/green Bereitstellungen mit funktioniert. CloudFormation Außerdem wird erklärt, wie Sie Ihre CloudFormation Vorlage für Blau/Grün-Bereitstellungen vorbereiten.

**Topics**
+ [Funktionsweise](#blue-green-how-it-works)
+ [Ressourcenaktualisierungen, die grüne Bereitstellungen initiieren](#blue-green-resources)
+ [Vorbereiten Ihrer -Vorlage](#blue-green-setup)
+ [Modellierung Ihrer blue/green Bereitstellung](#blue-green-required)
+ [Änderungssätze](#blue-green-changesets)
+ [Überwachung von Stack-Ereignissen](#blue-green-events)
+ [IAM-Berechtigungen](#blue-green-iam)

## Funktionsweise
<a name="blue-green-how-it-works"></a>

Wenn Sie blue/green ECS-Bereitstellungen über durchführen CodeDeploy, erstellen Sie zunächst eine Stack-Vorlage, die die Ressourcen für Ihre blauen und grünen Anwendungsumgebungen definiert, einschließlich der Angabe der zu CloudFormation verwendenden Einstellungen für das Routing und die Stabilisierung des Datenverkehrs. Als nächstes erstellen Sie einen Stapel aus dieser Vorlage. Dadurch wird Ihre blaue (aktuelle) Anwendung generiert. CloudFormation erstellt nur die blauen Ressourcen während der Stack-Erstellung. Ressourcen für eine grüne Bereitstellung werden erst erstellt, wenn sie erforderlich sind.

Wenn Sie dann bei einem future Stack-Update die Aufgabendefinition oder die Taskset-Ressourcen in Ihrer blauen Anwendung aktualisieren, CloudFormation geht das Folgende vor:
+ Generiert alle notwendigen Ressourcen für eine grüne Anwendungsumgebung.
+ Verschiebt den Datenverkehr basierend auf den angegebenen Datenverkehrs-Weiterleitungsparametern.
+ Löscht die blauen Ressourcen.

Wenn zu einem beliebigen Zeitpunkt ein Fehler auftritt, bevor die grüne Bereitstellung erfolgreich und abgeschlossen ist, führt CloudFormation den Stack in seinen Zustand zurück, bevor die gesamte grüne Bereitstellung initiiert wurde.

## Ressourcenaktualisierungen, die grüne Bereitstellungen initiieren
<a name="blue-green-resources"></a>

Wenn Sie ein Stack-Update durchführen, das bestimmte Eigenschaften bestimmter ECS-Ressourcen aktualisiert, wird ein CloudFormation umweltfreundlicher Bereitstellungsprozess eingeleitet. Die Ressourcen, die diesen Prozess in Gang setzen, sind:
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskset.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskset.html) 

Wenn die Aktualisierungen dieser Ressourcen jedoch keine Eigenschaftsänderungen beinhalten, die eine Ersetzung erfordern, wird keine grüne Bereitstellung initiiert. Weitere Informationen finden Sie unter [Verstehen des Aktualisierungsverhaltens von Stack-Ressourcen](using-cfn-updating-stacks-update-behaviors.md).

Es ist wichtig zu wissen, dass Sie Aktualisierungen der oben genannten Ressourcen nicht mit Aktualisierungen anderer Ressourcen im selben Stapelaktualisierungsvorgang kombinieren können. Wenn Sie sowohl die aufgeführten Ressourcen als auch andere Ressourcen innerhalb desselben Stapels aktualisieren müssen, haben Sie zwei Möglichkeiten:
+ Führen Sie zwei separate Stack-Aktualisierungsvorgänge durch: einen, die nur die Aktualisierungen der obengenannten Ressourcen enthält, und eine separate Stack-Aktualisierung, die Änderungen an anderen Ressourcen enthält.
+ Entfernen Sie die Abschnitte `Hooks` und `Transform` aus Ihrer Vorlage und führen Sie dann die Stack-Aktualisierung durch. In diesem Fall CloudFormation wird keine umweltfreundliche Bereitstellung durchgeführt.

## Bereiten Sie Ihre Vorlage für die Durchführung von blue/green ECS-Bereitstellungen vor
<a name="blue-green-setup"></a>

Um blue/green Bereitstellungen auf Ihrem Stack zu ermöglichen, nehmen Sie die folgenden Abschnitte in Ihre Stack-Vorlage auf, bevor Sie ein Stack-Update durchführen.
+ Fügen Sie Ihrer Vorlage einen Verweis auf die Transformation `AWS::CodeDeployBlueGreen` hinzu:

  ```
  "Transform": [
    "AWS::CodeDeployBlueGreen"
  ],
  ```
+ Fügen Sie einen `Hooks`-Abschnitt hinzu, der den Hook `AWS::CodeDeploy::BlueGreen` aufruft und die Eigenschaften für Ihre Bereitstellung angibt. Weitere Informationen finden Sie unter [`AWS::CodeDeploy::BlueGreen`-Hook-Syntax](blue-green-hook-syntax.md).
+ Definieren Sie im Abschnitt `Resources` die blauen und grünen Ressourcen für Ihre Bereitstellung.

Sie können diese Abschnitte hinzufügen, wenn Sie die Vorlage zum ersten Mal erstellen (d. h. vor dem Erstellen des Stacks selbst), oder Sie können sie einer vorhandenen Vorlage hinzufügen, bevor Sie eine Stack-Aktualisierung durchführen. Wenn Sie das blue/green Deployment für einen neuen Stack angeben, werden bei der Stack-Erstellung CloudFormation nur die blauen Ressourcen erstellt — Ressourcen für das grüne Deployment werden erst erstellt, wenn sie während eines Stack-Updates benötigt werden.

## Modellieren Sie Ihre blue/green Bereitstellung mithilfe von CloudFormation Ressourcen
<a name="blue-green-required"></a>

Um eine CodeDeploy blaue/grüne Bereitstellung auf ECS durchzuführen, muss Ihre CloudFormation Vorlage die Ressourcen enthalten, die Ihre Bereitstellung modellieren, z. B. einen Amazon ECS-Service und einen Load Balancer. Weitere Informationen dazu, was diese Ressourcen darstellen, finden Sie unter [Vor einer Amazon ECS-Bereitstellung](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-steps-ecs.html#deployment-steps-prerequisites-ecs) im *AWS CodeDeploy -Benutzerhandbuch*.


| Anforderung | Ressource | Erforderlich/optional | Initiiert die blue/green Bereitstellung, falls sie ersetzt wird? | 
| --- | --- | --- | --- | 
| Amazon-ECS-Cluster | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-cluster.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-cluster.html) | Optional. Der Standard-Cluster kann verwendet werden. | Nein | 
| Amazon-ECS-Service | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-service.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-service.html) | Erforderlich | Nein | 
| Application oder Network Load Balancer | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-service-loadbalancer.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-service-loadbalancer.html) | Erforderlich | Nein | 
| Produktions-Listener | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html) | Erforderlich | Nein | 
| Listener testen  | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html) | Optional. | Nein | 
| Zwei Zielgruppen | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html) | Erforderlich | Nein | 
| Amazon ECS-Aufgabendefinition  | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html) | Erforderlich | Ja | 
| Container für Ihre Amazon ECS-Anwendung | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-name](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-name) | Erforderlich | Nein | 
| Ein Port für den Ersatzaufgabensatz | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-portmapping.html#cfn-ecs-taskdefinition-portmapping-containerport](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-portmapping.html#cfn-ecs-taskdefinition-portmapping-containerport) | Erforderlich | Nein | 

## Änderungssätze
<a name="blue-green-changesets"></a>

Es wird dringend empfohlen, einen Änderungssatz zu erstellen, bevor Sie eine Stack-Aktualisierung durchführen, die eine Grün-Bereitstellung initiiert. So können Sie die tatsächlichen Änderungen, die an Ihrem Stack vorgenommen werden, sehen, bevor Sie die Stack-Aktualisierung durchführen. Beachten Sie, dass Ressourcenänderungen möglicherweise nicht in der Reihenfolge aufgeführt werden, in der sie während der Stack-Aktualisierung durchgeführt werden. Weitere Informationen finden Sie unter [CloudFormation Stapel mithilfe von Änderungssätzen aktualisieren](using-cfn-updating-stacks-changesets.md).

## Überwachung von Stack-Ereignissen
<a name="blue-green-events"></a>

Sie können die Stack-Ereignisse, die bei jedem Schritt der ECS-Bereitstellung generiert wurden, in der Registerkarte **Ereignisse** der Seite **Stack** und mithilfe der AWS CLI anzeigen. Weitere Informationen finden Sie unter [Fortschritt des Stapels überwachen](monitor-stack-progress.md).

## IAM-Berechtigungen für Bereitstellungen blue/green
<a name="blue-green-iam"></a>

 CloudFormation Um die blaugrünen Bereitstellungen erfolgreich durchführen zu können, benötigen Sie die folgenden Berechtigungen: CodeDeploy 
+ `codedeploy:Get*`
+ `codedeploy:CreateCloudFormationDeployment`

Weitere Informationen finden Sie unter [Aktionen, Ressourcen und Bedingungsschlüssel für CodeDeploy](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awscodedeploy.html) in der *Service-Autorisierungs-Referenz*.

# Überlegungen bei der Verwaltung von blue/green ECS-Bereitstellungen mit CloudFormation
<a name="blue-green-considerations"></a>

Das Verfahren CloudFormation zur Durchführung Ihrer blue/green ECS-Bereitstellungen unterscheidet CodeDeploy sich von einer standardmäßigen ECS-Bereitstellung mit nur. CodeDeploy Ein detailliertes Verständnis dieser Unterschiede finden Sie unter [Unterschiede zwischen Amazon blue/green ECS-Bereitstellungen durch CodeDeploy und CloudFormation](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployments-create-ecs-cfn.html#differences-ecs-bg-cfn) im *AWS CodeDeploy Benutzerhandbuch*. 

Bei der Verwaltung Ihrer blue/green Bereitstellung mithilfe von CloudFormation sind bestimmte Einschränkungen und Überlegungen zu beachten:
+ Nur bei Aktualisierungen bestimmter Ressourcen wird eine grüne Bereitstellung initiiert. Weitere Informationen finden Sie unter [Ressourcenaktualisierungen, die grüne Bereitstellungen initiieren](about-blue-green-deployments.md#blue-green-resources).
+ Sie können keine Aktualisierungen für Ressourcen, die grüne Bereitstellungen initiieren, und Aktualisierungen für andere Ressourcen in dieselbe Stack-Aktualisierung aufnehmen. Weitere Informationen finden Sie unter [Ressourcenaktualisierungen, die grüne Bereitstellungen initiieren](about-blue-green-deployments.md#blue-green-resources).
+ Sie können nur einen einzelnen ECS-Service als Bereitstellungsziel angeben.
+ Parameter, deren Werte verschleiert werden, CloudFormation können CodeDeploy während einer umweltfreundlichen Bereitstellung nicht aktualisiert werden. Dies führt zu einem Fehler und einem Fehler beim Stack-Update. Dazu zählen:
  + Parameter, die mit dem Attribut `NoEcho` definiert sind.
  + Parameter, die dynamische Referenzen verwenden, um ihre Werte von externen Diensten abzurufen. Weitere Informationen über dynamische Referenzen finden Sie unter [Abrufen von in anderen Diensten gespeicherten Werten mit Hilfe von dynamischen Referenzen](dynamic-references.md).
+ Um eine grüne Bereitstellung abzubrechen, die noch im Gange ist, brechen Sie das Stack-Update in CloudFormation, Not CodeDeploy oder ECS ab. Weitere Informationen finden Sie unter [Eine Stapelaktualisierung abbrechen](using-cfn-stack-update-cancel.md). Nach Abschluss einer Aktualisierung können Sie diese nicht mehr stornieren. Sie können jedoch einen Stapel mit allen vorherigen Einstellungen erneut aktualisieren.
+ Die folgenden CloudFormation Funktionen werden derzeit nicht für Vorlagen unterstützt, die blue/green ECS-Bereitstellungen definieren:
  + [Ausgaben](outputs-section-structure.md) deklarieren oder [Fn::](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-importvalue.html) verwendenImportValue, um Werte aus anderen Stacks zu importieren.
  + Ressourcen importieren. Weitere Informationen zum Importieren von Ressourcen finden Sie unter [AWS Ressourcen in einen CloudFormation Stack importieren](import-resources.md).
  + Verwendung des `AWS::CodeDeploy::BlueGreen`-Hooks in einer Vorlage, die verschachtelte Stackressourcen enthält. Weitere Informationen über verschachtelte Stapel finden Sie unter [Aufteilung einer Vorlage in wiederverwendbare Teile mit verschachtelten Stapeln](using-cfn-nested-stacks.md).
  + Verwendung des Hooks `AWS::CodeDeploy::BlueGreen` in einem verschachtelten Stack.

# `AWS::CodeDeploy::BlueGreen`-Hook-Syntax
<a name="blue-green-hook-syntax"></a>

Die folgende Syntax beschreibt die Struktur eines `AWS::CodeDeploy::BlueGreen` Hooks für blue/green ECS-Bereitstellungen.

## Syntax
<a name="cfn-blue-green-hook-syntax"></a>

```
"Hooks": {
  "Logical ID": {
    "Type": "AWS::CodeDeploy::BlueGreen",
    "Properties": {
      "TrafficRoutingConfig": {
        "Type": "Traffic routing type",
        "TimeBasedCanary": {
          "StepPercentage": Integer,
          "BakeTimeMins": Integer
        },
        "TimeBasedLinear": {
          "StepPercentage": Integer,
          "BakeTimeMins": Integer
        }
      },
      "AdditionalOptions": {"TerminationWaitTimeInMinutes": Integer},
      "LifecycleEventHooks": {
        "BeforeInstall": "FunctionName",
        "AfterInstall": "FunctionName",
        "AfterAllowTestTraffic": "FunctionName",
        "BeforeAllowTraffic": "FunctionName",
        "AfterAllowTraffic": "FunctionName"
      },
      "ServiceRole": "CodeDeployServiceRoleName",
      "Applications": [
        {
          "Target": {
            "Type": "AWS::ECS::Service",
            "LogicalID": "Logical ID of AWS::ECS::Service"
          },
          "ECSAttributes": {
            "TaskDefinitions": [
              "Logical ID of AWS::ECS::TaskDefinition (Blue)",
              "Logical ID of AWS::ECS::TaskDefinition (Green)"
            ],
            "TaskSets": [
              "Logical ID of AWS::ECS::TaskSet (Blue)",
              "Logical ID of AWS::ECS::TaskSet (Green)"
            ],
            "TrafficRouting": {
              "ProdTrafficRoute": {
                "Type": "AWS::ElasticLoadBalancingV2::Listener",
                "LogicalID": "Logical ID of AWS::ElasticLoadBalancingV2::Listener (Production)"
              },
              "TestTrafficRoute": {
                "Type": "AWS::ElasticLoadBalancingV2::Listener",
                "LogicalID": "Logical ID of AWS::ElasticLoadBalancingV2::Listener (Test)"
              },
              "TargetGroups": [
                "Logical ID of AWS::ElasticLoadBalancingV2::TargetGroup (Blue)",
                "Logical ID of AWS::ElasticLoadBalancingV2::TargetGroup (Green)"
              ]
            }
          }
        }
      ]
    }
  }
}
```

## Eigenschaften
<a name="cfn-blue-green-hook-properties"></a>

Logische ID (auch *logischer Name*genannt)  
Die logische ID eines Hooks, der im Abschnitt `Hooks` der Vorlage deklariert ist. Die logische ID muss alphanumerisch (A-Za-z0-9) und innerhalb der Vorlage eindeutig sein.  
*Erforderlich*: Ja    
`Type`  
Der Typ des Hooks. `AWS::CodeDeploy::BlueGreen`  
*Erforderlich*: Ja  
`Properties`  
Eigenschaften des Hooks.  
*Erforderlich*: Ja    
`TrafficRoutingConfig`  
Konfigurationseinstellungen für Datenverkehrsweiterleitungen  
*Required*: No  
Die Standardkonfiguration ist eine zeitbasierte Verschiebung des Canary-Verkehrs mit einem Schrittprozentsatz von 15 % und einer Bake-Zeit von fünf Minuten.    
`Type`  
Der Typ des Datenverkehrs, der von der Bereitstellungskonfiguration verwendet wird.  
Gültige Werte: AllAtOnce \$1 \$1 TimeBasedCanary TimeBasedLinear  
*Erforderlich*: Ja    
`TimeBasedCanary`  
Gibt eine Konfiguration an, die den Datenverkehr in zwei Schritten von einer Version der Bereitstellung auf eine andere verlagert.  
*Erforderlich*: Bedingt: Wenn Sie `TimeBasedCanary` als Datenverkehrs-Weiterleitungstyp angeben, müssen Sie den Parameter `TimeBasedCanary` einschließen.    
`StepPercentage`  
Der Prozentsatz des Datenverkehrs, der im ersten Schritt einer `TimeBasedCanary`-Bereitstellung verschoben werden soll. Der Schrittprozentsatz muss 14 % oder höher sein.  
*Required*: No  
`BakeTimeMins`  
Die Anzahl der Minuten zwischen der ersten und zweiten Verkehrsverschiebung einer `TimeBasedCanary`-Bereitstellung.  
*Required*: No  
`TimeBasedLinear`  
Gibt eine Konfiguration an, die den Datenverkehr in gleichen Schritten von einer Version der Bereitstellung in ein anderes gleiches Inkrement verlagert, wobei zwischen jedem Inkrement eine gleiche Anzahl von Minuten liegt.  
*Erforderlich*: Bedingt: Wenn Sie `TimeBasedLinear` als Datenverkehrs-Weiterleitungstyp angeben, müssen Sie den Parameter `TimeBasedLinear` einschließen.    
`StepPercentage`  
Der Prozentsatz des Datenverkehrs, der zu Beginn jedes Inkrements einer `TimeBasedLinear`-Bereitstellung verschoben wird. Der Schrittprozentsatz muss 14 % oder höher sein.  
*Required*: No  
`BakeTimeMins`  
Die Anzahl der Minuten zwischen jeder inkrementellen Verkehrsverschiebung einer `TimeBasedLinear`-Bereitstellung.  
*Required*: No  
`AdditionalOptions`  
Zusätzliche Optionen für die blue/green Bereitstellung.  
*Required*: No    
`TerminationWaitTimeInMinutes`  
Gibt die Wartezeit in Minuten an, bevor die blauen Ressourcen beendet werden.  
*Required*: No  
`LifecycleEventHooks`  
Verwenden Sie Lifecycle-Event-Hooks, um eine Lambda-Funktion anzugeben, die aufgerufen CodeDeploy werden kann, um eine Bereitstellung zu validieren. Sie können dieselbe Funktion oder eine andere für die Bereitstellungs-Lebenszyklusereignisse verwenden. Nach Abschluss der Validierungstests ruft die `AfterAllowTraffic` Lambda-Funktion zurück CodeDeploy und liefert das Ergebnis `Succeeded` oder`Failed`. Weitere Informationen finden Sie im [Abschnitt AppSpec „Hooks“](https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html) im *AWS CodeDeploy Benutzerhandbuch*.  
*Required*: No    
`BeforeInstall`  
Funktion zur Ausführung von Aufgaben, bevor der neue Aufgabensatz erstellt ist.  
*Required*: No  
`AfterInstall`  
Funktion zur Ausführung von Aufgaben nach Erstellung des neuen Aufgabensatzes und Zuordnung einer der Zielgruppen.  
*Required*: No  
`AfterAllowTestTraffic`  
Funktion zur Ausführung von Aufgaben, wenn der Test-Listener Datenverkehr an den neuen Aufgabensatz sendet.  
*Required*: No  
`BeforeAllowTraffic`  
Funktion zur Ausführung von Aufgaben, wenn die zweite Zielgruppe dem neuen Aufgabensatz zugeordnet ist, aber bevor Datenverkehr an den neuen Aufgabensatz umgeleitet wurde.  
*Required*: No  
`AfterAllowTraffic`  
Funktion zur Ausführung von Aufgaben, wenn die zweite Zielgruppe Datenverkehr an den neuen Aufgabensatz sendet.  
*Required*: No  
`ServiceRole`  
Die Ausführungsrolle, die für CloudFormation die Ausführung der blaugrünen Bereitstellungen verwendet werden soll. Eine Liste der erforderlichen Berechtigungen finden Sie unter [IAM-Berechtigungen für Bereitstellungen blue/green](about-blue-green-deployments.md#blue-green-iam).  
*Required*: No  
`Applications`  
Gibt die Eigenschaften der Amazon ECS-Anwendung an.  
*Erforderlich*: Ja    
`Target`  
  
*Erforderlich*: Ja    
`Type`  
Der Ressourcentyp.  
*Erforderlich*: Ja  
`LogicalID`  
Die logische ID der Ressource.  
*Erforderlich*: Ja  
`ECSAttributes`  
Die Ressourcen, die die verschiedenen Anforderungen Ihrer Amazon ECS-Anwendungsbereitstellung darstellen.  
*Erforderlich*: Ja    
`TaskDefinitions`  
Die logische ID der [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html)-Ressource zur Ausführung des Docker-Containers, der Ihre Amazon ECS-Anwendung enthält.  
*Erforderlich*: Ja  
`TaskSets`  
Die logischen IDs [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskset.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskset.html)Ressourcen, die als Tasksets für die Anwendung verwendet werden sollen.  
*Erforderlich*: Ja  
`TrafficRouting`  
Gibt Ressourcen an, die für das Weiterleiten des Datenverkehrs verwendet werden.  
*Erforderlich*: Ja    
`ProdTrafficRoute`  
Der Listener, der von Ihrem Load Balancer verwendet wird, um Datenverkehr an Ihre Zielgruppen weiterzuleiten.  
*Erforderlich*: Ja    
`Type`  
Der Ressourcentyp. `AWS::ElasticLoadBalancingV2::Listener`  
*Erforderlich*: Ja  
`LogicalID`  
Die logische ID der Ressource.  
*Erforderlich*: Ja  
`TestTrafficRoute`  
Der Listener, der von Ihrem Load Balancer verwendet wird, um Datenverkehr an Ihre Zielgruppen weiterzuleiten.  
*Erforderlich*: Ja    
`Type`  
Der Ressourcentyp. `AWS::ElasticLoadBalancingV2::Listener`  
*Erforderlich*: Ja  
`LogicalID`  
Die logische ID der Ressource.  
*Required*: No  
`TargetGroups`  
Logische ID der Ressourcen, die als Zielgruppen verwendet werden sollen, um den Datenverkehr an das registrierte Ziel weiterzuleiten.  
*Erforderlich*: Ja

# Beispiel für eine blau/grüne Einsatzvorlage
<a name="blue-green-template-example"></a>

Die folgende Beispielvorlage richtet eine CodeDeploy blaue/grüne Bereitstellung auf ECS ein, mit einem Fortschritt bei der Weiterleitung des Datenverkehrs von 15 Prozent pro Schritt und einem Stabilisierungszeitraum von 5 Minuten zwischen den einzelnen Schritten. 

Durch das Erstellen eines Stacks mit der Vorlage wird die anfängliche Konfiguration der Bereitstellung bereitgestellt. Wenn Sie dann Änderungen an den Eigenschaften der `BlueTaskSet` Ressource vorgenommen haben, die einen Austausch dieser Ressource erfordern, CloudFormation wird im Rahmen des Stack-Updates eine umweltfreundliche Bereitstellung initiiert.

## JSON
<a name="blue-green-template-example.json"></a>

```
{
  "AWSTemplateFormatVersion":"2010-09-09",
  "Parameters":{
    "Vpc":{ "Type":"AWS::EC2::VPC::Id" },
    "Subnet1":{ "Type":"AWS::EC2::Subnet::Id" },
    "Subnet2":{ "Type":"AWS::EC2::Subnet::Id" }
  },
  "Transform":[ "AWS::CodeDeployBlueGreen" ],
  "Hooks":{
    "CodeDeployBlueGreenHook":{
      "Type":"AWS::CodeDeploy::BlueGreen",
      "Properties":{
        "TrafficRoutingConfig":{
          "Type":"TimeBasedCanary",
          "TimeBasedCanary":{
            "StepPercentage":15,
            "BakeTimeMins":5
          }
        },
        "Applications":[
          {
            "Target":{
              "Type":"AWS::ECS::Service",
              "LogicalID":"ECSDemoService"
            },
            "ECSAttributes":{
              "TaskDefinitions":[ "BlueTaskDefinition","GreenTaskDefinition" ],
              "TaskSets":[ "BlueTaskSet","GreenTaskSet" ],
              "TrafficRouting":{
                "ProdTrafficRoute":{
                  "Type":"AWS::ElasticLoadBalancingV2::Listener",
                  "LogicalID":"ALBListenerProdTraffic"
                },
                "TargetGroups":[ "ALBTargetGroupBlue","ALBTargetGroupGreen" ]
              }
            }
          }
        ]
      }
    }
  },
  "Resources":{
    "ExampleSecurityGroup":{
      "Type":"AWS::EC2::SecurityGroup",
      "Properties":{
        "GroupDescription":"Security group for ec2 access",
        "VpcId":{ "Ref":"Vpc" },
        "SecurityGroupIngress":[
          {
            "IpProtocol":"tcp",
            "FromPort":80,
            "ToPort":80,
            "CidrIp":"0.0.0.0/0"
          },
          {
            "IpProtocol":"tcp",
            "FromPort":8080,
            "ToPort":8080,
            "CidrIp":"0.0.0.0/0"
          },
          {
            "IpProtocol":"tcp",
            "FromPort":22,
            "ToPort":22,
            "CidrIp":"0.0.0.0/0"
          }
        ]
      }
    },
    "ALBTargetGroupBlue":{
      "Type":"AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties":{
        "HealthCheckIntervalSeconds":5,
        "HealthCheckPath":"/",
        "HealthCheckPort":"80",
        "HealthCheckProtocol":"HTTP",
        "HealthCheckTimeoutSeconds":2,
        "HealthyThresholdCount":2,
        "Matcher":{ "HttpCode":"200" },
        "Port":80,
        "Protocol":"HTTP",
        "Tags":[{ "Key":"Group","Value":"Example" }],
        "TargetType":"ip",
        "UnhealthyThresholdCount":4,
        "VpcId":{ "Ref":"Vpc" }
      }
    },
    "ALBTargetGroupGreen":{
      "Type":"AWS::ElasticLoadBalancingV2::TargetGroup",
      "Properties":{
        "HealthCheckIntervalSeconds":5,
        "HealthCheckPath":"/",
        "HealthCheckPort":"80",
        "HealthCheckProtocol":"HTTP",
        "HealthCheckTimeoutSeconds":2,
        "HealthyThresholdCount":2,
        "Matcher":{ "HttpCode":"200" },
        "Port":80,
        "Protocol":"HTTP",
        "Tags":[{ "Key":"Group","Value":"Example" }],
        "TargetType":"ip",
        "UnhealthyThresholdCount":4,
        "VpcId":{ "Ref":"Vpc" }
      }
    },
    "ExampleALB":{
      "Type":"AWS::ElasticLoadBalancingV2::LoadBalancer",
      "Properties":{
        "Scheme":"internet-facing",
        "SecurityGroups":[{ "Ref":"ExampleSecurityGroup" }],
        "Subnets":[{ "Ref":"Subnet1" },{ "Ref":"Subnet2" }],
        "Tags":[{ "Key":"Group","Value":"Example" }],
        "Type":"application",
        "IpAddressType":"ipv4"
      }
    },
    "ALBListenerProdTraffic":{
      "Type":"AWS::ElasticLoadBalancingV2::Listener",
      "Properties":{
        "DefaultActions":[
          {
            "Type":"forward",
            "ForwardConfig":{
              "TargetGroups":[
                {
                  "TargetGroupArn":{ "Ref":"ALBTargetGroupBlue" },
                  "Weight":1
                }
              ]
            }
          }
        ],
        "LoadBalancerArn":{ "Ref":"ExampleALB" },
        "Port":80,
        "Protocol":"HTTP"
      }
    },
    "ALBListenerProdRule":{
      "Type":"AWS::ElasticLoadBalancingV2::ListenerRule",
      "Properties":{
        "Actions":[
          {
            "Type":"forward",
            "ForwardConfig":{
              "TargetGroups":[
                {
                  "TargetGroupArn":{ "Ref":"ALBTargetGroupBlue" },
                  "Weight":1
                }
              ]
            }
          }
        ],
        "Conditions":[
          {
            "Field":"http-header",
            "HttpHeaderConfig":{
              "HttpHeaderName":"User-Agent",
              "Values":[ "Mozilla" ]
            }
          }
        ],
        "ListenerArn":{ "Ref":"ALBListenerProdTraffic" },
        "Priority":1
      }
    },
    "ECSTaskExecutionRole":{
      "Type":"AWS::IAM::Role",
      "Properties":{
        "AssumeRolePolicyDocument":{
          "Version": "2012-10-17",		 	 	 
          "Statement":[
            {
              "Sid":"",
              "Effect":"Allow",
              "Principal":{
                "Service":"ecs-tasks.amazonaws.com"
              },
              "Action":"sts:AssumeRole"
            }
          ]
        },
        "ManagedPolicyArns":[ "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy" ]
      }
    },
    "BlueTaskDefinition":{
      "Type":"AWS::ECS::TaskDefinition",
      "Properties":{
        "ExecutionRoleArn":{
          "Fn::GetAtt":[ "ECSTaskExecutionRole","Arn" ]
        },
        "ContainerDefinitions":[
          {
            "Name":"DemoApp",
            "Image":"nginxdemos/hello:latest",
            "Essential":true,
            "PortMappings":[
              {
                "HostPort":80,
                "Protocol":"tcp",
                "ContainerPort":80
              }
            ]
          }
        ],
        "RequiresCompatibilities":[ "FARGATE" ],
        "NetworkMode":"awsvpc",
        "Cpu":"256",
        "Memory":"512",
        "Family":"ecs-demo"
      }
    },
    "ECSDemoCluster":{
      "Type":"AWS::ECS::Cluster",
      "Properties":{}
    },
    "ECSDemoService":{
      "Type":"AWS::ECS::Service",
      "Properties":{
        "Cluster":{ "Ref":"ECSDemoCluster" },
        "DesiredCount":1,
        "DeploymentController":{ "Type":"EXTERNAL" }
      }
    },
    "BlueTaskSet":{
      "Type":"AWS::ECS::TaskSet",
      "Properties":{
        "Cluster":{ "Ref":"ECSDemoCluster" },
        "LaunchType":"FARGATE",
        "NetworkConfiguration":{
          "AwsVpcConfiguration":{
            "AssignPublicIp":"ENABLED",
            "SecurityGroups":[{ "Ref":"ExampleSecurityGroup" }],
            "Subnets":[{ "Ref":"Subnet1" },{ "Ref":"Subnet2" }]
          }
        },
        "PlatformVersion":"1.4.0",
        "Scale":{
          "Unit":"PERCENT",
          "Value":100
        },
        "Service":{ "Ref":"ECSDemoService"},
        "TaskDefinition":{ "Ref":"BlueTaskDefinition" },
        "LoadBalancers":[
          {
            "ContainerName":"DemoApp",
            "ContainerPort":80,
            "TargetGroupArn":{ "Ref":"ALBTargetGroupBlue" }
          }
        ]
      }
    },
    "PrimaryTaskSet":{
      "Type":"AWS::ECS::PrimaryTaskSet",
      "Properties":{
        "Cluster":{ "Ref":"ECSDemoCluster" },
        "Service":{ "Ref":"ECSDemoService" },
        "TaskSetId":{ "Fn::GetAtt":[ "BlueTaskSet","Id" ]
        }
      }
    }
  }
}
```

## YAML
<a name="blue-green-template-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  Vpc:
    Type: AWS::EC2::VPC::Id
  Subnet1:
    Type: AWS::EC2::Subnet::Id
  Subnet2:
    Type: AWS::EC2::Subnet::Id
Transform:
  - 'AWS::CodeDeployBlueGreen'
Hooks:
  CodeDeployBlueGreenHook:
    Type: AWS::CodeDeploy::BlueGreen
    Properties:
      TrafficRoutingConfig:
        Type: TimeBasedCanary
        TimeBasedCanary:
          StepPercentage: 15
          BakeTimeMins: 5
      Applications:
        - Target:
            Type: AWS::ECS::Service
            LogicalID: ECSDemoService
          ECSAttributes:
            TaskDefinitions:
              - BlueTaskDefinition
              - GreenTaskDefinition
            TaskSets:
              - BlueTaskSet
              - GreenTaskSet
            TrafficRouting:
              ProdTrafficRoute:
                Type: AWS::ElasticLoadBalancingV2::Listener
                LogicalID: ALBListenerProdTraffic
              TargetGroups:
                - ALBTargetGroupBlue
                - ALBTargetGroupGreen
Resources:
  ExampleSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for ec2 access
      VpcId: !Ref Vpc
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 8080
          ToPort: 8080
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
  ALBTargetGroupBlue:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 5
      HealthCheckPath: /
      HealthCheckPort: '80'
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 2
      HealthyThresholdCount: 2
      Matcher:
        HttpCode: '200'
      Port: 80
      Protocol: HTTP
      Tags:
        - Key: Group
          Value: Example
      TargetType: ip
      UnhealthyThresholdCount: 4
      VpcId: !Ref Vpc
  ALBTargetGroupGreen:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 5
      HealthCheckPath: /
      HealthCheckPort: '80'
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 2
      HealthyThresholdCount: 2
      Matcher:
        HttpCode: '200'
      Port: 80
      Protocol: HTTP
      Tags:
        - Key: Group
          Value: Example
      TargetType: ip
      UnhealthyThresholdCount: 4
      VpcId: !Ref Vpc
  ExampleALB:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Scheme: internet-facing
      SecurityGroups:
        - !Ref ExampleSecurityGroup
      Subnets:
        - !Ref Subnet1
        - !Ref Subnet2
      Tags:
        - Key: Group
          Value: Example
      Type: application
      IpAddressType: ipv4
  ALBListenerProdTraffic:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          ForwardConfig:
            TargetGroups:
              - TargetGroupArn: !Ref ALBTargetGroupBlue
                Weight: 1
      LoadBalancerArn: !Ref ExampleALB
      Port: 80
      Protocol: HTTP
  ALBListenerProdRule:
    Type: AWS::ElasticLoadBalancingV2::ListenerRule
    Properties:
      Actions:
        - Type: forward
          ForwardConfig:
            TargetGroups:
              - TargetGroupArn: !Ref ALBTargetGroupBlue
                Weight: 1
      Conditions:
        - Field: http-header
          HttpHeaderConfig:
            HttpHeaderName: User-Agent
            Values:
              - Mozilla
      ListenerArn: !Ref ALBListenerProdTraffic
      Priority: 1
  ECSTaskExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Sid: ''
            Effect: Allow
            Principal:
              Service: ecs-tasks.amazonaws.com
            Action: 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy'
  BlueTaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      ExecutionRoleArn: !GetAtt 
        - ECSTaskExecutionRole
        - Arn
      ContainerDefinitions:
        - Name: DemoApp
          Image: 'nginxdemos/hello:latest'
          Essential: true
          PortMappings:
            - HostPort: 80
              Protocol: tcp
              ContainerPort: 80
      RequiresCompatibilities:
        - FARGATE
      NetworkMode: awsvpc
      Cpu: '256'
      Memory: '512'
      Family: ecs-demo
  ECSDemoCluster:
    Type: AWS::ECS::Cluster
    Properties: {}
  ECSDemoService:
    Type: AWS::ECS::Service
    Properties:
      Cluster: !Ref ECSDemoCluster
      DesiredCount: 1
      DeploymentController:
        Type: EXTERNAL
  BlueTaskSet:
    Type: AWS::ECS::TaskSet
    Properties:
      Cluster: !Ref ECSDemoCluster
      LaunchType: FARGATE
      NetworkConfiguration:
        AwsVpcConfiguration:
          AssignPublicIp: ENABLED
          SecurityGroups:
            - !Ref ExampleSecurityGroup
          Subnets:
            - !Ref Subnet1
            - !Ref Subnet2
      PlatformVersion: 1.4.0
      Scale:
        Unit: PERCENT
        Value: 100
      Service: !Ref ECSDemoService
      TaskDefinition: !Ref BlueTaskDefinition
      LoadBalancers:
        - ContainerName: DemoApp
          ContainerPort: 80
          TargetGroupArn: !Ref ALBTargetGroupBlue
  PrimaryTaskSet:
    Type: AWS::ECS::PrimaryTaskSet
    Properties:
      Cluster: !Ref ECSDemoCluster
      Service: !Ref ECSDemoService
      TaskSetId: !GetAtt 
        - BlueTaskSet
        - Id
```

# CloudFormation Schnipsel aus Vorlagen
<a name="template-snippets"></a>

Dieser Abschnitt enthält eine Reihe von Beispielszenarien, die Sie verwenden können, um zu verstehen, wie verschiedene CloudFormation -Vorlagenteile deklariert werden. Sie können die Ausschnitte auch als Ausgangspunkt für Abschnitte von benutzerdefinierten Vorlagen verwenden.

**Topics**
+ [Allgemeine Vorlagenausschnitte](quickref-general.md)
+ [CloudFormation Vorlagenausschnitte für automatische Skalierung](quickref-autoscaling.md)
+ [AWS Vorlagenausschnitte für die Rechnungskonsole](quickref-billingconductor.md)
+ [CloudFormation Schnipsel aus Vorlagen](quickref-cloudformation.md)
+ [CloudFront Amazon-Vorlagenschnipsel](quickref-cloudfront.md)
+ [CloudWatch Amazon-Vorlagenschnipsel](quickref-cloudwatch.md)
+ [Amazon CloudWatch Logs-Vorlagenausschnitte](quickref-cloudwatchlogs.md)
+ [Amazon DynamoDB-Vorlagenausschnitte](quickref-dynamodb.md)
+ [EC2 CloudFormation Amazon-Vorlagenschnipsel](quickref-ec2.md)
+ [Amazon Elastic Container Service Beispielvorlagen](quickref-ecs.md)
+ [Amazon Elastic File System-Beispielvorlage](quickref-efs.md)
+ [Elastic Beanstalk-Vorlagenausschnitte](quickref-elasticbeanstalk.md)
+ [Elastic Load Balancing-Vorlagenausschnitte](quickref-elb.md)
+ [AWS Identity and Access Management Schnipsel aus Vorlagen](quickref-iam.md)
+ [AWS Lambda Vorlage](quickref-lambda.md)
+ [Amazon Redshift-Vorlagenausschnitte](quickref-redshift.md)
+ [Amazon RDS-Vorlagenausschnitte](quickref-rds.md)
+ [Route-53-Vorlagenausschnitte](quickref-route53.md)
+ [Amazon S3-Vorlagenausschnitte](quickref-s3.md)
+ [Amazon SNS-Vorlagenausschnitte](quickref-sns.md)
+ [Amazon SQS-Vorlagenausschnitte](scenario-sqs-queue.md)
+ [Amazon Timestream Vorlage Schnipsel](scenario-timestream-queue.md)

# Allgemeine Vorlagenausschnitte
<a name="quickref-general"></a>

Die folgenden Beispiele zeigen verschiedene CloudFormation Vorlagenfunktionen, die nicht spezifisch für einen AWS Dienst sind.

**Topics**
+ [Base64 encoded UserData property](#scenario-userdata-base64)
+ [Base64 encoded UserData property with AccessKey and SecretKey](#scenario-userdata-base64-with-keys)
+ [Parameters-Abschnitt mit einem literalen String-Parameter](#scenario-one-string-parameter)
+ [Parameters-Abschnitt mit String-Parameter mit Beschränkung auf reguläre Ausdrücke](#scenario-constraint-string-parameter)
+ [Parameters-Abschnitt mit Zahlenparameter mit MinValue und MaxValue-Beschränkungen](#scenario-one-number-min-parameter)
+ [ParametersAbschnitt mit Zahlenparameter mit AllowedValues Einschränkung](#scenario-one-number-parameter)
+ [Parameters-Abschnitt mit einem literalen CommaDelimitedList-Parameter](#scenario-one-list-parameter)
+ [Parameters-Abschnitt mit Parameterwert basierend auf Pseudoparameter](#scenario-one-pseudo-parameter)
+ [AbschnittMapping mit drei Zuordnungen](#scenario-mapping-with-four-maps)
+ [Description basierend auf einer wörtlichen Zeichenkette](#scenario-description-from-literal-string)
+ [Outputs-Abschnitt mit einer literalen Stringausgabe](#scenario-output-with-literal-string)
+ [Outputs-Abschnitt mit einer Ressourcenreferenz und einer Pseudoreferenzausgabe](#scenario-output-with-ref-and-pseudo-ref)
+ [Outputs-Abschnitt mit einer Ausgabe, die auf einer Funktion, einem literalen String, einer Referenz und einem Pseudoparameter basiert](#scenario-output-with-complex-spec)
+ [Vorlagenformatversion](#scenario-format-version)
+ [AWS Tags Eigenschaft](#scenario-format-aws-tag)

## Base64 encoded UserData property
<a name="scenario-userdata-base64"></a>

Dieses Beispiel zeigt den Aufbau einer Eigenschaft `UserData` unter Verwendung der Funktionen `Fn::Base64` und `Fn::Join` . Die Referenzen `MyValue` und `MyName` sind Parameter, die im Abschnitt `Parameters` der Vorlage definiert werden müssen. Die Literalzeichenfolge `Hello World` ist einfach ein weiterer Wert, der in diesem Beispiel als Teil der `UserData`-Eigenschaft übergeben wird.

### JSON
<a name="quickref-general-example-1.json"></a>

```
1. "UserData" : {
2.     "Fn::Base64" : {
3.         "Fn::Join" : [ ",", [
4.             { "Ref" : "MyValue" },
5.             { "Ref" : "MyName" },
6.             "Hello World" ] ]
7.     }
8. }
```

### YAML
<a name="quickref-general-example-1.yaml"></a>

```
1. UserData:
2.   Fn::Base64: !Sub |
3.      Ref: MyValue
4.      Ref: MyName
5.      Hello World
```

## Base64 encoded UserData property with AccessKey and SecretKey
<a name="scenario-userdata-base64-with-keys"></a>

Dieses Beispiel zeigt den Aufbau einer Eigenschaft `UserData` unter Verwendung der Funktionen `Fn::Base64` und `Fn::Join` . Sie enthält die `AccessKey`- und `SecretKey`-Informationen. Die Referenzen `AccessKey` und `SecretKey` sind Parameter, die im Abschnitt „Parameters“ der Vorlage definiert werden müssen.

### JSON
<a name="quickref-general-example-2.json"></a>

```
1. "UserData" : {
2.     "Fn::Base64" : {
3.         "Fn::Join" : [ "", [
4.             "ACCESS_KEY=", { "Ref" : "AccessKey" },
5.             "SECRET_KEY=", { "Ref" : "SecretKey" } ]
6.         ]
7.     }
8. }
```

### YAML
<a name="quickref-general-example-2.yaml"></a>

```
1. UserData:
2.   Fn::Base64: !Sub |
3.      ACCESS_KEY=${AccessKey}
4.      SECRET_KEY=${SecretKey}
```

## Parameters-Abschnitt mit einem literalen String-Parameter
<a name="scenario-one-string-parameter"></a>

Das folgende Beispiel beschreibt eine gültige Deklaration für den Abschnitt „Parameters“, in welcher ein einzelner Parameter vom Typ `String` deklariert wird.

### JSON
<a name="quickref-general-example-3.json"></a>

```
1. "Parameters" : {
2.     "UserName" : {
3.         "Type" : "String",
4.         "Default" : "nonadmin",
5.         "Description" : "Assume a vanilla user if no command-line spec provided"
6.     }
7. }
```

### YAML
<a name="quickref-general-example-3.yaml"></a>

```
1. Parameters:
2.   UserName:
3.     Type: String
4.     Default: nonadmin
5.     Description: Assume a vanilla user if no command-line spec provided
```

## Parameters-Abschnitt mit String-Parameter mit Beschränkung auf reguläre Ausdrücke
<a name="scenario-constraint-string-parameter"></a>

Das folgende Beispiel beschreibt eine gültige Deklaration für den Abschnitt „Parameters“, in welcher ein einzelner Parameter vom Typ `String` deklariert wird. Der Parameter `AdminUserAccount` hat den Standardwert `admin`. Der Parameterwert muss eine Mindestlänge von 1 und eine maximale Länge von 16 aufweisen und enthält alphabetische Zeichen und Zahlen, aber muss mit einem Buchstaben beginnen.

### JSON
<a name="quickref-general-example-4.json"></a>

```
 1. "Parameters" : {
 2.     "AdminUserAccount": {
 3.       "Default": "admin",
 4.       "NoEcho": "true",
 5.       "Description" : "The admin account user name",
 6.       "Type": "String",
 7.       "MinLength": "1",
 8.       "MaxLength": "16",
 9.       "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*"
10.     }
11. }
```

### YAML
<a name="quickref-general-example-4.yaml"></a>

```
1. Parameters:
2.   AdminUserAccount:
3.     Default: admin
4.     NoEcho: true
5.     Description: The admin account user name
6.     Type: String
7.     MinLength: 1
8.     MaxLength: 16
9.     AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*'
```

## Parameters-Abschnitt mit Zahlenparameter mit MinValue und MaxValue-Beschränkungen
<a name="scenario-one-number-min-parameter"></a>

Das folgende Beispiel beschreibt eine gültige Deklaration für den Abschnitt „Parameters“, in welcher ein einzelner Parameter vom Typ `Number` deklariert wird. Der Parameter `WebServerPort` hat einen Standardwert von 80, einen Mindestwert von 1 und einen Höchstwert von 65535.

### JSON
<a name="quickref-general-example-5.json"></a>

```
1. "Parameters" : {
2.     "WebServerPort": {
3.       "Default": "80",
4.       "Description" : "TCP/IP port for the web server",
5.       "Type": "Number",
6.       "MinValue": "1",
7.       "MaxValue": "65535"
8.     }
9. }
```

### YAML
<a name="quickref-general-example-5.yaml"></a>

```
1. Parameters:
2.   WebServerPort:
3.     Default: 80
4.     Description: TCP/IP port for the web server
5.     Type: Number
6.     MinValue: 1
7.     MaxValue: 65535
```

## ParametersAbschnitt mit Zahlenparameter mit AllowedValues Einschränkung
<a name="scenario-one-number-parameter"></a>

Das folgende Beispiel beschreibt eine gültige Deklaration für den Abschnitt „Parameters“, in welcher ein einzelner Parameter vom Typ `Number` deklariert wird. Der Parameter `WebServerPort` hat den Standardwert 80 und erlaubt nur Werte zwischen 80 und 8888.

### JSON
<a name="quickref-general-example-6.json"></a>

```
1. "Parameters" : {
2.     "WebServerPortLimited": {
3.       "Default": "80",
4.       "Description" : "TCP/IP port for the web server",
5.       "Type": "Number",
6.       "AllowedValues" : ["80", "8888"]
7.     }
8. }
```

### YAML
<a name="quickref-general-example-6.yaml"></a>

```
1. Parameters:
2.   WebServerPortLimited:
3.     Default: 80
4.     Description: TCP/IP port for the web server
5.     Type: Number
6.     AllowedValues:
7.     - 80
8.     - 8888
```

## Parameters-Abschnitt mit einem literalen CommaDelimitedList-Parameter
<a name="scenario-one-list-parameter"></a>

Das folgende Beispiel zeigt eine gültige `Parameters`-Abschnittsdeklaration, in der ein einzelner `CommaDelimitedList`-Typ-Parameter deklariert ist. Die Eigenschaft `NoEcho` wird auf `TRUE`gesetzt, wodurch ihr Wert in der **describe-stacks**-Ausgabe mit Sternchen (\$1\$1\$1\$1\$1) maskiert wird, mit Ausnahme der Informationen, die an den unten angegebenen Stellen gespeichert sind.

**Wichtig**  
Durch die Verwendung des `NoEcho`-Attributs werden keine Informationen maskiert, die im Folgenden gespeichert sind:  
Der `Metadata` Vorlagenbereich. CloudFormation transformiert, modifiziert oder redigiert keine Informationen, die Sie in den `Metadata` Abschnitt aufnehmen. Weitere Informationen finden Sie unter [Metadaten](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html).
Der `Outputs`-Vorlagenabschnitt. Weitere Informationen finden Sie unter [Ausgaben](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html):
Das `Metadata`-Attribut einer Ressourcendefinition. Weitere Informationen finden Sie unter [`Metadata`-Attribut](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).
Es wird dringend empfohlen, diese Mechanismen nicht zu verwenden, um vertrauliche Informationen wie Passwörter oder Geheimnisse einzugeben.

**Wichtig**  
Anstatt vertrauliche Informationen direkt in Ihre CloudFormation Vorlagen einzubetten, empfehlen wir Ihnen, dynamische Parameter in der Stack-Vorlage zu verwenden, um auf vertrauliche Informationen zu verweisen, die außerhalb von gespeichert und verwaltet werden CloudFormation, z. B. im AWS Systems Manager Parameterspeicher oder. AWS Secrets Manager  
Weitere Informationen finden Sie in den bewährten Methoden zu [Keine Anmeldeinformationen in Ihre Vorlagen einbetten](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/security-best-practices.html#creds).

### JSON
<a name="quickref-general-example-7.json"></a>

```
1. "Parameters" : {
2.     "UserRoles" : {
3.         "Type" : "CommaDelimitedList",
4.         "Default" : "guest,newhire",
5.         "NoEcho" : "TRUE"
6.     }
7. }
```

### YAML
<a name="quickref-general-example-7.yaml"></a>

```
1. Parameters:
2.   UserRoles:
3.     Type: CommaDelimitedList
4.     Default: "guest,newhire"
5.     NoEcho: true
```

## Parameters-Abschnitt mit Parameterwert basierend auf Pseudoparameter
<a name="scenario-one-pseudo-parameter"></a>

Das folgende Beispiel zeigt Befehle in den EC2-Benutzerdaten, welche die Pseudoparameter `AWS::StackName` und `AWS::Region` verwenden. Weitere Informationen zu Pseudoparametern finden Sie unter [AWS Werte mithilfe von Pseudo-Parametern abrufen](pseudo-parameter-reference.md).

### JSON
<a name="quickref-general-example-10.json"></a>

```
 1.           "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
 2.              "#!/bin/bash -xe\n",
 3.              "yum install -y aws-cfn-bootstrap\n",
 4. 
 5.              "/opt/aws/bin/cfn-init -v ",
 6.              "         --stack ", { "Ref" : "AWS::StackName" },
 7.              "         --resource LaunchConfig ",
 8.              "         --region ", { "Ref" : "AWS::Region" }, "\n",
 9. 
10.              "/opt/aws/bin/cfn-signal -e $? ",
11.              "         --stack ", { "Ref" : "AWS::StackName" },
12.              "         --resource WebServerGroup ",
13.              "         --region ", { "Ref" : "AWS::Region" }, "\n"
14.         ]]}}
15.       }
```

### YAML
<a name="quickref-general-example-10.yaml"></a>

```
1. UserData:
2.   Fn::Base64: !Sub |
3.      #!/bin/bash -xe
4.      yum update -y aws-cfn-bootstrap
5.      /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfig --region ${AWS::Region}
6.      /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}
```

## AbschnittMapping mit drei Zuordnungen
<a name="scenario-mapping-with-four-maps"></a>

Das folgende Beispiel zeigt eine gültige `Mapping`-Abschnittserklärung, die drei Zuordnungen enthält. Die Zuweisung liefert bei Übereinstimmung mit dem Zuweisungsschlüssel `Stop`, `SlowDown` oder `Go` die RGB-Werte, die dem entsprechenden `RGBColor`-Attribut zugewiesen wurden.

### JSON
<a name="quickref-general-example-11.json"></a>

```
 1. "Mappings" : {
 2.     "LightColor" : {
 3.         "Stop" : {
 4.             "Description" : "red",
 5.             "RGBColor" : "RED 255 GREEN 0 BLUE 0"
 6.         },
 7.         "SlowDown" : {
 8.             "Description" : "yellow",
 9.             "RGBColor" : "RED 255 GREEN 255 BLUE 0"
10.         },
11.         "Go" : {
12.             "Description" : "green",
13.             "RGBColor" : "RED 0 GREEN 128 BLUE 0"
14.         }
15.     }
16. }
```

### YAML
<a name="quickref-general-example-11.yaml"></a>

```
 1. Mappings:
 2.   LightColor:
 3.     Stop:
 4.       Description: red
 5.       RGBColor: "RED 255 GREEN 0 BLUE 0"
 6.     SlowDown:
 7.       Description: yellow
 8.       RGBColor: "RED 255 GREEN 255 BLUE 0"
 9.     Go:
10.       Description: green
11.       RGBColor: "RED 0 GREEN 128 BLUE 0"
```

## Description basierend auf einer wörtlichen Zeichenkette
<a name="scenario-description-from-literal-string"></a>

Das folgende Beispiel zeigt eine gültige `Description`-Abschnittsdeklaration, bei der der Wert auf einer literalen Zeichenkette basiert. Dieses Codefragment kann für Vorlagen, Parameter, Ressourcen, Eigenschaften oder Ausgaben verwendet werden.

### JSON
<a name="quickref-general-example-8.json"></a>

```
1. "Description" : "Replace this value"
```

### YAML
<a name="quickref-general-example-8.yaml"></a>

```
1. Description: "Replace this value"
```

## Outputs-Abschnitt mit einer literalen Stringausgabe
<a name="scenario-output-with-literal-string"></a>

Dieses Beispiel zeigt eine Ausgabenzuweisung basierend auf einer Literalzeichenfolge.

### JSON
<a name="quickref-general-example-12.json"></a>

```
1. "Outputs" : {
2.     "MyPhone" : {
3.         "Value" : "Please call 555-5555",
4.         "Description" : "A random message for aws cloudformation describe-stacks"
5.     }
6. }
```

### YAML
<a name="quickref-general-example-12.yaml"></a>

```
1. Outputs:
2.   MyPhone:
3.     Value: Please call 555-5555
4.     Description: A random message for aws cloudformation describe-stacks
```

## Outputs-Abschnitt mit einer Ressourcenreferenz und einer Pseudoreferenzausgabe
<a name="scenario-output-with-ref-and-pseudo-ref"></a>

Dieses Beispiel zeigt einen `Outputs`-Abschnitt mit zwei Ausgangszuweisungen. Eine basiert auf einer Ressource und die andere auf einer Pseudoreferenz.

### JSON
<a name="quickref-general-example-13.json"></a>

```
1. "Outputs" : {
2.    "SNSTopic" : { "Value" : { "Ref" : "MyNotificationTopic" } },
3.    "StackName" : { "Value" : { "Ref" : "AWS::StackName" } }
4. }
```

### YAML
<a name="quickref-general-example-13.yaml"></a>

```
1. Outputs:
2.   SNSTopic:
3.     Value: !Ref MyNotificationTopic
4.   StackName:
5.     Value: !Ref AWS::StackName
```

## Outputs-Abschnitt mit einer Ausgabe, die auf einer Funktion, einem literalen String, einer Referenz und einem Pseudoparameter basiert
<a name="scenario-output-with-complex-spec"></a>

Dieses Beispiel zeigt einen Outputs-Abschnitt mit einer Ausgabenzuweisung. Die Join-Funktion wird verwendet, um den Wert zu verketten, wobei ein Prozentzeichen als Begrenzungszeichen verwendet wird.

### JSON
<a name="quickref-general-example-14.json"></a>

```
1. "Outputs" : {
2.     "MyOutput" : {
3.         "Value" : { "Fn::Join" :
4.             [ "%", [ "A-string", {"Ref" : "AWS::StackName" } ] ]
5.         }
6.     }
7. }
```

### YAML
<a name="quickref-general-example-14.yaml"></a>

```
1. Outputs:
2.   MyOutput:
3.     Value: !Join [ %, [ 'A-string', !Ref 'AWS::StackName' ]]
```

## Vorlagenformatversion
<a name="scenario-format-version"></a>

Der folgende Ausschnitt zeigt eine gültige `AWSTemplateFormatVersion`-Abschnittsdeklaration.

### JSON
<a name="quickref-general-example-9.json"></a>

```
1. "AWSTemplateFormatVersion" : "2010-09-09"
```

### YAML
<a name="quickref-general-example-9.yaml"></a>

```
1. AWSTemplateFormatVersion: '2010-09-09'
```

## AWS Tags Eigenschaft
<a name="scenario-format-aws-tag"></a>

Dieses Beispiel zeigt eine AWS `Tags` Eigenschaft. Sie würden diese Eigenschaft im Abschnitt „Properties” einer Ressource angeben. Wenn die Ressource erstellt wird, wird sie mit den Tags markiert, die Sie deklarieren.

### JSON
<a name="quickref-general-example-15.json"></a>

```
 1. "Tags" : [
 2.       {
 3.         "Key" : "keyname1",
 4.         "Value" : "value1"
 5.       },
 6.       {
 7.         "Key" : "keyname2",
 8.         "Value" : "value2"
 9.       }
10.     ]
```

### YAML
<a name="quickref-general-example-15.yaml"></a>

```
1. Tags: 
2.   - 
3.     Key: "keyname1"
4.     Value: "value1"
5.   - 
6.     Key: "keyname2"
7.     Value: "value2"
```

# CloudFormation Vorlagenausschnitte für automatische Skalierung
<a name="quickref-autoscaling"></a>

Mit Amazon EC2 Auto Scaling können Sie EC2 Amazon-Instances automatisch skalieren, entweder mit Skalierungsrichtlinien oder mit geplanter Skalierung. Auto Scaling-Gruppen sind Sammlungen von EC2 Amazon-Instances, die Auto Scaling und Flottenmanagementfunktionen wie Skalierungsrichtlinien, geplante Aktionen, Integritätsprüfungen, Lifecycle-Hooks und Load Balancing ermöglichen. 

Application Auto Scaling ermöglicht die automatische Skalierung verschiedener Ressourcen außerhalb von Amazon EC2, entweder mit Skalierungsrichtlinien oder mit geplanter Skalierung.

Mithilfe von CloudFormation Vorlagen können Sie Auto Scaling Scaling-Gruppen, Skalierungsrichtlinien, geplante Aktionen und andere Auto Scaling-Ressourcen als Teil Ihrer Infrastruktur erstellen und konfigurieren. Vorlagen erleichtern die Verwaltung und Automatisierung der Bereitstellung von automatisch skalierenden Ressourcen auf wiederholbare und konsistente Weise. 

Die folgenden Beispielvorlagen beschreiben CloudFormation Ressourcen oder Komponenten für Amazon EC2 Auto Scaling und Application Auto Scaling. Diese Ausschnitte sind für die Integration in eine Vorlage gedacht, nicht für eine unabhängige Ausführung.

**Topics**
+ [Konfigurieren Sie Amazon EC2 Auto Scaling-Ressourcen](quickref-ec2-auto-scaling.md)
+ [Konfigurieren Sie die Ressourcen für die automatische Skalierung von Anwendungen](quickref-application-auto-scaling.md)

# Konfigurieren Sie Amazon EC2 Auto Scaling Scaling-Ressourcen mit CloudFormation
<a name="quickref-ec2-auto-scaling"></a>

Die folgenden Beispiele zeigen verschiedene Snippets, die in Vorlagen für die Verwendung mit Amazon EC2 Auto Scaling aufgenommen werden können.

**Topics**
+ [Erstellen Sie eine Auto Scaling-Gruppe für eine einzelne Instance](#scenario-single-instance-as-group)
+ [Erstellen Sie eine Auto Scaling-Gruppe mit einem angeschlossenen Load Balancer](#scenario-as-group)
+ [Erstellen Sie eine Auto-Scaling-Gruppe mit Benachrichtigungen](#scenario-as-notification)
+ [Erstellen Sie eine Autoskalierungsgruppe, die ein `CreationPolicy` und ein `UpdatePolicy`verwendet.](#scenario-as-updatepolicy)
+ [Erstellen Sie eine Skalierungsrichtlinie](#scenario-step-scaling-policy)
+ [Gemischte Instances-Gruppen](#scenario-mixed-instances-group-template-examples)
+ [Beispiele für Launch-Konfigurationen](#scenario-launch-config-template-examples)

## Erstellen Sie eine Auto Scaling-Gruppe für eine einzelne Instance
<a name="scenario-single-instance-as-group"></a>

Dieses Beispiel zeigt eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html)-Ressource mit einer einzelnen Instance, um Ihnen den Einstieg zu erleichtern. Die `VPCZoneIdentifier`-Eigenschaft der Auto-Scaling-Gruppe gibt eine Liste vorhandener Subnetze in drei verschiedenen Availability Zones an. Sie müssen das entsprechende Subnetz IDs aus Ihrem Konto angeben, bevor Sie Ihren Stack erstellen. Die Eigenschaft `LaunchTemplate` verweist auf eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)-Ressource mit dem logischen Namen `myLaunchTemplate`, die an anderer Stelle in Ihrer Vorlage definiert ist.

**Anmerkung**  
Beispiele für Startvorlagen finden Sie unter [Erstellen Sie Startvorlagen mit CloudFormation](quickref-ec2-launch-templates.md) im Abschnitt Amazon EC2 Snippets und im Abschnitt [Beispiele](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html#aws-resource-ec2-launchtemplate--examples) in der `AWS::EC2::LaunchTemplate` Ressource.

### JSON
<a name="quickref-autoscaling-example-1.json"></a>

```
 1. "myASG" : {
 2.    "Type" : "AWS::AutoScaling::AutoScalingGroup",
 3.    "Properties" : {
 4.       "VPCZoneIdentifier" : [ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ],
 5.       "LaunchTemplate" : {
 6.         "LaunchTemplateId" : {
 7.           "Ref" : "myLaunchTemplate"
 8.         },
 9.         "Version" : {
10.           "Fn::GetAtt" : [
11.             "myLaunchTemplate",
12.             "LatestVersionNumber"
13.           ]
14.         }
15.       },
16.       "MaxSize" : "1",
17.       "MinSize" : "1"
18.    }
19. }
```

### YAML
<a name="quickref-autoscaling-example-1.yaml"></a>

```
 1. myASG:
 2.   Type: AWS::AutoScaling::AutoScalingGroup
 3.   Properties:
 4.     VPCZoneIdentifier:
 5.       - subnetIdAz1
 6.       - subnetIdAz2
 7.       - subnetIdAz3
 8.     LaunchTemplate:
 9.       LaunchTemplateId: !Ref myLaunchTemplate
10.       Version: !GetAtt myLaunchTemplate.LatestVersionNumber
11.     MaxSize: '1'
12.     MinSize: '1'
```

## Erstellen Sie eine Auto Scaling-Gruppe mit einem angeschlossenen Load Balancer
<a name="scenario-as-group"></a>

Dieses Beispiel zeigt eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html)-Ressource für den Lastausgleich über mehrere Server. Es gibt die logischen Namen von AWS Ressourcen an, die an anderer Stelle in derselben Vorlage deklariert wurden.

1. Die Eigenschaft `VPCZoneIdentifier` gibt die logischen Namen von zwei [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnet.html)-Ressourcen an, in denen die EC2-Instances der Auto Scaling-Gruppe erstellt werden: `myPublicSubnet1` und `myPublicSubnet2`.

1. Die Eigenschaft `LaunchTemplate` gibt eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html) Ressource mit dem logischen Namen `myLaunchTemplate`an.

1. Die `TargetGroupARNs`-Eigenschaft listet die Zielgruppen für einen Application Load Balancer oder einen Network Load Balancer auf, der verwendet wird, um den Datenverkehr an die Auto-Scaling-Gruppe weiterzuleiten. In diesem Beispiel wird eine Zielgruppe angegeben, eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html) Ressource mit dem logischen Namen `myTargetGroup`.

### JSON
<a name="quickref-autoscaling-example-2.json"></a>

```
 1. "myServerGroup" : {
 2.    "Type" : "AWS::AutoScaling::AutoScalingGroup",
 3.    "Properties" : {
 4.       "VPCZoneIdentifier" : [ { "Ref" : "myPublicSubnet1" }, { "Ref" : "myPublicSubnet2" } ],
 5.       "LaunchTemplate" : {
 6.         "LaunchTemplateId" : {
 7.           "Ref" : "myLaunchTemplate"
 8.         },
 9.         "Version" : {
10.           "Fn::GetAtt" : [
11.             "myLaunchTemplate",
12.             "LatestVersionNumber"
13.           ]
14.         }
15.       },
16.       "MaxSize" : "5",
17.       "MinSize" : "1",
18.       "TargetGroupARNs" : [ { "Ref" : "myTargetGroup" } ]
19.    }
20. }
```

### YAML
<a name="quickref-autoscaling-example-2.yaml"></a>

```
 1. myServerGroup:
 2.   Type: AWS::AutoScaling::AutoScalingGroup
 3.   Properties:
 4.     VPCZoneIdentifier:
 5.       - !Ref myPublicSubnet1
 6.       - !Ref myPublicSubnet2
 7.     LaunchTemplate:
 8.       LaunchTemplateId: !Ref myLaunchTemplate
 9.       Version: !GetAtt myLaunchTemplate.LatestVersionNumber
10.     MaxSize: '5'
11.     MinSize: '1'
12.     TargetGroupARNs:
13.       - !Ref myTargetGroup
```

### Weitere Informationen finden Sie auch unter
<a name="scenario-as-group-see-also"></a>

Ein detailliertes Beispiel, in dem eine Auto-Scaling-Gruppe mit einer Skalierungsrichtlinie zur Zielverfolgung-basierend auf der vordefinierten `ALBRequestCountPerTarget`-Metrik für Ihren Application Load Balancer erstellt wird, finden Sie im Abschnitt [Beispiele](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-scalingpolicy.html#aws-resource-autoscaling-scalingpolicy--examples) in der `AWS::AutoScaling::ScalingPolicy`-Ressource.

## Erstellen Sie eine Auto-Scaling-Gruppe mit Benachrichtigungen
<a name="scenario-as-notification"></a>

Dieses Beispiel zeigt eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html)-Ressource, die Amazon SNS-Benachrichtigungen sendet, wenn die angegebenen Ereignisse eintreten. Die `NotificationConfigurations` Eigenschaft gibt das SNS-Thema an, an das eine Benachrichtigung CloudFormation gesendet wird, und die Ereignisse, die CloudFormation dazu führen, dass Benachrichtigungen gesendet werden. Wenn die von angegebenen Ereignisse `NotificationTypes` eintreten, CloudFormation wird eine Benachrichtigung an das von angegebene SNS-Thema gesendet. `TopicARN` Wenn Sie den Stack starten, CloudFormation wird eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-subscription.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-subscription.html)Ressource (`snsTopicForAutoScalingGroup`) erstellt, die in derselben Vorlage deklariert ist.

Die `VPCZoneIdentifier`-Eigenschaft der Auto-Scaling-Gruppe gibt eine Liste vorhandener Subnetze in drei verschiedenen Availability Zones an. Sie müssen das entsprechende Subnetz IDs aus Ihrem Konto angeben, bevor Sie Ihren Stack erstellen. Die Eigenschaft `LaunchTemplate` verweist auf den logischen Namen einer [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)-Ressource, die an anderer Stelle in derselben Vorlage deklariert ist.

### JSON
<a name="quickref-autoscaling-example-3.json"></a>

```
 1. "myASG" : {
 2.   "Type" : "AWS::AutoScaling::AutoScalingGroup",
 3.   "DependsOn": [
 4.     "snsTopicForAutoScalingGroup"
 5.   ],
 6.   "Properties" : {
 7.     "VPCZoneIdentifier" : [ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ],
 8.     "LaunchTemplate" : {
 9.       "LaunchTemplateId" : {
10.         "Ref" : "logicalName"
11.       },
12.       "Version" : {
13.         "Fn::GetAtt" : [
14.           "logicalName",
15.           "LatestVersionNumber"
16.         ]
17.       }
18.     },
19.     "MaxSize" : "5",
20.     "MinSize" : "1",
21.     "NotificationConfigurations" : [
22.       {
23.         "TopicARN" : { "Ref" : "snsTopicForAutoScalingGroup" },
24.         "NotificationTypes" : [
25.           "autoscaling:EC2_INSTANCE_LAUNCH",
26.           "autoscaling:EC2_INSTANCE_LAUNCH_ERROR",
27.           "autoscaling:EC2_INSTANCE_TERMINATE",
28.           "autoscaling:EC2_INSTANCE_TERMINATE_ERROR",
29.           "autoscaling:TEST_NOTIFICATION"
30.         ]
31.       }
32.     ]
33.   }
34. }
```

### YAML
<a name="quickref-autoscaling-example-3.yaml"></a>

```
 1. myASG:
 2.   Type: AWS::AutoScaling::AutoScalingGroup
 3.   DependsOn:
 4.     - snsTopicForAutoScalingGroup
 5.   Properties:
 6.     VPCZoneIdentifier:
 7.       - subnetIdAz1
 8.       - subnetIdAz2
 9.       - subnetIdAz3
10.     LaunchTemplate:
11.       LaunchTemplateId: !Ref logicalName
12.       Version: !GetAtt logicalName.LatestVersionNumber
13.     MaxSize: '5'
14.     MinSize: '1'
15.     NotificationConfigurations:
16.       - TopicARN: !Ref snsTopicForAutoScalingGroup
17.         NotificationTypes:
18.           - autoscaling:EC2_INSTANCE_LAUNCH
19.           - autoscaling:EC2_INSTANCE_LAUNCH_ERROR
20.           - autoscaling:EC2_INSTANCE_TERMINATE
21.           - autoscaling:EC2_INSTANCE_TERMINATE_ERROR
22.           - autoscaling:TEST_NOTIFICATION
```

## Erstellen Sie eine Autoskalierungsgruppe, die ein `CreationPolicy` und ein `UpdatePolicy`verwendet.
<a name="scenario-as-updatepolicy"></a>

Das folgende Beispiel zeigt, wie Sie die Attribute `CreationPolicy` und `UpdatePolicy` zu einer [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html)-Ressource hinzufügen.

Die Richtlinie zur Probenerstellung verhindert, dass die Auto Scaling Scaling-Gruppe `CREATE_COMPLETE` den Status erreicht, bis sie CloudFormation eine `Count` Reihe von Erfolgssignalen erhält, wenn die Gruppe bereit ist. Um zu signalisieren, dass die Auto-Scaling-Gruppe bereit ist, wird ein `cfn-signal`-Hilfsskript, das den Benutzerdaten der Einführungsvorlage hinzugefügt wird (nicht gezeigt), auf den Instances ausgeführt. Wenn die Instances innerhalb des angegebenen Zeitraums kein Signal senden`Timeout`, CloudFormation wird davon ausgegangen, dass die Instanzen nicht erstellt wurden, CloudFormation schlägt die Ressourcenerstellung fehl und der Stack wird zurückgesetzt.

Die Beispielaktualisierungsrichtlinie weist CloudFormation an, mithilfe der `AutoScalingRollingUpdate` Eigenschaft ein fortlaufendes Update durchzuführen. Die fortlaufende Aktualisierung führt Änderungen an der Auto-Scaling-Gruppe in kleinen Stapeln (für dieses Beispiel Instance nach Instance) basierend auf `MaxBatchSize` durch und eine Pausenzeit zwischen Stapeln von Updates auf der Grundlage von `PauseTime`. Das `MinInstancesInService` Attribut gibt die Mindestanzahl von Instances an, die innerhalb der Auto Scaling Scaling-Gruppe in Betrieb sein müssen, während alte Instances CloudFormation aktualisiert werden.

Das `WaitOnResourceSignals`-Attribut ist auf `true` festgelegt. CloudFormation muss von jeder neuen Instance innerhalb der angegebenen `PauseTime` ein Signal erhalten, bevor die Aktualisierung fortgesetzt wird. Während die Stack-Aktualisierung ausgeführt wird, werden die folgenden EC2-Auto Scaling-Prozesse ausgesetzt: `HealthCheck`, `ReplaceUnhealthy`, `AZRebalance`, `AlarmNotification` und `ScheduledActions`. Hinweis: Unterbrechen Sie die Prozesstypen `Launch`, `Terminate` oder `AddToLoadBalancer` (wenn die Auto-Scaling-Gruppe mit Elastic Load Balancing verwendet wird) nicht, da dies die ordnungsgemäße Funktion der fortlaufenden Aktualisierung verhindern kann.

Die `VPCZoneIdentifier`-Eigenschaft der Auto-Scaling-Gruppe gibt eine Liste vorhandener Subnetze in drei verschiedenen Availability Zones an. Sie müssen das entsprechende Subnetz IDs aus Ihrem Konto angeben, bevor Sie Ihren Stack erstellen. Die Eigenschaft `LaunchTemplate` verweist auf den logischen Namen einer [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)-Ressource, die an anderer Stelle in derselben Vorlage deklariert ist.

Weitere Informationen zu den Attributen `CreationPolicy` und `UpdatePolicy` finden Sie unter [Ressourcenattribut-Referenz](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-product-attribute-reference.html).

### JSON
<a name="quickref-autoscaling-example-4.json"></a>

```
{
  "Resources":{
    "myASG":{
      "CreationPolicy":{
        "ResourceSignal":{
          "Count":"3",
          "Timeout":"PT15M"
        }
      },
      "UpdatePolicy":{
        "AutoScalingRollingUpdate":{
          "MinInstancesInService":"3",
          "MaxBatchSize":"1",
          "PauseTime":"PT12M5S",
          "WaitOnResourceSignals":"true",
          "SuspendProcesses":[
            "HealthCheck",
            "ReplaceUnhealthy",
            "AZRebalance",
            "AlarmNotification",
            "ScheduledActions",
            "InstanceRefresh"
          ]
        }
      },
      "Type":"AWS::AutoScaling::AutoScalingGroup",
      "Properties":{
        "VPCZoneIdentifier":[ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ],
        "LaunchTemplate":{
          "LaunchTemplateId":{
            "Ref":"logicalName"
          },
          "Version":{
            "Fn::GetAtt":[
              "logicalName",
              "LatestVersionNumber"
            ]
          }
        },
        "MaxSize":"5",
        "MinSize":"3"
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-4.yaml"></a>

```
---
Resources:
  myASG:
    CreationPolicy:
      ResourceSignal:
        Count: '3'
        Timeout: PT15M
    UpdatePolicy:
      AutoScalingRollingUpdate:
        MinInstancesInService: '3'
        MaxBatchSize: '1'
        PauseTime: PT12M5S
        WaitOnResourceSignals: true
        SuspendProcesses:
          - HealthCheck
          - ReplaceUnhealthy
          - AZRebalance
          - AlarmNotification
          - ScheduledActions
          - InstanceRefresh
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      VPCZoneIdentifier:
        - subnetIdAz1
        - subnetIdAz2
        - subnetIdAz3
      LaunchTemplate:
        LaunchTemplateId: !Ref logicalName
        Version: !GetAtt logicalName.LatestVersionNumber
      MaxSize: '5'
      MinSize: '3'
```

## Erstellen Sie eine Skalierungsrichtlinie
<a name="scenario-step-scaling-policy"></a>

Dieses Beispiel zeigt eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-scalingpolicy.html)-Ressource, die die Auto Scaling-Gruppe mithilfe einer stufenweisen Skalierungsrichtlinie skaliert. Die Eigenschaft `AdjustmentType` ist auf `ChangeInCapacity` festgelegt. Das bedeutet, dass der Parameter `ScalingAdjustment` angibt, wie viele Instances hinzugefügt werden sollen (bei positivem Wert für `ScalingAdjustment`) oder gelöscht werden sollen (bei negativem Wert). In diesem Beispiel wird `ScalingAdjustment` auf 1 festgelegt. Wenn der Schwellenwert für den Alarm überschritten wird, wird die Anzahl der EC2-Instances in der Gruppe also von der Richtlinie um 1 erhöht.

Die Ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudwatch-alarm.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudwatch-alarm.html) `CPUAlarmHigh` legt die Skalierungsrichtlinie `ASGScalingPolicyHigh` als Aktion fest, die ausgeführt werden soll, wenn sich der Alarm im Zustand ALARM befindet (`AlarmActions`). Die Eigenschaft `Dimensions` verweist auf den logischen Namen einer [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html)-Ressource, die an anderer Stelle in derselben Vorlage deklariert ist.

### JSON
<a name="quickref-autoscaling-example-5.json"></a>

```
 1. {
 2.   "Resources":{
 3.     "ASGScalingPolicyHigh":{
 4.       "Type":"AWS::AutoScaling::ScalingPolicy",
 5.       "Properties":{
 6.         "AutoScalingGroupName":{ "Ref":"logicalName" },
 7.         "PolicyType":"StepScaling",
 8.         "AdjustmentType":"ChangeInCapacity",
 9.         "StepAdjustments":[
10.           {
11.             "MetricIntervalLowerBound":0,
12.             "ScalingAdjustment":1
13.           }
14.         ]
15.       }
16.     },
17.     "CPUAlarmHigh":{
18.       "Type":"AWS::CloudWatch::Alarm",
19.       "Properties":{
20.         "EvaluationPeriods":"2",
21.         "Statistic":"Average",
22.         "Threshold":"90",
23.         "AlarmDescription":"Scale out if CPU > 90% for 2 minutes",
24.         "Period":"60",
25.         "AlarmActions":[ { "Ref":"ASGScalingPolicyHigh" } ],
26.         "Namespace":"AWS/EC2",
27.         "Dimensions":[
28.           {
29.             "Name":"AutoScalingGroupName",
30.             "Value":{ "Ref":"logicalName" }
31.           }
32.         ],
33.         "ComparisonOperator":"GreaterThanThreshold",
34.         "MetricName":"CPUUtilization"
35.       }
36.     }
37.   }
38. }
```

### YAML
<a name="quickref-autoscaling-example-5.yaml"></a>

```
 1. ---
 2. Resources:
 3.   ASGScalingPolicyHigh:
 4.     Type: AWS::AutoScaling::ScalingPolicy
 5.     Properties:
 6.       AutoScalingGroupName: !Ref logicalName
 7.       PolicyType: StepScaling
 8.       AdjustmentType: ChangeInCapacity
 9.       StepAdjustments: 
10.         - MetricIntervalLowerBound: 0
11.           ScalingAdjustment: 1
12.   CPUAlarmHigh:
13.     Type: AWS::CloudWatch::Alarm
14.     Properties:
15.       EvaluationPeriods: 2
16.       Statistic: Average
17.       Threshold: 90
18.       AlarmDescription: 'Scale out if CPU > 90% for 2 minutes'
19.       Period: 60
20.       AlarmActions:
21.         - !Ref ASGScalingPolicyHigh
22.       Namespace: AWS/EC2
23.       Dimensions:
24.         - Name: AutoScalingGroupName
25.           Value:
26.             !Ref logicalName
27.       ComparisonOperator: GreaterThanThreshold
28.       MetricName: CPUUtilization
```

### Weitere Informationen finden Sie auch unter
<a name="scenario-as-policy-see-also"></a>

Weitere Beispielvorlagen für Skalierungsrichtlinien finden Sie im Abschnitt [Beispiele](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-scalingpolicy.html#aws-resource-autoscaling-scalingpolicy--examples) in der `AWS::AutoScaling::ScalingPolicy`-Ressource.

## Gemischte Instances-Gruppen
<a name="scenario-mixed-instances-group-template-examples"></a>

### Erstellen einer Auto-Scaling-Gruppe mit attributbasierter Auswahl des Instance-Typs
<a name="scenario-mixed-instances-group-instance-requirements"></a>

Dieses Beispiel zeigt eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html)-Ressource, die die Informationen zum Starten einer gemischten Instancegruppe mit attributbasierter Instancetypauswahl enthält. Sie geben die Mindest- und Höchstwerte für die `VCpuCount`-Eigenschaft und der Mindestwert für die `MemoryMiB`-Eigenschaft ein. Alle Instance-Typen, die von der Auto-Scaling-Gruppe verwendet werden, müssen mit Ihren erforderlichen Instance-Attributen übereinstimmen. 

Die `VPCZoneIdentifier`-Eigenschaft der Auto-Scaling-Gruppe gibt eine Liste vorhandener Subnetze in drei verschiedenen Availability Zones an. Sie müssen das entsprechende Subnetz IDs aus Ihrem Konto angeben, bevor Sie Ihren Stack erstellen. Die Eigenschaft `LaunchTemplate` verweist auf den logischen Namen einer [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)-Ressource, die an anderer Stelle in derselben Vorlage deklariert ist.

#### JSON
<a name="quickref-mixed-instances-group-example-2.json"></a>

```
 1. {
 2.   "Resources":{
 3.     "myASG":{
 4.       "Type":"AWS::AutoScaling::AutoScalingGroup",
 5.       "Properties":{
 6.         "VPCZoneIdentifier":[
 7.           "subnetIdAz1",
 8.           "subnetIdAz2",
 9.           "subnetIdAz3"
10.         ],
11.         "MixedInstancesPolicy":{
12.           "LaunchTemplate":{
13.             "LaunchTemplateSpecification":{
14.               "LaunchTemplateId":{
15.                 "Ref":"logicalName"
16.               },
17.               "Version":{
18.                 "Fn::GetAtt":[
19.                   "logicalName",
20.                   "LatestVersionNumber"
21.                 ]
22.               }
23.             },
24.             "Overrides":[
25.               {
26.                 "InstanceRequirements":{
27.                   "VCpuCount":{
28.                     "Min":2,
29.                     "Max":4
30.                   },
31.                   "MemoryMiB":{
32.                     "Min":2048
33.                   }
34.                 }
35.               }
36.             ]
37.           }
38.         },
39.         "MaxSize":"5",
40.         "MinSize":"1"
41.       }
42.     }
43.   }
44. }
```

#### YAML
<a name="quickref-mixed-instances-group-example-1.yaml"></a>

```
 1. ---
 2. Resources:
 3.   myASG:
 4.     Type: AWS::AutoScaling::AutoScalingGroup
 5.     Properties:
 6.       VPCZoneIdentifier:
 7.         - subnetIdAz1
 8.         - subnetIdAz2
 9.         - subnetIdAz3
10.       MixedInstancesPolicy:
11.         LaunchTemplate:
12.           LaunchTemplateSpecification:
13.             LaunchTemplateId: !Ref logicalName
14.             Version: !GetAtt logicalName.LatestVersionNumber
15.           Overrides:
16.             - InstanceRequirements:
17.                 VCpuCount:
18.                   Min: 2
19.                   Max: 4
20.                 MemoryMiB:
21.                   Min: 2048
22.       MaxSize: '5'
23.       MinSize: '1'
```

## Beispiele für Launch-Konfigurationen
<a name="scenario-launch-config-template-examples"></a>

### Erstellen einer Startkonfiguration
<a name="scenario-as-launch-config"></a>

Dieses Beispiel zeigt eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-launchconfiguration.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-launchconfiguration.html)-Ressource für eine Auto-Skalierungsgruppe, für die Sie Werte für die Eigenschaften,`ImageId` `InstanceType`und `SecurityGroups` angeben. Die Eigenschaft `SecurityGroups` gibt sowohl den logischen Namen einer [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)-Ressource an, die an anderer Stelle in der Vorlage angegeben ist, als auch eine bestehende EC2-Sicherheitsgruppe namens `myExistingEC2SecurityGroup`.

#### JSON
<a name="quickref-launch-config-example-1.json"></a>

```
1. "mySimpleConfig" : {
2.    "Type" : "AWS::AutoScaling::LaunchConfiguration",
3.    "Properties" : {
4.       "ImageId" : "ami-02354e95b3example",
5.       "InstanceType" : "t3.micro",
6.       "SecurityGroups" : [ { "Ref" : "logicalName" }, "myExistingEC2SecurityGroup" ]
7.    }
8. }
```

#### YAML
<a name="quickref-launch-config-example-1.yaml"></a>

```
1. mySimpleConfig:
2.   Type: AWS::AutoScaling::LaunchConfiguration
3.   Properties:
4.     ImageId: ami-02354e95b3example
5.     InstanceType: t3.micro
6.     SecurityGroups:
7.       - !Ref logicalName
8.       - myExistingEC2SecurityGroup
```

### Erstellen Sie eine Auto Scaling-Gruppe, die eine Startkonfiguration verwendet
<a name="scenario-single-instance-as-group-launch-configuration"></a>

Dieses Beispiel zeigt eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html)-Ressource mit einer einzigen Instance. Die `VPCZoneIdentifier`-Eigenschaft der Auto-Scaling-Gruppe gibt eine Liste vorhandener Subnetze in drei verschiedenen Availability Zones an. Sie müssen das entsprechende Subnetz IDs aus Ihrem Konto angeben, bevor Sie Ihren Stack erstellen. Die Eigenschaft `LaunchConfigurationName` verweist auf eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-launchconfiguration.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-launchconfiguration.html)-Ressource mit dem logischen Namen `mySimpleConfig`, die in Ihrer Vorlage definiert ist.

#### JSON
<a name="quickref-launch-config-example-2.json"></a>

```
1. "myASG" : {
2.    "Type" : "AWS::AutoScaling::AutoScalingGroup",
3.    "Properties" : {
4.       "VPCZoneIdentifier" : [ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ],
5.       "LaunchConfigurationName" : { "Ref" : "mySimpleConfig" },
6.       "MaxSize" : "1",
7.       "MinSize" : "1"
8.    }
9. }
```

#### YAML
<a name="quickref-launch-config-example-2.yaml"></a>

```
 1. myASG:
 2.   Type: AWS::AutoScaling::AutoScalingGroup
 3.   Properties:
 4.     VPCZoneIdentifier:
 5.       - subnetIdAz1
 6.       - subnetIdAz2
 7.       - subnetIdAz3
 8.     LaunchConfigurationName: !Ref mySimpleConfig
 9.     MaxSize: '1'
10.     MinSize: '1'
```

# Konfigurieren Sie Auto Scaling-Ressourcen für Anwendungen mit CloudFormation
<a name="quickref-application-auto-scaling"></a>

Dieser Abschnitt enthält CloudFormation Vorlagenbeispiele für Richtlinien zur Skalierung von Application Auto Scaling und geplante Aktionen für verschiedene AWS Ressourcen.

**Wichtig**  
Wenn ein Snippet für die automatische Skalierung von Anwendungen in der Vorlage enthalten ist, müssen Sie möglicherweise mit dem Attribut `DependsOn` eine Abhängigkeit von der spezifischen skalierbaren Ressource deklarieren, die durch die Vorlage erstellt wird. Dies überschreibt die Standardparallelität und weist CloudFormation darauf hin, Ressourcen in einer bestimmten Reihenfolge zu verwenden. Andernfalls kann die Skalierungskonfiguration angewendet werden, bevor die Ressource vollständig eingerichtet wurde.  
Weitere Informationen finden Sie unter [DependsOn-Attribut](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-dependson.html).

**Topics**
+ [Erstellen Sie eine Skalierungsrichtlinie für eine AppStream Flotte](#w2aac11c41c15c19b9)
+ [Erstellen Sie eine Skalierungsrichtlinie für einen Aurora DB-Cluster](#w2aac11c41c15c19c11)
+ [Erstellen einer Skalierungsrichtlinie für eine DynamoDB-Tabelle](#w2aac11c41c15c19c13)
+ [Erstellen Sie eine Skalierungsrichtlinie für einen Amazon ECS-Service (Metriken: durchschnittliche CPU und Speicher)](#w2aac11c41c15c19c15)
+ [Erstellen Sie eine Skalierungsrichtlinie für einen Amazon ECS-Service (Metrik: durchschnittliche Anzahl der Anfragen pro Ziel)](#w2aac11c41c15c19c17)
+ [Erstellen Sie eine geplante Aktion mit einem Cron-Ausdruck für eine Lambda-Funktion](#w2aac11c41c15c19c19)
+ [Erstellen Sie eine geplante Aktion mit einem `at`-Ausdruck für eine Spot-Flotte](#w2aac11c41c15c19c21)

## Erstellen Sie eine Skalierungsrichtlinie für eine AppStream Flotte
<a name="w2aac11c41c15c19b9"></a>

Dieser Ausschnitt zeigt, wie Sie eine Richtlinie erstellen und sie auf eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-appstream-fleet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-appstream-fleet.html)-Ressource unter Verwendung der [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html)-Ressource anwenden. Die Ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html) deklariert ein skalierbares Ziel, auf das diese Richtlinie angewendet wird. Das Auto Scaling von Anwendungen kann die Anzahl der Flotten-Instances auf mindestens 1 Instance und maximal 20 skalieren. Die Richtlinie hält die durchschnittliche Kapazitätsauslastung der Flotte bei 75 Prozent, mit Aufskalierungs- und Abskalierungs-Ruhephasen von 300 Sekunden (5 Minuten).

Es verwendet die intrinsischen Funktionen `Fn::Join` und `Rev`, um die Eigenschaft `ResourceId` mit dem logischen Namen der Ressource `AWS::AppStream::Fleet` zu erstellen, die in derselben Vorlage angegeben ist. Weitere Informationen finden Sie unter [Intrinsische Funktionsreferenz](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

### JSON
<a name="quickref-autoscaling-example-6.json"></a>

```
{
  "Resources" : {
    "ScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : 20,
        "MinCapacity" : 1,
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/appstream.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_AppStreamFleet" },
        "ServiceNamespace" : "appstream",
        "ScalableDimension" : "appstream:fleet:DesiredCapacity",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "fleet",
              {
                "Ref" : "logicalName"
              }
            ]
          ]
        }
      }
    },
    "ScalingPolicyAppStreamFleet" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-cpu75" },
        "PolicyType" : "TargetTrackingScaling",
        "ServiceNamespace" : "appstream",
        "ScalableDimension" : "appstream:fleet:DesiredCapacity",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "fleet",
              {
                "Ref" : "logicalName"
              }
            ]
          ]
        },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 75,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "AppStreamAverageCapacityUtilization"
          },
          "ScaleInCooldown" : 300,
          "ScaleOutCooldown" : 300
        }
      }
    } 
  }
}
```

### YAML
<a name="quickref-autoscaling-example-6.yaml"></a>

```
---
Resources:
  ScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 20
      MinCapacity: 1
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/appstream.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_AppStreamFleet'
      ServiceNamespace: appstream
      ScalableDimension: appstream:fleet:DesiredCapacity
      ResourceId: !Join
        - /
        - - fleet
          - !Ref logicalName
  ScalingPolicyAppStreamFleet:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: !Sub ${AWS::StackName}-target-tracking-cpu75
      PolicyType: TargetTrackingScaling
      ServiceNamespace: appstream
      ScalableDimension: appstream:fleet:DesiredCapacity
      ResourceId: !Join
        - /
        - - fleet
          - !Ref logicalName
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 75
        PredefinedMetricSpecification:
          PredefinedMetricType: AppStreamAverageCapacityUtilization
        ScaleInCooldown: 300
        ScaleOutCooldown: 300
```

## Erstellen Sie eine Skalierungsrichtlinie für einen Aurora DB-Cluster
<a name="w2aac11c41c15c19c11"></a>

In diesem Schnipsel registrieren Sie eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbcluster.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbcluster.html) Ressource. Die Ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html) zeigt an, dass der DB-Cluster dynamisch skaliert werden soll, so dass er über ein bis acht Aurora-Replikate verfügt. Sie wenden auch eine Zielverfolgungs-Skalierungsrichtlinie auf den Cluster an, indem Sie die Ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html) verwenden.

In dieser Konfiguration wird die vordefinierte Metrik `RDSReaderAverageCPUUtilization` verwendet, um einen Aurora DB-Cluster anzupassen, basierend auf einer durchschnittlichen CPU-Auslastung von 40 Prozent über alle Aurora -Repliken hinweg in diesem Aurora DB-Cluster. Die Konfiguration sieht eine Scale-In-Ruhephase von 10 Minuten und eine Scale-Out-Ruhephase von 5 Minuten vor.

In diesem Beispiel wird die intrinsische Funktion `Fn::Sub` verwendet, um die Eigenschaft `ResourceId` mit dem logischen Namen der Ressource `AWS::RDS::DBCluster` zu erstellen, die in derselben Vorlage angegeben ist. Weitere Informationen finden Sie unter [Intrinsische Funktionsreferenz](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

### JSON
<a name="quickref-autoscaling-example-7.json"></a>

```
{
  "Resources" : {
    "ScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : 8,
        "MinCapacity" : 1,
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/rds.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_RDSCluster" },
        "ServiceNamespace" : "rds",
        "ScalableDimension" : "rds:cluster:ReadReplicaCount",
        "ResourceId" : { "Fn::Sub" : "cluster:${logicalName}" }
      }
    },
    "ScalingPolicyDBCluster" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-cpu40" },
        "PolicyType" : "TargetTrackingScaling",
        "ServiceNamespace" : "rds",
        "ScalableDimension" : "rds:cluster:ReadReplicaCount",
        "ResourceId" : { "Fn::Sub" : "cluster:${logicalName}" }, 
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 40,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "RDSReaderAverageCPUUtilization"
          },
          "ScaleInCooldown" : 600,
          "ScaleOutCooldown" : 300
        }
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-7.yaml"></a>

```
---
Resources:
  ScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 8
      MinCapacity: 1
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/rds.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_RDSCluster'
      ServiceNamespace: rds
      ScalableDimension: rds:cluster:ReadReplicaCount
      ResourceId: !Sub cluster:${logicalName}
  ScalingPolicyDBCluster:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: !Sub ${AWS::StackName}-target-tracking-cpu40
      PolicyType: TargetTrackingScaling
      ServiceNamespace: rds
      ScalableDimension: rds:cluster:ReadReplicaCount
      ResourceId: !Sub cluster:${logicalName}
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 40
        PredefinedMetricSpecification:
          PredefinedMetricType: RDSReaderAverageCPUUtilization
        ScaleInCooldown: 600
        ScaleOutCooldown: 300
```

## Erstellen einer Skalierungsrichtlinie für eine DynamoDB-Tabelle
<a name="w2aac11c41c15c19c13"></a>

Dieser Ausschnitt zeigt, wie Sie eine Richtlinie mit dem Richtlinientyp `TargetTrackingScaling` erstellen und sie auf eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-dynamodb-table.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-dynamodb-table.html)-Ressource unter Verwendung der [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html)-Ressource anwenden. Die Ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html) deklariert ein skalierbares Ziel, auf das diese Richtlinie angewendet wird, mit einem Minimum von fünf Schreibkapazitätseinheiten und einem Maximum von 15. Die Skalierungsrichtlinie skaliert den Schreibkapazitätsdurchsatz der Tabelle, um die Zielauslastung basierend auf der vordefinierten `DynamoDBWriteCapacityUtilization`-Metrik auf 50 Prozent zu halten.

Es verwendet die intrinsischen Funktionen `Fn::Join` und `Ref`, um die Eigenschaft `ResourceId` mit dem logischen Namen der Ressource `AWS::DynamoDB::Table` zu erstellen, die in derselben Vorlage angegeben ist. Weitere Informationen finden Sie unter [Intrinsische Funktionsreferenz](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

**Anmerkung**  
Weitere Informationen zum Erstellen einer CloudFormation Vorlage für DynamoDB-Ressourcen finden Sie im Blogbeitrag [How to use CloudFormation to configure auto scaling for Amazon DynamoDB tables and indexes](https://aws.amazon.com/blogs/database/how-to-use-aws-cloudformation-to-configure-auto-scaling-for-amazon-dynamodb-tables-and-indexes/) im Datenbank-Blog. AWS 

### JSON
<a name="quickref-autoscaling-example-8.json"></a>

```
{
  "Resources" : {
    "WriteCapacityScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : 15,
        "MinCapacity" : 5,
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable" },
        "ServiceNamespace" : "dynamodb",
        "ScalableDimension" : "dynamodb:table:WriteCapacityUnits",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "table",
              {
                "Ref" : "logicalName"
              }
            ]
          ]
        }
      }
    },
    "WriteScalingPolicy" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : "WriteScalingPolicy",
        "PolicyType" : "TargetTrackingScaling",
        "ScalingTargetId" : { "Ref" : "WriteCapacityScalableTarget" },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 50.0,
          "ScaleInCooldown" : 60,
          "ScaleOutCooldown" : 60,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "DynamoDBWriteCapacityUtilization"
          }
        }
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-8.yaml"></a>

```
---
Resources:
  WriteCapacityScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 15
      MinCapacity: 5
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable'
      ServiceNamespace: dynamodb
      ScalableDimension: dynamodb:table:WriteCapacityUnits
      ResourceId: !Join
        - /
        - - table
          - !Ref logicalName
  WriteScalingPolicy:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: WriteScalingPolicy
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref WriteCapacityScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 50.0
        ScaleInCooldown: 60
        ScaleOutCooldown: 60
        PredefinedMetricSpecification:
          PredefinedMetricType: DynamoDBWriteCapacityUtilization
```

## Erstellen Sie eine Skalierungsrichtlinie für einen Amazon ECS-Service (Metriken: durchschnittliche CPU und Speicher)
<a name="w2aac11c41c15c19c15"></a>

Dieser Ausschnitt zeigt, wie Sie eine Richtlinie erstellen und sie auf eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-service.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-service.html)-Ressource unter Verwendung der [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalingpolicy.html)-Ressource anwenden. Die Ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html) deklariert ein skalierbares Ziel, auf das diese Richtlinie angewendet wird. Application Auto Scaling kann die Anzahl der Aufgaben mit mindestens 1 und maximal 6 Aufgaben skalieren.

Es werden zwei Skalierungsrichtlinien mit dem `TargetTrackingScaling`-Richtlinientyp erstellt. Die Richtlinien werden verwendet, um den ECS-Service basierend auf der durchschnittlichen CPU- und Speicherauslastung des Service zu skalieren. Es verwendet die intrinsischen Funktionen `Fn::Join` und `Ref`, um die Eigenschaft `ResourceId` mit den logischen Namen der Ressourcen [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-cluster.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-cluster.html) (`myContainerCluster`) und `AWS::ECS::Service` (`myService`) zu konstruieren, die in derselben Vorlage angegeben sind. Weitere Informationen finden Sie unter [Intrinsische Funktionsreferenz](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

### JSON
<a name="quickref-autoscaling-example-9.json"></a>

```
{
  "Resources" : {
    "ECSScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : "6",
        "MinCapacity" : "1",
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService" },
        "ServiceNamespace" : "ecs",
        "ScalableDimension" : "ecs:service:DesiredCount",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "service",
              {
                "Ref" : "myContainerCluster"
              },
              {
                "Fn::GetAtt" : [
                  "myService",
                  "Name"
                ]
              }
            ]
          ]
        }
      }
    },
    "ServiceScalingPolicyCPU" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-cpu70" },
        "PolicyType" : "TargetTrackingScaling",
        "ScalingTargetId" : { "Ref" : "ECSScalableTarget" },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 70.0,
          "ScaleInCooldown" : 180,
          "ScaleOutCooldown" : 60,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "ECSServiceAverageCPUUtilization"
          }
        }
      }
    },
    "ServiceScalingPolicyMem" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : { "Fn::Sub" : "${AWS::StackName}-target-tracking-mem90" },
        "PolicyType" : "TargetTrackingScaling",
        "ScalingTargetId" : { "Ref" : "ECSScalableTarget" },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : 90.0,
          "ScaleInCooldown" : 180,
          "ScaleOutCooldown" : 60,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "ECSServiceAverageMemoryUtilization"
          }
        }
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-9.yaml"></a>

```
---
Resources:
  ECSScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 6
      MinCapacity: 1  
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService'
      ServiceNamespace: ecs
      ScalableDimension: 'ecs:service:DesiredCount'
      ResourceId: !Join 
        - /
        - - service
          - !Ref myContainerCluster
          - !GetAtt myService.Name
  ServiceScalingPolicyCPU:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: !Sub ${AWS::StackName}-target-tracking-cpu70
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref ECSScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 70.0
        ScaleInCooldown: 180
        ScaleOutCooldown: 60
        PredefinedMetricSpecification:
          PredefinedMetricType: ECSServiceAverageCPUUtilization
  ServiceScalingPolicyMem:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: !Sub ${AWS::StackName}-target-tracking-mem90
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref ECSScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 90.0
        ScaleInCooldown: 180
        ScaleOutCooldown: 60
        PredefinedMetricSpecification:
          PredefinedMetricType: ECSServiceAverageMemoryUtilization
```

## Erstellen Sie eine Skalierungsrichtlinie für einen Amazon ECS-Service (Metrik: durchschnittliche Anzahl der Anfragen pro Ziel)
<a name="w2aac11c41c15c19c17"></a>

Im folgenden Beispiel wird eine Skalierungsrichtlinie zur Zielverfolgung mit der vordefinierten `ALBRequestCountPerTarget` Metrik auf einen ECS-Service angewendet. Die Richtlinie wird verwendet, um dem ECS-Service Kapazität hinzuzufügen, wenn die Anforderungsanzahl pro Ziel (pro Minute) den Zielwert überschreitet. Da der Wert von `DisableScaleIn` auf „`true`“ festgelegt ist, entfernt die Richtlinie für die Ziel-Nachverfolgung keine Kapazität vom skalierbaren Ziel.

Es verwendet die intrinsischen Funktionen `Fn::Join` und `Fn::GetAtt`, um die Eigenschaft `ResourceLabel` mit den logischen Namen der Ressourcen [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html) (`myLoadBalancer`) und [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html) (`myTargetGroup`) zu erstellen, die in derselben Vorlage angegeben sind. Weitere Informationen finden Sie unter [Intrinsische Funktionsreferenz](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

Die Eigenschaften `MaxCapacity` und `MinCapacity` des skalierbaren Ziels und die `TargetValue`-Eigenschaft der Referenzparameterwerte der Skalierungsrichtlinie, die Sie beim Erstellen oder Aktualisieren eines Stacks an die Vorlage übergeben.

### JSON
<a name="quickref-autoscaling-example-10.json"></a>

```
{
  "Resources" : {
    "ECSScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : { "Ref" : "MaxCount" },
        "MinCapacity" : { "Ref" : "MinCount" },
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService" },
        "ServiceNamespace" : "ecs",
        "ScalableDimension" : "ecs:service:DesiredCount",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "service",
              {
                "Ref" : "myContainerCluster"
              },
              {
                "Fn::GetAtt" : [
                  "myService",
                  "Name"
                ]
              }
            ]
          ]
        }
      }
    },
    "ServiceScalingPolicyALB" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalingPolicy",
      "Properties" : {
        "PolicyName" : "alb-requests-per-target-per-minute",
        "PolicyType" : "TargetTrackingScaling",
        "ScalingTargetId" : { "Ref" : "ECSScalableTarget" },
        "TargetTrackingScalingPolicyConfiguration" : {
          "TargetValue" : { "Ref" : "ALBPolicyTargetValue" },
          "ScaleInCooldown" : 180,
          "ScaleOutCooldown" : 30,
          "DisableScaleIn" : true,
          "PredefinedMetricSpecification" : {
            "PredefinedMetricType" : "ALBRequestCountPerTarget",
            "ResourceLabel" : {
              "Fn::Join" : [
                "/",
                [
                  {
                    "Fn::GetAtt" : [
                      "myLoadBalancer",
                      "LoadBalancerFullName"
                    ]
                  },
                  {
                    "Fn::GetAtt" : [
                      "myTargetGroup",
                      "TargetGroupFullName"
                    ]
                  }
                ]
              ]
            }
          }
        }
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-10.yaml"></a>

```
---
Resources:
  ECSScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: !Ref MaxCount
      MinCapacity: !Ref MinCount  
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService'
      ServiceNamespace: ecs
      ScalableDimension: 'ecs:service:DesiredCount'
      ResourceId: !Join 
        - /
        - - service
          - !Ref myContainerCluster
          - !GetAtt myService.Name
  ServiceScalingPolicyALB:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: alb-requests-per-target-per-minute
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref ECSScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: !Ref ALBPolicyTargetValue
        ScaleInCooldown: 180
        ScaleOutCooldown: 30
        DisableScaleIn: true
        PredefinedMetricSpecification:
          PredefinedMetricType: ALBRequestCountPerTarget
          ResourceLabel: !Join 
            - '/' 
            - - !GetAtt myLoadBalancer.LoadBalancerFullName
              - !GetAtt myTargetGroup.TargetGroupFullName
```

## Erstellen Sie eine geplante Aktion mit einem Cron-Ausdruck für eine Lambda-Funktion
<a name="w2aac11c41c15c19c19"></a>

Dieser Ausschnitt registriert die bereitgestellte Gleichzeitigkeit für einen Funktionsalias ([https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-alias.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-alias.html)) namens `BLUE` unter Verwendung der Ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html) . Erstellt auch eine geplante Aktion mit einem wiederkehrenden Zeitplan unter Verwendung eines Cron-Ausdrucks. Die Zeitzone für den wiederkehrenden Zeitplan ist UTC.

Es verwendet die intrinsischen Funktionen `Fn::Join` und `Ref` in der Eigenschaft `RoleARN`, um den ARN der mit dem Dienst verknüpften Rolle anzugeben. Es verwendet die intrinsische Funktion `Fn::Sub`, um die Eigenschaft `ResourceId` mit dem logischen Namen der Ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html) oder [https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html) zu erstellen, die in derselben Vorlage angegeben ist. Weitere Informationen finden Sie unter [Intrinsische Funktionsreferenz](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

**Anmerkung**  
Sie können keine bereitgestellte Gleichzeitigkeit für einen Alias zuweisen, der auf die unveröffentlichte Version (`$LATEST`) verweist.  
Weitere Informationen zum Erstellen einer CloudFormation Vorlage für Lambda-Ressourcen finden Sie im Blogbeitrag [Scheduling AWS Lambda Provisioned Concurrency for recurriring peak usage auf dem Compute-Blog](https://aws.amazon.com/blogs/compute/scheduling-aws-lambda-provisioned-concurrency-for-recurring-peak-usage/). AWS 

### JSON
<a name="quickref-autoscaling-example-11.json"></a>

```
{
  "ScalableTarget" : {
    "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
    "Properties" : {
      "MaxCapacity" : 250,
      "MinCapacity" : 0,
      "RoleARN" : {
        "Fn::Join" : [
          ":",
          [
            "arn:aws:iam:",
            {
              "Ref" : "AWS::AccountId"
            },
            "role/aws-service-role/lambda.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_LambdaConcurrency"
          ]
        ]
      },
      "ServiceNamespace" : "lambda",
      "ScalableDimension" : "lambda:function:ProvisionedConcurrency",
      "ResourceId" : { "Fn::Sub" : "function:${logicalName}:BLUE" },
      "ScheduledActions" : [
        {
          "ScalableTargetAction" : {
            "MinCapacity" : "250"
          },
          "ScheduledActionName" : "my-scale-out-scheduled-action",
          "Schedule" : "cron(0 18 * * ? *)",
          "EndTime" : "2022-12-31T12:00:00.000Z"
        }
      ]
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-11.yaml"></a>

```
ScalableTarget:
  Type: AWS::ApplicationAutoScaling::ScalableTarget
  Properties:
    MaxCapacity: 250
    MinCapacity: 0
    RoleARN: !Join 
      - ':'
      - - 'arn:aws:iam:'
        - !Ref 'AWS::AccountId'
        - role/aws-service-role/lambda.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_LambdaConcurrency
    ServiceNamespace: lambda
    ScalableDimension: lambda:function:ProvisionedConcurrency
    ResourceId: !Sub function:${logicalName}:BLUE
    ScheduledActions:
      - ScalableTargetAction:
          MinCapacity: 250
        ScheduledActionName: my-scale-out-scheduled-action
        Schedule: 'cron(0 18 * * ? *)'
        EndTime: '2022-12-31T12:00:00.000Z'
```

## Erstellen Sie eine geplante Aktion mit einem `at`-Ausdruck für eine Spot-Flotte
<a name="w2aac11c41c15c19c21"></a>

Dieser Ausschnitt zeigt, wie Sie zwei geplante Aktionen erstellen, die nur einmal für eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-spotfleet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-spotfleet.html)-Ressource unter Verwendung der [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-applicationautoscaling-scalabletarget.html)-Ressource stattfinden. Die Zeitzone für jede einmalig geplante Aktion ist UTC.

Es verwendet die intrinsischen Funktionen `Fn::Join` und `Ref`, um die Eigenschaft `ResourceId` mit dem logischen Namen der Ressource `AWS::EC2::SpotFleet` zu erstellen, die in derselben Vorlage angegeben ist. Weitere Informationen finden Sie unter [Intrinsische Funktionsreferenz](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html).

**Anmerkung**  
Die Spot-Flottenanforderung muss den Anforderungstyp `maintain` aufweisen. Auto Scaling wird für einmalige Anforderungen oder Spot-Blöcke nicht unterstützt.

### JSON
<a name="quickref-autoscaling-example-12.json"></a>

```
{
  "Resources" : {
    "SpotFleetScalableTarget" : {
      "Type" : "AWS::ApplicationAutoScaling::ScalableTarget",
      "Properties" : {
        "MaxCapacity" : 0,
        "MinCapacity" : 0,
        "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ec2.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_EC2SpotFleetRequest" },
        "ServiceNamespace" : "ec2",
        "ScalableDimension" : "ec2:spot-fleet-request:TargetCapacity",
        "ResourceId" : {
          "Fn::Join" : [
            "/",
            [
              "spot-fleet-request",
              {
                "Ref" : "logicalName"
              }
            ]
          ]
        },
        "ScheduledActions" : [
          {
            "ScalableTargetAction" : {
              "MaxCapacity" : "10",
              "MinCapacity" : "10"
            },
            "ScheduledActionName" : "my-scale-out-scheduled-action",
            "Schedule" : "at(2022-05-20T13:00:00)"
          },
          {
            "ScalableTargetAction" : {
              "MaxCapacity" : "0",
              "MinCapacity" : "0"
            },
            "ScheduledActionName" : "my-scale-in-scheduled-action",
            "Schedule" : "at(2022-05-20T21:00:00)"
          }
        ]
      }
    }
  }
}
```

### YAML
<a name="quickref-autoscaling-example-12.yaml"></a>

```
---
Resources:
  SpotFleetScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 0
      MinCapacity: 0
      RoleARN: 
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/ec2.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_EC2SpotFleetRequest'
      ServiceNamespace: ec2
      ScalableDimension: 'ec2:spot-fleet-request:TargetCapacity'
      ResourceId: !Join 
        - /
        - - spot-fleet-request
          - !Ref logicalName
      ScheduledActions:
        - ScalableTargetAction:
            MaxCapacity: 10
            MinCapacity: 10
          ScheduledActionName: my-scale-out-scheduled-action
          Schedule: 'at(2022-05-20T13:00:00)'
        - ScalableTargetAction:
            MaxCapacity: 0
            MinCapacity: 0
          ScheduledActionName: my-scale-in-scheduled-action
          Schedule: 'at(2022-05-20T21:00:00)'
```

# AWS Vorlagenausschnitte für die Rechnungskonsole
<a name="quickref-billingconductor"></a>

In diesem Beispiel wird ein Preisplan mit einer globalen Aufschlagspreisregel von 10 % erstellt. Dieser Preisplan ist der Abrechnungsgruppe beigefügt. Die Abrechnungsgruppe verfügt außerdem über zwei benutzerdefinierte Einzelposten, für die zusätzlich zu den Gesamtkosten der Abrechnungsgruppe eine Gebühr von 10 USD und eine Gebühr von 10 % erhoben werden.

## JSON
<a name="quickref-billingconductor-example-1.json"></a>

```
 1. {
 2.    "Parameters": {
 3.       "LinkedAccountIds": {
 4.          "Type": "ListNumber"
 5.       },
 6.       "PrimaryAccountId": {
 7.          "Type": "Number"
 8.       }
 9.    },
10.    "Resources": {
11.       "TestPricingRule": {
12.          "Type": "AWS::BillingConductor::PricingRule",
13.          "Properties": {
14.             "Name": "TestPricingRule",
15.             "Description": "Test pricing rule created through Cloudformation. Mark everything by 10%.",
16.             "Type": "MARKUP",
17.             "Scope": "GLOBAL",
18.             "ModifierPercentage": 10
19.          }
20.       },
21.       "TestPricingPlan": {
22.          "Type": "AWS::BillingConductor::PricingPlan",
23.          "Properties": {
24.             "Name": "TestPricingPlan",
25.             "Description": "Test pricing plan created through Cloudformation.",
26.             "PricingRuleArns": [
27.                {"Fn::GetAtt": ["TestPricingRule", "Arn"]}
28.             ]
29.          }
30.       },
31.       "TestBillingGroup": {
32.          "Type": "AWS::BillingConductor::BillingGroup",
33.          "Properties": {
34.             "Name": "TestBillingGroup",
35.             "Description": "Test billing group created through Cloudformation with 1 linked account. The linked account is also the primary account.",
36.             "PrimaryAccountId": {
37.                "Ref": "PrimaryAccountId"
38.             },
39.             "AccountGrouping": {
40.                "LinkedAccountIds": null
41.             },
42.             "ComputationPreference": {
43.                "PricingPlanArn": {
44.                  "Fn::GetAtt": ["TestPricingPlan", "Arn"]
45.                }
46.             }
47.          }
48.       },
49.       "TestFlatCustomLineItem": {
50.          "Type": "AWS::BillingConductor::CustomLineItem",
51.          "Properties": {
52.             "Name": "TestFlatCustomLineItem",
53.             "Description": "Test flat custom line item created through Cloudformation for a $10 charge.",
54.             "BillingGroupArn": {
55.               "Fn::GetAtt": ["TestBillingGroup", "Arn"]
56.             },
57.             "CustomLineItemChargeDetails": {
58.                "Flat": {
59.                   "ChargeValue": 10
60.                },
61.                "Type": "FEE"
62.             }
63.          }
64.       },
65.       "TestPercentageCustomLineItem": {
66.          "Type": "AWS::BillingConductor::CustomLineItem",
67.          "Properties": {
68.             "Name": "TestPercentageCustomLineItem",
69.             "Description": "Test percentage custom line item created through Cloudformation for a %10 additional charge on the overall total bill of the billing group.",
70.             "BillingGroupArn": {
71.               "Fn::GetAtt": ["TestBillingGroup", "Arn"]
72.             },
73.             "CustomLineItemChargeDetails": {
74.                "Percentage": {
75.                   "PercentageValue": 10,
76.                   "ChildAssociatedResources": [
77.                      {"Fn::GetAtt": ["TestBillingGroup", "Arn"]}
78.                   ]
79.                },
80.                "Type": "FEE"
81.             }
82.          }
83.       }
84.    }
85. }
```

## YAML
<a name="quickref-billingconductor-example-1.yaml"></a>

```
 1. Parameters:
 2.   LinkedAccountIds:
 3.     Type: ListNumber
 4.   PrimaryAccountId:
 5.     Type: Number
 6. Resources:
 7.   TestPricingRule:
 8.     Type: AWS::BillingConductor::PricingRule
 9.     Properties:
10.       Name: 'TestPricingRule'
11.       Description: 'Test pricing rule created through Cloudformation. Mark everything by 10%.'
12.       Type: 'MARKUP'
13.       Scope: 'GLOBAL'
14.       ModifierPercentage: 10
15.   TestPricingPlan:
16.     Type: AWS::BillingConductor::PricingPlan
17.     Properties:
18.       Name: 'TestPricingPlan'
19.       Description: 'Test pricing plan created through Cloudformation.'
20.       PricingRuleArns:
21.         - !GetAtt TestPricingRule.Arn
22.   TestBillingGroup:
23.     Type: AWS::BillingConductor::BillingGroup
24.     Properties:
25.       Name: 'TestBillingGroup'
26.       Description: 'Test billing group created through Cloudformation with 1 linked account. The linked account is also the primary account.'
27.       PrimaryAccountId: !Ref PrimaryAccountId
28.       AccountGrouping:
29.         LinkedAccountIds: !Ref LinkedAccountIds
30.       ComputationPreference:
31.         PricingPlanArn: !GetAtt TestPricingPlan.Arn
32.   TestFlatCustomLineItem:
33.     Type: AWS::BillingConductor::CustomLineItem
34.     Properties:
35.       Name: 'TestFlatCustomLineItem'
36.       Description: 'Test flat custom line item created through Cloudformation for a $10 charge.'
37.       BillingGroupArn: !GetAtt TestBillingGroup.Arn
38.       CustomLineItemChargeDetails:
39.         Flat:
40.           ChargeValue: 10
41.         Type: 'FEE'
42.   TestPercentageCustomLineItem:
43.     Type: AWS::BillingConductor::CustomLineItem
44.     Properties:
45.       Name: 'TestPercentageCustomLineItem'
46.       Description: 'Test percentage custom line item created through Cloudformation for a %10 additional charge on the overall total bill of the billing group.'
47.       BillingGroupArn: !GetAtt TestBillingGroup.Arn
48.       CustomLineItemChargeDetails:
49.         Percentage:
50.           PercentageValue: 10
51.           ChildAssociatedResources:
52.             - !GetAtt TestBillingGroup.Arn
53.         Type: 'FEE'
```

# CloudFormation Schnipsel aus Vorlagen
<a name="quickref-cloudformation"></a>

**Topics**
+ [Verschachtelte Stacks](#w2aac11c41c23b5)
+ [Wartebedingung](#w2aac11c41c23b7)

## Verschachtelte Stacks
<a name="w2aac11c41c23b5"></a>

### Verschachteln eines Stacks in einer Vorlage
<a name="scenario-stack"></a>

Diese Beispielvorlage enthält eine geschachtelte Stack-Ressource mit dem Namen `myStack`. Wenn CloudFormation aus der Vorlage ein Stapel erstellt wird, wird der erstellt`myStack`, dessen Vorlage in der `TemplateURL` Eigenschaft angegeben ist. Der Ausgabewert `StackRef` gibt die Stack-ID für `myStack` zurück und der Wert `OutputFromNestedStack` gibt den Ausgabewert `BucketName` innerhalb der `myStack`-Ressource zurück. Das Format `Outputs.nestedstackoutputname` ist für die Angabe von Ausgabewerten aus verschachtelten Stapeln reserviert und kann an beliebiger Stelle innerhalb der enthaltenen Vorlage verwendet werden.

Weitere Informationen finden Sie unter [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html).

#### JSON
<a name="quickref-cloudformation-example-1.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Resources" : {
 4.         "myStack" : {
 5. 	       "Type" : "AWS::CloudFormation::Stack",
 6. 	       "Properties" : {
 7. 	        "TemplateURL" : "https://s3.amazonaws.com/cloudformation-templates-us-east-1/S3_Bucket.template",
 8.               "TimeoutInMinutes" : "60"
 9. 	       }
10.         }
11.     },
12.     "Outputs": {
13.        "StackRef": {"Value": { "Ref" : "myStack"}},
14.        "OutputFromNestedStack" : {
15.              "Value" : { "Fn::GetAtt" : [ "myStack", "Outputs.BucketName" ] }
16.        }
17.     }
18. }
```

#### YAML
<a name="quickref-cloudformation-example-1.yaml"></a>

```
 1. AWSTemplateFormatVersion: '2010-09-09'
 2. Resources:
 3.   myStack:
 4.     Type: AWS::CloudFormation::Stack
 5.     Properties:
 6.       TemplateURL: https://s3.amazonaws.com/cloudformation-templates-us-east-1/S3_Bucket.template
 7.       TimeoutInMinutes: '60'
 8. Outputs:
 9.   StackRef:
10.     Value: !Ref myStack
11.   OutputFromNestedStack:
12.     Value: !GetAtt myStack.Outputs.BucketName
```

### Verschachteln eines Stacks mit Eingabeparametern in einer Vorlage
<a name="scenario-stack-parameters"></a>

Diese Beispielvorlage enthält eine Stack-Ressource, die Eingabeparameter angibt. Wenn aus dieser Vorlage ein Stapel CloudFormation erstellt wird, werden die in der `Parameters` Eigenschaft deklarierten Wertepaare als Eingabeparameter für die Vorlage verwendet, mit der der `myStackWithParams` Stapel erstellt wurde. In diesem Beispiel wurden die Parameter `InstanceType` und `KeyName` angegeben.

Weitere Informationen finden Sie unter [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html).

#### JSON
<a name="quickref-cloudformation-example-2.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Resources" : {
 4.         "myStackWithParams" : {
 5.   	       "Type" : "AWS::CloudFormation::Stack",
 6. 	       "Properties" : {
 7. 	           "TemplateURL" : "https://s3.amazonaws.com/cloudformation-templates-us-east-1/EC2ChooseAMI.template",
 8. 	           "Parameters" : {
 9. 	               "InstanceType" : "t2.micro",
10. 	               "KeyName" : "mykey"
11. 	           }
12.    	       }
13.         }
14.     }
15. }
```

#### YAML
<a name="quickref-cloudformation-example-2.yaml"></a>

```
1. AWSTemplateFormatVersion: '2010-09-09'
2. Resources:
3.   myStackWithParams:
4.     Type: AWS::CloudFormation::Stack
5.     Properties:
6.       TemplateURL: https://s3.amazonaws.com/cloudformation-templates-us-east-1/EC2ChooseAMI.template
7.       Parameters:
8.         InstanceType: t2.micro
9.         KeyName: mykey
```

## Wartebedingung
<a name="w2aac11c41c23b7"></a>

### Verwendung einer Wartebedingung mit einer Amazon EC2-Instance
<a name="scenario-waitcondition"></a>

**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.

Wenn Sie keine Erstellungsrichtlinie verwenden können, sehen Sie die folgende Beispielvorlage, in der eine Amazon EC2-Instance mit einer Wartebedingung deklariert wird. Die Wartebedingung `myWaitCondition` verwendet `myWaitConditionHandle` für die Signalisierung, verwendet das Attribut `DependsOn`, um anzugeben, dass die Wartebedingung ausgelöst wird, nachdem die Amazon EC2-Instanceressource erstellt wurde, und verwendet die Eigenschaft `Timeout`, um eine Dauer von 4500 Sekunden für die Wartebedingung anzugeben. Außerdem wird die vorzeichenbehaftete URL, die die Wartebedingung signalisiert, mit der Eigenschaft `UserData` der `Ec2Instance`-Ressource an die Amazon EC2-Instance weitergegeben. So kann eine Anwendung oder ein Skript, das auf dieser Amazon EC2-Instance läuft, die vorzeichenbehaftete URL abrufen und sie verwenden, um einen Erfolg oder Misserfolg der Wartebedingung zu signalisieren. Sie müssen `cfn-signal` verwenden oder die Anwendung oder das Skript erstellen, das die Wartebedingung signalisiert. Der Ausgabewert `ApplicationData` enthält die Daten, die vom Wartezustandssignal zurückgegeben werden.

Weitere Informationen finden Sie unter [Wartebedingungen in einer CloudFormation Vorlage erstellen](using-cfn-waitcondition.md).

#### JSON
<a name="quickref-cloudformation-example-3.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Mappings" : {
 4.         "RegionMap" : {
 5.             "us-east-1" : {
 6.                 "AMI" : "ami-0123456789abcdef0"
 7.             },
 8.             "us-west-1" : {
 9.                 "AMI" : "ami-0987654321fedcba0"
10.             },
11.             "eu-west-1" : {
12.                 "AMI" : "ami-0abcdef123456789a"
13.             },
14.             "ap-northeast-1" : {
15.                 "AMI" : "ami-0fedcba987654321b"
16.             },
17.             "ap-southeast-1" : {
18.                 "AMI" : "ami-0c1d2e3f4a5b6c7d8"
19.             }
20.         }
21.     },
22.     "Resources" : {
23.         "Ec2Instance" : {
24.             "Type" : "AWS::EC2::Instance",
25.             "Properties" : {
26.                 "UserData" : { "Fn::Base64" : {"Ref" : "myWaitHandle"}},
27.                 "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]}
28.             }
29.         },
30.         "myWaitHandle" : {
31.             "Type" : "AWS::CloudFormation::WaitConditionHandle",
32.             "Properties" : {
33.             }
34.         },
35.         "myWaitCondition" : {
36.             "Type" : "AWS::CloudFormation::WaitCondition",
37.             "DependsOn" : "Ec2Instance",
38.             "Properties" : {
39.                 "Handle" : { "Ref" : "myWaitHandle" },
40.                 "Timeout" : "4500"
41.             }
42.         }
43.     },
44.     "Outputs" : {
45.         "ApplicationData" : {
46.             "Value" : { "Fn::GetAtt" : [ "myWaitCondition", "Data" ]},
47.             "Description" : "The data passed back as part of signalling the WaitCondition."
48.         }
49.     }
50. }
```

#### YAML
<a name="quickref-cloudformation-example-3.yaml"></a>

```
 1. AWSTemplateFormatVersion: '2010-09-09'
 2. Mappings:
 3.   RegionMap:
 4.     us-east-1:
 5.       AMI: ami-0123456789abcdef0
 6.     us-west-1:
 7.       AMI: ami-0987654321fedcba0
 8.     eu-west-1:
 9.       AMI: ami-0abcdef123456789a
10.     ap-northeast-1:
11.       AMI: ami-0fedcba987654321b
12.     ap-southeast-1:
13.       AMI: ami-0c1d2e3f4a5b6c7d8
14. Resources:
15.   Ec2Instance:
16.     Type: AWS::EC2::Instance
17.     Properties:
18.       UserData:
19.         Fn::Base64: !Ref myWaitHandle
20.       ImageId:
21.         Fn::FindInMap:
22.         - RegionMap
23.         - Ref: AWS::Region
24.         - AMI
25.   myWaitHandle:
26.     Type: AWS::CloudFormation::WaitConditionHandle
27.     Properties: {}
28.   myWaitCondition:
29.     Type: AWS::CloudFormation::WaitCondition
30.     DependsOn: Ec2Instance
31.     Properties:
32.       Handle: !Ref myWaitHandle
33.       Timeout: '4500'
34. Outputs:
35.   ApplicationData:
36.     Value: !GetAtt myWaitCondition.Data
37.     Description: The data passed back as part of signalling the WaitCondition.
```

### Verwenden des cfn-signal-Hilfsskript zum Signalisieren einer Wartebedingung
<a name="scenario-waitcondition-cfn-signal"></a>

Dieses Beispiel zeigt eine `cfn-signal`-Befehlszeile, die den Erfolg einer Wartebedingung signalisiert. Sie müssen die Befehlszeile in der Eigenschaft `UserData` der EC2-Instance definieren.

#### JSON
<a name="w2aac11c41c23b7b4b4"></a>

```
"UserData": {
  "Fn::Base64": {
    "Fn::Join": [
      "", 
      [
         "#!/bin/bash -xe\n",
         "/opt/aws/bin/cfn-signal --exit-code 0 '", 
         {
           "Ref": "myWaitHandle"
         },
         "'\n"
      ]   
    ]
  }
}
```

#### YAML
<a name="w2aac11c41c23b7b4b6"></a>

```
UserData:
  Fn::Base64: !Sub |
    #!/bin/bash -xe
    /opt/aws/bin/cfn-signal --exit-code 0 '${myWaitHandle}'
```

### Erstellen eines Signal für eine Wartebedingung mit Curl
<a name="scenario-waitcondition-curl"></a>

Das folgende Beispiel zeigt eine Curl-Befehlszeile, die für eine Wartebedingung einen Erfolg signalisiert.

```
1. curl -T /tmp/a "https://cloudformation-waitcondition-test.s3.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%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:

```
1. {
2.   "Status" : "SUCCESS",
3.   "Reason" : "Configuration Complete",
4.   "UniqueId" : "ID1234",
5.   "Data" : "Application has completed configuration."
6. }
```

Das folgende Beispiel zeigt eine Curl-Befehlszeile, die dasselbe Erfolgssignal sendet, mit der Ausnahme, dass die JSON als Parameter in der Befehlszeile gesendet wird.

```
1. 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-1%3A034017226601%3Astack%2Fstack-gosar-20110427004224-test-stack-with-WaitCondition--VEYW%2Fe498ce60-70a1-11e0-81a7-5081d0136786%2FmyWaitConditionHandle?Expires=1303976584&AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Signature=ik1twT6hpS4cgNAw7wyOoRejVoo%3D"
```

# CloudFront Amazon-Vorlagenschnipsel
<a name="quickref-cloudfront"></a>

Verwenden Sie diese Beispielvorlagenausschnitte zusammen mit Ihrer CloudFront Amazon-Vertriebsressource in. CloudFormation Weitere Informationen finden Sie in der [Referenz zum CloudFront Amazon-Ressourcentyp](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/AWS_CloudFront.html).

**Topics**
+ [CloudFront Amazon-Vertriebsressource mit Amazon S3-Ursprung](#scenario-cloudfront-s3origin)
+ [CloudFront Amazon-Vertriebsressource mit benutzerdefiniertem Ursprung](#scenario-cloudfront-customorigin)
+ [CloudFront Amazon-Vertrieb mit Unterstützung mehrerer Absender](#scenario-cloudfront-multiorigin)
+ [CloudFront Amazon-Vertrieb mit einer Lambda-Funktion als Ursprung](#scenario-cloudfront-lambda-origin)
+ [Weitere Informationen finden Sie auch unter](#w2aac11c41c27c15)

## CloudFront Amazon-Vertriebsressource mit Amazon S3-Ursprung
<a name="scenario-cloudfront-s3origin"></a>

Die folgende Beispielvorlage zeigt eine CloudFront [Amazon-Distribution](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudfront-distribution.html), die eine [S3Origin und eine ältere Origin-Zugriffsidentität](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-s3originconfig.html) (OAI) verwendet. Informationen zur Verwendung von Origin Access Control (OAC) stattdessen finden Sie unter [Beschränken des Zugriffs auf einen Amazon Simple Storage Service-Ursprung](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html) im *Amazon CloudFront Developer Guide*.

### JSON
<a name="quickref-cloudfront-example-1.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Resources" : {
 4.         "myDistribution" : {
 5.             "Type" : "AWS::CloudFront::Distribution",
 6.             "Properties" : {
 7.                 "DistributionConfig" : {
 8.                     "Origins" : [ {
 9.                         "DomainName" : "amzn-s3-demo-bucket.s3.amazonaws.com",
10.                         "Id" : "myS3Origin",
11.                         "S3OriginConfig" : {
12.                             "OriginAccessIdentity" : "origin-access-identity/cloudfront/E127EXAMPLE51Z"
13.                         }
14.                     }],
15.                     "Enabled" : "true",
16.                     "Comment" : "Some comment",
17.                     "DefaultRootObject" : "index.html",
18.                     "Logging" : {
19.                         "IncludeCookies" : "false",
20.                         "Bucket" : "amzn-s3-demo-logging-bucket.s3.amazonaws.com",
21.                         "Prefix" : "myprefix"
22.                     },
23.                     "Aliases" : [ "mysite.example.com", "yoursite.example.com" ],
24.                     "DefaultCacheBehavior" : {
25.                         "AllowedMethods" : [ "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" ],  
26.                         "TargetOriginId" : "myS3Origin",
27.                         "ForwardedValues" : {
28.                             "QueryString" : "false",
29.                             "Cookies" : { "Forward" : "none" }
30.                         },
31.                         "TrustedSigners" : [ "1234567890EX", "1234567891EX" ],
32.                         "ViewerProtocolPolicy" : "allow-all"
33.                     },
34.                    "PriceClass" : "PriceClass_200",
35.                    "Restrictions" : {
36.                        "GeoRestriction" : {
37.                            "RestrictionType" : "whitelist",
38.                            "Locations" : [ "AQ", "CV" ]
39.                        }
40.                    },
41.                    "ViewerCertificate" : { "CloudFrontDefaultCertificate" : "true" }  
42.                 }
43.             }
44.         }
45.     }
46. }
```

### YAML
<a name="quickref-cloudfront-example-1.yaml"></a>

```
 1. AWSTemplateFormatVersion: '2010-09-09'
 2. Resources:
 3.   myDistribution:
 4.     Type: AWS::CloudFront::Distribution
 5.     Properties:
 6.       DistributionConfig:
 7.         Origins:
 8.         - DomainName: amzn-s3-demo-bucket.s3.amazonaws.com
 9.           Id: myS3Origin
10.           S3OriginConfig:
11.             OriginAccessIdentity: origin-access-identity/cloudfront/E127EXAMPLE51Z
12.         Enabled: 'true'
13.         Comment: Some comment
14.         DefaultRootObject: index.html
15.         Logging:
16.           IncludeCookies: 'false'
17.           Bucket: amzn-s3-demo-logging-bucket.s3.amazonaws.com
18.           Prefix: myprefix
19.         Aliases:
20.         - mysite.example.com
21.         - yoursite.example.com
22.         DefaultCacheBehavior:
23.           AllowedMethods:
24.           - DELETE
25.           - GET
26.           - HEAD
27.           - OPTIONS
28.           - PATCH
29.           - POST
30.           - PUT
31.           TargetOriginId: myS3Origin
32.           ForwardedValues:
33.             QueryString: 'false'
34.             Cookies:
35.               Forward: none
36.           TrustedSigners:
37.           - 1234567890EX
38.           - 1234567891EX
39.           ViewerProtocolPolicy: allow-all
40.         PriceClass: PriceClass_200
41.         Restrictions:
42.           GeoRestriction:
43.             RestrictionType: whitelist
44.             Locations:
45.             - AQ
46.             - CV
47.         ViewerCertificate:
48.           CloudFrontDefaultCertificate: 'true'
```

## CloudFront Amazon-Vertriebsressource mit benutzerdefiniertem Ursprung
<a name="scenario-cloudfront-customorigin"></a>

Die folgende Beispielvorlage zeigt eine CloudFront [Amazon-Distribution](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudfront-distribution.html) mit einem [CustomOrigin](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-customoriginconfig.html).

### JSON
<a name="quickref-cloudfront-example-2.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion" : "2010-09-09",
 3.     "Resources" : {
 4.         "myDistribution" : {
 5.             "Type" : "AWS::CloudFront::Distribution",
 6.             "Properties" : {
 7.                 "DistributionConfig" : {
 8.                     "Origins" : [ {
 9.                             "DomainName" : "www.example.com",
10.                             "Id" : "myCustomOrigin",
11.                             "CustomOriginConfig" : {
12.                                 "HTTPPort" : "80",
13.                                 "HTTPSPort" : "443",
14.                                 "OriginProtocolPolicy" : "http-only"
15.                             }
16.                     } ],
17.                     "Enabled" : "true",
18.                     "Comment" : "Somecomment",
19.                     "DefaultRootObject" : "index.html",
20.                     "Logging" : {
21.                         "IncludeCookies" : "true",
22.                         "Bucket" : "amzn-s3-demo-logging-bucket.s3.amazonaws.com",
23.                         "Prefix": "myprefix"
24.                     },
25.                     "Aliases" : [
26.                         "mysite.example.com",
27.                         "*.yoursite.example.com"
28.                     ],
29.                     "DefaultCacheBehavior" : {
30.                         "TargetOriginId" : "myCustomOrigin",
31.                         "SmoothStreaming" : "false",  
32.                         "ForwardedValues" : {
33.                             "QueryString" : "false",
34.                             "Cookies" : { "Forward" : "all" }
35.                         },
36.                         "TrustedSigners" : [
37.                             "1234567890EX",
38.                             "1234567891EX"
39.                         ],
40.                         "ViewerProtocolPolicy" : "allow-all"
41.                     },
42.                     "CustomErrorResponses" : [ {
43.                         "ErrorCode" : "404",
44.                         "ResponsePagePath" : "/error-pages/404.html",
45.                         "ResponseCode" : "200",
46.                         "ErrorCachingMinTTL" : "30"
47.                     } ],
48.                    "PriceClass" : "PriceClass_200",
49.                    "Restrictions" : {
50.                        "GeoRestriction" : {
51.                            "RestrictionType" : "whitelist",
52.                            "Locations" : [ "AQ", "CV" ]
53.                        }
54.                    },
55.                    "ViewerCertificate": { "CloudFrontDefaultCertificate" : "true" }
56.                 }
57.             }
58.         }
59.     }
60. }
```

### YAML
<a name="quickref-cloudfront-example-2.yaml"></a>

```
 1. AWSTemplateFormatVersion: '2010-09-09'
 2. Resources:
 3.   myDistribution:
 4.     Type: AWS::CloudFront::Distribution
 5.     Properties:
 6.       DistributionConfig:
 7.         Origins:
 8.         - DomainName: www.example.com
 9.           Id: myCustomOrigin
10.           CustomOriginConfig:
11.             HTTPPort: '80'
12.             HTTPSPort: '443'
13.             OriginProtocolPolicy: http-only
14.         Enabled: 'true'
15.         Comment: Somecomment
16.         DefaultRootObject: index.html
17.         Logging:
18.           IncludeCookies: 'true'
19.           Bucket: amzn-s3-demo-logging-bucket.s3.amazonaws.com
20.           Prefix: myprefix
21.         Aliases:
22.         - mysite.example.com
23.         - "*.yoursite.example.com"
24.         DefaultCacheBehavior:
25.           TargetOriginId: myCustomOrigin
26.           SmoothStreaming: 'false'
27.           ForwardedValues:
28.             QueryString: 'false'
29.             Cookies:
30.               Forward: all
31.           TrustedSigners:
32.           - 1234567890EX
33.           - 1234567891EX
34.           ViewerProtocolPolicy: allow-all
35.         CustomErrorResponses:
36.         - ErrorCode: '404'
37.           ResponsePagePath: "/error-pages/404.html"
38.           ResponseCode: '200'
39.           ErrorCachingMinTTL: '30'
40.         PriceClass: PriceClass_200
41.         Restrictions:
42.           GeoRestriction:
43.             RestrictionType: whitelist
44.             Locations:
45.             - AQ
46.             - CV
47.         ViewerCertificate:
48.           CloudFrontDefaultCertificate: 'true'
```

## CloudFront Amazon-Vertrieb mit Unterstützung mehrerer Absender
<a name="scenario-cloudfront-multiorigin"></a>

Die folgende Beispielvorlage zeigt, wie Sie eine CloudFront [Distribution](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudfront-distribution.html) mit Unterstützung mehrerer Herkunft deklarieren. In der [DistributionConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-distributionconfig.html)wird eine Liste von Ursprüngen bereitgestellt und [DefaultCacheBehavior](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-defaultcachebehavior.html)ein festgelegt.

### JSON
<a name="quickref-cloudfront-example-3.json"></a>

```
{
    "AWSTemplateFormatVersion" : "2010-09-09",
    "Resources" : {
        "myDistribution" : {
            "Type" : "AWS::CloudFront::Distribution",
            "Properties" : {
                "DistributionConfig" : {
                    "Origins" : [ {
                        "Id" : "myS3Origin",
                        "DomainName" : "amzn-s3-demo-bucket.s3.amazonaws.com",
                        "S3OriginConfig" : {
                            "OriginAccessIdentity" : "origin-access-identity/cloudfront/E127EXAMPLE51Z"
                        }
                     }, 
                     {
                         "Id" : "myCustomOrigin",
                         "DomainName" : "www.example.com",
                         "CustomOriginConfig" : {
                             "HTTPPort" : "80",
                             "HTTPSPort" : "443",
                             "OriginProtocolPolicy" : "http-only"
                         }
                     }
                   ],
                   "Enabled" : "true",
                   "Comment" : "Some comment",
                   "DefaultRootObject" : "index.html", 
                   "Logging" : {
                       "IncludeCookies" : "true",
                       "Bucket" : "amzn-s3-demo-logging-bucket.s3.amazonaws.com",
                       "Prefix" : "myprefix"
                   },            
                   "Aliases" : [ "mysite.example.com", "yoursite.example.com" ],
                   "DefaultCacheBehavior" : {
                       "TargetOriginId" : "myS3Origin",
                       "ForwardedValues" : {
                           "QueryString" : "false",
                           "Cookies" : { "Forward" : "all" }
                        },
                       "TrustedSigners" : [ "1234567890EX", "1234567891EX"  ],
                       "ViewerProtocolPolicy" : "allow-all",
                       "MinTTL" : "100",
                       "SmoothStreaming" : "true"
                   },
                   "CacheBehaviors" : [ {
                            "AllowedMethods" : [ "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" ],  
                            "TargetOriginId" : "myS3Origin",
                            "ForwardedValues" : {
                                "QueryString" : "true",
                                "Cookies" : { "Forward" : "none" }
                            },
                            "TrustedSigners" : [ "1234567890EX", "1234567891EX" ],
                            "ViewerProtocolPolicy" : "allow-all",
                            "MinTTL" : "50",
                            "PathPattern" : "images1/*.jpg"
                        }, 
                        {
                            "AllowedMethods" : [ "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" ],  
                            "TargetOriginId" : "myCustomOrigin",
                            "ForwardedValues" : {
                                "QueryString" : "true",
                                "Cookies" : { "Forward" : "none" }
                            },
                            "TrustedSigners" : [ "1234567890EX", "1234567891EX"  ],
                            "ViewerProtocolPolicy" : "allow-all",
                            "MinTTL" : "50",
                            "PathPattern" : "images2/*.jpg"
                        }
                   ],
                   "CustomErrorResponses" : [ {
                       "ErrorCode" : "404",
                       "ResponsePagePath" : "/error-pages/404.html",
                       "ResponseCode" : "200",
                       "ErrorCachingMinTTL" : "30"
                   } ],
                   "PriceClass" : "PriceClass_All",
                   "ViewerCertificate" : { "CloudFrontDefaultCertificate" : "true" }
                }
            }
        }
    }
}
```

### YAML
<a name="quickref-cloudfront-example-3.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  myDistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        Origins:
        - Id: myS3Origin
          DomainName: amzn-s3-demo-bucket.s3.amazonaws.com
          S3OriginConfig:
            OriginAccessIdentity: origin-access-identity/cloudfront/E127EXAMPLE51Z
        - Id: myCustomOrigin
          DomainName: www.example.com
          CustomOriginConfig:
            HTTPPort: '80'
            HTTPSPort: '443'
            OriginProtocolPolicy: http-only
        Enabled: 'true'
        Comment: Some comment
        DefaultRootObject: index.html
        Logging:
          IncludeCookies: 'true'
          Bucket: amzn-s3-demo-logging-bucket.s3.amazonaws.com
          Prefix: myprefix
        Aliases:
        - mysite.example.com
        - yoursite.example.com
        DefaultCacheBehavior:
          TargetOriginId: myS3Origin
          ForwardedValues:
            QueryString: 'false'
            Cookies:
              Forward: all
          TrustedSigners:
          - 1234567890EX
          - 1234567891EX
          ViewerProtocolPolicy: allow-all
          MinTTL: '100'
          SmoothStreaming: 'true'
        CacheBehaviors:
        - AllowedMethods:
          - DELETE
          - GET
          - HEAD
          - OPTIONS
          - PATCH
          - POST
          - PUT
          TargetOriginId: myS3Origin
          ForwardedValues:
            QueryString: 'true'
            Cookies:
              Forward: none
          TrustedSigners:
          - 1234567890EX
          - 1234567891EX
          ViewerProtocolPolicy: allow-all
          MinTTL: '50'
          PathPattern: images1/*.jpg
        - AllowedMethods:
          - DELETE
          - GET
          - HEAD
          - OPTIONS
          - PATCH
          - POST
          - PUT
          TargetOriginId: myCustomOrigin
          ForwardedValues:
            QueryString: 'true'
            Cookies:
              Forward: none
          TrustedSigners:
          - 1234567890EX
          - 1234567891EX
          ViewerProtocolPolicy: allow-all
          MinTTL: '50'
          PathPattern: images2/*.jpg
        CustomErrorResponses:
        - ErrorCode: '404'
          ResponsePagePath: "/error-pages/404.html"
          ResponseCode: '200'
          ErrorCachingMinTTL: '30'
        PriceClass: PriceClass_All
        ViewerCertificate:
          CloudFrontDefaultCertificate: 'true'
```

## CloudFront Amazon-Vertrieb mit einer Lambda-Funktion als Ursprung
<a name="scenario-cloudfront-lambda-origin"></a>

Im folgenden Beispiel wird eine CloudFront Distribution erstellt, die einer angegebenen Lambda-Funktions-URL (als Parameter bereitgestellt) vorangestellt wird, wodurch reiner HTTPS-Zugriff, Caching, Komprimierung und globale Bereitstellung ermöglicht werden. Es konfiguriert die Lambda-URL als benutzerdefinierten HTTPS-Ursprung und wendet eine AWS Standard-Caching-Richtlinie an. Die Distribution ist für die Leistung mit HTTP/2 und IPv6 Unterstützung optimiert und gibt den CloudFront Domainnamen aus, sodass Benutzer über einen sicheren, CDN-gestützten Endpunkt auf die Lambda-Funktion zugreifen können. Weitere Informationen finden Sie im AWS Blog [unter Verwenden von Amazon CloudFront mit AWS Lambda als Ursprung zur Beschleunigung Ihrer Webanwendungen](https://aws.amazon.com/blogs/networking-and-content-delivery/using-amazon-cloudfront-with-aws-lambda-as-origin-to-accelerate-your-web-applications/).

### JSON
<a name="quickref-cloudfront-example-lambda-origin.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "LambdaEndpoint": {
            "Type": "String",
            "Description": "The Lambda function URL endpoint without the 'https://'"
        }
    },
    "Resources": {
        "MyDistribution": {
            "Type": "AWS::CloudFront::Distribution",
            "Properties": {
                "DistributionConfig": {
                    "PriceClass": "PriceClass_All",
                    "HttpVersion": "http2",
                    "IPV6Enabled": true,
                    "Origins": [
                        {
                            "DomainName": {
                                "Ref": "LambdaEndpoint"
                            },
                            "Id": "LambdaOrigin",
                            "CustomOriginConfig": {
                                "HTTPSPort": 443,
                                "OriginProtocolPolicy": "https-only"
                            }
                        }
                    ],
                    "Enabled": "true",
                    "DefaultCacheBehavior": {
                        "TargetOriginId": "LambdaOrigin",
                        "CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6",
                        "ViewerProtocolPolicy": "redirect-to-https",
                        "SmoothStreaming": "false",
                        "Compress": "true"
                    }
                }
            }
        }
    },
    "Outputs": {
        "CloudFrontDomain": {
            "Description": "CloudFront default domain name configured",
            "Value": {
                "Fn::Sub": "https://${MyDistribution.DomainName}/"
            }
        }
    }
}
```

### YAML
<a name="quickref-cloudfront-example-lambda-origin.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  LambdaEndpoint:
    Type: String
    Description: The Lambda function URL endpoint without the 'https://'
Resources:
  MyDistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        PriceClass: PriceClass_All
        HttpVersion: http2
        IPV6Enabled: true
        Origins:
        - DomainName: !Ref LambdaEndpoint
          Id: LambdaOrigin
          CustomOriginConfig:
            HTTPSPort: 443
            OriginProtocolPolicy: https-only
        Enabled: 'true'
        DefaultCacheBehavior:
          TargetOriginId: LambdaOrigin
          CachePolicyId: '658327ea-f89d-4fab-a63d-7e88639e58f6'
          ViewerProtocolPolicy: redirect-to-https
          SmoothStreaming: 'false'
          Compress: 'true'
Outputs:
  CloudFrontDomain:
    Description: CloudFront default domain name configured
    Value: !Sub https://${MyDistribution.DomainName}/
```

## Weitere Informationen finden Sie auch unter
<a name="w2aac11c41c27c15"></a>

Ein Beispiel für das Hinzufügen eines benutzerdefinierten Alias zu einem Route 53-Datensatz, um einen benutzerfreundlichen Namen für eine CloudFront Distribution zu erstellen, finden Sie unter[Alias-Ressourcendatensatz für eine Verteilung CloudFront](quickref-route53.md#scenario-user-friendly-url-for-cloudfront-distribution).

# CloudWatch Amazon-Vorlagenschnipsel
<a name="quickref-cloudwatch"></a>

Verwenden Sie diese Beispielvorlagenausschnitte, um Ihre CloudWatch Amazon-Ressourcen in zu beschreiben. CloudFormation Weitere Informationen finden Sie in der [Referenz zum CloudWatch Amazon-Ressourcentyp](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/AWS_CloudWatch.html).

**Topics**
+ [Fakturierungsbenachrichtigung](#cloudwatch-sample-billing-alarm)
+ [CPU-Nutzungsalarm](#cloudwatch-sample-cpu-utilization-alarm)
+ [Wiederherstellung einer Amazon Elastic Compute Cloud-Instance](#cloudwatch-sample-recover-instance)
+ [Erstellen eines grundlegenden Dashboards](#cloudwatch-sample-dashboard-basic)
+ [Erstellen Sie ein Dashboard mit side-by-side Widgets](#cloudwatch-sample-dashboard-sidebyside)

## Fakturierungsbenachrichtigung
<a name="cloudwatch-sample-billing-alarm"></a>

Im folgenden Beispiel CloudWatch sendet Amazon eine E-Mail-Benachrichtigung, wenn Belastungen auf Ihrem AWS Konto den Alarmschwellenwert überschreiten. Um Nutzungsbenachrichtigungen zu erhalten, aktivieren Sie Fakturierungsbenachrichtigungen. Weitere Informationen finden Sie im * CloudWatch Amazon-Benutzerhandbuch* unter [Einen Abrechnungsalarm erstellen, um Ihre geschätzten AWS Gebühren zu überwachen](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html). >

### JSON
<a name="quickref-cloudwatch-example-1.json"></a>

```
"SpendingAlarm": {
  "Type": "AWS::CloudWatch::Alarm",
  "Properties": {
    "AlarmDescription": { "Fn::Join": ["", [
      "Alarm if AWS spending is over $",
      { "Ref": "AlarmThreshold" }
    ]]},
    "Namespace": "AWS/Billing",
    "MetricName": "EstimatedCharges",
    "Dimensions": [{
      "Name": "Currency",
      "Value" : "USD"
    }],
    "Statistic": "Maximum",
    "Period": "21600",
    "EvaluationPeriods": "1",
    "Threshold": { "Ref": "AlarmThreshold" },
    "ComparisonOperator": "GreaterThanThreshold",
    "AlarmActions": [{
      "Ref": "BillingAlarmNotification"
    }],
    "InsufficientDataActions": [{
      "Ref": "BillingAlarmNotification"
    }]
  }
}
```

### YAML
<a name="quickref-cloudwatch-example-1.yaml"></a>

```
SpendingAlarm:
  Type: AWS::CloudWatch::Alarm
  Properties:
    AlarmDescription: 
      'Fn::Join':
        - ''
        - - Alarm if AWS spending is over $
          - !Ref: AlarmThreshold
    Namespace: AWS/Billing
    MetricName: EstimatedCharges
    Dimensions:
    - Name: Currency
      Value: USD
    Statistic: Maximum
    Period: '21600'
    EvaluationPeriods: '1'
    Threshold:
      !Ref: "AlarmThreshold"
    ComparisonOperator: GreaterThanThreshold
    AlarmActions:
    - !Ref: "BillingAlarmNotification"
    InsufficientDataActions:
    - !Ref: "BillingAlarmNotification"
```

## CPU-Nutzungsalarm
<a name="cloudwatch-sample-cpu-utilization-alarm"></a>

Der folgenden Beispiel-Ausschnitt erstellt einen Alarm, der eine Benachrichtigung versendet, wenn die durchschnittliche CPU-Auslastung einer Amazon EC2-Instance 90 Prozent länger als 60 Sekunden überschreitet und das über drei Bewertungszeiträume.

### JSON
<a name="quickref-cloudwatch-example-2.json"></a>

```
 1. "CPUAlarm" : {
 2.   "Type" : "AWS::CloudWatch::Alarm",
 3.   "Properties" : {
 4.     "AlarmDescription" : "CPU alarm for my instance",
 5.     "AlarmActions" : [ { "Ref" : "logical name of an AWS::SNS::Topic resource" } ],
 6.     "MetricName" : "CPUUtilization",
 7.     "Namespace" : "AWS/EC2",
 8.     "Statistic" : "Average",
 9.     "Period" : "60",
10.     "EvaluationPeriods" : "3",
11.     "Threshold" : "90",
12.     "ComparisonOperator" : "GreaterThanThreshold",
13.     "Dimensions" : [ {
14.       "Name" : "InstanceId",
15.       "Value" : { "Ref" : "logical name of an AWS::EC2::Instance resource" }
16.     } ]
17.   }
18. }
```

### YAML
<a name="quickref-cloudwatch-example-2.yaml"></a>

```
 1. CPUAlarm:
 2.   Type: AWS::CloudWatch::Alarm
 3.   Properties:
 4.     AlarmDescription: CPU alarm for my instance
 5.     AlarmActions:
 6.     - !Ref: "logical name of an AWS::SNS::Topic resource"
 7.     MetricName: CPUUtilization
 8.     Namespace: AWS/EC2
 9.     Statistic: Average
10.     Period: '60'
11.     EvaluationPeriods: '3'
12.     Threshold: '90'
13.     ComparisonOperator: GreaterThanThreshold
14.     Dimensions:
15.     - Name: InstanceId
16.       Value: !Ref: "logical name of an AWS::EC2::Instance resource"
```

## Wiederherstellung einer Amazon Elastic Compute Cloud-Instance
<a name="cloudwatch-sample-recover-instance"></a>

Der folgende CloudWatch Alarm stellt eine EC2-Instance wieder her, wenn die Statusüberprüfung 15 Minuten hintereinander fehlschlägt. Weitere Informationen zu Alarmaktionen finden [Sie unter Erstellen von Alarmen zum Stoppen, Beenden, Neustarten oder Wiederherstellen einer EC2-Instance](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/UsingAlarmActions.html) im * CloudWatch Amazon-Benutzerhandbuch*.

### JSON
<a name="quickref-cloudwatch-example-3.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters" : {
    "RecoveryInstance" : {
      "Description" : "The EC2 instance ID to associate this alarm with.",
      "Type" : "AWS::EC2::Instance::Id"
    }
  },
  "Resources": {
    "RecoveryTestAlarm": {
      "Type": "AWS::CloudWatch::Alarm",
      "Properties": {
        "AlarmDescription": "Trigger a recovery when instance status check fails for 15 consecutive minutes.",
        "Namespace": "AWS/EC2" ,
        "MetricName": "StatusCheckFailed_System",
        "Statistic": "Minimum",
        "Period": "60",
        "EvaluationPeriods": "15",
        "ComparisonOperator": "GreaterThanThreshold",
        "Threshold": "0",
        "AlarmActions": [ {"Fn::Join" : ["", ["arn:aws:automate:", { "Ref" : "AWS::Region" }, ":ec2:recover" ]]} ],
        "Dimensions": [{"Name": "InstanceId","Value": {"Ref": "RecoveryInstance"}}]
      }
    }
  }
}
```

### YAML
<a name="quickref-cloudwatch-example-3.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  RecoveryInstance:
    Description: The EC2 instance ID to associate this alarm with.
    Type: AWS::EC2::Instance::Id
Resources:
  RecoveryTestAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: Trigger a recovery when instance status check fails for 15
        consecutive minutes.
      Namespace: AWS/EC2
      MetricName: StatusCheckFailed_System
      Statistic: Minimum
      Period: '60'
      EvaluationPeriods: '15'
      ComparisonOperator: GreaterThanThreshold
      Threshold: '0'
      AlarmActions: [ !Sub "arn:aws:automate:${AWS::Region}:ec2:recover" ]
      Dimensions:
      - Name: InstanceId
        Value: !Ref: RecoveryInstance
```

## Erstellen eines grundlegenden Dashboards
<a name="cloudwatch-sample-dashboard-basic"></a>

Das folgende Beispiel erstellt ein einfaches CloudWatch Dashboard mit einem Metrik-Widget, das die CPU-Auslastung anzeigt, und einem Text-Widget, das eine Meldung anzeigt.

### JSON
<a name="quickref-cloudwatch-sample-dashboard-basic.json"></a>

```
{
    "BasicDashboard": {
        "Type": "AWS::CloudWatch::Dashboard",
        "Properties": {
            "DashboardName": "Dashboard1",
            "DashboardBody": "{\"widgets\":[{\"type\":\"metric\",\"x\":0,\"y\":0,\"width\":12,\"height\":6,\"properties\":{\"metrics\":[[\"AWS/EC2\",\"CPUUtilization\",\"InstanceId\",\"i-012345\"]],\"period\":300,\"stat\":\"Average\",\"region\":\"us-east-1\",\"title\":\"EC2 Instance CPU\"}},{\"type\":\"text\",\"x\":0,\"y\":7,\"width\":3,\"height\":3,\"properties\":{\"markdown\":\"Hello world\"}}]}"
        }
    }
}
```

### YAML
<a name="quickref-cloudwatch-sample-dashboard-basic.yaml"></a>

```
BasicDashboard:
  Type: AWS::CloudWatch::Dashboard
  Properties:
    DashboardName: Dashboard1
    DashboardBody: '{"widgets":[{"type":"metric","x":0,"y":0,"width":12,"height":6,"properties":{"metrics":[["AWS/EC2","CPUUtilization","InstanceId","i-012345"]],"period":300,"stat":"Average","region":"us-east-1","title":"EC2 Instance CPU"}},{"type":"text","x":0,"y":7,"width":3,"height":3,"properties":{"markdown":"Hello world"}}]}'
```

## Erstellen Sie ein Dashboard mit side-by-side Widgets
<a name="cloudwatch-sample-dashboard-sidebyside"></a>

Im folgenden Beispiel wird ein Dashboard mit zwei Metrik-Widgets erstellt, die nebeneinander angezeigt werden.

### JSON
<a name="quickref-cloudwatch-sample-dashboard-sidebyside.json"></a>

```
{
    "DashboardSideBySide": {
        "Type": "AWS::CloudWatch::Dashboard",
        "Properties": {
            "DashboardName": "Dashboard1",
            "DashboardBody": "{\"widgets\":[{\"type\":\"metric\",\"x\":0,\"y\":0,\"width\":12,\"height\":6,\"properties\":{\"metrics\":[[\"AWS/EC2\",\"CPUUtilization\",\"InstanceId\",\"i-012345\"]],\"period\":300,\"stat\":\"Average\",\"region\":\"us-east-1\",\"title\":\"EC2 Instance CPU\"}},{\"type\":\"metric\",\"x\":12,\"y\":0,\"width\":12,\"height\":6,\"properties\":{\"metrics\":[[\"AWS/S3\",\"BucketSizeBytes\",\"BucketName\",\"amzn-s3-demo-bucket\"]],\"period\":86400,\"stat\":\"Maximum\",\"region\":\"us-east-1\",\"title\":\"amzn-s3-demo-bucket bytes\"}}]}"
        }
    }
}
```

### YAML
<a name="quickref-cloudwatch-sample-dashboard-sidebysidequickref-cloudwatch-sample-dashboard-sidebyside.yaml"></a>

```
DashboardSideBySide:
  Type: AWS::CloudWatch::Dashboard
  Properties:
    DashboardName: Dashboard1
    DashboardBody: '{"widgets":[{"type":"metric","x":0,"y":0,"width":12,"height":6,"properties":{"metrics":[["AWS/EC2","CPUUtilization","InstanceId","i-012345"]],"period":300,"stat":"Average","region":"us-east-1","title":"EC2 Instance CPU"}},{"type":"metric","x":12,"y":0,"width":12,"height":6,"properties":{"metrics":[["AWS/S3","BucketSizeBytes","BucketName","amzn-s3-demo-bucket"]],"period":86400,"stat":"Maximum","region":"us-east-1","title":"amzn-s3-demo-bucket bytes"}}]}'
```

# Amazon CloudWatch Logs-Vorlagenausschnitte
<a name="quickref-cloudwatchlogs"></a>

Amazon CloudWatch Logs kann Ihr System, Ihre Anwendung und Ihre benutzerdefinierten Protokolldateien von Amazon EC2 EC2-Instances oder anderen Quellen überwachen. Sie können CloudFormation es verwenden, um Protokollgruppen und Metrikfilter bereitzustellen und zu verwalten. Weitere Informationen zu Amazon CloudWatch Logs finden Sie im [Amazon CloudWatch Logs-Benutzerhandbuch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html).

**Topics**
+ [Senden Sie Logs von einer Linux-Instance an CloudWatch Logs](#quickref-cloudwatchlogs-example1)
+ [Sendet CloudWatch Protokolle von einer Windows-Instanz an Logs](#quickref-cloudwatchlogs-example2)
+ [Weitere Informationen finden Sie auch unter](#w2aac11c41c35c11)

## Senden Sie Logs von einer Linux-Instance an CloudWatch Logs
<a name="quickref-cloudwatchlogs-example1"></a>

Die folgende Vorlage zeigt, wie Sie einen Webserver auf Amazon Linux 2023 mit CloudWatch Logs-Integration einrichten. Die Vorlage führt die folgenden Aufgaben aus:
+ Installiert Apache und PHP.
+ Konfiguriert den CloudWatch Agenten so, dass er CloudWatch Apache-Zugriffsprotokolle an Logs weiterleitet.
+ Richtet eine IAM-Rolle ein, damit der CloudWatch Agent Protokolldaten an CloudWatch Logs senden kann.
+ Erstellen Sie benutzerdefinierte Alarme und Benachrichtigungen zur Überwachung von 404-Fehlern oder hoher Bandbreitennutzung.

Protokollereignisse vom Webserver liefern Metrikdaten für CloudWatch Alarme. Die beiden Metrikfilter beschreiben, wie die Protokollinformationen in CloudWatch Metriken umgewandelt werden. Die 404-Metrik zählt die Zahl von 404-Vorkommnissen. Die Größenmetrik verfolgt die Größe einer Anforderung. Die beiden CloudWatch Alarme senden Benachrichtigungen, wenn innerhalb von 2 Minuten mehr als zwei 404-Sekunden eintreffen oder wenn die durchschnittliche Anforderungsgröße innerhalb von 10 Minuten über 3500 KB liegt.

### JSON
<a name="quickref-cloudwatchlogs-example.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Sample template that sets up and configures CloudWatch Logs on Amazon Linux 2023 instance.",
    "Parameters": {
        "KeyName": {
            "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instances",
            "Type": "AWS::EC2::KeyPair::KeyName",
            "ConstraintDescription": "must be the name of an existing EC2 KeyPair."
        },
        "SSHLocation": {
            "Description": "The IP address range that can be used to SSH to the EC2 instances",
            "Type": "String",
            "MinLength": "9",
            "MaxLength": "18",
            "Default": "0.0.0.0/0",
            "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
            "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x."
        },
        "OperatorEmail": {
            "Description": "Email address to notify when CloudWatch alarms are triggered (404 errors or high bandwidth usage)",
            "Type": "String"
        }
    },
    "Resources": {
        "LogRole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": [
                                    "ec2.amazonaws.com"
                                ]
                            },
                            "Action": [
                                "sts:AssumeRole"
                            ]
                        }
                    ]
                },
                "Path": "/",
                "Policies": [
                    {
                        "PolicyName": "LogRolePolicy",
                        "PolicyDocument": {
                            "Version": "2012-10-17",		 	 	 
                            "Statement": [
                                {
                                    "Effect": "Allow",
                                    "Action": [
                                        "logs:PutLogEvents",
                                        "logs:DescribeLogStreams",
                                        "logs:DescribeLogGroups",
                                        "logs:CreateLogGroup",
                                        "logs:CreateLogStream"
                                    ],
                                    "Resource": "*"
                                }
                            ]
                        }
                    }
                ]
            }
        },
        "LogRoleInstanceProfile": {
            "Type": "AWS::IAM::InstanceProfile",
            "Properties": {
                "Path": "/",
                "Roles": [{"Ref": "LogRole"}]
            }
        },
        "WebServerSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable HTTP access via port 80 and SSH access via port 22",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 80,
                        "ToPort": 80,
                        "CidrIp": "0.0.0.0/0"
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 22,
                        "ToPort": 22,
                        "CidrIp": {"Ref": "SSHLocation"}
                    }
                ]
            }
        },
        "WebServerHost": {
            "Type": "AWS::EC2::Instance",
            "Metadata": {
                "Comment": "Install a simple PHP application on Amazon Linux 2023",
                "AWS::CloudFormation::Init": {
                    "config": {
                        "packages": {
                            "dnf": {
                                "httpd": [],
                                "php": [],
                                "php-fpm": []
                            }
                        },
                        "files": {
                            "/etc/amazon-cloudwatch-agent/amazon-cloudwatch-agent.json": {
                                "content": {
                                    "logs": {
                                        "logs_collected": {
                                            "files": {
                                                "collect_list": [{
                                                    "file_path": "/var/log/httpd/access_log",
                                                    "log_group_name": {"Ref": "WebServerLogGroup"},
                                                    "log_stream_name": "{instance_id}/apache.log",
                                                    "timestamp_format": "%d/%b/%Y:%H:%M:%S %z"
                                                }]
                                            }
                                        }
                                    }
                                },
                                "mode": "000644",
                                "owner": "root",
                                "group": "root"
                            },
                            "/var/www/html/index.php": {
                                "content": "<?php\necho '<h1>AWS CloudFormation sample PHP application on Amazon Linux 2023</h1>';\n?>\n",
                                "mode": "000644",
                                "owner": "apache",
                                "group": "apache"
                            },
                            "/etc/cfn/cfn-hup.conf": {
                                "content":  {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "[main]\n",
                                            "stack=",
                                            {"Ref": "AWS::StackId"},
                                            "\n",
                                            "region=",
                                            {"Ref": "AWS::Region"},
                                            "\n"
                                        ]
                                    ]
                                },
                                "mode": "000400",
                                "owner": "root",
                                "group": "root"
                            },
                            "/etc/cfn/hooks.d/cfn-auto-reloader.conf": {
                                "content": {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "[cfn-auto-reloader-hook]\n",
                                            "triggers=post.update\n",
                                            "path=Resources.WebServerHost.Metadata.AWS::CloudFormation::Init\n",
                                            "action=/opt/aws/bin/cfn-init -s ",
                                            {"Ref": "AWS::StackId"},
                                            " -r WebServerHost ",
                                            " --region     ",
                                            {"Ref": "AWS::Region"},
                                            "\n",
                                            "runas=root\n"
                                        ]
                                    ]
                                }
                            }
                        },
                        "services": {
                            "systemd": {
                                "httpd": {
                                    "enabled": "true",
                                    "ensureRunning": "true"
                                },
                                "php-fpm": {
                                    "enabled": "true",
                                    "ensureRunning": "true"
                                }
                            }
                        }
                    }
                }
            },
            "CreationPolicy": {
                "ResourceSignal": {
                    "Timeout": "PT5M"
                }
            },
            "Properties": {
                "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}",
                "KeyName": {"Ref": "KeyName"},
                "InstanceType": "t3.micro",
                "SecurityGroupIds": [{"Ref": "WebServerSecurityGroup"}],
                "IamInstanceProfile": {"Ref": "LogRoleInstanceProfile"},
                "UserData": {"Fn::Base64": {"Fn::Join": [ "", [
                    "#!/bin/bash\n",
                    "dnf update -y aws-cfn-bootstrap\n",
                    "dnf install -y amazon-cloudwatch-agent\n",
                    "/opt/aws/bin/cfn-init -v --stack ", {"Ref": "AWS::StackName"}, " --resource WebServerHost --region ", {"Ref": "AWS::Region"}, "\n",
                    "\n",
                    "# Verify Apache log directory exists and create if needed\n",
                    "mkdir -p /var/log/httpd\n",
                    "\n",
                    "# Start CloudWatch agent\n",
                    "/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/etc/amazon-cloudwatch-agent/amazon-cloudwatch-agent.json -s\n",
                    "\n",
                    "# Signal success\n",
                    "/opt/aws/bin/cfn-signal -e $? --stack ", {"Ref": "AWS::StackName"}, " --resource WebServerHost --region ", {"Ref": "AWS::Region"}, "\n"
                ]]}}
            }
        },
        "WebServerLogGroup": {
            "Type": "AWS::Logs::LogGroup",
            "DeletionPolicy": "Retain",
            "UpdateReplacePolicy": "Retain",
            "Properties": {
                "RetentionInDays": 7
            }
        },
        "404MetricFilter": {
            "Type": "AWS::Logs::MetricFilter",
            "Properties": {
                "LogGroupName": {"Ref": "WebServerLogGroup"},
                "FilterPattern": "[ip, identity, user_id, timestamp, request, status_code = 404, size, ...]",
                "MetricTransformations": [
                    {
                        "MetricValue": "1",
                        "MetricNamespace": "test/404s",
                        "MetricName": "test404Count"
                    }
                ]
            }
        },
        "BytesTransferredMetricFilter": {
            "Type": "AWS::Logs::MetricFilter",
            "Properties": {
                "LogGroupName": {"Ref": "WebServerLogGroup"},
                "FilterPattern": "[ip, identity, user_id, timestamp, request, status_code, size, ...]",
                "MetricTransformations": [
                    {
                        "MetricValue": "$size",
                        "MetricNamespace": "test/BytesTransferred",
                        "MetricName": "testBytesTransferred"
                    }
                ]
            }
        },
        "404Alarm": {
            "Type": "AWS::CloudWatch::Alarm",
            "Properties": {
                "AlarmDescription": "The number of 404s is greater than 2 over 2 minutes",
                "MetricName": "test404Count",
                "Namespace": "test/404s",
                "Statistic": "Sum",
                "Period": "60",
                "EvaluationPeriods": "2",
                "Threshold": "2",
                "AlarmActions": [{"Ref": "AlarmNotificationTopic"}],
                "ComparisonOperator": "GreaterThanThreshold"
            }
        },
        "BandwidthAlarm": {
            "Type": "AWS::CloudWatch::Alarm",
            "Properties": {
                "AlarmDescription": "The average volume of traffic is greater 3500 KB over 10 minutes",
                "MetricName": "testBytesTransferred",
                "Namespace": "test/BytesTransferred",
                "Statistic": "Average",
                "Period": "300",
                "EvaluationPeriods": "2",
                "Threshold": "3500",
                "AlarmActions": [{"Ref": "AlarmNotificationTopic"}],
                "ComparisonOperator": "GreaterThanThreshold"
            }
        },
        "AlarmNotificationTopic": {
            "Type": "AWS::SNS::Topic",
            "Properties": {
                "Subscription": [{"Endpoint": {"Ref": "OperatorEmail"}, "Protocol": "email"}]
            }
        }
    },
    "Outputs": {
        "InstanceId": {
            "Description": "The instance ID of the web server",
            "Value": {"Ref": "WebServerHost"}
        },
        "WebsiteURL": {
            "Value": {"Fn::Sub": "http://${WebServerHost.PublicDnsName}"},
            "Description": "URL for the web server"
        },
        "PublicIP": {
            "Description": "Public IP address of the web server",
            "Value": {"Fn::GetAtt": ["WebServerHost","PublicIp"]
            }
        },
        "CloudWatchLogGroupName": {
            "Description": "The name of the CloudWatch log group",
            "Value": {"Ref": "WebServerLogGroup"}
        }
    }
}
```

### YAML
<a name="quickref-cloudwatchlogs-example.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Description: Sample template that sets up and configures CloudWatch Logs on Amazon Linux 2023 instance.
Parameters:
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instances
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  OperatorEmail:
    Description: Email address to notify when CloudWatch alarms are triggered (404 errors or high bandwidth usage)
    Type: String
Resources:
  LogRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17		 	 	 
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Path: /
      Policies:
        - PolicyName: LogRolePolicy
          PolicyDocument:
            Version: 2012-10-17		 	 	 
            Statement:
              - Effect: Allow
                Action:
                  - 'logs:PutLogEvents'
                  - 'logs:DescribeLogStreams'
                  - 'logs:DescribeLogGroups'
                  - 'logs:CreateLogGroup'
                  - 'logs:CreateLogStream'
                Resource: '*'
  LogRoleInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles:
        - !Ref LogRole
  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80 and SSH access via port 22
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref SSHLocation
  WebServerHost:
    Type: AWS::EC2::Instance
    Metadata:
      Comment: Install a simple PHP application on Amazon Linux 2023
      'AWS::CloudFormation::Init':
        config:
          packages:
            dnf:
              httpd: []
              php: []
              php-fpm: []
          files:
            /etc/amazon-cloudwatch-agent/amazon-cloudwatch-agent.json:
              content: !Sub |
                {
                  "logs": {
                    "logs_collected": {
                      "files": {
                        "collect_list": [
                          {
                            "file_path": "/var/log/httpd/access_log",
                            "log_group_name": "${WebServerLogGroup}",
                            "log_stream_name": "{instance_id}/apache.log",
                            "timestamp_format": "%d/%b/%Y:%H:%M:%S %z"
                          }
                        ]
                      }
                    }
                  }
                }
              mode: '000644'
              owner: root
              group: root
            /var/www/html/index.php:
              content: |
                <?php echo '<h1>AWS CloudFormation sample PHP application on Amazon Linux 2023</h1>';
                ?>
              mode: '000644'
              owner: apache
              group: apache
            /etc/cfn/cfn-hup.conf:
              content: !Sub |
                [main]
                stack=${AWS::StackId}
                region=${AWS::Region}
              mode: '000400'
              owner: root
              group: root
            /etc/cfn/hooks.d/cfn-auto-reloader.conf:
              content: !Sub |
                [cfn-auto-reloader-hook]
                triggers=post.update
                path=Resources.WebServerHost.Metadata.AWS::CloudFormation::Init
                action=/opt/aws/bin/cfn-init -s ${AWS::StackId} -r WebServerHost --region ${AWS::Region}
                runas=root
          services:
            systemd:
              httpd:
                enabled: 'true'
                ensureRunning: 'true'
              php-fpm:
                enabled: 'true'
                ensureRunning: 'true'
    CreationPolicy:
      ResourceSignal:
        Timeout: PT5M
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64}}'
      KeyName: !Ref KeyName
      InstanceType: t3.micro
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      IamInstanceProfile: !Ref LogRoleInstanceProfile
      UserData: !Base64
        Fn::Sub: |
          #!/bin/bash
          dnf update -y aws-cfn-bootstrap
          dnf install -y amazon-cloudwatch-agent
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServerHost --region ${AWS::Region}
          
          # Verify Apache log directory exists and create if needed
          mkdir -p /var/log/httpd
          
          # Start CloudWatch agent
          /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/etc/amazon-cloudwatch-agent/amazon-cloudwatch-agent.json -s
          
          # Signal success
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerHost --region ${AWS::Region}
          echo "Done"
  WebServerLogGroup:
    Type: AWS::Logs::LogGroup
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
    Properties:
      RetentionInDays: 7
  404MetricFilter:
    Type: AWS::Logs::MetricFilter
    Properties:
      LogGroupName: !Ref WebServerLogGroup
      FilterPattern: >-
        [ip, identity, user_id, timestamp, request, status_code = 404, size, ...]
      MetricTransformations:
        - MetricValue: '1'
          MetricNamespace: test/404s
          MetricName: test404Count
  BytesTransferredMetricFilter:
    Type: AWS::Logs::MetricFilter
    Properties:
      LogGroupName: !Ref WebServerLogGroup
      FilterPattern: '[ip, identity, user_id, timestamp, request, status_code, size, ...]'
      MetricTransformations:
        - MetricValue: $size
          MetricNamespace: test/BytesTransferred
          MetricName: testBytesTransferred
  404Alarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: The number of 404s is greater than 2 over 2 minutes
      MetricName: test404Count
      Namespace: test/404s
      Statistic: Sum
      Period: '60'
      EvaluationPeriods: '2'
      Threshold: '2'
      AlarmActions:
        - !Ref AlarmNotificationTopic
      ComparisonOperator: GreaterThanThreshold
  BandwidthAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: The average volume of traffic is greater 3500 KB over 10 minutes
      MetricName: testBytesTransferred
      Namespace: test/BytesTransferred
      Statistic: Average
      Period: '300'
      EvaluationPeriods: '2'
      Threshold: '3500'
      AlarmActions:
        - !Ref AlarmNotificationTopic
      ComparisonOperator: GreaterThanThreshold
  AlarmNotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint: !Ref OperatorEmail
          Protocol: email
Outputs:
  InstanceId:
    Description: The instance ID of the web server
    Value: !Ref WebServerHost
  WebsiteURL:
    Value: !Sub 'http://${WebServerHost.PublicDnsName}'
    Description: URL for the web server
  PublicIP:
    Description: Public IP address of the web server
    Value: !GetAtt WebServerHost.PublicIp
  CloudWatchLogGroupName:
    Description: The name of the CloudWatch log group
    Value: !Ref WebServerLogGroup
```

## Sendet CloudWatch Protokolle von einer Windows-Instanz an Logs
<a name="quickref-cloudwatchlogs-example2"></a>

Die folgende Vorlage konfiguriert CloudWatch Logs für eine Windows 2012R2-Instanz.

Der CloudWatch Logs-Agent unter Windows (SSM-Agent unter Windows 2012R2 und Windows 2016 AMIs) sendet Protokolle erst, nachdem er gestartet wurde, sodass alle Protokolle, die vor dem Start generiert wurden, nicht gesendet werden. Um dieses Problem zu umgehen, hilft die Vorlage folgendermaßen dabei, sicherzustellen, dass der Agent gestartet wird, bevor Protokolle geschrieben werden:
+ Konfigurieren der Agent-Einrichtung als erstes `config`-Element in cfn-init `configSets`.
+ Einfügen einer Pause mit `waitAfterCompletion` nach dem Befehl zum Starten des Agents.

### JSON
<a name="quickref-cloudwatchlogs-example2.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Sample template that sets up and configures CloudWatch Logs on Windows 2012R2 instance.",
    "Parameters": {
        "KeyPair": {
            "Description": "Name of an existing EC2 KeyPair to enable RDP access to the instances",
            "Type": "AWS::EC2::KeyPair::KeyName",
            "ConstraintDescription": "must be the name of an existing EC2 KeyPair."
        },
        "RDPLocation": {
            "Description": "The IP address range that can be used to RDP to the EC2 instances",
            "Type": "String",
            "MinLength": "9",
            "MaxLength": "18",
            "Default": "0.0.0.0/0",
            "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
            "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x."
        },
        "OperatorEmail": {
            "Description": "Email address to notify when CloudWatch alarms are triggered (404 errors)",
            "Type": "String"
        }
    },
    "Resources": {
        "WebServerSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Enable HTTP access via port 80 and RDP access via port 3389",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "80",
                        "ToPort": "80",
                        "CidrIp": "0.0.0.0/0"
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "3389",
                        "ToPort": "3389",
                        "CidrIp": {"Ref": "RDPLocation"}
                    }
                ]
            }
        },
        "LogRole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": [
                                    "ec2.amazonaws.com"
                                ]
                            },
                            "Action": [
                                "sts:AssumeRole"
                            ]
                        }
                    ]
                },
                "ManagedPolicyArns": [
                    "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
                ],
                "Path": "/",
                "Policies": [
                    {
                        "PolicyName": "LogRolePolicy",
                        "PolicyDocument": {
                            "Version": "2012-10-17",		 	 	 
                            "Statement": [
                                {
                                    "Effect": "Allow",
                                    "Action": [
                                        "logs:Create*",
                                        "logs:PutLogEvents",
                                        "s3:GetObject"
                                    ],
                                    "Resource": [
                                        "arn:aws:logs:*:*:*",
                                        "arn:aws:s3:::*"
                                    ]
                                }
                            ]
                        }
                    }
                ]
            }
        },
        "LogRoleInstanceProfile": {
            "Type": "AWS::IAM::InstanceProfile",
            "Properties": {
                "Path": "/",
                "Roles": [{"Ref": "LogRole"}]
            }
        },
        "WebServerHost": {
            "Type": "AWS::EC2::Instance",
            "CreationPolicy": {
                "ResourceSignal": {
                    "Timeout": "PT15M"
                }
            },
            "Metadata": {
                "AWS::CloudFormation::Init": {
                    "configSets": {
                        "config": [
                            "00-ConfigureCWLogs",
                            "01-InstallWebServer",
                            "02-ConfigureApplication",
                            "03-Finalize"
                        ]
                    },
                    "00-ConfigureCWLogs": {
                        "files": {
                            "C:\\Program Files\\Amazon\\SSM\\Plugins\\awsCloudWatch\\AWS.EC2.Windows.CloudWatch.json": {
                                "content": {
                                    "EngineConfiguration": {
                                        "Components": [
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "ApplicationEventLog",
                                                "Parameters": {
                                                    "Levels": "7",
                                                    "LogName": "Application"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "SystemEventLog",
                                                "Parameters": {
                                                    "Levels": "7",
                                                    "LogName": "System"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "SecurityEventLog",
                                                "Parameters": {
                                                    "Levels": "7",
                                                    "LogName": "Security"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "EC2ConfigLog",
                                                "Parameters": {
                                                    "CultureName": "en-US",
                                                    "Encoding": "ASCII",
                                                    "Filter": "EC2ConfigLog.txt",
                                                    "LogDirectoryPath": "C:\\Program Files\\Amazon\\Ec2ConfigService\\Logs",
                                                    "TimeZoneKind": "UTC",
                                                    "TimestampFormat": "yyyy-MM-ddTHH:mm:ss.fffZ:"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CfnInitLog",
                                                "Parameters": {
                                                    "CultureName": "en-US",
                                                    "Encoding": "ASCII",
                                                    "Filter": "cfn-init.log",
                                                    "LogDirectoryPath": "C:\\cfn\\log",
                                                    "TimeZoneKind": "Local",
                                                    "TimestampFormat": "yyyy-MM-dd HH:mm:ss,fff"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "IISLogs",
                                                "Parameters": {
                                                    "CultureName": "en-US",
                                                    "Encoding": "UTF-8",
                                                    "Filter": "",
                                                    "LineCount": "3",
                                                    "LogDirectoryPath": "C:\\inetpub\\logs\\LogFiles\\W3SVC1",
                                                    "TimeZoneKind": "UTC",
                                                    "TimestampFormat": "yyyy-MM-dd HH:mm:ss"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "MemoryPerformanceCounter",
                                                "Parameters": {
                                                    "CategoryName": "Memory",
                                                    "CounterName": "Available MBytes",
                                                    "DimensionName": "",
                                                    "DimensionValue": "",
                                                    "InstanceName": "",
                                                    "MetricName": "Memory",
                                                    "Unit": "Megabytes"
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchApplicationEventLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/ApplicationEventLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchSystemEventLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/SystemEventLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchSecurityEventLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/SecurityEventLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchEC2ConfigLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/EC2ConfigLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchCfnInitLog",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/CfnInitLog",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatchIISLogs",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "LogGroup": {"Ref": "LogGroup"},
                                                    "LogStream": "{instance_id}/IISLogs",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            },
                                            {
                                                "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatch.CloudWatchOutputComponent,AWS.EC2.Windows.CloudWatch",
                                                "Id": "CloudWatch",
                                                "Parameters": {
                                                    "AccessKey": "",
                                                    "NameSpace": "Windows/Default",
                                                    "Region": {"Ref": "AWS::Region"},
                                                    "SecretKey": ""
                                                }
                                            }
                                        ],
                                        "Flows": {
                                            "Flows": [
                                                "ApplicationEventLog,CloudWatchApplicationEventLog",
                                                "SystemEventLog,CloudWatchSystemEventLog",
                                                "SecurityEventLog,CloudWatchSecurityEventLog",
                                                "EC2ConfigLog,CloudWatchEC2ConfigLog",
                                                "CfnInitLog,CloudWatchCfnInitLog",
                                                "IISLogs,CloudWatchIISLogs",
                                                "MemoryPerformanceCounter,CloudWatch"
                                            ]
                                        },
                                        "PollInterval": "00:00:05"
                                    },
                                    "IsEnabled": true
                                }
                            }
                        },
                        "commands": {
                            "0-enableSSM": {
                                "command": "powershell.exe -Command \"Set-Service -Name AmazonSSMAgent -StartupType Automatic\" ",
                                "waitAfterCompletion": "0"
                            },
                            "1-restartSSM": {
                                "command": "powershell.exe -Command \"Restart-Service AmazonSSMAgent \"",
                                "waitAfterCompletion": "30"
                            }
                        }
                    },
                    "01-InstallWebServer": {
                        "commands": {
                            "01_install_webserver": {
                                "command": "powershell.exe -Command \"Install-WindowsFeature Web-Server  -IncludeAllSubFeature\"",
                                "waitAfterCompletion": "0"
                            }
                        }
                    },
                    "02-ConfigureApplication": {
                        "files": {
                            "c:\\Inetpub\\wwwroot\\index.htm": {
                                "content": "<html> <head> <title>Test Application Page</title> </head> <body> <h1>Congratulations!! Your IIS server is configured.</h1> </body> </html>"
                            }
                        }
                    },
                    "03-Finalize": {
                        "commands": {
                            "00_signal_success": {
                                "command": {
                                    "Fn::Sub": "cfn-signal.exe -e 0 --resource WebServerHost --stack ${AWS::StackName} --region ${AWS::Region}"
                                },
                                "waitAfterCompletion": "0"
                            }
                        }
                    }
                }
            },
            "Properties": {
                "KeyName": {
                    "Ref": "KeyPair"
                },
                "ImageId": "{{resolve:ssm:/aws/service/ami-windows-latest/Windows_Server-2012-R2_RTM-English-64Bit-Base}}",
                "InstanceType": "t2.xlarge",
                "SecurityGroupIds": [{"Ref": "WebServerSecurityGroup"}],
                "IamInstanceProfile": {"Ref": "LogRoleInstanceProfile"},
                "UserData": {
                    "Fn::Base64": {
                        "Fn::Join": [
                            "",
                            [
                                "<script>\n",
                                "wmic product where \"description='Amazon SSM Agent' \" uninstall\n",
                                "wmic product where \"description='aws-cfn-bootstrap' \" uninstall \n",
                                "start /wait c:\\Windows\\system32\\msiexec /passive /qn /i https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-win64-latest.msi\n",
                                "powershell.exe -Command \"iwr https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/windows_amd64/AmazonSSMAgentSetup.exe  -UseBasicParsing -OutFile C:\\AmazonSSMAgentSetup.exe\"\n",
                                "start /wait C:\\AmazonSSMAgentSetup.exe /install /quiet\n",
                                "cfn-init.exe -v -c config -s ", {"Ref": "AWS::StackName"}, " --resource WebServerHost --region ", {"Ref": "AWS::Region"}, " \n",
                                "</script>\n"
                            ]
                        ]
                    }
                }
            }
        },
        "LogGroup": {
            "Type": "AWS::Logs::LogGroup",
            "Properties": {
                "RetentionInDays": 7
            }
        },
        "404MetricFilter": {
            "Type": "AWS::Logs::MetricFilter",
            "Properties": {
                "LogGroupName": {"Ref": "LogGroup"},
                "FilterPattern": "[timestamps, serverip, method, uri, query, port, dash, clientip, useragent, status_code = 404, ...]",
                "MetricTransformations": [
                    {
                        "MetricValue": "1",
                        "MetricNamespace": "test/404s",
                        "MetricName": "test404Count"
                    }
                ]
            }
        },
        "404Alarm": {
            "Type": "AWS::CloudWatch::Alarm",
            "Properties": {
                "AlarmDescription": "The number of 404s is greater than 2 over 2 minutes",
                "MetricName": "test404Count",
                "Namespace": "test/404s",
                "Statistic": "Sum",
                "Period": "60",
                "EvaluationPeriods": "2",
                "Threshold": "2",
                "AlarmActions": [{"Ref": "AlarmNotificationTopic"}],
                "ComparisonOperator": "GreaterThanThreshold"
            }
        },
        "AlarmNotificationTopic": {
            "Type": "AWS::SNS::Topic",
            "Properties": {
                "Subscription": [{"Endpoint": {"Ref": "OperatorEmail"}, "Protocol": "email"}]
            }
        }
    },
    "Outputs": {
        "InstanceId": {
            "Description": "The instance ID of the web server",
            "Value": {"Ref": "WebServerHost"}
        },
        "WebsiteURL": {
            "Value": {"Fn::Sub": "http://${WebServerHost.PublicDnsName}"},
            "Description": "URL for the web server"
        },
        "PublicIP": {
            "Description": "Public IP address of the web server",
            "Value": {"Fn::GetAtt": ["WebServerHost","PublicIp"]}
        },
        "CloudWatchLogGroupName": {
            "Description": "The name of the CloudWatch log group",
            "Value": {"Ref": "LogGroup"}
        }
    }
}
```

### YAML
<a name="quickref-cloudwatchlogs-example2.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Description: >-
  Sample template that sets up and configures CloudWatch Logs on Windows 2012R2 instance.
Parameters:
  KeyPair:
    Description: Name of an existing EC2 KeyPair to enable RDP access to the instances
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  RDPLocation:
    Description: The IP address range that can be used to RDP to the EC2 instances
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: '(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})'
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  OperatorEmail:
    Description: Email address to notify when CloudWatch alarms are triggered (404 errors)
    Type: String
Resources:
  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable HTTP access via port 80 and RDP access via port 3389
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '80'
          ToPort: '80'
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: '3389'
          ToPort: '3389'
          CidrIp: !Ref RDPLocation
  LogRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17		 	 	 
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore'
      Path: /
      Policies:
        - PolicyName: LogRolePolicy
          PolicyDocument:
            Version: 2012-10-17		 	 	 
            Statement:
              - Effect: Allow
                Action:
                  - 'logs:Create*'
                  - 'logs:PutLogEvents'
                  - 's3:GetObject'
                Resource:
                  - 'arn:aws:logs:*:*:*'
                  - 'arn:aws:s3:::*'
  LogRoleInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles:
        - !Ref LogRole
  WebServerHost:
    Type: AWS::EC2::Instance
    CreationPolicy:
      ResourceSignal:
        Timeout: PT15M
    Metadata:
      'AWS::CloudFormation::Init':
        configSets:
          config:
            - 00-ConfigureCWLogs
            - 01-InstallWebServer
            - 02-ConfigureApplication
            - 03-Finalize
        00-ConfigureCWLogs:
          files:
            'C:\Program Files\Amazon\SSM\Plugins\awsCloudWatch\AWS.EC2.Windows.CloudWatch.json':
              content: !Sub |
                {
                  "EngineConfiguration": {
                      "Components": [
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "ApplicationEventLog",
                              "Parameters": {
                                  "Levels": "7",
                                  "LogName": "Application"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "SystemEventLog",
                              "Parameters": {
                                  "Levels": "7",
                                  "LogName": "System"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "SecurityEventLog",
                              "Parameters": {
                                  "Levels": "7",
                                  "LogName": "Security"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "EC2ConfigLog",
                              "Parameters": {
                                  "CultureName": "en-US",
                                  "Encoding": "ASCII",
                                  "Filter": "EC2ConfigLog.txt",
                                  "LogDirectoryPath": "C:\\Program Files\\Amazon\\Ec2ConfigService\\Logs",
                                  "TimeZoneKind": "UTC",
                                  "TimestampFormat": "yyyy-MM-ddTHH:mm:ss.fffZ:"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "CfnInitLog",
                              "Parameters": {
                                  "CultureName": "en-US",
                                  "Encoding": "ASCII",
                                  "Filter": "cfn-init.log",
                                  "LogDirectoryPath": "C:\\cfn\\log",
                                  "TimeZoneKind": "Local",
                                  "TimestampFormat": "yyyy-MM-dd HH:mm:ss,fff"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CustomLog.CustomLogInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "IISLogs",
                              "Parameters": {
                                  "CultureName": "en-US",
                                  "Encoding": "UTF-8",
                                  "Filter": "",
                                  "LineCount": "3",
                                  "LogDirectoryPath": "C:\\inetpub\\logs\\LogFiles\\W3SVC1",
                                  "TimeZoneKind": "UTC",
                                  "TimestampFormat": "yyyy-MM-dd HH:mm:ss"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "MemoryPerformanceCounter",
                              "Parameters": {
                                  "CategoryName": "Memory",
                                  "CounterName": "Available MBytes",
                                  "DimensionName": "",
                                  "DimensionValue": "",
                                  "InstanceName": "",
                                  "MetricName": "Memory",
                                  "Unit": "Megabytes"
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchApplicationEventLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/ApplicationEventLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchSystemEventLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/SystemEventLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchSecurityEventLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/SecurityEventLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchEC2ConfigLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/EC2ConfigLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchCfnInitLog",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/CfnInitLog",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatchIISLogs",
                              "Parameters": {
                                  "AccessKey": "",
                                  "LogGroup": "${LogGroup}",
                                  "LogStream": "{instance_id}/IISLogs",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          },
                          {
                              "FullName": "AWS.EC2.Windows.CloudWatch.CloudWatch.CloudWatchOutputComponent,AWS.EC2.Windows.CloudWatch",
                              "Id": "CloudWatch",
                              "Parameters": {
                                  "AccessKey": "",
                                  "NameSpace": "Windows/Default",
                                  "Region": "${AWS::Region}",
                                  "SecretKey": ""
                              }
                          }
                      ],
                      "Flows": {
                          "Flows": [
                              "ApplicationEventLog,CloudWatchApplicationEventLog",
                              "SystemEventLog,CloudWatchSystemEventLog",
                              "SecurityEventLog,CloudWatchSecurityEventLog",
                              "EC2ConfigLog,CloudWatchEC2ConfigLog",
                              "CfnInitLog,CloudWatchCfnInitLog",
                              "IISLogs,CloudWatchIISLogs",
                              "MemoryPerformanceCounter,CloudWatch"
                          ]
                      },
                      "PollInterval": "00:00:05"
                  },
                  "IsEnabled": true
                }
          commands:
            0-enableSSM:
              command: >-
                powershell.exe -Command "Set-Service -Name AmazonSSMAgent
                -StartupType Automatic" 
              waitAfterCompletion: '0'
            1-restartSSM:
              command: powershell.exe -Command "Restart-Service AmazonSSMAgent "
              waitAfterCompletion: '30'
        01-InstallWebServer:
          commands:
            01_install_webserver:
              command: >-
                powershell.exe -Command "Install-WindowsFeature Web-Server 
                -IncludeAllSubFeature"
              waitAfterCompletion: '0'
        02-ConfigureApplication:
          files:
            'c:\Inetpub\wwwroot\index.htm':
              content: >-
                <html> <head> <title>Test Application Page</title> </head>
                <body> <h1>Congratulations !! Your IIS server is
                configured.</h1> </body> </html>
        03-Finalize:
          commands:
            00_signal_success:
              command: !Sub >-
                cfn-signal.exe -e 0 --resource WebServerHost --stack
                ${AWS::StackName} --region ${AWS::Region}
              waitAfterCompletion: '0'
    Properties:
      KeyName: !Ref KeyPair
      ImageId: "{{resolve:ssm:/aws/service/ami-windows-latest/Windows_Server-2012-R2_RTM-English-64Bit-Base}}"
      InstanceType: t2.xlarge
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      IamInstanceProfile: !Ref LogRoleInstanceProfile
      UserData: !Base64 
        'Fn::Sub': >
          <script>

          wmic product where "description='Amazon SSM Agent' " uninstall

          wmic product where "description='aws-cfn-bootstrap' " uninstall 

          start /wait c:\\Windows\\system32\\msiexec /passive /qn /i
          https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-win64-latest.msi

          powershell.exe -Command "iwr
          https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/windows_amd64/AmazonSSMAgentSetup.exe 
          -UseBasicParsing -OutFile C:\\AmazonSSMAgentSetup.exe"

          start /wait C:\\AmazonSSMAgentSetup.exe /install /quiet

          cfn-init.exe -v -c config -s ${AWS::StackName} --resource
          WebServerHost --region ${AWS::Region} 

          </script>
  LogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      RetentionInDays: 7
  404MetricFilter:
    Type: AWS::Logs::MetricFilter
    Properties:
      LogGroupName: !Ref LogGroup
      FilterPattern: >-
        [timestamps, serverip, method, uri, query, port, dash, clientip,
        useragent, status_code = 404, ...]
      MetricTransformations:
        - MetricValue: '1'
          MetricNamespace: test/404s
          MetricName: test404Count
  404Alarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: The number of 404s is greater than 2 over 2 minutes
      MetricName: test404Count
      Namespace: test/404s
      Statistic: Sum
      Period: '60'
      EvaluationPeriods: '2'
      Threshold: '2'
      AlarmActions:
        - !Ref AlarmNotificationTopic
      ComparisonOperator: GreaterThanThreshold
  AlarmNotificationTopic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription:
        - Endpoint: !Ref OperatorEmail
          Protocol: email
Outputs:
  InstanceId:
    Description: The instance ID of the web server
    Value: !Ref WebServerHost
  WebsiteURL:
    Value: !Sub 'http://${WebServerHost.PublicDnsName}'
    Description: URL for the web server
  PublicIP:
    Description: Public IP address of the web server
    Value: !GetAtt 
      - WebServerHost
      - PublicIp
  CloudWatchLogGroupName:
    Description: The name of the CloudWatch log group
    Value: !Ref LogGroup
```

## Weitere Informationen finden Sie auch unter
<a name="w2aac11c41c35c11"></a>

Weitere Informationen zu CloudWatch Logs-Ressourcen finden Sie unter oder. [AWS::Logs::LogGroup[AWS::Logs::MetricFilter](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-logs-metricfilter.html)](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-logs-loggroup.html)

# Amazon DynamoDB-Vorlagenausschnitte
<a name="quickref-dynamodb"></a>

**Topics**
+ [Auto Scaling von Anwendungen mit einer Amazon DynamoDB-Tabelle](#quickref-dynamodb-application-autoscaling)
+ [Weitere Informationen finden Sie auch unter](#w2aac11c41c39b7)

## Auto Scaling von Anwendungen mit einer Amazon DynamoDB-Tabelle
<a name="quickref-dynamodb-application-autoscaling"></a>

In diesem Beispiel wird Application Auto Scaling für eine `AWS::DynamoDB::Table`-Ressource eingerichtet. Die Vorlage definiert eine `TargetTrackingScaling`-Skalierungsrichtline, die den `WriteCapacityUnits`-Durchsatz für die Tabelle skaliert.

### JSON
<a name="quickref-dynamodb-example.json"></a>

```
{
    "Resources": {
        "DDBTable": {
            "Type": "AWS::DynamoDB::Table",
            "Properties": {
                "AttributeDefinitions": [
                    {
                        "AttributeName": "ArtistId",
                        "AttributeType": "S"
                    },
                    {
                        "AttributeName": "Concert",
                        "AttributeType": "S"
                    },
                    {
                        "AttributeName": "TicketSales",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema": [
                    {
                        "AttributeName": "ArtistId",
                        "KeyType": "HASH"
                    },
                    {
                        "AttributeName": "Concert",
                        "KeyType": "RANGE"
                    }
                ],
                "GlobalSecondaryIndexes": [
                    {
                        "IndexName": "GSI",
                        "KeySchema": [
                            {
                                "AttributeName": "TicketSales",
                                "KeyType": "HASH"
                            }
                        ],
                        "Projection": {
                            "ProjectionType": "KEYS_ONLY"
                        },
                        "ProvisionedThroughput": {
                            "ReadCapacityUnits": 5,
                            "WriteCapacityUnits": 5
                        }
                    }
                ],
                "ProvisionedThroughput": {
                    "ReadCapacityUnits": 5,
                    "WriteCapacityUnits": 5
                }
            }
        },
        "WriteCapacityScalableTarget": {
            "Type": "AWS::ApplicationAutoScaling::ScalableTarget",
            "Properties": {
                "MaxCapacity": 15,
                "MinCapacity": 5,
                "ResourceId": {
                    "Fn::Join": [
                        "/",
                        [
                            "table",
                            {
                                "Ref": "DDBTable"
                            }
                        ]
                    ]
                },
                "RoleARN" : { "Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable" },
                "ScalableDimension": "dynamodb:table:WriteCapacityUnits",
                "ServiceNamespace": "dynamodb"
            }
        },
        "WriteScalingPolicy": {
            "Type": "AWS::ApplicationAutoScaling::ScalingPolicy",
            "Properties": {
                "PolicyName": "WriteAutoScalingPolicy",
                "PolicyType": "TargetTrackingScaling",
                "ScalingTargetId": {
                    "Ref": "WriteCapacityScalableTarget"
                },
                "TargetTrackingScalingPolicyConfiguration": {
                    "TargetValue": 50,
                    "ScaleInCooldown": 60,
                    "ScaleOutCooldown": 60,
                    "PredefinedMetricSpecification": {
                        "PredefinedMetricType": "DynamoDBWriteCapacityUtilization"
                    }
                }
            }
        }
    }
}
```

### YAML
<a name="quickref-dynamodb-example.yaml"></a>

```
Resources:
  DDBTable:
    Type: AWS::DynamoDB::Table
    Properties:
      AttributeDefinitions:
        - AttributeName: "ArtistId"
          AttributeType: "S"
        - AttributeName: "Concert"
          AttributeType: "S"
        - AttributeName: "TicketSales"
          AttributeType: "S"
      KeySchema:
        - AttributeName: "ArtistId"
          KeyType: "HASH"
        - AttributeName: "Concert"
          KeyType: "RANGE"
      GlobalSecondaryIndexes:
        - IndexName: "GSI"
          KeySchema:
            - AttributeName: "TicketSales"
              KeyType: "HASH"
          Projection:
            ProjectionType: "KEYS_ONLY"
          ProvisionedThroughput:
            ReadCapacityUnits: 5
            WriteCapacityUnits: 5
      ProvisionedThroughput:
        ReadCapacityUnits: 5
        WriteCapacityUnits: 5
  WriteCapacityScalableTarget:
    Type: AWS::ApplicationAutoScaling::ScalableTarget
    Properties:
      MaxCapacity: 15
      MinCapacity: 5
      ResourceId: !Join
        - /
        - - table
          - !Ref DDBTable
      RoleARN:
        Fn::Sub: 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable'
      ScalableDimension: dynamodb:table:WriteCapacityUnits
      ServiceNamespace: dynamodb
  WriteScalingPolicy:
    Type: AWS::ApplicationAutoScaling::ScalingPolicy
    Properties:
      PolicyName: WriteAutoScalingPolicy
      PolicyType: TargetTrackingScaling
      ScalingTargetId: !Ref WriteCapacityScalableTarget
      TargetTrackingScalingPolicyConfiguration:
        TargetValue: 50.0
        ScaleInCooldown: 60
        ScaleOutCooldown: 60
        PredefinedMetricSpecification:
          PredefinedMetricType: DynamoDBWriteCapacityUtilization
```

## Weitere Informationen finden Sie auch unter
<a name="w2aac11c41c39b7"></a>

Weitere Informationen finden Sie im Blogbeitrag [How to use CloudFormation to configure auto scaling for DynamoDB tables and indexes](https://aws.amazon.com/blogs/database/how-to-use-aws-cloudformation-to-configure-auto-scaling-for-amazon-dynamodb-tables-and-indexes/) im AWS Datenbank-Blog.

Weitere Informationen zu DynamoDB-Ressourcen finden Sie unter. [AWS::DynamoDB::Table](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-dynamodb-table.html)

# EC2 CloudFormation Amazon-Vorlagenschnipsel
<a name="quickref-ec2"></a>

Amazon EC2 bietet skalierbare Rechenkapazität in der AWS Cloud. Sie können Amazon verwenden EC2 , um so viele oder so wenige virtuelle Server zu starten, wie Sie benötigen, Sicherheit und Netzwerke zu konfigurieren und Speicher zu verwalten. Diese virtuellen Server, die als Instances bezeichnet werden, können eine Vielzahl von Betriebssystemen und Anwendungen ausführen und sind an Ihre jeweiligen Anforderungen anpassbar. Amazon EC2 ermöglicht es Ihnen, nach oben oder unten zu skalieren, um Änderungen der Anforderungen oder Nutzungsspitzen zu bewältigen.

Mithilfe von CloudFormation Vorlagen können Sie EC2 Amazon-Instances als Teil Ihrer Infrastruktur definieren und bereitstellen. Vorlagen machen es einfach, den Einsatz von EC2 Amazon-Ressourcen wiederholbar und konsistent zu verwalten und zu automatisieren. 

Die folgenden Beispielvorlagen beschreiben CloudFormation Ressourcen oder Komponenten für Amazon. EC2 Diese Ausschnitte sind für die Integration in eine Vorlage gedacht, nicht für eine unabhängige Ausführung.

**Topics**
+ [Konfigurieren von EC2-Instances](quickref-ec2-instance-config.md)
+ [Startvorlagen erstellen](quickref-ec2-launch-templates.md)
+ [Verwalten von Sicherheitsgruppen](quickref-ec2-sg.md)
+ [Elastic zuweisen IPs](quickref-ec2-elastic-ip.md)
+ [Konfigurieren von VPC-Ressourcen](quickref-ec2-vpc.md)

# Konfigurieren Sie Amazon EC2 EC2-Instances mit CloudFormation
<a name="quickref-ec2-instance-config"></a>

Die folgenden Ausschnitte zeigen, wie Sie Amazon-EC2-Instances mit CloudFormation konfigurieren.

**Topics**
+ [Allgemeine Amazon-EC2-Konfigurationen](#quickref-ec2-instance-config-general)
+ [Angeben der Blockgerät-Zuweisungen für eine Instance](#scenario-ec2-bdm)

## Allgemeine Amazon-EC2-Konfigurationen
<a name="quickref-ec2-instance-config-general"></a>

Die folgenden Ausschnitte zeigen allgemeine Konfigurationen für Amazon-EC2-Instances mit CloudFormation.

**Topics**
+ [Erstellen einer Amazon-EC2-Instance in einer angegebenen Availability Zone](#scenario-ec2-instance)
+ [Konfigurieren einer getaggten Amazon-EC2-Instance mit einem EBS-Volume und Benutzerdaten](#scenario-ec2-instance-with-vol-and-tags)
+ [Definieren des DynamoDB-Tabellennamens in den Benutzerdaten für den Start einer Amazon-EC2-Instance](#scenario-ec2-with-sdb-domain)
+ [Erstellen eines Amazon-EBS-Volumes mit `DeletionPolicy`](#scenario-ec2-volume)

### Erstellen einer Amazon-EC2-Instance in einer angegebenen Availability Zone
<a name="scenario-ec2-instance"></a>

Das folgende Snippet erstellt mithilfe einer Ressource eine Amazon EC2 EC2-Instance in der angegebenen Availability Zone. [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) Der Code für eine Availability Zone ist der Regionscode gefolgt von einem Buchstaben als Bezeichner. Eine Instance können Sie in einer einzigen Availability Zone starten. 

#### JSON
<a name="quickref-ec2-example-6.json"></a>

```
1. "Ec2Instance": {
2.     "Type": "AWS::EC2::Instance",
3.     "Properties": {
4.         "AvailabilityZone": "aa-example-1a",
5.         "ImageId": "ami-1234567890abcdef0"
6.     }
7. }
```

#### YAML
<a name="quickref-ec2-example-6.yaml"></a>

```
1. Ec2Instance:
2.   Type: AWS::EC2::Instance
3.   Properties:
4.     AvailabilityZone: aa-example-1a
5.     ImageId: ami-1234567890abcdef0
```

### Konfigurieren einer getaggten Amazon-EC2-Instance mit einem EBS-Volume und Benutzerdaten
<a name="scenario-ec2-instance-with-vol-and-tags"></a>

Mit dem folgenden Ausschnitt wird eine Amazon-EC2-Instance mit einem Tag, einem EBS-Volume und Benutzerdaten erstellt. Es verwendet eine Ressource. [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) In derselben Vorlage müssen Sie eine [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)Ressource, eine [AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html)Ressource und eine [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html)Ressource definieren. Der `KeyName` muss im Abschnitt `Parameters` der Vorlage definiert werden.

Mithilfe von Tags können Sie AWS Ressourcen anhand Ihrer Präferenzen kategorisieren, z. B. nach Zweck, Eigentümer oder Umgebung. Benutzerdaten ermöglichen die Bereitstellung benutzerdefinierter Skripts oder Daten für eine Instance während des Starts. Diese Daten erleichtern die Automatisierung von Aufgaben, die Softwarekonfiguration, die Paketinstallation und weitere Aktionen auf einer Instance während der Initialisierung. 

Weitere Informationen zum Taggen Ihrer Ressourcen finden Sie unter [Taggen Sie Ihre Amazon EC2-Ressourcen](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html) im *Amazon EC2-Benutzerhandbuch*. 

Informationen über Benutzerdaten finden Sie unter [Verwenden Sie Instance-Metadaten zur Verwaltung Ihrer EC2-Instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) im *Amazon EC2-Benutzerhandbuch*.

#### JSON
<a name="quickref-ec2-example-7.json"></a>

```
 1. "Ec2Instance": {
 2.   "Type": "AWS::EC2::Instance",
 3.   "Properties": {
 4.     "KeyName": { "Ref": "KeyName" },
 5.     "SecurityGroups": [ { "Ref": "Ec2SecurityGroup" } ],
 6.     "UserData": {
 7.       "Fn::Base64": {
 8.         "Fn::Join": [ ":", [
 9.             "PORT=80",
10.             "TOPIC=",
11.             { "Ref": "MySNSTopic" }
12.           ]
13.         ]
14.       }
15.     },
16.     "InstanceType": "aa.size",
17.     "AvailabilityZone": "aa-example-1a",
18.     "ImageId": "ami-1234567890abcdef0",
19.     "Volumes": [
20.       {
21.         "VolumeId": { "Ref": "MyVolumeResource" },
22.         "Device": "/dev/sdk"
23.       }
24.     ],
25.     "Tags": [ { "Key": "Name", "Value": "MyTag" } ]
26.   }
27. }
```

#### YAML
<a name="quickref-ec2-example-7.yaml"></a>

```
 1. Ec2Instance:
 2.   Type: AWS::EC2::Instance
 3.   Properties:
 4.     KeyName: !Ref KeyName
 5.     SecurityGroups:
 6.       - !Ref Ec2SecurityGroup
 7.     UserData:
 8.       Fn::Base64:
 9.         Fn::Join:
10.           - ":"
11.           - - "PORT=80"
12.             - "TOPIC="
13.             - !Ref MySNSTopic
14.     InstanceType: aa.size
15.     AvailabilityZone: aa-example-1a
16.     ImageId: ami-1234567890abcdef0
17.     Volumes:
18.       - VolumeId: !Ref MyVolumeResource
19.         Device: "/dev/sdk"
20.     Tags:
21.       - Key: Name
22.         Value: MyTag
```

### Definieren des DynamoDB-Tabellennamens in den Benutzerdaten für den Start einer Amazon-EC2-Instance
<a name="scenario-ec2-with-sdb-domain"></a>

Mit dem folgenden Ausschnitt wird eine Amazon-EC2-Instance erstellt und in den Benutzerdaten ein DynamoDB-Tabellenname definiert, der beim Start an die Instance übergeben wird. Es verwendet eine [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html)Ressource. Sie können Parameter oder dynamische Werte in den Benutzerdaten definieren, um sie beim Start an eine EC2-Instance zu übergeben. 

Weitere Informationen über Benutzerdaten finden Sie unter [Verwenden Sie Instance-Metadaten zur Verwaltung Ihrer EC2-Instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html) im *Amazon EC2-Benutzerhandbuch*.

#### JSON
<a name="quickref-ec2-example-8.json"></a>

```
 1. "Ec2Instance": {
 2.     "Type": "AWS::EC2::Instance",
 3.     "Properties": {
 4.         "UserData": {
 5.             "Fn::Base64": {
 6.                 "Fn::Join": [
 7.                     "",
 8.                     [
 9.                         "TableName=",
10.                         {
11.                             "Ref": "DynamoDBTableName"
12.                         }
13.                     ]
14.                 ]
15.             }
16.         },
17.         "AvailabilityZone": "aa-example-1a",
18.         "ImageId": "ami-1234567890abcdef0"
19.     }
20. }
```

#### YAML
<a name="quickref-ec2-example-8.yaml"></a>

```
 1. Ec2Instance:
 2.   Type: AWS::EC2::Instance
 3.   Properties:
 4.     UserData:
 5.       Fn::Base64:
 6.         Fn::Join:
 7.           - ''
 8.           - - 'TableName='
 9.             - Ref: DynamoDBTableName
10.     AvailabilityZone: aa-example-1a
11.     ImageId: ami-1234567890abcdef0
```

### Erstellen eines Amazon-EBS-Volumes mit `DeletionPolicy`
<a name="scenario-ec2-volume"></a>

Die folgenden Codefragmente erstellen ein Amazon EBS-Volume mithilfe einer Amazon EC2 EC2-Ressource. [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) Sie können das Volume mit der Eigenschaft `Size` oder `SnapshotID` (aber nicht mit beiden) definieren. Ein `DeletionPolicy`-Attribut ist so eingestellt, dass beim Löschen des Stacks ein Snapshot des Volumes erstellt wird. 

Weitere Informationen zum Attribut `DeletionPolicy` finden Sie unter [Attribut DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html).

Weitere Informationen zum Erstellen von Amazon-EBS-Volumes finden Sie unter [Erstellen eines Amazon-EBS-Volumes](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-creating-volume.html).

#### JSON
<a name="quickref-ec2-example-13.json"></a>

Mit diesem Ausschnitt wird ein Amazon-EBS-Volume mit einer angegebenen **Größe** erstellt. Die Größe ist auf 10 eingestellt, Sie können sie jedoch nach Bedarf anpassen. Mit der [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html)Ressource können Sie entweder die Größe oder eine Snapshot-ID angeben, aber nicht beides.

```
 1. "MyEBSVolume": {
 2.     "Type": "AWS::EC2::Volume",
 3.     "Properties": {
 4.         "Size": "10",
 5.         "AvailabilityZone": {
 6.             "Ref": "AvailabilityZone"
 7.         }
 8.     },
 9.     "DeletionPolicy": "Snapshot"
10. }
```

Mit diesem Ausschnitt wird ein Amazon-EBS-Volume mit einer angegebenen **Snapshot-ID** erstellt. Mit der [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html)Ressource können Sie entweder die Größe oder eine Snapshot-ID angeben, jedoch nicht beides.

```
 1. "MyEBSVolume": {
 2.     "Type": "AWS::EC2::Volume",
 3.     "Properties": {
 4.         "SnapshotId" : "snap-1234567890abcdef0",
 5.         "AvailabilityZone": {
 6.             "Ref": "AvailabilityZone"
 7.         }
 8.     },
 9.     "DeletionPolicy": "Snapshot"
10. }
```

#### YAML
<a name="quickref-ec2-example-13.yaml"></a>

Mit diesem Ausschnitt wird ein Amazon-EBS-Volume mit einer angegebenen **Größe** erstellt. Die Größe ist auf 10 eingestellt, Sie können sie jedoch nach Bedarf anpassen. Mit der [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html)Ressource können Sie entweder die Größe oder eine Snapshot-ID angeben, jedoch nicht beides.

```
1. MyEBSVolume:
2.   Type: AWS::EC2::Volume
3.   Properties:
4.     Size: 10
5.     AvailabilityZone:
6.       Ref: AvailabilityZone
7.   DeletionPolicy: Snapshot
```

Mit diesem Ausschnitt wird ein Amazon-EBS-Volume mit einer angegebenen **Snapshot-ID** erstellt. Mit der [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html)Ressource können Sie entweder die Größe oder eine Snapshot-ID angeben, jedoch nicht beides.

```
1. MyEBSVolume:
2.   Type: AWS::EC2::Volume
3.   Properties:
4.     SnapshotId: snap-1234567890abcdef0
5.     AvailabilityZone:
6.       Ref: AvailabilityZone
7.   DeletionPolicy: Snapshot
```

## Angeben der Blockgerät-Zuweisungen für eine Instance
<a name="scenario-ec2-bdm"></a>

Eine Blockgerät-Zuweisung definiert die Blockgeräte (Instance-Speicher-Volumes und EBS-Volumes), die an eine Instance angefügt werden sollen. Eine Blockgerät-Zuweisung können Sie beim Erstellen eines AMI angeben, sodass die Zuweisung von allen Instances verwendet wird, die über das AMI gestartet werden. Alternativ können Sie eine Blockgerät-Zuweisung beim Starten einer Instance angeben. Diese Zuweisung gilt dann statt der im AMI angegebenen, über das die Instance gestartet wurde.

Sie können die folgenden Vorlagenausschnitte verwenden, um die Blockgerätezuordnungen für Ihre EBS- oder Instance-Speicher-Volumes mithilfe der `BlockDeviceMappings` Eigenschaft einer Ressource anzugeben. [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) 

Weitere Informationen über Blockgeräte-Zuordnungen finden Sie unter [Blockgeräte-Zuordnungen für Volumes auf Amazon EC2-Instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html) im *Amazon EC2-Benutzerhandbuch*.

**Topics**
+ [Angeben der Blockgerät-Zuweisungen für zwei EBS-Volumes](#w2aac11c41c43c13b9c11)
+ [Anzeigen der Blockgerät-Zuweisung für ein Instance-Speicher-Volume](#w2aac11c41c43c13b9c13)

### Angeben der Blockgerät-Zuweisungen für zwei EBS-Volumes
<a name="w2aac11c41c43c13b9c11"></a>

#### JSON
<a name="quickref-ec2-example-1.json"></a>

```
"Ec2Instance": {
    "Type": "AWS::EC2::Instance",
    "Properties": {
      "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
      "KeyName": { "Ref": "KeyName" },
      "InstanceType": { "Ref": "InstanceType" },
      "SecurityGroups": [{ "Ref": "Ec2SecurityGroup" }],
      "BlockDeviceMappings": [
        {
          "DeviceName": "/dev/sda1",
          "Ebs": { "VolumeSize": "50" }
        },
        {
          "DeviceName": "/dev/sdm",
          "Ebs": { "VolumeSize": "100" }
        }
      ]
    }
  }
}
```

#### YAML
<a name="quickref-ec2-example-1.yaml"></a>

```
EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
      KeyName: !Ref KeyName
      InstanceType: !Ref InstanceType
      SecurityGroups:
        - !Ref Ec2SecurityGroup
      BlockDeviceMappings:
        -
          DeviceName: /dev/sda1
          Ebs:
            VolumeSize: 50
        -
          DeviceName: /dev/sdm
          Ebs:
            VolumeSize: 100
```

### Anzeigen der Blockgerät-Zuweisung für ein Instance-Speicher-Volume
<a name="w2aac11c41c43c13b9c13"></a>

#### JSON
<a name="quickref-ec2-example-2.json"></a>

```
"Ec2Instance" : {
  "Type" : "AWS::EC2::Instance", 
  "Properties" : {
    "ImageId" : "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
    "KeyName" : { "Ref" : "KeyName" },
    "InstanceType": { "Ref": "InstanceType" },
    "SecurityGroups" : [{ "Ref" : "Ec2SecurityGroup" }],
    "BlockDeviceMappings" : [
      {
        "DeviceName"  : "/dev/sdc",
        "VirtualName" : "ephemeral0"
      }
    ]
  }
}
```

#### YAML
<a name="quickref-ec2-example-2.yaml"></a>

```
EC2Instance:
  Type: AWS::EC2::Instance
  Properties:
    ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
    KeyName: !Ref KeyName
    InstanceType: !Ref InstanceType
    SecurityGroups:
      - !Ref Ec2SecurityGroup
    BlockDeviceMappings:
      - DeviceName: /dev/sdc
        VirtualName: ephemeral0
```

# Erstellen Sie Startvorlagen mit CloudFormation
<a name="quickref-ec2-launch-templates"></a>

Dieser Abschnitt enthält ein Beispiel für die Erstellung einer Amazon EC2 EC2-Startvorlage mithilfe von CloudFormation. Mit Startvorlagen können Sie Vorlagen für die Konfiguration und Bereitstellung von Amazon EC2-Instances innerhalb von AWS erstellen. Mit Startvorlagen können Sie Startparameter speichern, so dass Sie diese nicht bei jedem Start einer Instance neu angeben müssen. Weitere Beispiele finden Sie im Abschnitt [Beispiele](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html#aws-resource-ec2-launchtemplate--examples) in der `AWS::EC2::LaunchTemplate` Ressource.

Weitere Informationen über Startvorlagen finden Sie unter [Speichern von Instance-Startparametern in Amazon EC2-Startvorlagen](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html) im *Amazon EC2 User Guide*. 

Informationen zur Erstellung von Startvorlagen für die Verwendung mit Auto Scaling-Gruppen finden Sie unter [Auto Scaling-Startvorlagen](https://docs.aws.amazon.com/autoscaling/ec2/userguide/launch-templates.html) im *Amazon EC2 Auto Scaling User Guide*.

**Topics**
+ [Erstellen Sie eine Startvorlage, in der Sicherheitsgruppen, Tags, Benutzerdaten und eine IAM-Rolle angegeben sind.](#scenario-as-launch-template)

## Erstellen Sie eine Startvorlage, in der Sicherheitsgruppen, Tags, Benutzerdaten und eine IAM-Rolle angegeben sind.
<a name="scenario-as-launch-template"></a>

Dieser Ausschnitt zeigt eine [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)Ressource, die die Konfigurationsinformationen zum Starten einer Instance enthält. Sie definieren Werte für die `ImageId`-, `InstanceType`-, `SecurityGroups`-, `UserData`- und `TagSpecifications`-Eigenschaften. Die `SecurityGroups`-Eigenschaft gibt eine vorhandene EC2-Sicherheitsgruppe und eine neue Sicherheitsgruppe an. Die `Ref` Funktion ruft die ID der [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)Ressource ab`myNewEC2SecurityGroup`, die an anderer Stelle in der Stack-Vorlage deklariert wurde. 

Die Einführungsvorlage enthält einen Abschnitt für benutzerdefinierte Benutzerdaten. In diesem Abschnitt können Sie Konfigurations-Aufgaben und Skripts übergeben, die beim Launch einer Instance ausgeführt werden. In diesem Beispiel installieren die Benutzerdaten den AWS Systems Manager Agenten und starten den Agenten.

Die Startvorlage enthält auch eine IAM-Rolle, die es Anwendungen, die auf Instances laufen, ermöglicht, Aktionen in Ihrem Namen durchzuführen. Dieses Beispiel zeigt eine [AWS::IAM::Role](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html)Ressource für die Startvorlage, die die `IamInstanceProfile` Eigenschaft verwendet, um die IAM-Rolle anzugeben. Die `Ref` Funktion ruft den Namen der [AWS::IAM::InstanceProfile](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-instanceprofile.html)Ressource `myInstanceProfile` ab. Um die Berechtigungen der IAM-Rolle zu konfigurieren, geben Sie einen Wert für die `ManagedPolicyArns`-Eigenschaft an.

### JSON
<a name="quickref-launch-template-example-1.json"></a>

```
 1. {
 2.   "Resources":{
 3.     "myLaunchTemplate":{
 4.       "Type":"AWS::EC2::LaunchTemplate",
 5.       "Properties":{
 6.         "LaunchTemplateName":{ "Fn::Sub": "${AWS::StackName}-launch-template" },
 7.         "LaunchTemplateData":{
 8.           "ImageId":"ami-02354e95b3example",
 9.           "InstanceType":"t3.micro",
10.           "IamInstanceProfile":{
11.             "Name":{
12.               "Ref":"myInstanceProfile"
13.             }
14.           },
15.           "SecurityGroupIds":[
16.             {
17.               "Ref":"myNewEC2SecurityGroup"
18.             },
19.             "sg-083cd3bfb8example"
20.           ],
21.           "UserData":{
22.             "Fn::Base64":{
23.               "Fn::Join": [
24.                 "", [
25.                   "#!/bin/bash\n",
26.                   "cd /tmp\n",
27.                   "yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm\n",
28.                   "systemctl enable amazon-ssm-agent\n",
29.                   "systemctl start amazon-ssm-agent\n"
30.                 ]
31.               ]
32.             }
33.           },
34.           "TagSpecifications":[
35.             {
36.               "ResourceType":"instance",
37.               "Tags":[
38.                 {
39.                   "Key":"environment",
40.                   "Value":"development"
41.                 }
42.               ]
43.             },
44.             {
45.               "ResourceType":"volume",
46.               "Tags":[
47.                 {
48.                   "Key":"environment",
49.                   "Value":"development"
50.                 }
51.               ]
52.             }
53.           ]
54.         }
55.       }
56.     },
57.     "myInstanceRole":{
58.       "Type":"AWS::IAM::Role",
59.       "Properties":{
60.         "RoleName":"InstanceRole",
61.         "AssumeRolePolicyDocument":{
62.           "Version": "2012-10-17",		 	 	 
63.           "Statement":[
64.             {
65.               "Effect":"Allow",
66.               "Principal":{
67.                 "Service":[
68.                   "ec2.amazonaws.com"
69.                 ]
70.               },
71.               "Action":[
72.                 "sts:AssumeRole"
73.               ]
74.             }
75.           ]
76.         },
77.         "ManagedPolicyArns":[
78.           "arn:aws:iam::aws:policy/myCustomerManagedPolicy"
79.         ]
80.       }
81.     },
82.     "myInstanceProfile":{
83.       "Type":"AWS::IAM::InstanceProfile",
84.       "Properties":{
85.         "Path":"/",
86.         "Roles":[
87.           {
88.             "Ref":"myInstanceRole"
89.           }
90.         ]
91.       }
92.     }
93.   }
94. }
```

### YAML
<a name="quickref-launch-template-example-1.yaml"></a>

```
 1. ---
 2. Resources:
 3.   myLaunchTemplate:
 4.     Type: AWS::EC2::LaunchTemplate
 5.     Properties:
 6.       LaunchTemplateName: !Sub ${AWS::StackName}-launch-template
 7.       LaunchTemplateData:
 8.         ImageId: ami-02354e95b3example
 9.         InstanceType: t3.micro
10.         IamInstanceProfile:
11.           Name: !Ref myInstanceProfile
12.         SecurityGroupIds:
13.         - !Ref myNewEC2SecurityGroup
14.         - sg-083cd3bfb8example
15.         UserData:
16.           Fn::Base64: !Sub |
17.             #!/bin/bash
18.             cd /tmp
19.             yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
20.             systemctl enable amazon-ssm-agent
21.             systemctl start amazon-ssm-agent
22.         TagSpecifications:
23.         - ResourceType: instance
24.           Tags:
25.           - Key: environment
26.             Value: development
27.         - ResourceType: volume
28.           Tags:
29.           - Key: environment
30.             Value: development
31.   myInstanceRole:
32.     Type: AWS::IAM::Role
33.     Properties:
34.       RoleName: InstanceRole
35.       AssumeRolePolicyDocument:
36.         Version: '2012-10-17'
37.         Statement:
38.         - Effect: 'Allow'
39.           Principal:
40.             Service:
41.             - 'ec2.amazonaws.com'
42.           Action:
43.           - 'sts:AssumeRole'
44.       ManagedPolicyArns:
45.         - 'arn:aws:iam::aws:policy/myCustomerManagedPolicy'
46.   myInstanceProfile:
47.     Type: AWS::IAM::InstanceProfile
48.     Properties:
49.       Path: '/'
50.       Roles:
51.       - !Ref myInstanceRole
```

# Sicherheitsgruppen verwalten mit CloudFormation
<a name="quickref-ec2-sg"></a>

Die folgenden Ausschnitte zeigen, wie Sie Sicherheitsgruppen und Amazon EC2 EC2-Instances verwalten können, CloudFormation um den Zugriff auf Ihre Ressourcen zu kontrollieren. AWS 

**Topics**
+ [Verknüpfen einer Amazon-EC2-Instance mit einer Sicherheitsgruppe](#quickref-ec2-instances-associate-security-group)
+ [Erstellen von Sicherheitsgruppen mit Regeln für eingehenden Datenverkehr](#quickref-ec2-instances-ingress)
+ [Erstellen eines Elastic Load Balancers mit einer Regel für eingehenden Datenverkehr für eine Sicherheitsgruppe](#scenario-ec2-security-group-elbingress)

## Verknüpfen einer Amazon-EC2-Instance mit einer Sicherheitsgruppe
<a name="quickref-ec2-instances-associate-security-group"></a>

Die folgenden Beispielausschnitte zeigen, wie Sie eine Amazon-EC2-Instance mithilfe von CloudFormation mit einer standardmäßigen Amazon-VPC-Sicherheitsgruppe verknüpfen.

**Topics**
+ [Verknüpfen einer Amazon-EC2-Instance mit einer standardmäßigen VPC-Sicherheitsgruppe](#using-cfn-getatt-default-values)
+ [Erstellen einer Amazon-EC2-Instance mit einem angefügten Volume und einer Sicherheitsgruppe](#scenario-ec2-volumeattachment)

### Verknüpfen einer Amazon-EC2-Instance mit einer standardmäßigen VPC-Sicherheitsgruppe
<a name="using-cfn-getatt-default-values"></a>

Mit dem folgenden Ausschnitt wird eine Amazon-VPC, ein Subnetz in der VPC und eine Amazon-EC2-Instance erstellt. Die VPC wird mithilfe einer [AWS::EC2::VPC](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpc.html)-Ressource erstellt. Der IP-Adressbereich für die VPC wird in der größeren Vorlage definiert und durch den Parameter `MyVPCCIDRRange` referenziert.

Ein Subnetz wird in der VPC mithilfe einer [AWS::EC2:: Subnet](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnet.html)-Ressource erstellt. Das Subnetz wird mit der VPC verknüpft, die als `MyVPC` referenziert wird.

Eine EC2-Instance wird innerhalb der VPC und des Subnetzes mithilfe einer Ressource gestartet. [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) Diese Ressource gibt das Amazon Machine Image (AMI) an, das zum Starten der Instance verwendet werden soll, das Subnetz, in dem die Instance ausgeführt wird, und die mit der Instance zu verknüpfende Sicherheitsgruppe. Der `ImageId` verwendet einen Systems Manager-Parameter, um dynamisch das neueste Amazon Linux 2 AMI abzurufen. 

Die ID der Sicherheitsgruppe wird mit der Funktion `Fn::GetAtt` abgerufen, die die Standardsicherheitsgruppe aus der Ressource `MyVPC` abruft. 

Die Instance wird in der im Ausschnitt definierten Ressource `MySubnet` platziert. 

Wenn Sie eine VPC mit erstellen CloudFormation, erstellt AWS automatisch Standardressourcen innerhalb der VPC, einschließlich einer Standardsicherheitsgruppe. Wenn Sie jedoch eine VPC innerhalb einer CloudFormation Vorlage definieren, haben Sie beim Erstellen IDs der Vorlage möglicherweise keinen Zugriff auf diese Standardressourcen. Um auf die in der Vorlage angegebenen Standardressourcen zuzugreifen und diese zu nutzen, können Sie intrinsische Funktionen wie etwa `Fn::GetAtt` verwenden. Mithilfe dieser Funktion können Sie mit den Standardressourcen arbeiten, die von CloudFormation automatisch erstellt werden.

#### JSON
<a name="quickref-ec2-example-15.json"></a>

```
"MyVPC": {
    "Type": "AWS::EC2::VPC",
    "Properties": {
        "CidrBlock": {
            "Ref": "MyVPCCIDRRange"
        },
        "EnableDnsSupport": false,
        "EnableDnsHostnames": false,
        "InstanceTenancy": "default"
    }
},
"MySubnet": {
    "Type": "AWS::EC2::Subnet",
    "Properties": {
        "CidrBlock": {
            "Ref": "MyVPCCIDRRange"
        },
        "VpcId": {
            "Ref": "MyVPC"
        }
    }
},
"MyInstance": {
    "Type": "AWS::EC2::Instance",
    "Properties": {
        "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
        "SecurityGroupIds": [
            {
                "Fn::GetAtt": [
                    "MyVPC",
                    "DefaultSecurityGroup"
                ]
            }
        ],
        "SubnetId": {
            "Ref": "MySubnet"
        }
    }
}
```

#### YAML
<a name="quickref-ec2-example-15.yaml"></a>

```
MyVPC:
  Type: AWS::EC2::VPC
  Properties:
    CidrBlock:
      Ref: MyVPCCIDRRange
    EnableDnsSupport: false
    EnableDnsHostnames: false
    InstanceTenancy: default
MySubnet:
  Type: AWS::EC2::Subnet
  Properties:
    CidrBlock:
      Ref: MyVPCCIDRRange
    VpcId:
      Ref: MyVPC
MyInstance:
  Type: AWS::EC2::Instance
  Properties:
    ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
    SecurityGroupIds:
      - Fn::GetAtt:
          - MyVPC
          - DefaultSecurityGroup
    SubnetId:
      Ref: MySubnet
```

### Erstellen einer Amazon-EC2-Instance mit einem angefügten Volume und einer Sicherheitsgruppe
<a name="scenario-ec2-volumeattachment"></a>

Das folgende Snippet erstellt eine Amazon EC2 EC2-Instance mithilfe einer [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html)Ressource, die von einem bestimmten AMI aus gestartet wird. Die Instance ist einer Sicherheitsgruppe zugeordnet, die eingehenden SSH-Verkehr über Port 22 von einer angegebenen IP-Adresse aus unter Verwendung einer Ressource zulässt. [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) Es erstellt mithilfe einer [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html)Ressource ein 100-GB-Amazon-EBS-Volume. Das Volume wird in derselben Availability Zone wie die Instance erstellt (wie in der Funktion `GetAtt` angegeben) und in der Instance auf dem Gerät `/dev/sdh` gemountet.

Weitere Informationen zum Erstellen von Amazon-EBS-Volumes finden Sie unter [Erstellen eines Amazon-EBS-Volumes](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-creating-volume.html).

#### JSON
<a name="quickref-ec2-example-14.json"></a>

```
 1. "Ec2Instance": {
 2.     "Type": "AWS::EC2::Instance",
 3.     "Properties": {
 4.         "SecurityGroups": [
 5.             {
 6.                 "Ref": "InstanceSecurityGroup"
 7.             }
 8.         ],
 9.         "ImageId": "ami-1234567890abcdef0"
10.     }
11. },
12. "InstanceSecurityGroup": {
13.     "Type": "AWS::EC2::SecurityGroup",
14.     "Properties": {
15.         "GroupDescription": "Enable SSH access via port 22",
16.         "SecurityGroupIngress": [
17.             {
18.                 "IpProtocol": "tcp",
19.                 "FromPort": "22",
20.                 "ToPort": "22",
21.                 "CidrIp": "192.0.2.0/24"
22.             }
23.         ]
24.     }
25. },
26. "NewVolume": {
27.     "Type": "AWS::EC2::Volume",
28.     "Properties": {
29.         "Size": "100",
30.         "AvailabilityZone": {
31.             "Fn::GetAtt": [
32.                 "Ec2Instance",
33.                 "AvailabilityZone"
34.             ]
35.         }
36.     }
37. },
38. "MountPoint": {
39.     "Type": "AWS::EC2::VolumeAttachment",
40.     "Properties": {
41.         "InstanceId": {
42.             "Ref": "Ec2Instance"
43.         },
44.         "VolumeId": {
45.             "Ref": "NewVolume"
46.         },
47.         "Device": "/dev/sdh"
48.     }
49. }
```

#### YAML
<a name="quickref-ec2-example-14.yaml"></a>

```
 1. Ec2Instance:
 2.   Type: AWS::EC2::Instance
 3.   Properties:
 4.     SecurityGroups:
 5.       - !Ref InstanceSecurityGroup
 6.     ImageId: ami-1234567890abcdef0
 7. InstanceSecurityGroup:
 8.   Type: AWS::EC2::SecurityGroup
 9.   Properties:
10.     GroupDescription: Enable SSH access via port 22
11.     SecurityGroupIngress:
12.       - IpProtocol: tcp
13.         FromPort: 22
14.         ToPort: 22
15.         CidrIp: 192.0.2.0/24
16. NewVolume:
17.   Type: AWS::EC2::Volume
18.   Properties:
19.     Size: 100
20.     AvailabilityZone: !GetAtt [Ec2Instance, AvailabilityZone]
21. MountPoint:
22.   Type: AWS::EC2::VolumeAttachment
23.   Properties:
24.     InstanceId: !Ref Ec2Instance
25.     VolumeId: !Ref NewVolume
26.     Device: /dev/sdh
```

## Erstellen von Sicherheitsgruppen mit Regeln für eingehenden Datenverkehr
<a name="quickref-ec2-instances-ingress"></a>

Die folgenden Beispielausschnitte zeigen, wie mit CloudFormation Sicherheitsgruppen mit bestimmten Regeln für eingehenden Datenverkehr konfiguriert werden können.

**Topics**
+ [Erstellen einer Sicherheitsgruppe mit Regeln für eingehenden Datenverkehr für SSH- und HTTP-Zugriff](#scenario-ec2-security-group-rule)
+ [Erstellen einer Sicherheitsgruppe mit Regeln für eingehenden Datenverkehr für SSH- und HTTP-Zugriff aus angegebenen CIDR-Bereichen](#scenario-ec2-security-group-two-ports)
+ [Erstellen von miteinander kommunizierenden Sicherheitsgruppen mit Regeln für eingehenden Datenverkehr](#scenario-ec2-security-group-ingress)

### Erstellen einer Sicherheitsgruppe mit Regeln für eingehenden Datenverkehr für SSH- und HTTP-Zugriff
<a name="scenario-ec2-security-group-rule"></a>

Der folgende Ausschnitt beschreibt zwei Regeln für den Zugriff auf Sicherheitsgruppen, die eine Ressource verwenden. [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) Die erste Eingangsregel ermöglicht den SSH-Zugriff (Port 22) von einer vorhandenen Sicherheitsgruppe mit dem Namen`MyAdminSecurityGroup`, die dem AWS Konto mit der Kontonummer gehört. `1111-2222-3333` Die zweite Regel für eingehenden Datenverkehr erlaubt den HTTP-Zugriff (Port 80) aus einer anderen Sicherheitsgruppe namens `MySecurityGroupCreatedInCFN`, die in derselben Vorlage erstellt wurde. Mithilfe der Funktion `Ref` wird der logische Name der Sicherheitsgruppe referenziert, die in derselben Vorlage erstellt wurde. 

In der ersten Regel für eingehenden Datenverkehr müssen Sie sowohl für die Eigenschaft `SourceSecurityGroupName` als auch für die Eigenschaft `SourceSecurityGroupOwnerId` einen Wert hinzufügen. In der zweiten Regel für eingehenden Datenverkehr referenziert `MySecurityGroupCreatedInCFNTemplate` eine andere Sicherheitsgruppe, die in derselben Vorlage erstellt wurde. Vergewissern Sie sich, dass der logische Name `MySecurityGroupCreatedInCFNTemplate` mit dem tatsächlichen logischen Namen der Sicherheitsgruppe übereinstimmt, die Sie in der größeren Vorlage angeben. 

Weitere Informationen über Sicherheitsgruppen finden Sie unter [Amazon EC2-Sicherheitsgruppen für Ihre Amazon EC2-Instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html) im *Amazon EC2-Benutzerhandbuch*.

#### JSON
<a name="quickref-ec2-example-10.json"></a>

```
 1. "SecurityGroup": {
 2.     "Type": "AWS::EC2::SecurityGroup",
 3.     "Properties": {
 4.         "GroupDescription": "Allow connections from specified source security group",
 5.         "SecurityGroupIngress": [
 6.             {
 7.                 "IpProtocol": "tcp",
 8.                 "FromPort": "22",
 9.                 "ToPort": "22",
10.                 "SourceSecurityGroupName": "MyAdminSecurityGroup",
11.                 "SourceSecurityGroupOwnerId": "1111-2222-3333"
12.             },
13.             {
14.                 "IpProtocol": "tcp",
15.                 "FromPort": "80",
16.                 "ToPort": "80",
17.                 "SourceSecurityGroupName": {
18.                     "Ref": "MySecurityGroupCreatedInCFNTemplate"
19.                 }
20.             }
21.         ]
22.     }
23. }
```

#### YAML
<a name="quickref-ec2-example-10.yaml"></a>

```
 1. SecurityGroup:
 2.   Type: AWS::EC2::SecurityGroup
 3.   Properties:
 4.     GroupDescription: Allow connections from specified source security group
 5.     SecurityGroupIngress:
 6.       - IpProtocol: tcp
 7.         FromPort: '22'
 8.         ToPort: '22'
 9.         SourceSecurityGroupName: MyAdminSecurityGroup
10.         SourceSecurityGroupOwnerId: '1111-2222-3333'
11.       - IpProtocol: tcp
12.         FromPort: '80'
13.         ToPort: '80'
14.         SourceSecurityGroupName:
15.           Ref: MySecurityGroupCreatedInCFNTemplate
```

### Erstellen einer Sicherheitsgruppe mit Regeln für eingehenden Datenverkehr für SSH- und HTTP-Zugriff aus angegebenen CIDR-Bereichen
<a name="scenario-ec2-security-group-two-ports"></a>

Mit dem folgenden Ausschnitt wird eine Sicherheitsgruppe für eine Amazon-EC2-Instance mit zwei Regeln für eingehenden Datenverkehr erstellt. Diese Regeln erlauben eingehenden TCP-Verkehr an den angegebenen Ports aus den festgelegten CIDR-Bereichen. Eine [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)Ressource wird verwendet, um die Regeln zu spezifizieren. Für jede Regel müssen Sie ein Protokoll angeben. Für TCP müssen Sie einen Port oder Portbereich angeben. Wenn Sie weder eine Quellsicherheitsgruppe noch einen CIDR-Bereich angeben, wird der Stack zwar gestartet, die Regel aber nicht auf die Sicherheitsgruppe angewendet. 

Weitere Informationen über Sicherheitsgruppen finden Sie unter [Amazon EC2-Sicherheitsgruppen für Ihre Amazon EC2-Instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html) im *Amazon EC2-Benutzerhandbuch*.

#### JSON
<a name="quickref-ec2-example-9.json"></a>

```
 1. "ServerSecurityGroup": {
 2.   "Type": "AWS::EC2::SecurityGroup",
 3.   "Properties": {
 4.     "GroupDescription": "Allow connections from specified CIDR ranges",
 5.     "SecurityGroupIngress": [
 6.       {
 7.         "IpProtocol": "tcp",
 8.         "FromPort": "80",
 9.         "ToPort": "80",
10.         "CidrIp": "192.0.2.0/24"
11.       },
12.       {
13.         "IpProtocol": "tcp",
14.         "FromPort": "22",
15.         "ToPort": "22",
16.         "CidrIp": "192.0.2.0/24"
17.       }
18.     ]
19.   }
20. }
```

#### YAML
<a name="quickref-ec2-example-9.yaml"></a>

```
 1. ServerSecurityGroup:
 2.   Type: AWS::EC2::SecurityGroup
 3.   Properties:
 4.     GroupDescription: Allow connections from specified CIDR ranges
 5.     SecurityGroupIngress:
 6.       - IpProtocol: tcp
 7.         FromPort: 80
 8.         ToPort: 80
 9.         CidrIp: 192.0.2.0/24
10.       - IpProtocol: tcp
11.         FromPort: 22
12.         ToPort: 22
13.         CidrIp: 192.0.2.0/24
```

### Erstellen von miteinander kommunizierenden Sicherheitsgruppen mit Regeln für eingehenden Datenverkehr
<a name="scenario-ec2-security-group-ingress"></a>

Das folgende Snippet verwendet die [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)Ressource, um zwei Amazon EC2-Sicherheitsgruppen zu erstellen, und. `SGroup1` `SGroup2` [Eingangsregeln, die die Kommunikation zwischen den beiden Sicherheitsgruppen ermöglichen, werden mithilfe der Ingress-Ressource erstellt. AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroupingress.html) `SGroup1Ingress`richtet eine Eingangsregel ein`SGroup1`, die eingehenden TCP-Verkehr auf Port 80 von der Quellsicherheitsgruppe zulässt,. `SGroup2` `SGroup2Ingress`richtet eine Eingangsregel ein`SGroup2`, die eingehenden TCP-Verkehr auf Port 80 von der Quellsicherheitsgruppe zulässt,. `SGroup1` 

#### JSON
<a name="quickref-ec2-example-12.json"></a>

```
 1. "SGroup1": {
 2.     "Type": "AWS::EC2::SecurityGroup",
 3.     "Properties": {
 4.         "GroupDescription": "EC2 instance access"
 5.     }
 6. },
 7. "SGroup2": {
 8.     "Type": "AWS::EC2::SecurityGroup",
 9.     "Properties": {
10.         "GroupDescription": "EC2 instance access"
11.     }
12. },
13. "SGroup1Ingress": {
14.     "Type": "AWS::EC2::SecurityGroupIngress",
15.     "Properties": {
16.         "GroupName": {
17.             "Ref": "SGroup1"
18.         },
19.         "IpProtocol": "tcp",
20.         "ToPort": "80",
21.         "FromPort": "80",
22.         "SourceSecurityGroupName": {
23.             "Ref": "SGroup2"
24.         }
25.     }
26. },
27. "SGroup2Ingress": {
28.     "Type": "AWS::EC2::SecurityGroupIngress",
29.     "Properties": {
30.         "GroupName": {
31.             "Ref": "SGroup2"
32.         },
33.         "IpProtocol": "tcp",
34.         "ToPort": "80",
35.         "FromPort": "80",
36.         "SourceSecurityGroupName": {
37.             "Ref": "SGroup1"
38.         }
39.     }
40. }
```

#### YAML
<a name="quickref-ec2-example-12.yaml"></a>

```
 1. SGroup1:
 2.   Type: AWS::EC2::SecurityGroup
 3.   Properties:
 4.     GroupDescription: EC2 Instance access
 5. SGroup2:
 6.   Type: AWS::EC2::SecurityGroup
 7.   Properties:
 8.     GroupDescription: EC2 Instance access
 9. SGroup1Ingress:
10.   Type: AWS::EC2::SecurityGroupIngress
11.   Properties:
12.     GroupName: !Ref SGroup1
13.     IpProtocol: tcp
14.     ToPort: 80
15.     FromPort: 80
16.     SourceSecurityGroupName: !Ref SGroup2
17. SGroup2Ingress:
18.   Type: AWS::EC2::SecurityGroupIngress
19.   Properties:
20.     GroupName: !Ref SGroup2
21.     IpProtocol: tcp
22.     ToPort: 80
23.     FromPort: 80
24.     SourceSecurityGroupName: !Ref SGroup1
```

## Erstellen eines Elastic Load Balancers mit einer Regel für eingehenden Datenverkehr für eine Sicherheitsgruppe
<a name="scenario-ec2-security-group-elbingress"></a>

Die folgende Vorlage erstellt eine [AWS::ElasticLoadBalancing::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancing-loadbalancer.html)Ressource in der angegebenen Availability Zone. Die [AWS::ElasticLoadBalancing::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancing-loadbalancer.html)Ressource ist so konfiguriert, dass sie auf Port 80 auf HTTP-Verkehr wartet und Anfragen an Instanzen auch an Port 80 weiterleitet. Der Elastic Load Balancer übernimmt den Lastenausgleich des eingehenden HTTP-Datenverkehrs unter den Instances.

 Darüber hinaus generiert diese Vorlage eine [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)Ressource, die dem Load Balancer zugeordnet ist. Diese Sicherheitsgruppe wird mit einer einzigen Regel für eingehenden Datenverkehr erstellt, die als `ELB ingress group` bezeichnet wird. Sie erlaubt eingehenden TCP-Verkehr an Port 80. Die Quelle für diese Regel wird mithilfe der Funktion `Fn::GetAtt` definiert, um Attribute aus der Load-Balancer-Ressource abzurufen. `SourceSecurityGroupOwnerId` ruft mit `Fn::GetAtt` den `OwnerAlias` der Quellsicherheitsgruppe des Load Balancers ab. `SourceSecurityGroupName` ruft mit `Fn::Getatt` den `GroupName` der Quellsicherheitsgruppe des ELB ab. 

Diese Konfiguration gewährleistet eine sichere Kommunikation zwischen dem ELB und den Instances. 

Weitere Informationen zu Elastic Load Balancing finden Sie im [Elastic Load Balancing-Entwicklerhandbuch](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/).

### JSON
<a name="quickref-ec2-example-11.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "MyELB": {
            "Type": "AWS::ElasticLoadBalancing::LoadBalancer",
            "Properties": {
                "AvailabilityZones": [
                    "aa-example-1a"
                ],
                "Listeners": [
                    {
                        "LoadBalancerPort": "80",
                        "InstancePort": "80",
                        "Protocol": "HTTP"
                    }
                ]
            }
        },
        "MyELBIngressGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "ELB ingress group",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 80,
                        "ToPort": 80,
                        "SourceSecurityGroupOwnerId": {
                            "Fn::GetAtt": [
                                "MyELB",
                                "SourceSecurityGroup.OwnerAlias"
                            ]
                        },
                        "SourceSecurityGroupName": {
                            "Fn::GetAtt": [
                                "MyELB",
                                "SourceSecurityGroup.GroupName"
                            ]
                        }
                    }
                ]
            }
        }
    }
}
```

### YAML
<a name="quickref-ec2-example-11.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyELB:
    Type: AWS::ElasticLoadBalancing::LoadBalancer
    Properties:
      AvailabilityZones:
        - aa-example-1a
      Listeners:
        - LoadBalancerPort: '80'
          InstancePort: '80'
          Protocol: HTTP
  MyELBIngressGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: ELB ingress group
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '80'
          ToPort: '80'
          SourceSecurityGroupOwnerId:
            Fn::GetAtt:
              - MyELB
              - SourceSecurityGroup.OwnerAlias
          SourceSecurityGroupName:
            Fn::GetAtt:
              - MyELB
              - SourceSecurityGroup.GroupName
```

# Zuweisen und Zuordnen von Elastic IP-Adressen zu CloudFormation
<a name="quickref-ec2-elastic-ip"></a>

Die folgenden Vorlagenausschnitte sind Beispiele für Elastic-IP-Adressen (EIPs) in Amazon EC2. Diese Beispiele behandeln die Zuweisung, Zuordnung und Verwaltung von EIPs für Ihre Instances.

**Topics**
+ [Zuweisen einer Elastic IP-Adresse und deren Verknüpfung mit einer Amazon-EC2-Instance](#scenario-ec2-eip)
+ [Verknüpfen einer Elastic-IP-Adresse mit einer Amazon-EC2-Instance durch Angabe der IP-Adresse](#scenario-ec2-eip-association)
+ [Verknüpfen einer Elastic-IP-Adresse mit einer Amazon-EC2-Instance durch Angabe der Zuweisungs-ID der IP-Adresse](#scenario-ec2-eip-association-vpc)

## Zuweisen einer Elastic IP-Adresse und deren Verknüpfung mit einer Amazon-EC2-Instance
<a name="scenario-ec2-eip"></a>

Das folgende Snippet weist eine Amazon EC2 Elastic IP (EIP) -Adresse zu und verknüpft sie mithilfe einer Ressource mit einer Amazon EC2 EC2-Instance. [AWS::EC2::EIP ](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eip.html) [Mithilfe von Bring Your Own IP Addresses (BYOIP) können Sie eine EIP-Adresse aus einem Adresspool zuweisen, der einem öffentlichen Adressbereich gehört, AWS oder aus einem Adresspool, der aus einem öffentlichen IPv4 Adressbereich erstellt wurde, den Sie AWS zur Verwendung mit Ihren AWS Ressourcen verwenden.](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html) In diesem Beispiel wird die EIP aus einem Adresspool zugewiesen, der Eigentümer ist. AWS

Weitere Informationen zu Elastic-IP-Adressen finden Sie unter [Elastic-IP-Adressen](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html) im *Benutzerhandbuch von Amazon EC2*.

### JSON
<a name="quickref-ec2-example-3.json"></a>

```
1. "ElasticIP": {
2.     "Type": "AWS::EC2::EIP",
3.     "Properties": {
4.         "InstanceId": {
5.             "Ref": "Ec2Instance"
6.         }
7.     }
8. }
```

### YAML
<a name="quickref-ec2-example-3.yaml"></a>

```
1. ElasticIP:
2.   Type: AWS::EC2::EIP
3.   Properties:
4.     InstanceId: !Ref EC2Instance
```

## Verknüpfen einer Elastic-IP-Adresse mit einer Amazon-EC2-Instance durch Angabe der IP-Adresse
<a name="scenario-ec2-eip-association"></a>

Der folgende Ausschnitt verknüpft eine bestehende Amazon EC2 Elastic IP-Adresse mit einer EC2-Instance, die eine [AWS: :EC2::](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eipassociation.html) -Ressource verwendet. EIPAssociation Dazu müssen Sie zunächst eine Elastic-IP-Adresse für die Verwendung in Ihrem Konto zuweisen. Eine Elastic-IP-Adresse kann mit einer einzelnen Instance verknüpft werden.

### JSON
<a name="quickref-ec2-example-4.json"></a>

```
1. "IPAssoc": {
2.   "Type": "AWS::EC2::EIPAssociation",
3.   "Properties": {
4.     "InstanceId": {
5.       "Ref": "Ec2Instance"
6.     },
7.     "EIP": "192.0.2.0"
8.   }
9. }
```

### YAML
<a name="quickref-ec2-example-4.yaml"></a>

```
1. IPAssoc:
2.   Type: AWS::EC2::EIPAssociation
3.   Properties:
4.     InstanceId: !Ref EC2Instance
5.     EIP: 192.0.2.0
```

## Verknüpfen einer Elastic-IP-Adresse mit einer Amazon-EC2-Instance durch Angabe der Zuweisungs-ID der IP-Adresse
<a name="scenario-ec2-eip-association-vpc"></a>

Der folgende Ausschnitt verknüpft eine bestehende Elastic IP-Adresse mit einer Amazon EC2 EC2-Instance, indem die Zuweisungs-ID mithilfe einer [AWS: :EC2::](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eipassociation.html) -Ressource angegeben wird. EIPAssociation Eine Zuweisungs-ID wird einer Elastic IP-Adresse nach ihrer Zuweisung zugeordnet. 

### JSON
<a name="quickref-ec2-example-5.json"></a>

```
1. "IPAssoc": {
2.     "Type": "AWS::EC2::EIPAssociation",
3.     "Properties": {
4.         "InstanceId": {
5.             "Ref": "Ec2Instance"
6.         },
7.         "AllocationId": "eipalloc-1234567890abcdef0"
8.     }
9. }
```

### YAML
<a name="quickref-ec2-example-5.yaml"></a>

```
1. IPAssoc:
2.   Type: AWS::EC2::EIPAssociation
3.   Properties:
4.     InstanceId: !Ref EC2Instance
5.     AllocationId: eipalloc-1234567890abcdef0
```

# Konfigurieren Sie Amazon VPC-Ressourcen mit CloudFormation
<a name="quickref-ec2-vpc"></a>

Dieser Abschnitt enthält Beispiele für die Konfiguration von Amazon VPC-Ressourcen mithilfe von CloudFormation. VPCsermöglichen es Ihnen, darin ein virtuelles Netzwerk zu erstellen. Diese Auszüge zeigen AWS, wie Sie Aspekte von konfigurieren können, um Ihre VPCs Netzwerkanforderungen zu erfüllen. 

**Topics**
+ [Aktivieren Sie den Internetzugang IPv6 nur für ausgehenden Datenverkehr in einer VPC](#quickref-ec2-route-egressonlyinternetgateway)
+ [Elastic Network-Schnittstelle (ENI) Vorlagenausschnitte](#cfn-template-snippets-eni)

## Aktivieren Sie den Internetzugang IPv6 nur für ausgehenden Datenverkehr in einer VPC
<a name="quickref-ec2-route-egressonlyinternetgateway"></a>

Ein auf ausgehenden Datenverkehr beschränktes Internet-Gateway erlaubt Instances in einer VPC den Zugriff auf das Internet und verhindert, dass Ressourcen aus dem Internet mit den Instances kommunizieren. Das folgende Snippet ermöglicht den Internetzugang IPv6 nur für ausgehenden Datenverkehr von einer VPC aus. Es erstellt eine VPC mit einem IPv4 Adressbereich, der eine `10.0.0/16` [AWS: :EC2: :VPC-Ressource](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpc.html) verwendet. Eine Routentabelle ist dieser VPC-Ressource mithilfe einer [AWS::EC2::RouteTable](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-routetable.html)Ressource zugeordnet. Über die Routing-Tabelle werden Routen für Instances in der VPC verwaltet. An [AWS::EC2::EgressOnlyInternetGateway](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-egressonlyinternetgateway.html)wird verwendet, um ein Internet-Gateway nur für ausgehenden Datenverkehr zu erstellen, um die IPv6 Kommunikation für ausgehenden Datenverkehr von Instances innerhalb der VPC zu ermöglichen und gleichzeitig eingehenden Datenverkehr zu verhindern. Eine [AWS::EC2::Route](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-route.html)Ressource wird angegeben, um eine IPv6 Route in der Routentabelle zu erstellen, die den gesamten ausgehenden IPv6 Verkehr () `::/0` an das Internet-Gateway weiterleitet, das nur für ausgehenden Verkehr bestimmt ist. 

*Weitere Informationen zu Internet-Gateways nur für ausgehenden Datenverkehr finden Sie unter [Aktivieren von ausgehendem IPv6 Datenverkehr mithilfe eines Internet-Gateways nur für ausgehenden Datenverkehr im Amazon VPC-Benutzerhandbuch](https://docs.aws.amazon.com/vpc/latest/userguide/egress-only-internet-gateway.html).*

### JSON
<a name="quickref-ec2-example-16.json"></a>

```
"DefaultIpv6Route": {
    "Type": "AWS::EC2::Route",
    "Properties": {
        "DestinationIpv6CidrBlock": "::/0",
        "EgressOnlyInternetGatewayId": {
            "Ref": "EgressOnlyInternetGateway"
        },
        "RouteTableId": {
            "Ref": "RouteTable"
        }
    }
},
"EgressOnlyInternetGateway": {
    "Type": "AWS::EC2::EgressOnlyInternetGateway",
    "Properties": {
        "VpcId": {
            "Ref": "VPC"
        }
    }
},
"RouteTable": {
    "Type": "AWS::EC2::RouteTable",
    "Properties": {
        "VpcId": {
            "Ref": "VPC"
        }
    }
},
"VPC": {
    "Type": "AWS::EC2::VPC",
    "Properties": {
        "CidrBlock": "10.0.0.0/16"
    }
}
```

### YAML
<a name="quickref-ec2-example-16.yaml"></a>

```
DefaultIpv6Route:
  Type: AWS::EC2::Route
  Properties:
    DestinationIpv6CidrBlock: "::/0"
    EgressOnlyInternetGatewayId:
      Ref: "EgressOnlyInternetGateway"
    RouteTableId:
      Ref: "RouteTable"
EgressOnlyInternetGateway:
  Type: AWS::EC2::EgressOnlyInternetGateway
  Properties:
    VpcId:
      Ref: "VPC"
RouteTable:
  Type: AWS::EC2::RouteTable
  Properties:
    VpcId:
      Ref: "VPC"
VPC:
  Type: AWS::EC2::VPC
  Properties:
    CidrBlock: "10.0.0.0/16"
```

## Elastic Network-Schnittstelle (ENI) Vorlagenausschnitte
<a name="cfn-template-snippets-eni"></a>

### Erstellen Sie eine Amazon EC2 EC2-Instance mit angehängten elastischen Netzwerkschnittstellen () ENIs
<a name="cfn-template-snippets-eni-template"></a>

Das folgende Beispiel-Snippet erstellt eine Amazon EC2-Instance unter Verwendung einer [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html)-Ressource in der angegebenen Amazon VPC und dem angegebenen Subnetz. Sie verbindet zwei Netzwerkschnittstellen (ENIs) mit der Instance, ordnet Elastic IP-Adressen den Instances über die angehängte ENIs Verbindung zu und konfiguriert die Sicherheitsgruppe für SSH- und HTTP-Zugriff. Benutzerdaten werden der Instance im Rahmen der Startkonfiguration bereitgestellt, wenn die Instance erstellt wird. Die Benutzerdaten enthalten ein im `base64`-Format codiertes Skript, damit sie auf jeden Fall an die Instance übergeben werden. Beim Start der Instance wird das Skript automatisch als Teil des Bootstrapping-Prozesses ausgeführt. Es installiert `ec2-net-utils`, konfiguriert die Netzwerkschnittstellen und startet den HTTP-Service. 

Um das passende Amazon Machine Image (AMI) für die ausgewählte Region zu ermitteln, wird im Ausschnitt eine `Fn::FindInMap`-Funktion verwendet, die Werte in einer `RegionMap`-Zuordnung nachschlägt. Diese Zuordnung muss in der größeren Vorlage definiert werden. Die beiden Netzwerkschnittstellen werden mit [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-networkinterface.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-networkinterface.html) Ressourcen erstellt. Elastische IP-Adressen werden über [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eip.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eip.html) Ressourcen angegeben, die der `vpc`-Domain zugewiesen sind. Diese elastischen IP-Adressen sind mit den Netzwerkschnittstellen über die Ressourcen [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eipassociation.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eipassociation.html) verbunden. 

Im Abschnitt `Outputs` werden Werte oder Ressourcen definiert, auf die Sie nach Erstellung des Stacks zugreifen möchten. In diesem Codeausschnitt lautet die definierte Ausgabe `InstancePublicIp`, was für die öffentliche IP-Adresse der vom Stack erstellten EC2-Instance steht. [Sie können diese Ausgabe auf der Registerkarte „**Ausgabe**“ in der CloudFormation Konsole oder mit dem Befehl describe-stacks abrufen.](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html) 

Weitere Informationen über Elastic-Network-Schnittstellen finden Sie unter [Elastic-Network-Schnittstellen](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html).

#### JSON
<a name="cfn-template-snippets-eni-example-1.json"></a>

```
"Resources": {
    "ControlPortAddress": {
        "Type": "AWS::EC2::EIP",
        "Properties": {
            "Domain": "vpc"
        }
    },
    "AssociateControlPort": {
        "Type": "AWS::EC2::EIPAssociation",
        "Properties": {
            "AllocationId": {
                "Fn::GetAtt": [
                    "ControlPortAddress",
                    "AllocationId"
                ]
            },
            "NetworkInterfaceId": {
                "Ref": "controlXface"
            }
        }
    },
    "WebPortAddress": {
        "Type": "AWS::EC2::EIP",
        "Properties": {
            "Domain": "vpc"
        }
    },
    "AssociateWebPort": {
        "Type": "AWS::EC2::EIPAssociation",
        "Properties": {
            "AllocationId": {
                "Fn::GetAtt": [
                    "WebPortAddress",
                    "AllocationId"
                ]
            },
            "NetworkInterfaceId": {
                "Ref": "webXface"
            }
        }
    },
    "SSHSecurityGroup": {
        "Type": "AWS::EC2::SecurityGroup",
        "Properties": {
            "VpcId": {
                "Ref": "VpcId"
            },
            "GroupDescription": "Enable SSH access via port 22",
            "SecurityGroupIngress": [
                {
                    "CidrIp": "0.0.0.0/0",
                    "FromPort": 22,
                    "IpProtocol": "tcp",
                    "ToPort": 22
                }
            ]
        }
    },
    "WebSecurityGroup": {
        "Type": "AWS::EC2::SecurityGroup",
        "Properties": {
            "VpcId": {
                "Ref": "VpcId"
            },
            "GroupDescription": "Enable HTTP access via user-defined port",
            "SecurityGroupIngress": [
                {
                    "CidrIp": "0.0.0.0/0",
                    "FromPort": 80,
                    "IpProtocol": "tcp",
                    "ToPort": 80
                }
            ]
        }
    },
    "controlXface": {
        "Type": "AWS::EC2::NetworkInterface",
        "Properties": {
            "SubnetId": {
                "Ref": "SubnetId"
            },
            "Description": "Interface for controlling traffic such as SSH",
            "GroupSet": [
                {
                    "Fn::GetAtt": [
                        "SSHSecurityGroup",
                        "GroupId"
                    ]
                }
            ],
            "SourceDestCheck": true,
            "Tags": [
                {
                    "Key": "Network",
                    "Value": "Control"
                }
            ]
        }
    },
    "webXface": {
        "Type": "AWS::EC2::NetworkInterface",
        "Properties": {
            "SubnetId": {
                "Ref": "SubnetId"
            },
            "Description": "Interface for web traffic",
            "GroupSet": [
                {
                    "Fn::GetAtt": [
                        "WebSecurityGroup",
                        "GroupId"
                    ]
                }
            ],
            "SourceDestCheck": true,
            "Tags": [
                {
                    "Key": "Network",
                    "Value": "Web"
                }
            ]
        }
    },
    "Ec2Instance": {
        "Type": "AWS::EC2::Instance",
        "Properties": {
            "ImageId": {
                "Fn::FindInMap": [
                    "RegionMap",
                    {
                        "Ref": "AWS::Region"
                    },
                    "AMI"
                ]
            },
            "KeyName": {
                "Ref": "KeyName"
            },
            "NetworkInterfaces": [
                {
                    "NetworkInterfaceId": {
                        "Ref": "controlXface"
                    },
                    "DeviceIndex": "0"
                },
                {
                    "NetworkInterfaceId": {
                        "Ref": "webXface"
                    },
                    "DeviceIndex": "1"
                }
            ],
            "Tags": [
                {
                    "Key": "Role",
                    "Value": "Test Instance"
                }
            ],
            "UserData": {
                "Fn::Base64": {
                    "Fn::Sub": "#!/bin/bash -xe\nyum install ec2-net-utils -y\nec2ifup eth1\nservice httpd start\n"
                }
            }
        }
    }
},
"Outputs": {
    "InstancePublicIp": {
        "Description": "Public IP Address of the EC2 Instance",
        "Value": {
            "Fn::GetAtt": [
                "Ec2Instance",
                "PublicIp"
            ]
        }
    }
}
```

#### YAML
<a name="cfn-template-snippets-eni-example.yaml"></a>

```
Resources:
  ControlPortAddress:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
  AssociateControlPort:
    Type: AWS::EC2::EIPAssociation
    Properties:
      AllocationId:
        Fn::GetAtt:
          - ControlPortAddress
          - AllocationId
      NetworkInterfaceId:
        Ref: controlXface
  WebPortAddress:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc
  AssociateWebPort:
    Type: AWS::EC2::EIPAssociation
    Properties:
      AllocationId:
        Fn::GetAtt:
          - WebPortAddress
          - AllocationId
      NetworkInterfaceId:
        Ref: webXface
  SSHSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: VpcId
      GroupDescription: Enable SSH access via port 22
      SecurityGroupIngress:
        - CidrIp: 0.0.0.0/0
          FromPort: 22
          IpProtocol: tcp
          ToPort: 22
  WebSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: VpcId
      GroupDescription: Enable HTTP access via user-defined port
      SecurityGroupIngress:
        - CidrIp: 0.0.0.0/0
          FromPort: 80
          IpProtocol: tcp
          ToPort: 80
  controlXface:
    Type: AWS::EC2::NetworkInterface
    Properties:
      SubnetId:
        Ref: SubnetId
      Description: Interface for controlling traffic such as SSH
      GroupSet:
        - Fn::GetAtt:
            - SSHSecurityGroup
            - GroupId
      SourceDestCheck: true
      Tags:
        - Key: Network
          Value: Control
  webXface:
    Type: AWS::EC2::NetworkInterface
    Properties:
      SubnetId:
        Ref: SubnetId
      Description: Interface for web traffic
      GroupSet:
        - Fn::GetAtt:
            - WebSecurityGroup
            - GroupId
      SourceDestCheck: true
      Tags:
        - Key: Network
          Value: Web
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId:
        Fn::FindInMap:
          - RegionMap
          - Ref: AWS::Region
          - AMI
      KeyName:
        Ref: KeyName
      NetworkInterfaces:
        - NetworkInterfaceId:
            Ref: controlXface
          DeviceIndex: "0"
        - NetworkInterfaceId:
            Ref: webXface
          DeviceIndex: "1"
      Tags:
        - Key: Role
          Value: Test Instance
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          yum install ec2-net-utils -y
          ec2ifup eth1
          service httpd start
Outputs:
  InstancePublicIp:
    Description: Public IP Address of the EC2 Instance
    Value:
      Fn::GetAtt:
        - Ec2Instance
        - PublicIp
```

# Amazon Elastic Container Service Beispielvorlagen
<a name="quickref-ecs"></a>

Amazon Elastic Container Service (Amazon ECS) ist ein Container-Management-Service, mit dem Sie unkompliziert Docker-Container in einem Cluster aus Amazon Elastic Compute Cloud (Amazon EC2)-Instances ausführen, beenden und verwalten können.

## Erstellen Sie einen Cluster mit AL2023 Amazon ECS-Optimized-AMI
<a name="create-cluster-al2023"></a>

Definieren Sie einen Cluster, der einen Kapazitätsanbieter verwendet, der AL2023-Instances auf Amazon EC2 startet.

**Wichtig**  
Das neueste AMI IDs finden Sie unter [Amazon ECS-Optimized AMI](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html) im *Amazon Elastic Container Service Developer Guide*.

### JSON
<a name="quickref-ecs-example-1.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "EC2 ECS cluster that starts out empty, with no EC2 instances yet. An ECS capacity provider automatically launches more EC2 instances as required on the fly when you request ECS to launch services or standalone tasks.",
  "Parameters": {
      "InstanceType": {
          "Type": "String",
          "Description": "EC2 instance type",
          "Default": "t2.medium",
          "AllowedValues": [
              "t1.micro",
              "t2.2xlarge",
              "t2.large",
              "t2.medium",
              "t2.micro",
              "t2.nano",
              "t2.small",
              "t2.xlarge",
              "t3.2xlarge",
              "t3.large",
              "t3.medium",
              "t3.micro",
              "t3.nano",
              "t3.small",
              "t3.xlarge"
          ]
      },
      "DesiredCapacity": {
          "Type": "Number",
          "Default": "0",
          "Description": "Number of EC2 instances to launch in your ECS cluster."
      },
      "MaxSize": {
          "Type": "Number",
          "Default": "100",
          "Description": "Maximum number of EC2 instances that can be launched in your ECS cluster."
      },
      "ECSAMI": {
          "Description": "The Amazon Machine Image ID used for the cluster",
          "Type": "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
          "Default": "/aws/service/ecs/optimized-ami/amazon-linux-2023/recommended/image_id"
      },
      "VpcId": {
          "Type": "AWS::EC2::VPC::Id",
          "Description": "VPC ID where the ECS cluster is launched",
          "Default": "vpc-1234567890abcdef0"
      },
      "SubnetIds": {
          "Type": "List<AWS::EC2::Subnet::Id>",
          "Description": "List of subnet IDs where the EC2 instances will be launched",
          "Default": "subnet-021345abcdef67890"
      }
  },
  "Resources": {
      "ECSCluster": {
          "Type": "AWS::ECS::Cluster",
          "Properties": {
              "ClusterSettings": [
                  {
                      "Name": "containerInsights",
                      "Value": "enabled"
                  }
              ]
          }
      },
      "ECSAutoScalingGroup": {
          "Type": "AWS::AutoScaling::AutoScalingGroup",
          "DependsOn": [
              "ECSCluster",
              "EC2Role"
          ],
          "Properties": {
              "VPCZoneIdentifier": {
                  "Ref": "SubnetIds"
              },
              "LaunchTemplate": {
                  "LaunchTemplateId": {
                      "Ref": "ContainerInstances"
                  },
                  "Version": {
                      "Fn::GetAtt": [
                          "ContainerInstances",
                          "LatestVersionNumber"
                      ]
                  }
              },
              "MinSize": 0,
              "MaxSize": {
                  "Ref": "MaxSize"
              },
              "DesiredCapacity": {
                  "Ref": "DesiredCapacity"
              },
              "NewInstancesProtectedFromScaleIn": true
          },
          "UpdatePolicy": {
              "AutoScalingReplacingUpdate": {
                  "WillReplace": "true"
              }
          }
      },
      "ContainerInstances": {
          "Type": "AWS::EC2::LaunchTemplate",
          "Properties": {
              "LaunchTemplateName": "asg-launch-template",
              "LaunchTemplateData": {
                  "ImageId": {
                      "Ref": "ECSAMI"
                  },
                  "InstanceType": {
                      "Ref": "InstanceType"
                  },
                  "IamInstanceProfile": {
                      "Name": {
                          "Ref": "EC2InstanceProfile"
                      }
                  },
                  "SecurityGroupIds": [
                      {
                          "Ref": "ContainerHostSecurityGroup"
                      }
                  ],
                  "UserData": {
                      "Fn::Base64": {
                          "Fn::Sub": "#!/bin/bash -xe\n echo ECS_CLUSTER=${ECSCluster} >> /etc/ecs/ecs.config\n yum install -y aws-cfn-bootstrap\n /opt/aws/bin/cfn-init -v --stack ${AWS::StackId} --resource ContainerInstances --configsets full_install --region ${AWS::Region} &\n"
                      }
                  },
                  "MetadataOptions": {
                      "HttpEndpoint": "enabled",
                      "HttpTokens": "required"
                  }
              }
          }
      },
      "EC2InstanceProfile": {
          "Type": "AWS::IAM::InstanceProfile",
          "Properties": {
              "Path": "/",
              "Roles": [
                  {
                      "Ref": "EC2Role"
                  }
              ]
          }
      },
      "CapacityProvider": {
          "Type": "AWS::ECS::CapacityProvider",
          "Properties": {
              "AutoScalingGroupProvider": {
                  "AutoScalingGroupArn": {
                      "Ref": "ECSAutoScalingGroup"
                  },
                  "ManagedScaling": {
                      "InstanceWarmupPeriod": 60,
                      "MinimumScalingStepSize": 1,
                      "MaximumScalingStepSize": 100,
                      "Status": "ENABLED",
                      "TargetCapacity": 100
                  },
                  "ManagedTerminationProtection": "ENABLED"
              }
          }
      },
      "CapacityProviderAssociation": {
          "Type": "AWS::ECS::ClusterCapacityProviderAssociations",
          "Properties": {
              "CapacityProviders": [
                  {
                      "Ref": "CapacityProvider"
                  }
              ],
              "Cluster": {
                  "Ref": "ECSCluster"
              },
              "DefaultCapacityProviderStrategy": [
                  {
                      "Base": 0,
                      "CapacityProvider": {
                          "Ref": "CapacityProvider"
                      },
                      "Weight": 1
                  }
              ]
          }
      },
      "ContainerHostSecurityGroup": {
          "Type": "AWS::EC2::SecurityGroup",
          "Properties": {
              "GroupDescription": "Access to the EC2 hosts that run containers",
              "VpcId": {
                  "Ref": "VpcId"
              }
          }
      },
      "EC2Role": {
          "Type": "AWS::IAM::Role",
          "Properties": {
              "AssumeRolePolicyDocument": {
                  "Statement": [
                      {
                          "Effect": "Allow",
                          "Principal": {
                              "Service": [
                                  "ec2.amazonaws.com"
                              ]
                          },
                          "Action": [
                              "sts:AssumeRole"
                          ]
                      }
                  ]
              },
              "Path": "/",
              "ManagedPolicyArns": [
                  "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role",
                  "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
              ]
          }
      },
      "ECSTaskExecutionRole": {
          "Type": "AWS::IAM::Role",
          "Properties": {
              "AssumeRolePolicyDocument": {
                  "Statement": [
                      {
                          "Effect": "Allow",
                          "Principal": {
                              "Service": [
                                  "ecs-tasks.amazonaws.com"
                              ]
                          },
                          "Action": [
                              "sts:AssumeRole"
                          ],
                          "Condition": {
                              "ArnLike": {
                                  "aws:SourceArn": {
                                      "Fn::Sub": "arn:${AWS::Partition}:ecs:${AWS::Region}:${AWS::AccountId}:*"
                                  }
                              },
                              "StringEquals": {
                                  "aws:SourceAccount": {
                                        "Fn::Sub": "${AWS::AccountId}"
                                    }
                              }
                          }
                      }
                  ]
              },
              "Path": "/",
              "ManagedPolicyArns": [
                  "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
              ]
          }
      }
  },
  "Outputs": {
      "ClusterName": {
          "Description": "The ECS cluster into which to launch resources",
          "Value": "ECSCluster"
      },
      "ECSTaskExecutionRole": {
          "Description": "The role used to start up a task",
          "Value": "ECSTaskExecutionRole"
      },
      "CapacityProvider": {
          "Description": "The cluster capacity provider that the service should use to request capacity when it wants to start up a task",
          "Value": "CapacityProvider"
      }
  }
}
```

### YAML
<a name="quickref-ecs-example-1.yaml"></a>

```
AWSTemplateFormatVersion: 2010-09-09
Description: EC2 ECS cluster that starts out empty, with no EC2 instances yet.
  An ECS capacity provider automatically launches more EC2 instances as required
  on the fly when you request ECS to launch services or standalone tasks.
Parameters:
  InstanceType:
    Type: String
    Description: EC2 instance type
    Default: "t2.medium"
    AllowedValues:
      - t1.micro
      - t2.2xlarge
      - t2.large
      - t2.medium
      - t2.micro
      - t2.nano
      - t2.small
      - t2.xlarge
      - t3.2xlarge
      - t3.large
      - t3.medium
      - t3.micro
      - t3.nano
      - t3.small
      - t3.xlarge
  DesiredCapacity:
    Type: Number
    Default: "0"
    Description: Number of EC2 instances to launch in your ECS cluster.
  MaxSize:
    Type: Number
    Default: "100"
    Description: Maximum number of EC2 instances that can be launched in your ECS cluster.
  ECSAMI:
    Description: The Amazon Machine Image ID used for the cluster
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ecs/optimized-ami/amazon-linux-2023/recommended/image_id
  VpcId:
    Type: AWS::EC2::VPC::Id
    Description: VPC ID where the ECS cluster is launched
    Default: vpc-1234567890abcdef0
  SubnetIds:
    Type: List<AWS::EC2::Subnet::Id>
    Description: List of subnet IDs where the EC2 instances will be launched
    Default: "subnet-021345abcdef67890"
Resources:
# This is authorizes ECS to manage resources on your
  # account on your behalf. This role is likely already created on your account
  # ECSRole:
  #  Type: AWS::IAM::ServiceLinkedRole
  #  Properties:
  #    AWSServiceName: 'ecs.amazonaws.com'
  
   # ECS Resources
  ECSCluster:
    Type: AWS::ECS::Cluster
    Properties:
      ClusterSettings:
        - Name: containerInsights
          Value: enabled
  
  # Autoscaling group. This launches the actual EC2 instances that will register
  # themselves as members of the cluster, and run the docker containers.
  ECSAutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    DependsOn:
      # This is to ensure that the ASG gets deleted first before these
    # resources, when it comes to stack teardown.
      - ECSCluster
      - EC2Role
    Properties:
      VPCZoneIdentifier:
        Ref: SubnetIds
      LaunchTemplate:
        LaunchTemplateId: !Ref ContainerInstances
        Version: !GetAtt ContainerInstances.LatestVersionNumber
      MinSize: 0
      MaxSize:
        Ref: MaxSize
      DesiredCapacity:
        Ref: DesiredCapacity
      NewInstancesProtectedFromScaleIn: true
    UpdatePolicy:
      AutoScalingReplacingUpdate:
        WillReplace: "true"
  # The config for each instance that is added to the cluster
  ContainerInstances:
    Type: AWS::EC2::LaunchTemplate
    Properties:
      LaunchTemplateName: "asg-launch-template"
      LaunchTemplateData:
        ImageId:
          Ref: ECSAMI
        InstanceType:
          Ref: InstanceType
        IamInstanceProfile:
          Name: !Ref EC2InstanceProfile
        SecurityGroupIds:
          - !Ref ContainerHostSecurityGroup
        # This injected configuration file is how the EC2 instance
      # knows which ECS cluster on your AWS account it should be joining
        UserData:
          Fn::Base64: !Sub |
           #!/bin/bash -xe
            echo ECS_CLUSTER=${ECSCluster} >> /etc/ecs/ecs.config
            yum install -y aws-cfn-bootstrap
            /opt/aws/bin/cfn-init -v --stack ${AWS::StackId} --resource ContainerInstances --configsets full_install --region ${AWS::Region} &
         # Disable IMDSv1, and require IMDSv2
        MetadataOptions:
          HttpEndpoint: enabled
          HttpTokens: required
  EC2InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles: 
      - !Ref EC2Role 
  # Create an ECS capacity provider to attach the ASG to the ECS cluster
  # so that it autoscales as we launch more containers
  CapacityProvider:
    Type: AWS::ECS::CapacityProvider
    Properties:
      AutoScalingGroupProvider:
        AutoScalingGroupArn: !Ref ECSAutoScalingGroup
        ManagedScaling:
          InstanceWarmupPeriod: 60
          MinimumScalingStepSize: 1
          MaximumScalingStepSize: 100
          Status: ENABLED
          # Percentage of cluster reservation to try to maintain
          TargetCapacity: 100
        ManagedTerminationProtection: ENABLED
   # Create a cluster capacity provider assocation so that the cluster
  # will use the capacity provider
  CapacityProviderAssociation:
    Type: AWS::ECS::ClusterCapacityProviderAssociations
    Properties:
      CapacityProviders:
        - !Ref CapacityProvider
      Cluster: !Ref ECSCluster
      DefaultCapacityProviderStrategy:
        - Base: 0
          CapacityProvider: !Ref CapacityProvider
          Weight: 1
  # A security group for the EC2 hosts that will run the containers.
  # This can be used to limit incoming traffic to or outgoing traffic
  # from the container's host EC2 instance.
  ContainerHostSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Access to the EC2 hosts that run containers
      VpcId:
        Ref: VpcId
  # Role for the EC2 hosts. This allows the ECS agent on the EC2 hosts
  # to communciate with the ECS control plane, as well as download the docker
  # images from ECR to run on your host.
  EC2Role:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      ManagedPolicyArns:
      # See reference: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonEC2ContainerServiceforEC2Role
        - arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role
      # This managed policy allows us to connect to the instance using SSM
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
  # This is a role which is used within Fargate to allow the Fargate agent
  # to download images, and upload logs.
  ECSTaskExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ecs-tasks.amazonaws.com
            Action:
              - sts:AssumeRole
            Condition:
              ArnLike:
                aws:SourceArn: !Sub arn:${AWS::Partition}:ecs:${AWS::Region}:${AWS::AccountId}:*
              StringEquals:
                aws:SourceAccount: !Sub ${AWS::AccountId}
      Path: /
      # This role enables all features of ECS. See reference:
    # https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-iam-awsmanpol.html#security-iam-awsmanpol-AmazonECSTaskExecutionRolePolicy
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
Outputs:
  ClusterName:
    Description: The ECS cluster into which to launch resources
    Value: ECSCluster
  ECSTaskExecutionRole:
    Description: The role used to start up a task
    Value: ECSTaskExecutionRole
  CapacityProvider:
    Description: The cluster capacity provider that the service should use to
      request capacity when it wants to start up a task
    Value: CapacityProvider
```

## Einen Dienst einrichten
<a name="create-service"></a>

Die folgende Vorlage definiert einen Service, der den Kapazitätsanbieter verwendet, um Kapazität zur Ausführung anzufordern AL2023 . Container werden auf den AL2023 Instances gestartet, sobald sie online gehen:

### JSON
<a name="quickref-ecs-example-2.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "An example service that deploys in AWS VPC networking mode on EC2 capacity. Service uses a capacity provider to request EC2 instances to run on. Service runs with networking in private subnets, but still accessible to the internet via a load balancer hosted in public subnets.",
  "Parameters": {
      "VpcId": {
          "Type": "String",
          "Description": "The VPC that the service is running inside of"
      },
      "PublicSubnetIds": {
          "Type": "List<AWS::EC2::Subnet::Id>",
          "Description": "List of public subnet ID's to put the load balancer in"
      },
      "PrivateSubnetIds": {
          "Type": "List<AWS::EC2::Subnet::Id>",
          "Description": "List of private subnet ID's that the AWS VPC tasks are in"
      },
      "ClusterName": {
          "Type": "String",
          "Description": "The name of the ECS cluster into which to launch capacity."
      },
      "ECSTaskExecutionRole": {
          "Type": "String",
          "Description": "The role used to start up an ECS task"
      },
      "CapacityProvider": {
          "Type": "String",
          "Description": "The cluster capacity provider that the service should use to request capacity when it wants to start up a task"
      },
      "ServiceName": {
          "Type": "String",
          "Default": "web",
          "Description": "A name for the service"
      },
      "ImageUrl": {
          "Type": "String",
          "Default": "public.ecr.aws/docker/library/nginx:latest",
          "Description": "The url of a docker image that contains the application process that will handle the traffic for this service"
      },
      "ContainerCpu": {
          "Type": "Number",
          "Default": 256,
          "Description": "How much CPU to give the container. 1024 is 1 CPU"
      },
      "ContainerMemory": {
          "Type": "Number",
          "Default": 512,
          "Description": "How much memory in megabytes to give the container"
      },
      "ContainerPort": {
          "Type": "Number",
          "Default": 80,
          "Description": "What port that the application expects traffic on"
      },
      "DesiredCount": {
          "Type": "Number",
          "Default": 2,
          "Description": "How many copies of the service task to run"
      }
  },
  "Resources": {
      "TaskDefinition": {
          "Type": "AWS::ECS::TaskDefinition",
          "Properties": {
              "Family": {
                  "Ref": "ServiceName"
              },
              "Cpu": {
                  "Ref": "ContainerCpu"
              },
              "Memory": {
                  "Ref": "ContainerMemory"
              },
              "NetworkMode": "awsvpc",
              "RequiresCompatibilities": [
                  "EC2"
              ],
              "ExecutionRoleArn": {
                  "Ref": "ECSTaskExecutionRole"
              },
              "ContainerDefinitions": [
                  {
                      "Name": {
                          "Ref": "ServiceName"
                      },
                      "Cpu": {
                          "Ref": "ContainerCpu"
                      },
                      "Memory": {
                          "Ref": "ContainerMemory"
                      },
                      "Image": {
                          "Ref": "ImageUrl"
                      },
                      "PortMappings": [
                          {
                              "ContainerPort": {
                                  "Ref": "ContainerPort"
                              },
                              "HostPort": {
                                  "Ref": "ContainerPort"
                              }
                          }
                      ],
                      "LogConfiguration": {
                          "LogDriver": "awslogs",
                          "Options": {
                              "mode": "non-blocking",
                              "max-buffer-size": "25m",
                              "awslogs-group": {
                                  "Ref": "LogGroup"
                              },
                              "awslogs-region": {
                                  "Ref": "AWS::Region"
                              },
                              "awslogs-stream-prefix": {
                                  "Ref": "ServiceName"
                              }
                          }
                      }
                  }
              ]
          }
      },
      "Service": {
          "Type": "AWS::ECS::Service",
          "DependsOn": "PublicLoadBalancerListener",
          "Properties": {
              "ServiceName": {
                  "Ref": "ServiceName"
              },
              "Cluster": {
                  "Ref": "ClusterName"
              },
              "PlacementStrategies": [
                  {
                      "Field": "attribute:ecs.availability-zone",
                      "Type": "spread"
                  },
                  {
                      "Field": "cpu",
                      "Type": "binpack"
                  }
              ],
              "CapacityProviderStrategy": [
                  {
                      "Base": 0,
                      "CapacityProvider": {
                          "Ref": "CapacityProvider"
                      },
                      "Weight": 1
                  }
              ],
              "NetworkConfiguration": {
                  "AwsvpcConfiguration": {
                      "SecurityGroups": [
                          {
                              "Ref": "ServiceSecurityGroup"
                          }
                      ],
                      "Subnets": {
                          "Ref": "PrivateSubnetIds"
                      }
                  }
              },
              "DeploymentConfiguration": {
                  "MaximumPercent": 200,
                  "MinimumHealthyPercent": 75
              },
              "DesiredCount": {
                  "Ref": "DesiredCount"
              },
              "TaskDefinition": {
                  "Ref": "TaskDefinition"
              },
              "LoadBalancers": [
                  {
                      "ContainerName": {
                          "Ref": "ServiceName"
                      },
                      "ContainerPort": {
                          "Ref": "ContainerPort"
                      },
                      "TargetGroupArn": {
                          "Ref": "ServiceTargetGroup"
                      }
                  }
              ]
          }
      },
      "ServiceSecurityGroup": {
          "Type": "AWS::EC2::SecurityGroup",
          "Properties": {
              "GroupDescription": "Security group for service",
              "VpcId": {
                  "Ref": "VpcId"
              }
          }
      },
      "ServiceTargetGroup": {
          "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
          "Properties": {
              "HealthCheckIntervalSeconds": 6,
              "HealthCheckPath": "/",
              "HealthCheckProtocol": "HTTP",
              "HealthCheckTimeoutSeconds": 5,
              "HealthyThresholdCount": 2,
              "TargetType": "ip",
              "Port": {
                  "Ref": "ContainerPort"
              },
              "Protocol": "HTTP",
              "UnhealthyThresholdCount": 10,
              "VpcId": {
                  "Ref": "VpcId"
              },
              "TargetGroupAttributes": [
                  {
                      "Key": "deregistration_delay.timeout_seconds",
                      "Value": 0
                  }
              ]
          }
      },
      "PublicLoadBalancerSG": {
          "Type": "AWS::EC2::SecurityGroup",
          "Properties": {
              "GroupDescription": "Access to the public facing load balancer",
              "VpcId": {
                  "Ref": "VpcId"
              },
              "SecurityGroupIngress": [
                  {
                      "CidrIp": "0.0.0.0/0",
                      "IpProtocol": -1
                  }
              ]
          }
      },
      "PublicLoadBalancer": {
          "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
          "Properties": {
              "Scheme": "internet-facing",
              "LoadBalancerAttributes": [
                  {
                      "Key": "idle_timeout.timeout_seconds",
                      "Value": "30"
                  }
              ],
              "Subnets": {
                  "Ref": "PublicSubnetIds"
              },
              "SecurityGroups": [
                  {
                      "Ref": "PublicLoadBalancerSG"
                  }
              ]
          }
      },
      "PublicLoadBalancerListener": {
          "Type": "AWS::ElasticLoadBalancingV2::Listener",
          "Properties": {
              "DefaultActions": [
                  {
                      "Type": "forward",
                      "ForwardConfig": {
                          "TargetGroups": [
                              {
                                  "TargetGroupArn": {
                                      "Ref": "ServiceTargetGroup"
                                  },
                                  "Weight": 100
                              }
                          ]
                      }
                  }
              ],
              "LoadBalancerArn": {
                  "Ref": "PublicLoadBalancer"
              },
              "Port": 80,
              "Protocol": "HTTP"
          }
      },
      "ServiceIngressfromLoadBalancer": {
          "Type": "AWS::EC2::SecurityGroupIngress",
          "Properties": {
              "Description": "Ingress from the public ALB",
              "GroupId": {
                  "Ref": "ServiceSecurityGroup"
              },
              "IpProtocol": -1,
              "SourceSecurityGroupId": {
                  "Ref": "PublicLoadBalancerSG"
              }
          }
      },
      "LogGroup": {
          "Type": "AWS::Logs::LogGroup"
      }
  }
}
```

### YAML
<a name="quickref-ecs-example-2.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Description: >-
  An example service that deploys in AWS VPC networking mode on EC2 capacity.
  Service uses a capacity provider to request EC2 instances to run on. Service
  runs with networking in private subnets, but still accessible to the internet
  via a load balancer hosted in public subnets.
Parameters:
  VpcId:
    Type: String
    Description: The VPC that the service is running inside of
  PublicSubnetIds:
    Type: 'List<AWS::EC2::Subnet::Id>'
    Description: List of public subnet ID's to put the load balancer in
  PrivateSubnetIds:
    Type: 'List<AWS::EC2::Subnet::Id>'
    Description: List of private subnet ID's that the AWS VPC tasks are in
  ClusterName:
    Type: String
    Description: The name of the ECS cluster into which to launch capacity.
  ECSTaskExecutionRole:
    Type: String
    Description: The role used to start up an ECS task
  CapacityProvider:
    Type: String
    Description: >-
      The cluster capacity provider that the service should use to request
      capacity when it wants to start up a task
  ServiceName:
    Type: String
    Default: web
    Description: A name for the service
  ImageUrl:
    Type: String
    Default: 'public.ecr.aws/docker/library/nginx:latest'
    Description: >-
      The url of a docker image that contains the application process that will
      handle the traffic for this service
  ContainerCpu:
    Type: Number
    Default: 256
    Description: How much CPU to give the container. 1024 is 1 CPU
  ContainerMemory:
    Type: Number
    Default: 512
    Description: How much memory in megabytes to give the container
  ContainerPort:
    Type: Number
    Default: 80
    Description: What port that the application expects traffic on
  DesiredCount:
    Type: Number
    Default: 2
    Description: How many copies of the service task to run
Resources:
  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      Family: !Ref ServiceName
      Cpu: !Ref ContainerCpu
      Memory: !Ref ContainerMemory
      NetworkMode: awsvpc
      RequiresCompatibilities:
        - EC2
      ExecutionRoleArn: !Ref ECSTaskExecutionRole
      ContainerDefinitions:
        - Name: !Ref ServiceName
          Cpu: !Ref ContainerCpu
          Memory: !Ref ContainerMemory
          Image: !Ref ImageUrl
          PortMappings:
            - ContainerPort: !Ref ContainerPort
              HostPort: !Ref ContainerPort
          LogConfiguration:
            LogDriver: awslogs
            Options:
              mode: non-blocking
              max-buffer-size: 25m
              awslogs-group: !Ref LogGroup
              awslogs-region: !Ref AWS::Region
              awslogs-stream-prefix: !Ref ServiceName
  Service:
    Type: AWS::ECS::Service
    DependsOn: PublicLoadBalancerListener
    Properties:
      ServiceName: !Ref ServiceName
      Cluster: !Ref ClusterName
      PlacementStrategies:
        - Field: 'attribute:ecs.availability-zone'
          Type: spread
        - Field: cpu
          Type: binpack
      CapacityProviderStrategy:
        - Base: 0
          CapacityProvider: !Ref CapacityProvider
          Weight: 1
      NetworkConfiguration:
        AwsvpcConfiguration:
          SecurityGroups:
            - !Ref ServiceSecurityGroup
          Subnets: !Ref PrivateSubnetIds
      DeploymentConfiguration:
        MaximumPercent: 200
        MinimumHealthyPercent: 75
      DesiredCount: !Ref DesiredCount
      TaskDefinition: !Ref TaskDefinition
      LoadBalancers:
        - ContainerName: !Ref ServiceName
          ContainerPort: !Ref ContainerPort
          TargetGroupArn: !Ref ServiceTargetGroup
  ServiceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for service
      VpcId: !Ref VpcId
  ServiceTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      HealthCheckIntervalSeconds: 6
      HealthCheckPath: /
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 5
      HealthyThresholdCount: 2
      TargetType: ip
      Port: !Ref ContainerPort
      Protocol: HTTP
      UnhealthyThresholdCount: 10
      VpcId: !Ref VpcId
      TargetGroupAttributes:
        - Key: deregistration_delay.timeout_seconds
          Value: 0
  PublicLoadBalancerSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Access to the public facing load balancer
      VpcId: !Ref VpcId
      SecurityGroupIngress:
        - CidrIp: 0.0.0.0/0
          IpProtocol: -1
  PublicLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Scheme: internet-facing
      LoadBalancerAttributes:
        - Key: idle_timeout.timeout_seconds
          Value: '30'
      Subnets: !Ref PublicSubnetIds
      SecurityGroups:
        - !Ref PublicLoadBalancerSG
  PublicLoadBalancerListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          ForwardConfig:
            TargetGroups:
              - TargetGroupArn: !Ref ServiceTargetGroup
                Weight: 100
      LoadBalancerArn: !Ref PublicLoadBalancer
      Port: 80
      Protocol: HTTP
  ServiceIngressfromLoadBalancer:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      Description: Ingress from the public ALB
      GroupId: !Ref ServiceSecurityGroup
      IpProtocol: -1
      SourceSecurityGroupId: !Ref PublicLoadBalancerSG
  LogGroup:
    Type: AWS::Logs::LogGroup
```

# Amazon Elastic File System-Beispielvorlage
<a name="quickref-efs"></a>

Amazon Elastic File System (Amazon EFS) ist ein Dateispeicherservice für Amazon Elastic Compute Cloud (Amazon EC2) -Instances. Mit Amazon EFS haben ihre Anwendungen Speicher, wenn sie ihn benötigen, da die Speicherkapazität automatisch wächst oder sinkt, wenn Sie Dateien hinzufügen oder entfernen.

Die folgende Beispielvorlage stellt EC2 Instances (in einer Auto Scaling Scaling-Gruppe) bereit, die einem Amazon EFS-Dateisystem zugeordnet sind. Um die Instances mit dem Dateisystem zu verknüpfen, führen die Instances das cfn-init Hilfsskript aus, das den `nfs-utils` runterlädt und installiert, yum package erstellt ein neues Verzeichnis und verwendet den DNS-Namen des Dateisystems um das Dateisystem am Verzeichnis zu mounten. Der DNS-Name des Dateisystems wird in die IP-Adresse eines Mount-Ziels in der Availability Zone der EC2 Amazon-Instance aufgelöst. Weitere Informationen über den DNS-Namenstruktur finden sie unter [Mounting von Dateisystemen](https://docs.aws.amazon.com/efs/latest/ug/mounting-fs.html) im *Amazon Elastic File System-Benutzerhandbuch*.

Um die Aktivität des Netzwerk-Dateisystems zu messen, enthält die Vorlage benutzerdefinierte CloudWatch Amazon-Metriken. Die Vorlage erstellt außerdem eine VPC, Subnetz und Sicherheitsgruppen. Damit die Instances mit dem Dateisystem kommunizieren können, muss DNS für die VPC aktiviert sein und das Mount-Ziel und die EC2 Instances müssen sich in derselben Availability Zone (AZ) befinden, die durch das Subnetz spezifiziert wird.

Die Sicherheitsgruppe des Mount-Ziels ermöglicht eine Netzwerkverbindung zum TCP-Port 2049, die erforderlich ist, damit ein NFSv4 Client ein Dateisystem mounten kann. Weitere Informationen zu Sicherheitsgruppen für EC2 Instances und Mount-Ziele finden Sie unter [Sicherheit](https://docs.aws.amazon.com/efs/latest/ug/security-considerations.html) im [https://docs.aws.amazon.com/efs/latest/ug/](https://docs.aws.amazon.com/efs/latest/ug/).

**Anmerkung**  
Wenn Sie eine Aktualisierung des Bereitstellungsziels durchführen, dass zu einer Ersetzung führt, werden Instances oder Anwendungen die von den verknüpften Dateisystemen verwenden werden, möglicherweise unterbrochen. Dies kann dazu führen, dass nicht festgeschriebene Schreibvorgänge verloren gehen. Um Unterbrechungen zu vermeiden, beenden Sie Ihre Instances, wenn Sie das Bereitstellungsziel aktualisieren, indem Sie die gewünschte Kapazität auf null setzen. Auf diese Weise können die Instances das Mounting des Dateisystems aufheben, bevor das Bereitstellungsziel gelöscht wird. Nachdem die Mount-Aktualisierung abgeschlossen ist, starten Sie Ihre Instances in einer nachfolgenden Aktualisierung, indem Sie die gewünschte Kapazitäten setzen.

## JSON
<a name="quickref-efs-example-1.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "This template creates an Amazon EFS file system and mount target and associates it with Amazon EC2 instances in an Auto Scaling group. **WARNING** This template creates Amazon EC2 instances and related resources. You will be billed for the AWS resources used if you create a stack from this template.",
  "Parameters": {
    "InstanceType" : {
      "Description" : "WebServer EC2 instance type",
      "Type" : "String",
      "Default" : "t2.small",
      "AllowedValues" : [ 
        "t1.micro", 
        "t2.nano", 
        "t2.micro", 
        "t2.small", 
        "t2.medium", 
        "t2.large", 
        "m1.small", 
        "m1.medium", 
        "m1.large", 
        "m1.xlarge", 
        "m2.xlarge", 
        "m2.2xlarge", 
        "m2.4xlarge", 
        "m3.medium", 
        "m3.large", 
        "m3.xlarge", 
        "m3.2xlarge", 
        "m4.large", 
        "m4.xlarge", 
        "m4.2xlarge", 
        "m4.4xlarge", 
        "m4.10xlarge", 
        "c1.medium", 
        "c1.xlarge", 
        "c3.large", 
        "c3.xlarge", 
        "c3.2xlarge", 
        "c3.4xlarge", 
        "c3.8xlarge", 
        "c4.large", 
        "c4.xlarge", 
        "c4.2xlarge", 
        "c4.4xlarge", 
        "c4.8xlarge", 
        "g2.2xlarge", 
        "g2.8xlarge", 
        "r3.large", 
        "r3.xlarge", 
        "r3.2xlarge", 
        "r3.4xlarge", 
        "r3.8xlarge", 
        "i2.xlarge", 
        "i2.2xlarge", 
        "i2.4xlarge", 
        "i2.8xlarge", 
        "d2.xlarge", 
        "d2.2xlarge", 
        "d2.4xlarge", 
        "d2.8xlarge", 
        "hi1.4xlarge", 
        "hs1.8xlarge", 
        "cr1.8xlarge", 
        "cc2.8xlarge", 
        "cg1.4xlarge"
      ],
      "ConstraintDescription" : "must be a valid EC2 instance type."
    },
    "KeyName": {
      "Type": "AWS::EC2::KeyPair::KeyName",
      "Description": "Name of an existing EC2 key pair to enable SSH access to the EC2 instances"
    },
    "AsgMaxSize": {
      "Type": "Number",
      "Description": "Maximum size and initial desired capacity of Auto Scaling Group",
      "Default": "2"
    },
    "SSHLocation" : {
      "Description" : "The IP address range that can be used to connect to the EC2 instances by using SSH",
      "Type": "String",
      "MinLength": "9",
      "MaxLength": "18",
      "Default": "0.0.0.0/0",
      "AllowedPattern": "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
      "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x."
    },
    "VolumeName" : {
      "Description" : "The name to be used for the EFS volume",
      "Type": "String",
      "MinLength": "1",
      "Default": "myEFSvolume"
    },
    "MountPoint" : {
      "Description" : "The Linux mount point for the EFS volume",
      "Type": "String",
      "MinLength": "1",
      "Default": "myEFSvolume"
    }
  },
  "Mappings" : {
    "AWSInstanceType2Arch" : {
      "t1.micro"    : { "Arch" : "HVM64"  },
      "t2.nano"     : { "Arch" : "HVM64"  },
      "t2.micro"    : { "Arch" : "HVM64"  },
      "t2.small"    : { "Arch" : "HVM64"  },
      "t2.medium"   : { "Arch" : "HVM64"  },
      "t2.large"    : { "Arch" : "HVM64"  },
      "m1.small"    : { "Arch" : "HVM64"  },
      "m1.medium"   : { "Arch" : "HVM64"  },
      "m1.large"    : { "Arch" : "HVM64"  },
      "m1.xlarge"   : { "Arch" : "HVM64"  },
      "m2.xlarge"   : { "Arch" : "HVM64"  },
      "m2.2xlarge"  : { "Arch" : "HVM64"  },
      "m2.4xlarge"  : { "Arch" : "HVM64"  },
      "m3.medium"   : { "Arch" : "HVM64"  },
      "m3.large"    : { "Arch" : "HVM64"  },
      "m3.xlarge"   : { "Arch" : "HVM64"  },
      "m3.2xlarge"  : { "Arch" : "HVM64"  },
      "m4.large"    : { "Arch" : "HVM64"  },
      "m4.xlarge"   : { "Arch" : "HVM64"  },
      "m4.2xlarge"  : { "Arch" : "HVM64"  },
      "m4.4xlarge"  : { "Arch" : "HVM64"  },
      "m4.10xlarge" : { "Arch" : "HVM64"  },
      "c1.medium"   : { "Arch" : "HVM64"  },
      "c1.xlarge"   : { "Arch" : "HVM64"  },
      "c3.large"    : { "Arch" : "HVM64"  },
      "c3.xlarge"   : { "Arch" : "HVM64"  },
      "c3.2xlarge"  : { "Arch" : "HVM64"  },
      "c3.4xlarge"  : { "Arch" : "HVM64"  },
      "c3.8xlarge"  : { "Arch" : "HVM64"  },
      "c4.large"    : { "Arch" : "HVM64"  },
      "c4.xlarge"   : { "Arch" : "HVM64"  },
      "c4.2xlarge"  : { "Arch" : "HVM64"  },
      "c4.4xlarge"  : { "Arch" : "HVM64"  },
      "c4.8xlarge"  : { "Arch" : "HVM64"  },
      "g2.2xlarge"  : { "Arch" : "HVMG2"  },
      "g2.8xlarge"  : { "Arch" : "HVMG2"  },
      "r3.large"    : { "Arch" : "HVM64"  },
      "r3.xlarge"   : { "Arch" : "HVM64"  },
      "r3.2xlarge"  : { "Arch" : "HVM64"  },
      "r3.4xlarge"  : { "Arch" : "HVM64"  },
      "r3.8xlarge"  : { "Arch" : "HVM64"  },
      "i2.xlarge"   : { "Arch" : "HVM64"  },
      "i2.2xlarge"  : { "Arch" : "HVM64"  },
      "i2.4xlarge"  : { "Arch" : "HVM64"  },
      "i2.8xlarge"  : { "Arch" : "HVM64"  },
      "d2.xlarge"   : { "Arch" : "HVM64"  },
      "d2.2xlarge"  : { "Arch" : "HVM64"  },
      "d2.4xlarge"  : { "Arch" : "HVM64"  },
      "d2.8xlarge"  : { "Arch" : "HVM64"  },
      "hi1.4xlarge" : { "Arch" : "HVM64"  },
      "hs1.8xlarge" : { "Arch" : "HVM64"  },
      "cr1.8xlarge" : { "Arch" : "HVM64"  },
      "cc2.8xlarge" : { "Arch" : "HVM64"  }
    },
    "AWSRegionArch2AMI" : {
      "us-east-1"        : {"HVM64" : "ami-0ff8a91507f77f867", "HVMG2" : "ami-0a584ac55a7631c0c"},
      "us-west-2"        : {"HVM64" : "ami-a0cfeed8", "HVMG2" : "ami-0e09505bc235aa82d"},
      "us-west-1"        : {"HVM64" : "ami-0bdb828fd58c52235", "HVMG2" : "ami-066ee5fd4a9ef77f1"},
      "eu-west-1"        : {"HVM64" : "ami-047bb4163c506cd98", "HVMG2" : "ami-0a7c483d527806435"},
      "eu-west-2"        : {"HVM64" : "ami-f976839e", "HVMG2" : "NOT_SUPPORTED"},
      "eu-west-3"        : {"HVM64" : "ami-0ebc281c20e89ba4b", "HVMG2" : "NOT_SUPPORTED"},
      "eu-central-1"     : {"HVM64" : "ami-0233214e13e500f77", "HVMG2" : "ami-06223d46a6d0661c7"},
      "ap-northeast-1"   : {"HVM64" : "ami-06cd52961ce9f0d85", "HVMG2" : "ami-053cdd503598e4a9d"},
      "ap-northeast-2"   : {"HVM64" : "ami-0a10b2721688ce9d2", "HVMG2" : "NOT_SUPPORTED"},
      "ap-northeast-3"   : {"HVM64" : "ami-0d98120a9fb693f07", "HVMG2" : "NOT_SUPPORTED"},
      "ap-southeast-1"   : {"HVM64" : "ami-08569b978cc4dfa10", "HVMG2" : "ami-0be9df32ae9f92309"},
      "ap-southeast-2"   : {"HVM64" : "ami-09b42976632b27e9b", "HVMG2" : "ami-0a9ce9fecc3d1daf8"},
      "ap-south-1"       : {"HVM64" : "ami-0912f71e06545ad88", "HVMG2" : "ami-097b15e89dbdcfcf4"},
      "us-east-2"        : {"HVM64" : "ami-0b59bfac6be064b78", "HVMG2" : "NOT_SUPPORTED"},
      "ca-central-1"     : {"HVM64" : "ami-0b18956f", "HVMG2" : "NOT_SUPPORTED"},
      "sa-east-1"        : {"HVM64" : "ami-07b14488da8ea02a0", "HVMG2" : "NOT_SUPPORTED"},
      "cn-north-1"       : {"HVM64" : "ami-0a4eaf6c4454eda75", "HVMG2" : "NOT_SUPPORTED"},
      "cn-northwest-1"   : {"HVM64" : "ami-6b6a7d09", "HVMG2" : "NOT_SUPPORTED"}
    }
  },
  "Resources": {
    "CloudWatchPutMetricsRole" : {
      "Type"  : "AWS::IAM::Role",
      "Properties" : {
          "AssumeRolePolicyDocument" : {
              "Statement" : [ {
                  "Effect" : "Allow",
                  "Principal" : {
                      "Service" : [ "ec2.amazonaws.com" ]
                  },
                  "Action" : [ "sts:AssumeRole" ]
              } ]
          },
          "Path" : "/"
      }
    },
    "CloudWatchPutMetricsRolePolicy" : {
        "Type" : "AWS::IAM::Policy",
        "Properties" : {
            "PolicyName" : "CloudWatch_PutMetricData",
            "PolicyDocument" : {
              "Version": "2012-10-17",		 	 	 
              "Statement": [
                {
                  "Sid": "CloudWatchPutMetricData",
                  "Effect": "Allow",
                  "Action": ["cloudwatch:PutMetricData"],
                  "Resource": ["*"]
                }
              ]
            },
            "Roles" : [ { "Ref" : "CloudWatchPutMetricsRole" } ]
        }
    },
    "CloudWatchPutMetricsInstanceProfile" : {
      "Type" : "AWS::IAM::InstanceProfile",
      "Properties" : {
        "Path" : "/",
        "Roles" : [ { "Ref" : "CloudWatchPutMetricsRole" } ]
      }
    },
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {
        "EnableDnsSupport" : "true",
        "EnableDnsHostnames" : "true",
        "CidrBlock": "10.0.0.0/16",
        "Tags": [ {"Key": "Application", "Value": { "Ref": "AWS::StackId"} } ]
      }
    },
    "InternetGateway" : {
      "Type" : "AWS::EC2::InternetGateway",
      "Properties" : {
        "Tags" : [
          { "Key" : "Application", "Value" : { "Ref" : "AWS::StackName" } },
          { "Key" : "Network", "Value" : "Public" }
        ]
      }
    },
    "GatewayToInternet" : {
      "Type" : "AWS::EC2::VPCGatewayAttachment",
      "Properties" : {
        "VpcId" : { "Ref" : "VPC" },
        "InternetGatewayId" : { "Ref" : "InternetGateway" }
      }
    },
    "RouteTable":{
      "Type":"AWS::EC2::RouteTable",
      "Properties":{
        "VpcId": {"Ref":"VPC"}
      }
    },
    "SubnetRouteTableAssoc": {
      "Type" : "AWS::EC2::SubnetRouteTableAssociation",
      "Properties" : {
        "RouteTableId" : {"Ref":"RouteTable"},
        "SubnetId" : {"Ref":"Subnet"}
      }
    },
    "InternetGatewayRoute": {
        "Type":"AWS::EC2::Route",
        "Properties":{
            "DestinationCidrBlock":"0.0.0.0/0",
            "RouteTableId":{"Ref":"RouteTable"},
            "GatewayId":{"Ref":"InternetGateway"}
        }
    },
    "Subnet": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": { "Ref": "VPC" },
        "CidrBlock": "10.0.0.0/24",
        "Tags": [ { "Key": "Application", "Value": { "Ref": "AWS::StackId" } } ]
      }
    },    
    "InstanceSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "VpcId": { "Ref": "VPC" },
        "GroupDescription": "Enable SSH access via port 22",
        "SecurityGroupIngress": [
          { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": { "Ref": "SSHLocation" } },
          { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "CidrIp": "0.0.0.0/0" }
         ]
      }
    },
    "MountTargetSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "VpcId": { "Ref": "VPC" },
        "GroupDescription": "Security group for mount target",
        "SecurityGroupIngress": [
          {
            "IpProtocol": "tcp",
            "FromPort": 2049,
            "ToPort": 2049,
            "CidrIp": "0.0.0.0/0"
          }
        ]
      }
    },
    "FileSystem": {
      "Type": "AWS::EFS::FileSystem",
      "Properties": {
        "PerformanceMode": "generalPurpose",
        "FileSystemTags": [
          {
            "Key": "Name",
            "Value": { "Ref" : "VolumeName" }
          }
        ]
      }
    },
    "MountTarget": {
      "Type": "AWS::EFS::MountTarget",
      "Properties": {
        "FileSystemId": { "Ref": "FileSystem" },
        "SubnetId": { "Ref": "Subnet" },
        "SecurityGroups": [ { "Ref": "MountTargetSecurityGroup" } ]        
      }
    },
    "LaunchConfiguration": {
      "Type": "AWS::AutoScaling::LaunchConfiguration",
      "Metadata" : {
        "AWS::CloudFormation::Init" : {
          "configSets" : {
            "MountConfig" : [ "setup", "mount" ]
          },
          "setup" : {
            "packages" : {
              "yum" : {
                "nfs-utils" : []
              }
            },
            "files" : {
              "/home/ec2-user/post_nfsstat" : {
                "content" : { "Fn::Join" : [ "", [
                      "#!/bin/bash\n",
                      "\n",
                      "INPUT=\"$(cat)\"\n",
                      "CW_JSON_OPEN='{ \"Namespace\": \"EFS\", \"MetricData\": [ '\n",
                      "CW_JSON_CLOSE=' ] }'\n",
                      "CW_JSON_METRIC=''\n",
                      "METRIC_COUNTER=0\n",
                      "\n",
                      "for COL in 1 2 3 4 5 6; do\n",
                      "\n",
                      " COUNTER=0\n",
                      " METRIC_FIELD=$COL\n",
                      " DATA_FIELD=$(($COL+($COL-1)))\n",
                      "\n",
                      " while read line; do\n",
                      "   if [[ COUNTER -gt 0 ]]; then\n",
                      "\n",
                      "     LINE=`echo $line | tr -s ' ' `\n",
                      "     AWS_COMMAND=\"aws cloudwatch put-metric-data --region ", { "Ref": "AWS::Region" }, "\"\n",
                      "     MOD=$(( $COUNTER % 2))\n",
                      "\n",
                      "     if [ $MOD -eq 1 ]; then\n",
                      "       METRIC_NAME=`echo $LINE | cut -d ' ' -f $METRIC_FIELD`\n",
                      "     else\n",
                      "       METRIC_VALUE=`echo $LINE | cut -d ' ' -f $DATA_FIELD`\n",
                      "     fi\n",
                      "\n",
                      "     if [[ -n \"$METRIC_NAME\" && -n \"$METRIC_VALUE\" ]]; then\n",
                      "       INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)\n",
                      "       CW_JSON_METRIC=\"$CW_JSON_METRIC { \\\"MetricName\\\": \\\"$METRIC_NAME\\\", \\\"Dimensions\\\": [{\\\"Name\\\": \\\"InstanceId\\\", \\\"Value\\\": \\\"$INSTANCE_ID\\\"} ], \\\"Value\\\": $METRIC_VALUE },\"\n",
                      "       unset METRIC_NAME\n",
                      "       unset METRIC_VALUE\n",
                      "\n",
                      "       METRIC_COUNTER=$((METRIC_COUNTER+1))\n",
                      "       if [ $METRIC_COUNTER -eq 20 ]; then\n",
                      "         # 20 is max metric collection size, so we have to submit here\n",
                      "         aws cloudwatch put-metric-data --region ", { "Ref": "AWS::Region" }, " --cli-input-json \"`echo $CW_JSON_OPEN ${CW_JSON_METRIC%?} $CW_JSON_CLOSE`\"\n",
                      "\n",
                      "         # reset\n",
                      "         METRIC_COUNTER=0\n",
                      "         CW_JSON_METRIC=''\n",
                      "       fi\n",
                      "     fi  \n",
                      "\n",
                      "\n",
                      "\n",
                      "     COUNTER=$((COUNTER+1))\n",
                      "   fi\n",
                      "\n",
                      "   if [[ \"$line\" == \"Client nfs v4:\" ]]; then\n",
                      "     # the next line is the good stuff \n",
                      "     COUNTER=$((COUNTER+1))\n",
                      "   fi\n",
                      " done <<< \"$INPUT\"\n",
                      "done\n",
                      "\n",
                      "# submit whatever is left\n",
                      "aws cloudwatch put-metric-data --region ", { "Ref": "AWS::Region" }, " --cli-input-json \"`echo $CW_JSON_OPEN ${CW_JSON_METRIC%?} $CW_JSON_CLOSE`\""
                    ] ] },
                "mode": "000755",
                "owner": "ec2-user",
                "group": "ec2-user"
              },
              "/home/ec2-user/crontab" : {
                "content" : { "Fn::Join" : [ "", [
                  "* * * * * /usr/sbin/nfsstat | /home/ec2-user/post_nfsstat\n"
                ] ] },
                "owner": "ec2-user",
                "group": "ec2-user"
              }
            },
            "commands" : {
              "01_createdir" : {
                "command" : {"Fn::Join" : [ "", [ "mkdir /", { "Ref" : "MountPoint" }]]}
              }
            }
          },
          "mount" : {
            "commands" : {
              "01_mount" : {
                "command" : { "Fn::Sub": "sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 ${FileSystem}.efs.${AWS::Region}.amazonaws.com:/ /${MountPoint}"}
              },
              "02_permissions" : {
                "command" : {"Fn::Join" : [ "", [ "chown ec2-user:ec2-user /", { "Ref" : "MountPoint" }]]}
              }
            }
          }
        }
      },
      "Properties": {
        "AssociatePublicIpAddress" : true,
        "ImageId": {
          "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" }, {
            "Fn::FindInMap": [ "AWSInstanceType2Arch", { "Ref": "InstanceType" }, "Arch" ]
          } ]
        },
        "InstanceType": { "Ref": "InstanceType" },
        "KeyName": { "Ref": "KeyName" },
        "SecurityGroups": [ { "Ref": "InstanceSecurityGroup" } ],
        "IamInstanceProfile" : { "Ref" : "CloudWatchPutMetricsInstanceProfile" },
        "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
             "#!/bin/bash -xe\n",
             "yum install -y aws-cfn-bootstrap\n",

             "/opt/aws/bin/cfn-init -v ",
             "         --stack ", { "Ref" : "AWS::StackName" },
             "         --resource LaunchConfiguration ",
             "         --configsets MountConfig ",
             "         --region ", { "Ref" : "AWS::Region" }, "\n",

             "crontab /home/ec2-user/crontab\n",

             "/opt/aws/bin/cfn-signal -e $? ",
             "         --stack ", { "Ref" : "AWS::StackName" },
             "         --resource AutoScalingGroup ",
             "         --region ", { "Ref" : "AWS::Region" }, "\n"
        ]]}}
      }
    },
    "AutoScalingGroup": {
      "Type": "AWS::AutoScaling::AutoScalingGroup",
      "DependsOn": ["MountTarget", "GatewayToInternet"],
      "CreationPolicy" : {
        "ResourceSignal" : {
          "Timeout" : "PT15M",
          "Count"   : { "Ref": "AsgMaxSize" }
        }
      },
      "Properties": {
        "VPCZoneIdentifier": [ { "Ref": "Subnet" } ],
        "LaunchConfigurationName": { "Ref": "LaunchConfiguration" },
        "MinSize": "1",
        "MaxSize": { "Ref": "AsgMaxSize" },
        "DesiredCapacity": { "Ref": "AsgMaxSize" },
        "Tags": [ {
          "Key": "Name",
          "Value": "EFS FileSystem Mounted Instance",
          "PropagateAtLaunch": "true"
        } ]
      }
    }
  },
  "Outputs" : {
    "MountTargetID" : {
      "Description" : "Mount target ID",
      "Value" :  { "Ref" : "MountTarget" }
    },
    "FileSystemID" : {
      "Description" : "File system ID",
      "Value" :  { "Ref" : "FileSystem" }
    }
  }
}
```

## YAML
<a name="quickref-efs-example-1.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Description: This template creates an Amazon EFS file system and mount target and
  associates it with Amazon EC2 instances in an Auto Scaling group. **WARNING** This
  template creates Amazon EC2 instances and related resources. You will be billed
  for the AWS resources used if you create a stack from this template.
Parameters:
  InstanceType:
    Description: WebServer EC2 instance type
    Type: String
    Default: t2.small
    AllowedValues:
      - t1.micro
      - t2.nano
      - t2.micro
      - t2.small
      - t2.medium
      - t2.large
      - m1.small
      - m1.medium
      - m1.large
      - m1.xlarge
      - m2.xlarge
      - m2.2xlarge
      - m2.4xlarge
      - m3.medium
      - m3.large
      - m3.xlarge
      - m3.2xlarge
      - m4.large
      - m4.xlarge
      - m4.2xlarge
      - m4.4xlarge
      - m4.10xlarge
      - c1.medium
      - c1.xlarge
      - c3.large
      - c3.xlarge
      - c3.2xlarge
      - c3.4xlarge
      - c3.8xlarge
      - c4.large
      - c4.xlarge
      - c4.2xlarge
      - c4.4xlarge
      - c4.8xlarge
      - g2.2xlarge
      - g2.8xlarge
      - r3.large
      - r3.xlarge
      - r3.2xlarge
      - r3.4xlarge
      - r3.8xlarge
      - i2.xlarge
      - i2.2xlarge
      - i2.4xlarge
      - i2.8xlarge
      - d2.xlarge
      - d2.2xlarge
      - d2.4xlarge
      - d2.8xlarge
      - hi1.4xlarge
      - hs1.8xlarge
      - cr1.8xlarge
      - cc2.8xlarge
      - cg1.4xlarge
    ConstraintDescription: must be a valid EC2 instance type.
  KeyName:
    Type: AWS::EC2::KeyPair::KeyName
    Description: Name of an existing EC2 key pair to enable SSH access to the ECS
      instances
  AsgMaxSize:
    Type: Number
    Description: Maximum size and initial desired capacity of Auto Scaling Group
    Default: '2'
  SSHLocation:
    Description: The IP address range that can be used to connect to the EC2 instances
      by using SSH
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})"
    ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x.
  VolumeName:
    Description: The name to be used for the EFS volume
    Type: String
    MinLength: '1'
    Default: myEFSvolume
  MountPoint:
    Description: The Linux mount point for the EFS volume
    Type: String
    MinLength: '1'
    Default: myEFSvolume
Mappings:
  AWSInstanceType2Arch:
    t1.micro:
      Arch: HVM64
    t2.nano:
      Arch: HVM64
    t2.micro:
      Arch: HVM64
    t2.small:
      Arch: HVM64
    t2.medium:
      Arch: HVM64
    t2.large:
      Arch: HVM64
    m1.small:
      Arch: HVM64
    m1.medium:
      Arch: HVM64
    m1.large:
      Arch: HVM64
    m1.xlarge:
      Arch: HVM64
    m2.xlarge:
      Arch: HVM64
    m2.2xlarge:
      Arch: HVM64
    m2.4xlarge:
      Arch: HVM64
    m3.medium:
      Arch: HVM64
    m3.large:
      Arch: HVM64
    m3.xlarge:
      Arch: HVM64
    m3.2xlarge:
      Arch: HVM64
    m4.large:
      Arch: HVM64
    m4.xlarge:
      Arch: HVM64
    m4.2xlarge:
      Arch: HVM64
    m4.4xlarge:
      Arch: HVM64
    m4.10xlarge:
      Arch: HVM64
    c1.medium:
      Arch: HVM64
    c1.xlarge:
      Arch: HVM64
    c3.large:
      Arch: HVM64
    c3.xlarge:
      Arch: HVM64
    c3.2xlarge:
      Arch: HVM64
    c3.4xlarge:
      Arch: HVM64
    c3.8xlarge:
      Arch: HVM64
    c4.large:
      Arch: HVM64
    c4.xlarge:
      Arch: HVM64
    c4.2xlarge:
      Arch: HVM64
    c4.4xlarge:
      Arch: HVM64
    c4.8xlarge:
      Arch: HVM64
    g2.2xlarge:
      Arch: HVMG2
    g2.8xlarge:
      Arch: HVMG2
    r3.large:
      Arch: HVM64
    r3.xlarge:
      Arch: HVM64
    r3.2xlarge:
      Arch: HVM64
    r3.4xlarge:
      Arch: HVM64
    r3.8xlarge:
      Arch: HVM64
    i2.xlarge:
      Arch: HVM64
    i2.2xlarge:
      Arch: HVM64
    i2.4xlarge:
      Arch: HVM64
    i2.8xlarge:
      Arch: HVM64
    d2.xlarge:
      Arch: HVM64
    d2.2xlarge:
      Arch: HVM64
    d2.4xlarge:
      Arch: HVM64
    d2.8xlarge:
      Arch: HVM64
    hi1.4xlarge:
      Arch: HVM64
    hs1.8xlarge:
      Arch: HVM64
    cr1.8xlarge:
      Arch: HVM64
    cc2.8xlarge:
      Arch: HVM64
  AWSRegionArch2AMI:
    us-east-1:
      HVM64: ami-0ff8a91507f77f867
      HVMG2: ami-0a584ac55a7631c0c
    us-west-2:
      HVM64: ami-a0cfeed8
      HVMG2: ami-0e09505bc235aa82d
    us-west-1:
      HVM64: ami-0bdb828fd58c52235
      HVMG2: ami-066ee5fd4a9ef77f1
    eu-west-1:
      HVM64: ami-047bb4163c506cd98
      HVMG2: ami-0a7c483d527806435
    eu-west-2:
      HVM64: ami-f976839e
      HVMG2: NOT_SUPPORTED
    eu-west-3:
      HVM64: ami-0ebc281c20e89ba4b
      HVMG2: NOT_SUPPORTED
    eu-central-1:
      HVM64: ami-0233214e13e500f77
      HVMG2: ami-06223d46a6d0661c7
    ap-northeast-1:
      HVM64: ami-06cd52961ce9f0d85
      HVMG2: ami-053cdd503598e4a9d
    ap-northeast-2:
      HVM64: ami-0a10b2721688ce9d2
      HVMG2: NOT_SUPPORTED
    ap-northeast-3:
      HVM64: ami-0d98120a9fb693f07
      HVMG2: NOT_SUPPORTED
    ap-southeast-1:
      HVM64: ami-08569b978cc4dfa10
      HVMG2: ami-0be9df32ae9f92309
    ap-southeast-2:
      HVM64: ami-09b42976632b27e9b
      HVMG2: ami-0a9ce9fecc3d1daf8
    ap-south-1:
      HVM64: ami-0912f71e06545ad88
      HVMG2: ami-097b15e89dbdcfcf4
    us-east-2:
      HVM64: ami-0b59bfac6be064b78
      HVMG2: NOT_SUPPORTED
    ca-central-1:
      HVM64: ami-0b18956f
      HVMG2: NOT_SUPPORTED
    sa-east-1:
      HVM64: ami-07b14488da8ea02a0
      HVMG2: NOT_SUPPORTED
    cn-north-1:
      HVM64: ami-0a4eaf6c4454eda75
      HVMG2: NOT_SUPPORTED
    cn-northwest-1:
      HVM64: ami-6b6a7d09
      HVMG2: NOT_SUPPORTED
Resources:
  CloudWatchPutMetricsRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - ec2.amazonaws.com
          Action:
          - sts:AssumeRole
      Path: "/"
  CloudWatchPutMetricsRolePolicy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: CloudWatch_PutMetricData
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Sid: CloudWatchPutMetricData
          Effect: Allow
          Action:
          - cloudwatch:PutMetricData
          Resource:
          - "*"
      Roles:
      - Ref: CloudWatchPutMetricsRole
  CloudWatchPutMetricsInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
      - Ref: CloudWatchPutMetricsRole
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
      CidrBlock: 10.0.0.0/16
      Tags:
      - Key: Application
        Value:
          Ref: AWS::StackId
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
      - Key: Application
        Value:
          Ref: AWS::StackName
      - Key: Network
        Value: Public
  GatewayToInternet:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId:
        Ref: VPC
      InternetGatewayId:
        Ref: InternetGateway
  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId:
        Ref: VPC
  SubnetRouteTableAssoc:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId:
        Ref: RouteTable
      SubnetId:
        Ref: Subnet
  InternetGatewayRoute:
    Type: AWS::EC2::Route
    Properties:
      DestinationCidrBlock: 0.0.0.0/0
      RouteTableId:
        Ref: RouteTable
      GatewayId:
        Ref: InternetGateway
  Subnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: VPC
      CidrBlock: 10.0.0.0/24
      Tags:
      - Key: Application
        Value:
          Ref: AWS::StackId
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: VPC
      GroupDescription: Enable SSH access via port 22
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 22
        ToPort: 22
        CidrIp:
          Ref: SSHLocation
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        CidrIp: 0.0.0.0/0
  MountTargetSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: VPC
      GroupDescription: Security group for mount target
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 2049
        ToPort: 2049
        CidrIp: 0.0.0.0/0
  FileSystem:
    Type: AWS::EFS::FileSystem
    Properties:
      PerformanceMode: generalPurpose
      FileSystemTags:
      - Key: Name
        Value:
          Ref: VolumeName
  MountTarget:
    Type: AWS::EFS::MountTarget
    Properties:
      FileSystemId:
        Ref: FileSystem
      SubnetId:
        Ref: Subnet
      SecurityGroups:
      - Ref: MountTargetSecurityGroup
  LaunchConfiguration:
    Type: AWS::AutoScaling::LaunchConfiguration
    Metadata:
      AWS::CloudFormation::Init:
        configSets:
          MountConfig:
          - setup
          - mount
        setup:
          packages:
            yum:
              nfs-utils: []
          files:
            "/home/ec2-user/post_nfsstat":
              content: !Sub |
                #!/bin/bash

                INPUT="$(cat)"
                CW_JSON_OPEN='{ "Namespace": "EFS", "MetricData": [ '
                CW_JSON_CLOSE=' ] }'
                CW_JSON_METRIC=''
                METRIC_COUNTER=0

                for COL in 1 2 3 4 5 6; do

                 COUNTER=0
                 METRIC_FIELD=$COL
                 DATA_FIELD=$(($COL+($COL-1)))

                 while read line; do
                   if [[ COUNTER -gt 0 ]]; then

                     LINE=`echo $line | tr -s ' ' `
                     AWS_COMMAND="aws cloudwatch put-metric-data --region ${AWS::Region}"
                     MOD=$(( $COUNTER % 2))

                     if [ $MOD -eq 1 ]; then
                       METRIC_NAME=`echo $LINE | cut -d ' ' -f $METRIC_FIELD`
                     else
                       METRIC_VALUE=`echo $LINE | cut -d ' ' -f $DATA_FIELD`
                     fi

                     if [[ -n "$METRIC_NAME" && -n "$METRIC_VALUE" ]]; then
                       INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
                       CW_JSON_METRIC="$CW_JSON_METRIC { \"MetricName\": \"$METRIC_NAME\", \"Dimensions\": [{\"Name\": \"InstanceId\", \"Value\": \"$INSTANCE_ID\"} ], \"Value\": $METRIC_VALUE },"
                       unset METRIC_NAME
                       unset METRIC_VALUE

                       METRIC_COUNTER=$((METRIC_COUNTER+1))
                       if [ $METRIC_COUNTER -eq 20 ]; then
                         # 20 is max metric collection size, so we have to submit here
                         aws cloudwatch put-metric-data --region ${AWS::Region} --cli-input-json "`echo $CW_JSON_OPEN ${!CW_JSON_METRIC%?} $CW_JSON_CLOSE`"

                         # reset
                         METRIC_COUNTER=0
                         CW_JSON_METRIC=''
                       fi
                     fi



                     COUNTER=$((COUNTER+1))
                   fi

                   if [[ "$line" == "Client nfs v4:" ]]; then
                     # the next line is the good stuff
                     COUNTER=$((COUNTER+1))
                   fi
                 done <<< "$INPUT"
                done

                # submit whatever is left
                aws cloudwatch put-metric-data --region ${AWS::Region} --cli-input-json "`echo $CW_JSON_OPEN ${!CW_JSON_METRIC%?} $CW_JSON_CLOSE`"
              mode: '000755'
              owner: ec2-user
              group: ec2-user
            "/home/ec2-user/crontab":
              content: "* * * * * /usr/sbin/nfsstat | /home/ec2-user/post_nfsstat\n"
              owner: ec2-user
              group: ec2-user
          commands:
            01_createdir:
              command: !Sub "mkdir /${MountPoint}"
        mount:
          commands:
            01_mount:
              command: !Sub >
                mount -t nfs4 -o nfsvers=4.1 ${FileSystem}.efs.${AWS::Region}.amazonaws.com:/ /${MountPoint}
            02_permissions:
              command: !Sub "chown ec2-user:ec2-user /${MountPoint}"
    Properties:
      AssociatePublicIpAddress: true
      ImageId:
        Fn::FindInMap:
        - AWSRegionArch2AMI
        - Ref: AWS::Region
        - Fn::FindInMap:
          - AWSInstanceType2Arch
          - Ref: InstanceType
          - Arch
      InstanceType:
        Ref: InstanceType
      KeyName:
        Ref: KeyName
      SecurityGroups:
      - Ref: InstanceSecurityGroup
      IamInstanceProfile:
        Ref: CloudWatchPutMetricsInstanceProfile
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          yum install -y aws-cfn-bootstrap
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfiguration --configsets MountConfig --region ${AWS::Region}
          crontab /home/ec2-user/crontab
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource AutoScalingGroup --region ${AWS::Region}
  AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    DependsOn:
    - MountTarget
    - GatewayToInternet
    CreationPolicy:
      ResourceSignal:
        Timeout: PT15M
        Count:
          Ref: AsgMaxSize
    Properties:
      VPCZoneIdentifier:
      - Ref: Subnet
      LaunchConfigurationName:
        Ref: LaunchConfiguration
      MinSize: '1'
      MaxSize:
        Ref: AsgMaxSize
      DesiredCapacity:
        Ref: AsgMaxSize
      Tags:
      - Key: Name
        Value: EFS FileSystem Mounted Instance
        PropagateAtLaunch: 'true'
Outputs:
  MountTargetID:
    Description: Mount target ID
    Value:
      Ref: MountTarget
  FileSystemID:
    Description: File system ID
    Value:
      Ref: FileSystem
```

# Elastic Beanstalk-Vorlagenausschnitte
<a name="quickref-elasticbeanstalk"></a>

Mit Elastic Beanstalk können Sie Anwendungen schnell bereitstellen und verwalten, AWS ohne sich Gedanken über die Infrastruktur machen zu müssen, auf der diese Anwendungen ausgeführt werden. Die folgende Beispielvorlage kann Ihnen helfen, Elastic Beanstalk Beanstalk-Ressourcen in Ihrer CloudFormation Vorlage zu beschreiben.

## Elastic Beanstalk-Beispiel-PHP
<a name="quickref-elasticbeanstalk-sampleenv"></a>

Die folgende Beispielvorlage stellt eine PHP-Beispielwebanwendung bereit, die in einem Amazon S3-Bucket gespeichert wird. Die Umgebung ist auch eine Umgebung mit auto-scaling und Lastenausgleich mit mindestens zwei EC2 Amazon-Instances und maximal sechs. Es zeigt eine Elastic Beanstalk-Umgebung, die eine Legacy-Startkonfiguration verwendet. Informationen zur Verwendung einer Startvorlage finden Sie unter [Startvorlagen](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-autoscaling-launch-templates.html) im *AWS Elastic Beanstalk Entwicklerhandbuch*.

Ersetzen Sie `solution-stack` durch einen Lösungs-Stack-Namen (Plattformversion). Verwenden Sie den Befehl, um eine Liste der verfügbaren Lösungsstapel zu erhalten. AWS CLI **aws elasticbeanstalk list-available-solution-stacks**

### JSON
<a name="quickref-elasticbeanstalk-example-1.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "sampleApplication": {
            "Type": "AWS::ElasticBeanstalk::Application",
            "Properties": {
                "Description": "AWS Elastic Beanstalk Sample Application"
            }
        },
        "sampleApplicationVersion": {
            "Type": "AWS::ElasticBeanstalk::ApplicationVersion",
            "Properties": {
                "ApplicationName": {
                    "Ref": "sampleApplication"
                },
                "Description": "AWS ElasticBeanstalk Sample Application Version",
                "SourceBundle": {
                    "S3Bucket": {
                        "Fn::Sub": "elasticbeanstalk-samples-${AWS::Region}"
                    },
                    "S3Key": "php-newsample-app.zip"
                }
            }
        },
        "sampleConfigurationTemplate": {
            "Type": "AWS::ElasticBeanstalk::ConfigurationTemplate",
            "Properties": {
                "ApplicationName": {
                    "Ref": "sampleApplication"
                },
                "Description": "AWS ElasticBeanstalk Sample Configuration Template",
                "OptionSettings": [
                    {
                        "Namespace": "aws:autoscaling:asg",
                        "OptionName": "MinSize",
                        "Value": "2"
                    },
                    {
                        "Namespace": "aws:autoscaling:asg",
                        "OptionName": "MaxSize",
                        "Value": "6"
                    },
                    {
                        "Namespace": "aws:elasticbeanstalk:environment",
                        "OptionName": "EnvironmentType",
                        "Value": "LoadBalanced"
                    },
                    {
                        "Namespace": "aws:autoscaling:launchconfiguration",
                        "OptionName": "IamInstanceProfile",
                        "Value": {
                            "Ref": "MyInstanceProfile"
                        }
                    }
                ],
                "SolutionStackName": "solution-stack"
            }
        },
        "sampleEnvironment": {
            "Type": "AWS::ElasticBeanstalk::Environment",
            "Properties": {
                "ApplicationName": {
                    "Ref": "sampleApplication"
                },
                "Description": "AWS ElasticBeanstalk Sample Environment",
                "TemplateName": {
                    "Ref": "sampleConfigurationTemplate"
                },
                "VersionLabel": {
                    "Ref": "sampleApplicationVersion"
                }
            }
        },
        "MyInstanceRole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": [
                                    "ec2.amazonaws.com"
                                ]
                            },
                            "Action": [
                                "sts:AssumeRole"
                            ]
                        }
                    ]
                },
                "Description": "Beanstalk EC2 role",
                "ManagedPolicyArns": [
                    "arn:aws:iam::aws:policy/AWSElasticBeanstalkWebTier",
                    "arn:aws:iam::aws:policy/AWSElasticBeanstalkMulticontainerDocker",
                    "arn:aws:iam::aws:policy/AWSElasticBeanstalkWorkerTier"
                ]
            }
        },
        "MyInstanceProfile": {
            "Type": "AWS::IAM::InstanceProfile",
            "Properties": {
                "Roles": [
                    {
                        "Ref": "MyInstanceRole"
                    }
                ]
            }
        }
    }
}
```

### YAML
<a name="quickref-elasticbeanstalk-example-1.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  sampleApplication:
    Type: AWS::ElasticBeanstalk::Application
    Properties:
      Description: AWS Elastic Beanstalk Sample Application
  sampleApplicationVersion:
    Type: AWS::ElasticBeanstalk::ApplicationVersion
    Properties:
      ApplicationName:
        Ref: sampleApplication
      Description: AWS ElasticBeanstalk Sample Application Version
      SourceBundle:
        S3Bucket: !Sub "elasticbeanstalk-samples-${AWS::Region}"
        S3Key: php-newsample-app.zip
  sampleConfigurationTemplate:
    Type: AWS::ElasticBeanstalk::ConfigurationTemplate
    Properties:
      ApplicationName:
        Ref: sampleApplication
      Description: AWS ElasticBeanstalk Sample Configuration Template
      OptionSettings:
      - Namespace: aws:autoscaling:asg
        OptionName: MinSize
        Value: '2'
      - Namespace: aws:autoscaling:asg
        OptionName: MaxSize
        Value: '6'
      - Namespace: aws:elasticbeanstalk:environment
        OptionName: EnvironmentType
        Value: LoadBalanced
      - Namespace: aws:autoscaling:launchconfiguration
        OptionName: IamInstanceProfile
        Value: !Ref MyInstanceProfile        
      SolutionStackName: solution-stack
  sampleEnvironment:
    Type: AWS::ElasticBeanstalk::Environment
    Properties:
      ApplicationName:
        Ref: sampleApplication
      Description: AWS ElasticBeanstalk Sample Environment
      TemplateName:
        Ref: sampleConfigurationTemplate
      VersionLabel:
        Ref: sampleApplicationVersion
  MyInstanceRole:
    Type: AWS::IAM::Role
    Properties: 
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - sts:AssumeRole
      Description: Beanstalk EC2 role
      ManagedPolicyArns: 
        - arn:aws:iam::aws:policy/AWSElasticBeanstalkWebTier
        - arn:aws:iam::aws:policy/AWSElasticBeanstalkMulticontainerDocker
        - arn:aws:iam::aws:policy/AWSElasticBeanstalkWorkerTier
  MyInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties: 
      Roles:
        - !Ref MyInstanceRole
```

# Elastic Load Balancing-Vorlagenausschnitte
<a name="quickref-elb"></a>

Um einen Application Load Balancer, einen Network Load Balancer oder einen Gateway Load Balancer zu erstellen, verwenden Sie die V2-Ressourcentypen, die mit `AWS::ElasticLoadBalancingV2`beginnen. Um einen Classic Load Balancer zu erstellen, verwenden Sie die Ressourcentypen, die mit `AWS::ElasticLoadBalancing`beginnen.

**Topics**
+ [ELBv2 Ressourcen](#scenario-elbv2-load-balancer)
+ [Classic-Load-Balancer-Ressourcen](#scenario-elb-load-balancer)

## ELBv2 Ressourcen
<a name="scenario-elbv2-load-balancer"></a>

Dieses Beispiel definiert einen Application Load Balancer mit einem HTTP-Listener und einer Standardaktion, die den Datenverkehr an die Zielgruppe weiterleitet. Der Load Balancer verwendet die Standardeinstellungen für die Zustandsprüfung. Die Zielgruppe hat zwei registrierte EC2 Instanzen. 

------
#### [ YAML ]

```
Resources:
  myLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: my-alb
      Type: application
      Scheme: internal
      Subnets: 
        - !Ref subnet-AZ1
        - !Ref subnet-AZ2
      SecurityGroups: 
        - !Ref mySecurityGroup

  myHTTPlistener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref myLoadBalancer
      Protocol: HTTP
      Port: 80
      DefaultActions:
        - Type: "forward"
          TargetGroupArn: !Ref myTargetGroup
                        
  myTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      Name: "my-target-group"
      Protocol: HTTP
      Port: 80
      TargetType: instance
      VpcId: !Ref myVPC
      Targets:
        - Id: !GetAtt Instance1.InstanceId
          Port: 80
        - Id: !GetAtt Instance2.InstanceId
          Port: 80
```

------
#### [ JSON ]

```
{
    "Resources": {
        "myLoadBalancer": {
            "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
            "Properties": {
                "Name": "my-alb",
                "Type": "application",
                "Scheme": "internal",
                "Subnets": [
                    {
                        "Ref": "subnet-AZ1"
                    },
                    {
                        "Ref": "subnet-AZ2"
                    }
                ],
                "SecurityGroups": [
                    {
                        "Ref": "mySecurityGroup"
                    }
                ]
            }
        },
        "myHTTPlistener": {
            "Type": "AWS::ElasticLoadBalancingV2::Listener",
            "Properties": {
                "LoadBalancerArn": {
                    "Ref": "myLoadBalancer"
                },
                "Protocol": "HTTP",
                "Port": 80,
                "DefaultActions": [
                    {
                        "Type": "forward",
                        "TargetGroupArn": {
                            "Ref": "myTargetGroup"
                        }
                    }
                ]
            }
        },
        "myTargetGroup": {
            "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
            "Properties": {
                "Name": "my-target-group",
                "Protocol": "HTTP",
                "Port": 80,
                "TargetType": "instance",
                "VpcId": {
                    "Ref": "myVPC"
                },
                "Targets": [
                    {
                        "Id": {
                            "Fn::GetAtt": [
                                "Instance1",
                                "InstanceId"
                            ]
                        },
                        "Port": 80
                    },
                    {
                        "Id": {
                            "Fn::GetAtt": [
                                "Instance2",
                                "InstanceId"
                            ]
                        },
                        "Port": 80
                    }
                ]
            }
        }
    }
}
```

------

## Classic-Load-Balancer-Ressourcen
<a name="scenario-elb-load-balancer"></a>

Dieses Beispiel definiert einen Classic Load Balancer mit einem HTTP-Listener und ohne registrierte EC2 Instances. Der Load Balancer verwendet die Standardeinstellungen für die Zustandsprüfung.

------
#### [ YAML ]

```
myLoadBalancer:
  Type: AWS::ElasticLoadBalancing::LoadBalancer
  Properties:
    AvailabilityZones:
    - "us-east-1a"
    Listeners:
    - LoadBalancerPort: '80'
      InstancePort: '80'
      Protocol: HTTP
```

------
#### [ JSON ]

```
"myLoadBalancer" : {
    "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
    "Properties" : {
        "AvailabilityZones" : [ "us-east-1a" ],
        "Listeners" : [ {
            "LoadBalancerPort" : "80",
            "InstancePort" : "80",
            "Protocol" : "HTTP"
        } ]
    }
}
```

------

In diesem Beispiel wird ein Classic Load Balancer mit einem HTTP-Listener, zwei registrierten EC2 Instances und benutzerdefinierten Einstellungen für die Zustandsprüfung definiert.

------
#### [ YAML ]

```
myClassicLoadBalancer:
  Type: AWS::ElasticLoadBalancing::LoadBalancer
  Properties:
    AvailabilityZones:
    - "us-east-1a"
    Instances:
    - Ref: Instance1
    - Ref: Instance2
    Listeners:
    - LoadBalancerPort: '80'
      InstancePort: '80'
      Protocol: HTTP
    HealthCheck:
      Target: HTTP:80/
      HealthyThreshold: '3'
      UnhealthyThreshold: '5'
      Interval: '30'
      Timeout: '5'
```

------
#### [ JSON ]

```
"myClassicLoadBalancer" : {
    "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
    "Properties" : {
        "AvailabilityZones" : [ "us-east-1a" ],
        "Instances" : [
            { "Ref" : "Instance1" },
            { "Ref" : "Instance2" }
        ],
        "Listeners" : [ {
            "LoadBalancerPort" : "80",
            "InstancePort" : "80",
            "Protocol" : "HTTP"
        } ],

        "HealthCheck" : {
            "Target" : "HTTP:80/",
            "HealthyThreshold" : "3",
            "UnhealthyThreshold" : "5",
            "Interval" : "30",
            "Timeout" : "5"
        }
    }
}
```

------

# AWS Identity and Access Management Schnipsel aus Vorlagen
<a name="quickref-iam"></a>

Dieser Abschnitt enthält AWS Identity and Access Management Vorlagenausschnitte.

**Topics**
+ [Deklarieren einer IAM-Benutzerressource](#scenario-iam-user)
+ [Deklarieren einer IAM-Zugriffsschlüssel-Ressource](#scenario-iam-accesskey)
+ [Deklarieren einer IAM-Gruppenressource](#scenario-iam-group)
+ [Hinzufügen von Benutzern zu einer Gruppe](#scenario-iam-addusertogroup)
+ [Deklarieren einer IAM-Richtlinie](#scenario-iam-policy)
+ [Deklarieren einer Amazon S3-Bucket-Richtlinie](#scenario-bucket-policy)
+ [Deklarieren einer Amazon SNS-Themenrichtlinie](#scenario-sns-policy)
+ [Deklarieren einer Amazon SQS-Richtlinie](#scenario-sqs-policy)
+ [Vorlagenbeispiele für IAM-Rollen](#scenarios-iamroles)

**Wichtig**  
Beim Erstellen oder Aktualisieren eines Stacks anhand einer Vorlage, die IAM-Ressourcen enthält, müssen Sie die Verwendung von IAM-Funktionen bestätigen. Weitere Informationen finden Sie unter [Bestätigung von IAM-Ressourcen in Vorlagen CloudFormation](control-access-with-iam.md#using-iam-capabilities).

## Deklarieren einer IAM-Benutzerressource
<a name="scenario-iam-user"></a>

Dieser Ausschnitt zeigt, wie Sie eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html)-Ressource deklarieren, um einen IAM-Benutzer zu erstellen. Der Benutzer wird mit dem Pfad (`"/"`) und einem Anmeldungsprofil mit dem Passwort (`myP@ssW0rd`) deklariert.

Im Richtliniendokument namens `giveaccesstoqueueonly` erhält der Benutzer die Berechtigung zum Ausführen aller Amazon SQS-Aktionen auf der Amazon SQS-Warteschlangenressource `myqueue`. Der Zugriff auf alle anderen Amazon SQS-Warteschlangenressourcen wird verweigert. Die Funktion `Fn::GetAtt` erhält das Attribut Arn der Ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html) `myqueue`.

Das Richtliniendokument namens `giveaccesstotopiconly` wird dem Benutzer hinzugefügt, um ihm die Berechtigung zum Ausführen aller Amazon SNS-Aktionen auf der Amazon SNS-Themenressource `mytopic` zu erteilen und den Zugriff auf alle anderen Amazon SNS-Ressourcen zu verweigern. Die `Ref`-Funktion ruft das ARN-Attribut der [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html)-Ressource `mytopic` ab.

### JSON
<a name="quickref-iam-example-1.json"></a>

```
"myuser" : {
   "Type" : "AWS::IAM::User",
   "Properties" : {
      "Path" : "/",
      "LoginProfile" : {
         "Password" : "myP@ssW0rd"
      },
      "Policies" : [ {
         "PolicyName" : "giveaccesstoqueueonly",
         "PolicyDocument" : {
            "Version": "2012-10-17",		 	 	 
            "Statement" : [ {
               "Effect" : "Allow",
               "Action" : [ "sqs:*" ],
               "Resource" : [ {
                  "Fn::GetAtt" : [ "myqueue", "Arn" ]
               } ]
            }, {
               "Effect" : "Deny",
               "Action" : [ "sqs:*" ],
               "NotResource" : [ {
                  "Fn::GetAtt" : [ "myqueue", "Arn" ]
               } ]
            }
         ] }
      }, {
         "PolicyName" : "giveaccesstotopiconly",
         "PolicyDocument" : {
            "Version": "2012-10-17",		 	 	 
            "Statement" : [ {
               "Effect" : "Allow",
               "Action" : [ "sns:*" ],
               "Resource" : [ { "Ref" : "mytopic" } ]
            }, {
               "Effect" : "Deny",
               "Action" : [ "sns:*" ],
               "NotResource" : [ { "Ref" : "mytopic" } ]
            } ]
         }
      } ]
   }
}
```

### YAML
<a name="quickref-iam-example-1.yaml"></a>

```
myuser:
  Type: AWS::IAM::User
  Properties:
    Path: "/"
    LoginProfile:
      Password: myP@ssW0rd
    Policies:
    - PolicyName: giveaccesstoqueueonly
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action:
          - sqs:*
          Resource:
          - !GetAtt myqueue.Arn
        - Effect: Deny
          Action:
          - sqs:*
          NotResource:
          - !GetAtt myqueue.Arn
    - PolicyName: giveaccesstotopiconly
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action:
          - sns:*
          Resource:
          - !Ref mytopic
        - Effect: Deny
          Action:
          - sns:*
          NotResource:
          - !Ref mytopic
```

## Deklarieren einer IAM-Zugriffsschlüssel-Ressource
<a name="scenario-iam-accesskey"></a>

### 
<a name="quickref-iam-access-key"></a>

Dieser Ausschnitt zeigt eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-accesskey.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-accesskey.html) Ressource. Die Ressource `myaccesskey` erstellt einen Zugriffsschlüssel und weist ihn einem IAM-Benutzer zu, der in der Vorlage als Ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) deklariert ist.

#### JSON
<a name="quickref-iam-example-2.json"></a>

```
"myaccesskey" : {
   "Type" : "AWS::IAM::AccessKey",
   "Properties" : {
      "UserName" : { "Ref" : "myuser" }
   }
}
```

#### YAML
<a name="quickref-iam-example-2.yaml"></a>

```
myaccesskey:
  Type: AWS::IAM::AccessKey
  Properties:
    UserName:
      !Ref myuser
```

### 
<a name="quickref-iam-access-key-2"></a>

Sie können den geheimen Schlüssel für eine `AWS::IAM::AccessKey`-Ressource mithilfe der `Fn::GetAtt`-Funktion abrufen. Eine Möglichkeit zum Abrufen des geheimen Schlüssels besteht darin, ihn in einen `Output`-Wert zu setzen. Sie können den Zugriffsschlüssel mit der `Ref`-Funktion abrufen. Die folgenden `Output`-Wertdeklarationen rufen den Zugriffsschlüssel und den geheimen Schlüssel für `myaccesskey` ab.

#### JSON
<a name="quickref-iam-example-3.json"></a>

```
"AccessKeyformyaccesskey" : {
   "Value" : { "Ref" : "myaccesskey" }
},
"SecretKeyformyaccesskey" : {
   "Value" : {
      "Fn::GetAtt" : [ "myaccesskey", "SecretAccessKey" ]
   }
}
```

#### YAML
<a name="quickref-iam-example-3.yaml"></a>

```
AccessKeyformyaccesskey:
  Value:
    !Ref myaccesskey
SecretKeyformyaccesskey:
  Value: !GetAtt myaccesskey.SecretAccessKey
```

### 
<a name="quickref-iam-access-key-3"></a>

Sie können den AWS Zugriffsschlüssel und den geheimen Schlüssel auch an eine EC2 Amazon-Instance oder Auto Scaling Scaling-Gruppe übergeben, die in der Vorlage definiert sind. Die folgende [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html)-Deklaration verwendet die `UserData`-Eigenschaft, um den Zugriffsschlüssel und den geheimen Schlüssel für die `myaccesskey`-Ressource zu übergeben.

#### JSON
<a name="quickref-iam-example-4.json"></a>

```
"myinstance" : {
   "Type" : "AWS::EC2::Instance",
   "Properties" : {
      "AvailabilityZone" : "us-east-1a",
      "ImageId" : "ami-0ff8a91507f77f867",
      "UserData" : {
         "Fn::Base64" : {
            "Fn::Join" : [
               "", [
                  "ACCESS_KEY=", {
                     "Ref" : "myaccesskey"
                  },
                  "&",
                  "SECRET_KEY=",
                  {
                     "Fn::GetAtt" : [
                        "myaccesskey",
                        "SecretAccessKey"
                     ]
                  }
               ]
            ]
         }
      }
   }
}
```

#### YAML
<a name="quickref-iam-example-4.yaml"></a>

```
myinstance:
  Type: AWS::EC2::Instance
  Properties:
    AvailabilityZone: "us-east-1a"
    ImageId: ami-0ff8a91507f77f867
    UserData:
      Fn::Base64: !Sub "ACCESS_KEY=${myaccesskey}&SECRET_KEY=${myaccesskey.SecretAccessKey}"
```

## Deklarieren einer IAM-Gruppenressource
<a name="scenario-iam-group"></a>

Dieser Ausschnitt zeigt eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-group.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-group.html) Ressource. Die Gruppe hat einen Pfad (`"/myapplication/"`). Das Richtliniendokument namens `myapppolicy` wird der Gruppe hinzugefügt, um den Benutzern der Gruppe die Berechtigung zum Ausführen aller Amazon SQS-Aktionen auf der Amazon SQS-Warteschlangenressource "myqueue" zu erteilen und den Zugriff auf alle anderen Amazon SQS-Ressourcen außer `myqueue` zu verweigern.

Zum Zuweisen einer Richtlinie zu einer Ressource benötigt IAM den Amazon-Ressourcennamen (ARN) für die Ressource. In dem Ausschnitt ruft die Funktion `Fn::GetAtt` den ARN der Ressourcenwarteschlange [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html) ab.

### JSON
<a name="quickref-iam-example-5.json"></a>

```
"mygroup" : {
   "Type" : "AWS::IAM::Group",
   "Properties" : {
      "Path" : "/myapplication/",
      "Policies" : [ {
         "PolicyName" : "myapppolicy",
         "PolicyDocument" : {
            "Version": "2012-10-17",		 	 	 
            "Statement" : [ {
               "Effect" : "Allow",
               "Action" : [ "sqs:*" ],
               "Resource" : [ {
                  "Fn::GetAtt" : [ "myqueue", "Arn" ]
               } ]
            },
            {
               "Effect" : "Deny",
               "Action" : [ "sqs:*" ],
               "NotResource" : [ { "Fn::GetAtt" : [ "myqueue", "Arn" ] } ]
            }
         ] }
      } ]
   }
}
```

### YAML
<a name="quickref-iam-example-5.yaml"></a>

```
mygroup:
  Type: AWS::IAM::Group
  Properties:
    Path: "/myapplication/"
    Policies:
    - PolicyName: myapppolicy
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action:
          - sqs:*
          Resource: !GetAtt myqueue.Arn
        - Effect: Deny
          Action:
          - sqs:*
          NotResource: !GetAtt myqueue.Arn
```

## Hinzufügen von Benutzern zu einer Gruppe
<a name="scenario-iam-addusertogroup"></a>

Die Ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-usertogroupaddition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-usertogroupaddition.html) fügt Benutzer zu einer Gruppe hinzu. Im folgenden Ausschnitt fügt die Ressource `addUserToGroup` die folgenden Benutzer zu einer bestehenden Gruppe namens `myexistinggroup2`hinzu: den bestehenden Benutzer `existinguser1` und den Benutzer `myuser`, der in der Vorlage als Ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html) deklariert ist.

### JSON
<a name="quickref-iam-example-6.json"></a>

```
"addUserToGroup" : {
   "Type" : "AWS::IAM::UserToGroupAddition",
   "Properties" : {
      "GroupName" : "myexistinggroup2",
      "Users" : [ "existinguser1", { "Ref" : "myuser" } ]
   }
}
```

### YAML
<a name="quickref-iam-example-6.yaml"></a>

```
addUserToGroup:
  Type: AWS::IAM::UserToGroupAddition
  Properties:
    GroupName: myexistinggroup2
    Users:
    - existinguser1
    - !Ref myuser
```

## Deklarieren einer IAM-Richtlinie
<a name="scenario-iam-policy"></a>

Dieser Ausschnitt zeigt, wie Sie eine Richtlinie erstellen und sie auf mehrere Gruppen anwenden, indem Sie eine Ressource mit dem Namen [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-policy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-policy.html) `mypolicy` verwenden. Die `mypolicy`-Ressource enthält eine `PolicyDocument`-Eigenschaft, die `GetObject`-, `PutObject`- und `PutObjectAcl`-Aktionen für die Objekte in dem durch den ARN `arn:aws:s3:::myAWSBucket` repräsentierten S3-Bucket zulässt. Die Ressource `mypolicy` wendet die Richtlinie auf eine bestehende Gruppe namens `myexistinggroup1` und eine Gruppe `mygroup` an, die in der Vorlage als Ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-group.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-group.html) deklariert ist. Dieses Beispiel zeigt, wie eine Richtlinie mithilfe der `Groups`-Eigenschaft auf eine Gruppe angewendet wird. Sie können jedoch auch die `Users`-Eigenschaft verwenden, um einer Liste von Benutzern ein Richtliniendokument hinzuzufügen.

### JSON
<a name="quickref-iam-example-7.json"></a>

```
"mypolicy" : {
   "Type" : "AWS::IAM::Policy",
   "Properties" : {
      "PolicyName" : "mygrouppolicy",
      "PolicyDocument" : {
         "Version": "2012-10-17",		 	 	 
         "Statement" : [ {
            "Effect" : "Allow",
            "Action" : [
               "s3:GetObject" , "s3:PutObject" , "s3:PutObjectAcl" ],
            "Resource" : "arn:aws:s3:::myAWSBucket/*"
         } ]
      },
      "Groups" : [ "myexistinggroup1", { "Ref" : "mygroup" } ]
   }
}
```

### YAML
<a name="quickref-iam-example-7.yaml"></a>

```
mypolicy:
  Type: AWS::IAM::Policy
  Properties:
    PolicyName: mygrouppolicy
    PolicyDocument:
      Version: '2012-10-17'
      Statement:
      - Effect: Allow
        Action:
        - s3:GetObject
        - s3:PutObject
        - s3:PutObjectAcl
        Resource: arn:aws:s3:::myAWSBucket/*
    Groups:
    - myexistinggroup1
    - !Ref mygroup
```

## Deklarieren einer Amazon S3-Bucket-Richtlinie
<a name="scenario-bucket-policy"></a>

Dieser Ausschnitt zeigt, wie Sie eine Richtlinie erstellen und sie auf einen Amazon S3-Bucket anwenden, indem Sie die Ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html) verwenden. Die `mybucketpolicy`-Ressource deklariert ein Richtliniendokument, das dem `user1`-Benutzer IAM erlaubt, die `GetObject`-Aktion auf alle Objekte in dem S3-Bucket auszuführen, auf den die Richtlinie angewendet wird. In dem Codebeispiel ruft die `Fn::GetAtt`-Funktion den ARN der `user1`-Ressource ab. Die `mybucketpolicy`-Ressource wendet die Richtlinie auf die `AWS::S3::BucketPolicy`-Ressource mybucket an. Die `Ref`-Funktion ruft den Bucket-Namen der `mybucket`-Ressource ab.

### JSON
<a name="quickref-iam-example-8.json"></a>

```
"mybucketpolicy" : {
   "Type" : "AWS::S3::BucketPolicy",
   "Properties" : {
      "PolicyDocument" : {
         "Id" : "MyPolicy",
         "Version": "2012-10-17",		 	 	 
         "Statement" : [ {
            "Sid" : "ReadAccess",
            "Action" : [ "s3:GetObject" ],
            "Effect" : "Allow",
            "Resource" : { "Fn::Join" : [
                  "", [ "arn:aws:s3:::", { "Ref" : "mybucket" } , "/*" ]
               ] },
            "Principal" : {
               "AWS" : { "Fn::GetAtt" : [ "user1", "Arn" ] }
            }
         } ]
      },
      "Bucket" : { "Ref" : "mybucket" }
   }
}
```

### YAML
<a name="quickref-iam-example-8.yaml"></a>

```
mybucketpolicy:
  Type: AWS::S3::BucketPolicy
  Properties:
    PolicyDocument:
      Id: MyPolicy
      Version: '2012-10-17'
      Statement:
      - Sid: ReadAccess
        Action:
        - s3:GetObject
        Effect: Allow
        Resource: !Sub "arn:aws:s3:::${mybucket}/*"
        Principal:
          AWS: !GetAtt user1.Arn
    Bucket: !Ref mybucket
```

## Deklarieren einer Amazon SNS-Themenrichtlinie
<a name="scenario-sns-policy"></a>

Dieser Ausschnitt zeigt, wie Sie eine Richtlinie erstellen und sie mithilfe der Ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topicpolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topicpolicy.html) auf ein Amazon SNS-Thema anwenden. Die `mysnspolicy`-Ressource enthält eine `PolicyDocument`-Eigenschaft, die es der [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-user.html)-Ressource `myuser` ermöglicht, die `Publish`-Aktion für eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html)-Ressource `mytopic`durchzuführen. In dem Codebeispiel ruft die `Fn::GetAtt`-Funktion den ARN für die `myuser`-Ressource ab und die `Ref`-Funktion ruft den ARN für die `mytopic`-Ressource ab.

### JSON
<a name="quickref-iam-example-9.json"></a>

```
"mysnspolicy" : {
   "Type" : "AWS::SNS::TopicPolicy",
   "Properties" : {
      "PolicyDocument" :  {
         "Id" : "MyTopicPolicy",
         "Version": "2012-10-17",		 	 	 
         "Statement" : [ {
            "Sid" : "My-statement-id",
            "Effect" : "Allow",
            "Principal" : {
               "AWS" : { "Fn::GetAtt" : [ "myuser", "Arn" ] }
            },
            "Action" : "sns:Publish",
            "Resource" : "*"
         } ]
      },
      "Topics" : [ { "Ref" : "mytopic" } ]
   }
}
```

### YAML
<a name="quickref-iam-example-9.yaml"></a>

```
mysnspolicy:
  Type: AWS::SNS::TopicPolicy
  Properties:
    PolicyDocument:
      Id: MyTopicPolicy
      Version: '2012-10-17'
      Statement:
      - Sid: My-statement-id
        Effect: Allow
        Principal:
          AWS: !GetAtt myuser.Arn
        Action: sns:Publish
        Resource: "*"
    Topics:
    - !Ref mytopic
```

## Deklarieren einer Amazon SQS-Richtlinie
<a name="scenario-sqs-policy"></a>

Dieser Ausschnitt zeigt, wie Sie eine Richtlinie erstellen und sie mit der Ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queuepolicy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queuepolicy.html) auf eine Amazon SQS-Warteschlange anwenden. Die Eigenschaft `PolicyDocument` ermöglicht es dem bestehenden Benutzer `myapp` (angegeben durch seinen ARN), die Aktion `SendMessage` für eine bestehende Warteschlange, die durch ihre URL angegeben ist, und eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sqs-queue.html) Ressource myqueue durchzuführen. Die [Ref](resources-section-structure.md#resource-properties-ref)-Funktion ruft die URL für die `myqueue`-Ressource ab.

### JSON
<a name="quickref-iam-example-10.json"></a>

```
"mysqspolicy" : {
   "Type" : "AWS::SQS::QueuePolicy",
   "Properties" : {
      "PolicyDocument" : {
         "Id" : "MyQueuePolicy",
         "Version": "2012-10-17",		 	 	 
         "Statement" : [ {
            "Sid" : "Allow-User-SendMessage",
            "Effect" : "Allow",
            "Principal" : {
               "AWS" : "arn:aws:iam::123456789012:user/myapp"
            },
            "Action" : [ "sqs:SendMessage" ],
            "Resource" : "*"
         } ]
      },
      "Queues" : [
         "https://sqs.us-east-2aws-region.amazonaws.com/123456789012/myexistingqueue",
         { "Ref" : "myqueue" }
      ]
   }
}
```

### YAML
<a name="quickref-iam-example-10.yaml"></a>

```
mysqspolicy:
  Type: AWS::SQS::QueuePolicy
  Properties:
    PolicyDocument:
      Id: MyQueuePolicy
      Version: '2012-10-17'
      Statement:
      - Sid: Allow-User-SendMessage
        Effect: Allow
        Principal:
          AWS: arn:aws:iam::123456789012:user/myapp
        Action:
        - sqs:SendMessage
        Resource: "*"
    Queues:
    - https://sqs.aws-region.amazonaws.com/123456789012/myexistingqueue
    - !Ref myqueue
```

## Vorlagenbeispiele für IAM-Rollen
<a name="scenarios-iamroles"></a>

Dieser Abschnitt enthält CloudFormation Vorlagenbeispiele für IAM-Rollen für EC2 Instances.

Weitere Informationen finden Sie unter [IAM-Rollen für Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html) im * EC2 Amazon-Benutzerhandbuch*.

### IAM-Rolle bei EC2
<a name="scenario-iamrole-ec2"></a>

In diesem Beispiel wird das Instanzprofil durch die `IamInstanceProfile` Eigenschaft der EC2 Instanz referenziert. Sowohl die Instance-Richtlinie als auch die Rollenrichtlinie referenzieren [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html).

#### JSON
<a name="quickref-iam-example-11.json"></a>

```
{
   "AWSTemplateFormatVersion": "2010-09-09",
   "Resources": {
      "myEC2Instance": {
         "Type": "AWS::EC2::Instance",
         "Version": "2009-05-15",
         "Properties": {
            "ImageId": "ami-0ff8a91507f77f867",
            "InstanceType": "m1.small",
            "Monitoring": "true",
            "DisableApiTermination": "false",
            "IamInstanceProfile": {
               "Ref": "RootInstanceProfile"
            }
         }
      },
      "RootRole": {
         "Type": "AWS::IAM::Role",
         "Properties": {
            "AssumeRolePolicyDocument": {
               "Version": "2012-10-17",		 	 	 
               "Statement": [ {
                  "Effect": "Allow",
                  "Principal": {
                     "Service": [ "ec2.amazonaws.com" ]
                  },
                  "Action": [ "sts:AssumeRole" ]
               } ]
            },
            "Path": "/"
         }
      },
      "RolePolicies": {
         "Type": "AWS::IAM::Policy",
         "Properties": {
            "PolicyName": "root",
            "PolicyDocument": {
               "Version": "2012-10-17",		 	 	 
               "Statement": [ {
                  "Effect": "Allow",
                  "Action": "*",
                  "Resource": "*"
               } ]
            },
            "Roles": [ { "Ref": "RootRole" } ]
         }
      },
      "RootInstanceProfile": {
         "Type": "AWS::IAM::InstanceProfile",
         "Properties": {
            "Path": "/",
            "Roles": [ { "Ref": "RootRole" } ]
         }
      }
   }
}
```

#### YAML
<a name="quickref-iam-example-11.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  myEC2Instance:
    Type: AWS::EC2::Instance
    Version: '2009-05-15'
    Properties:
      ImageId: ami-0ff8a91507f77f867
      InstanceType: m1.small
      Monitoring: 'true'
      DisableApiTermination: 'false'
      IamInstanceProfile:
        !Ref RootInstanceProfile
  RootRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - ec2.amazonaws.com
          Action:
          - sts:AssumeRole
      Path: "/"
  RolePolicies:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: root
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action: "*"
          Resource: "*"
      Roles:
      - !Ref RootRole
  RootInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
      - !Ref RootRole
```

### IAM-Rolle mit Auto Scaling-Gruppe
<a name="scenario-iamrole-asg"></a>

In diesem Beispiel wird das Instance-Profil durch die `IamInstanceProfile` Eigenschaft einer Amazon EC2 Auto Scaling Scaling-Startkonfiguration referenziert.

#### JSON
<a name="quickref-iam-example-12.json"></a>

```
{
   "AWSTemplateFormatVersion": "2010-09-09",
   "Resources": {
      "myLCOne": {
         "Type": "AWS::AutoScaling::LaunchConfiguration",
         "Version": "2009-05-15",
         "Properties": {
            "ImageId": "ami-0ff8a91507f77f867",
            "InstanceType": "m1.small",
            "InstanceMonitoring": "true",
            "IamInstanceProfile": { "Ref": "RootInstanceProfile" }
         }
      },
      "myASGrpOne": {
         "Type": "AWS::AutoScaling::AutoScalingGroup",
         "Version": "2009-05-15",
         "Properties": {
            "AvailabilityZones": [ "us-east-1a" ],
            "LaunchConfigurationName": { "Ref": "myLCOne" },
            "MinSize": "0",
            "MaxSize": "0",
            "HealthCheckType": "EC2",
            "HealthCheckGracePeriod": "120"
         }
      },
      "RootRole": {
         "Type": "AWS::IAM::Role",
         "Properties": {
            "AssumeRolePolicyDocument": {
               "Version": "2012-10-17",		 	 	 
               "Statement": [ {
                  "Effect": "Allow",
                  "Principal": {
                     "Service": [ "ec2.amazonaws.com" ]
                  },
                  "Action": [ "sts:AssumeRole" ]
               } ]
            },
            "Path": "/"
         }
      },
      "RolePolicies": {
         "Type": "AWS::IAM::Policy",
         "Properties": {
            "PolicyName": "root",
            "PolicyDocument": {
               "Version": "2012-10-17",		 	 	 
               "Statement": [ {
                  "Effect": "Allow",
                  "Action": "*",
                  "Resource": "*"
               } ]
            },
            "Roles": [ { "Ref": "RootRole" } ]
         }
      },
      "RootInstanceProfile": {
         "Type": "AWS::IAM::InstanceProfile",
         "Properties": {
            "Path": "/",
            "Roles": [ { "Ref": "RootRole" } ]
         }
      }
   }
}
```

#### YAML
<a name="quickref-iam-example-12.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  myLCOne:
    Type: AWS::AutoScaling::LaunchConfiguration
    Version: '2009-05-15'
    Properties:
      ImageId: ami-0ff8a91507f77f867
      InstanceType: m1.small
      InstanceMonitoring: 'true'
      IamInstanceProfile:
        !Ref RootInstanceProfile
  myASGrpOne:
    Type: AWS::AutoScaling::AutoScalingGroup
    Version: '2009-05-15'
    Properties:
      AvailabilityZones:
      - "us-east-1a"
      LaunchConfigurationName:
        !Ref myLCOne
      MinSize: '0'
      MaxSize: '0'
      HealthCheckType: EC2
      HealthCheckGracePeriod: '120'
  RootRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - ec2.amazonaws.com
          Action:
          - sts:AssumeRole
      Path: "/"
  RolePolicies:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: root
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action: "*"
          Resource: "*"
      Roles:
      - !Ref RootRole
  RootInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
      - !Ref RootRole
```

# AWS Lambda Vorlage
<a name="quickref-lambda"></a>

Die folgende Vorlage verwendet eine AWS Lambda (Lambda-) Funktion und eine benutzerdefinierte Ressource, um eine neue Sicherheitsgruppe an eine Liste vorhandener Sicherheitsgruppen anzuhängen. Diese Funktion ist hilfreich, wenn Sie dynamisch eine Liste von Sicherheitsgruppen erstellen möchten, sodass die Liste sowohl neue als auch vorhandene Sicherheitsgruppen enthält. Sie können beispielsweise eine Liste vorhandener Sicherheitsgruppen als Parameterwert übergeben, den neuen Wert an die Liste anhängen und dann alle Ihre Werte einer Instanz zuordnen. EC2 Weitere Informationen über den Ressourcentyp Lambda-Funktion finden Sie unter [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html).

In diesem Beispiel CloudFormation wird beim Erstellen der `AllSecurityGroups` benutzerdefinierten Ressource die `AppendItemToListFunction` Lambda-Funktion CloudFormation aufgerufen. CloudFormation übergibt die Liste der vorhandenen Sicherheitsgruppen und eine neue Sicherheitsgruppe (`NewSecurityGroup`) an die Funktion, die die neue Sicherheitsgruppe an die Liste anhängt und dann die geänderte Liste zurückgibt. CloudFormation verwendet die geänderte Liste, um der `MyEC2Instance` Ressource alle Sicherheitsgruppen zuzuordnen.

## JSON
<a name="quickref-lambda-example-1.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Parameters": {
        "ExistingSecurityGroups": {
            "Type": "List<AWS::EC2::SecurityGroup::Id>"
        },
        "ExistingVPC": {
            "Type": "AWS::EC2::VPC::Id",
            "Description": "The VPC ID that includes the security groups in the ExistingSecurityGroups parameter."
        },
        "InstanceType": {
            "Type": "String",
            "Default": "t2.micro",
            "AllowedValues": [
                "t2.micro",
                "t3.micro"
            ]
        }
    },

    "Resources": {
        "SecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "GroupDescription": "Allow HTTP traffic to the host",
                "VpcId": {
                    "Ref": "ExistingVPC"
                },
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 80,
                        "ToPort": 80,
                        "CidrIp": "0.0.0.0/0"
                    }
                ],
                "SecurityGroupEgress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": 80,
                        "ToPort": 80,
                        "CidrIp": "0.0.0.0/0"
                    }
                ]
            }
        },
        "AllSecurityGroups": {
            "Type": "Custom::Split",
            "Properties": {
                "ServiceToken": {
                    "Fn::GetAtt": [
                        "AppendItemToListFunction",
                        "Arn"
                    ]
                },
                "List": {
                    "Ref": "ExistingSecurityGroups"
                },
                "AppendedItem": {
                    "Ref": "SecurityGroup"
                }
            }
        },
        "AppendItemToListFunction": {
            "Type": "AWS::Lambda::Function",
            "Properties": {
                "Handler": "index.handler",
                "Role": {
                    "Fn::GetAtt": [
                        "LambdaExecutionRole",
                        "Arn"
                    ]
                },
                "Code": {
                    "ZipFile": {
                        "Fn::Join": [
                            "",
                            [
                                "var response = require('cfn-response');",
                                "exports.handler = function(event, context) {",
                                "   var responseData = {Value: event.ResourceProperties.List};",
                                "   responseData.Value.push(event.ResourceProperties.AppendedItem);",
                                "   response.send(event, context, response.SUCCESS, responseData);",
                                "};"
                            ]
                        ]
                    }
                },
                "Runtime": "nodejs20.x"
            }
        },
        "MyEC2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}",
                "SecurityGroupIds": {
                    "Fn::GetAtt": [
                        "AllSecurityGroups",
                        "Value"
                    ]
                },
                "InstanceType": {
                    "Ref": "InstanceType"
                }
            }
        },
        "LambdaExecutionRole": {
            "Type": "AWS::IAM::Role",
            "Properties": {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17", 		 	 	 
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Principal": {
                                "Service": [
                                    "lambda.amazonaws.com"
                                ]
                            },
                            "Action": [
                                "sts:AssumeRole"
                            ]
                        }
                    ]
                },
                "Path": "/",
                "Policies": [
                    {
                        "PolicyName": "root",
                        "PolicyDocument": {
                            "Version": "2012-10-17", 		 	 	 
                            "Statement": [
                                {
                                    "Effect": "Allow",
                                    "Action": [
                                        "logs:*"
                                    ],
                                    "Resource": "arn:aws:logs:*:*:*"
                                }
                            ]
                        }
                    }
                ]
            }
        }
    },
    "Outputs": {
        "AllSecurityGroups": {
            "Description": "Security Groups that are associated with the EC2 instance",
            "Value": {
                "Fn::Join": [
                    ", ",
                    {
                        "Fn::GetAtt": [
                            "AllSecurityGroups",
                            "Value"
                        ]
                    }
                ]
            }
        }
    }
}
```

## YAML
<a name="quickref-lambda-example-1.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  ExistingSecurityGroups:
    Type: List<AWS::EC2::SecurityGroup::Id>
  ExistingVPC:
    Type: AWS::EC2::VPC::Id
    Description: The VPC ID that includes the security groups in the ExistingSecurityGroups parameter.
  InstanceType:
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t3.micro
Resources:
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Allow HTTP traffic to the host
      VpcId: !Ref ExistingVPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
      SecurityGroupEgress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
  AllSecurityGroups:
    Type: Custom::Split
    Properties:
      ServiceToken: !GetAtt AppendItemToListFunction.Arn
      List: !Ref ExistingSecurityGroups
      AppendedItem: !Ref SecurityGroup
  AppendItemToListFunction:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        ZipFile: !Join
          - ''
          - - var response = require('cfn-response');
            - exports.handler = function(event, context) {
            - '   var responseData = {Value: event.ResourceProperties.List};'
            - '   responseData.Value.push(event.ResourceProperties.AppendedItem);'
            - '   response.send(event, context, response.SUCCESS, responseData);'
            - '};'
      Runtime: nodejs20.x
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: '{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}'
      SecurityGroupIds: !GetAtt AllSecurityGroups.Value
      InstanceType: !Ref InstanceType
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17' 		 	 	 
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      Policies:
        - PolicyName: root
          PolicyDocument:
            Version: '2012-10-17' 		 	 	 
            Statement:
              - Effect: Allow
                Action:
                  - logs:*
                Resource: arn:aws:logs:*:*:*
Outputs:
  AllSecurityGroups:
    Description: Security Groups that are associated with the EC2 instance
    Value: !Join
      - ', '
      - !GetAtt AllSecurityGroups.Value
```

# Amazon Redshift-Vorlagenausschnitte
<a name="quickref-redshift"></a>

Amazon Redshift ist ein vollständig verwalteter Data-Warehouse-Service in Petabytegröße in der Cloud. Sie können mit Amazon-Redshift-Cluster von CloudFormation bereitstellen und verwalten.

## Amazon-Redshift-Cluster
<a name="quickref-redshift-samplecluster"></a>

Die folgende Beispielvorlage erstellt einen Amazon Redshift-Cluster entsprechend den Parameterwerten, die bei der Stack-Erstellung angegeben werden. Die Cluster-Parametergruppe, die dem Amazon Redshift-Cluster zugeordnet ist, ermöglicht die Protokollierung von Benutzeraktivitäten. Die Vorlage startet zudem die Amazon Redshift-Cluster in einer Amazon VPC, die in der Vorlage definiert ist. Die VPC enthält ein Internet-Gateway, sodass Sie aus dem Internet auf die Amazon Redshift-Cluster zugreifen können. Die Kommunikation zwischen dem Cluster und dem Internet-Gateway muss jedoch auch aktiviert werden, was durch den Eintrag in die Routing-Tabelle erfolgt.

**Anmerkung**  
Die Vorlage enthält die Bedingung `IsMultiNodeCluster`, sodass der Parameter `NumberOfNodes` nur deklariert wird, wenn dem Parameter `ClusterType` der Wert `multi-node` zugewiesen wird.

Das Beispiel definiert den Parameter `MysqlRootPassword` mit auf `true` gesetzter Eigenschaft `NoEcho`. Wenn Sie das `NoEcho`-Attribut auf `true` festlegen, gibt CloudFormation für alle Aufrufe, die den Stack oder die Stapelereignisse beschreiben, den als Sternchen (\$1\$1\$1\$1\$1) maskierten Parameterwert zurück, mit Ausnahme der Informationen, die an den folgenden Speicherorten gespeichert sind.

**Wichtig**  
Durch die Verwendung des `NoEcho`-Attributs werden keine Informationen maskiert, die im Folgenden gespeichert sind:  
Der `Metadata` Vorlagenbereich. CloudFormation transformiert, modifiziert oder redigiert keine Informationen, die Sie in den `Metadata` Abschnitt aufnehmen. Weitere Informationen finden Sie unter [Metadaten](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html).
Der `Outputs`-Vorlagenabschnitt. Weitere Informationen finden Sie unter [Ausgaben](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html):
Das `Metadata`-Attribut einer Ressourcendefinition. Weitere Informationen finden Sie unter [`Metadata`-Attribut](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).
Es wird dringend empfohlen, diese Mechanismen nicht zu verwenden, um vertrauliche Informationen wie Passwörter oder Geheimnisse einzugeben.

**Wichtig**  
Anstatt vertrauliche Informationen direkt in Ihre CloudFormation Vorlagen einzubetten, empfehlen wir Ihnen, dynamische Parameter in der Stack-Vorlage zu verwenden, um auf vertrauliche Informationen zu verweisen, die außerhalb von gespeichert und verwaltet werden CloudFormation, z. B. im AWS Systems Manager Parameterspeicher oder. AWS Secrets Manager  
Weitere Informationen finden Sie in den bewährten Methoden zu [Keine Anmeldeinformationen in Ihre Vorlagen einbetten](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/security-best-practices.html#creds).

### JSON
<a name="quickref-redshift-example-1.json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters" : {
    "DatabaseName" : {
      "Description" : "The name of the first database to be created when the cluster is created",
      "Type" : "String",
      "Default" : "dev",
      "AllowedPattern" : "([a-z]|[0-9])+"
    },
    "ClusterType" : {
      "Description" : "The type of cluster",
      "Type" : "String",
      "Default" : "single-node",
      "AllowedValues" : [ "single-node", "multi-node" ]
    },
    "NumberOfNodes" : {
      "Description" : "The number of compute nodes in the cluster. For multi-node clusters, the NumberOfNodes parameter must be greater than 1",
      "Type" : "Number",
      "Default" : "1"
    },
    "NodeType" : {
      "Description" : "The type of node to be provisioned",
      "Type" : "String",
      "Default" : "ds2.xlarge",
      "AllowedValues" : [ "ds2.xlarge", "ds2.8xlarge", "dc1.large", "dc1.8xlarge" ]
    }, 
    "MasterUsername" : {
      "Description" : "The user name that is associated with the master user account for the cluster that is being created",
      "Type" : "String",
      "Default" : "defaultuser",
      "AllowedPattern" : "([a-z])([a-z]|[0-9])*"
    },
    "MasterUserPassword" :  {
      "Description" : "The password that is associated with the master user account for the cluster that is being created.",
      "Type" : "String",
      "NoEcho" : "true"
    },
    "InboundTraffic" : {
      "Description" : "Allow inbound traffic to the cluster from this CIDR range.",
      "Type" : "String",
      "MinLength": "9",
      "MaxLength": "18",
      "Default" : "0.0.0.0/0",
      "AllowedPattern" : "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})",
      "ConstraintDescription" : "must be a valid CIDR range of the form x.x.x.x/x."
    },
    "PortNumber" : {
      "Description" : "The port number on which the cluster accepts incoming connections.",
      "Type" : "Number",
      "Default" : "5439"
    }
  },
  "Conditions" : {
    "IsMultiNodeCluster" : {
      "Fn::Equals" : [{ "Ref" : "ClusterType" }, "multi-node" ]        
    }
  },
  "Resources" : {
    "RedshiftCluster" : {
      "Type" : "AWS::Redshift::Cluster",
      "DependsOn" : "AttachGateway",
      "Properties" : {
        "ClusterType" : { "Ref" : "ClusterType" },
        "NumberOfNodes" : { "Fn::If" : [ "IsMultiNodeCluster",  { "Ref" : "NumberOfNodes" }, { "Ref" : "AWS::NoValue" }]},
        "NodeType" : { "Ref" : "NodeType" },
        "DBName" : { "Ref" : "DatabaseName" },
        "MasterUsername" : { "Ref" : "MasterUsername" },
        "MasterUserPassword" : { "Ref" : "MasterUserPassword" },               
        "ClusterParameterGroupName" : { "Ref" : "RedshiftClusterParameterGroup" },
        "VpcSecurityGroupIds" : [ { "Ref" : "SecurityGroup" } ],
        "ClusterSubnetGroupName" : { "Ref" : "RedshiftClusterSubnetGroup" },
        "PubliclyAccessible" : "true",
        "Port" : { "Ref" : "PortNumber" }
      }
    },
    "RedshiftClusterParameterGroup" : {
      "Type" : "AWS::Redshift::ClusterParameterGroup",
      "Properties" : {
        "Description" : "Cluster parameter group",
        "ParameterGroupFamily" : "redshift-1.0",
        "Parameters" : [{
          "ParameterName" : "enable_user_activity_logging",
          "ParameterValue" : "true"
        }]
      }
    },
    "RedshiftClusterSubnetGroup" : {
      "Type" : "AWS::Redshift::ClusterSubnetGroup",
      "Properties" : {
        "Description" : "Cluster subnet group",
        "SubnetIds" : [ { "Ref" : "PublicSubnet" } ]
      }
    },
    "VPC" : {
      "Type" : "AWS::EC2::VPC",
      "Properties" : {
        "CidrBlock" : "10.0.0.0/16"
      }
    },
    "PublicSubnet" : {
      "Type" : "AWS::EC2::Subnet",
      "Properties" : {
        "CidrBlock" : "10.0.0.0/24",
        "VpcId" : { "Ref" : "VPC" }
      }
    },
    "SecurityGroup" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "GroupDescription" : "Security group",
        "SecurityGroupIngress" : [ {
          "CidrIp" : { "Ref": "InboundTraffic" },
          "FromPort" : { "Ref" : "PortNumber" },
          "ToPort" : { "Ref" : "PortNumber" },
          "IpProtocol" : "tcp"
        } ],
        "VpcId" : { "Ref" : "VPC" }
      }
    },
    "myInternetGateway" : {
      "Type" : "AWS::EC2::InternetGateway"
    },
    "AttachGateway" : {
      "Type" : "AWS::EC2::VPCGatewayAttachment",
      "Properties" : {
        "VpcId" : { "Ref" : "VPC" },
        "InternetGatewayId" : { "Ref" : "myInternetGateway" }
      }
    },
    "PublicRouteTable" : {
      "Type" : "AWS::EC2::RouteTable",
      "Properties" : {
        "VpcId" : {
          "Ref" : "VPC"
        }
      }
    },
    "PublicRoute" : {
      "Type" : "AWS::EC2::Route",
      "DependsOn" : "AttachGateway",
      "Properties"  : {
        "RouteTableId" : {
          "Ref" : "PublicRouteTable"
        },
        "DestinationCidrBlock" : "0.0.0.0/0",
        "GatewayId" : {
          "Ref" : "myInternetGateway"
        }
      }
    },
    "PublicSubnetRouteTableAssociation" : {
      "Type" : "AWS::EC2::SubnetRouteTableAssociation",
      "Properties" : {
        "SubnetId" : {
          "Ref" : "PublicSubnet"
        },
        "RouteTableId" : {
          "Ref" : "PublicRouteTable"
        }
      }
    }
  },
  "Outputs" : {
    "ClusterEndpoint" : {
      "Description" : "Cluster endpoint",
      "Value" : { "Fn::Join" : [ ":", [ { "Fn::GetAtt" : [ "RedshiftCluster", "Endpoint.Address" ] }, { "Fn::GetAtt" : [ "RedshiftCluster", "Endpoint.Port" ] } ] ] }
    },
    "ClusterName" : {
      "Description" : "Name of cluster",
      "Value" : { "Ref" : "RedshiftCluster" }
    },
    "ParameterGroupName" : {
      "Description" : "Name of parameter group",
      "Value" : { "Ref" : "RedshiftClusterParameterGroup" }
    },
    "RedshiftClusterSubnetGroupName" : {
      "Description" : "Name of cluster subnet group",
      "Value" : { "Ref" : "RedshiftClusterSubnetGroup" }
    },
    "RedshiftClusterSecurityGroupName" : {
      "Description" : "Name of cluster security group",
      "Value" : { "Ref" : "SecurityGroup" }
    }
  }
}
```

### YAML
<a name="quickref-redshift-example-1.yaml"></a>

```
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  DatabaseName:
    Description: The name of the first database to be created when the cluster is
      created
    Type: String
    Default: dev
    AllowedPattern: "([a-z]|[0-9])+"
  ClusterType:
    Description: The type of cluster
    Type: String
    Default: single-node
    AllowedValues:
    - single-node
    - multi-node
  NumberOfNodes:
    Description: The number of compute nodes in the cluster. For multi-node clusters,
      the NumberOfNodes parameter must be greater than 1
    Type: Number
    Default: '1'
  NodeType:
    Description: The type of node to be provisioned
    Type: String
    Default: ds2.xlarge
    AllowedValues:
    - ds2.xlarge
    - ds2.8xlarge
    - dc1.large
    - dc1.8xlarge
  MasterUsername:
    Description: The user name that is associated with the master user account for
      the cluster that is being created
    Type: String
    Default: defaultuser
    AllowedPattern: "([a-z])([a-z]|[0-9])*"
  MasterUserPassword:
    Description: The password that is associated with the master user account for
      the cluster that is being created.
    Type: String
    NoEcho: 'true'
  InboundTraffic:
    Description: Allow inbound traffic to the cluster from this CIDR range.
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})"
    ConstraintDescription: must be a valid CIDR range of the form x.x.x.x/x.
  PortNumber:
    Description: The port number on which the cluster accepts incoming connections.
    Type: Number
    Default: '5439'
Conditions:
  IsMultiNodeCluster:
    Fn::Equals:
    - Ref: ClusterType
    - multi-node
Resources:
  RedshiftCluster:
    Type: AWS::Redshift::Cluster
    DependsOn: AttachGateway
    Properties:
      ClusterType:
        Ref: ClusterType
      NumberOfNodes:
        Fn::If:
        - IsMultiNodeCluster
        - Ref: NumberOfNodes
        - Ref: AWS::NoValue
      NodeType:
        Ref: NodeType
      DBName:
        Ref: DatabaseName
      MasterUsername:
        Ref: MasterUsername
      MasterUserPassword:
        Ref: MasterUserPassword
      ClusterParameterGroupName:
        Ref: RedshiftClusterParameterGroup
      VpcSecurityGroupIds:
      - Ref: SecurityGroup
      ClusterSubnetGroupName:
        Ref: RedshiftClusterSubnetGroup
      PubliclyAccessible: 'true'
      Port:
        Ref: PortNumber
  RedshiftClusterParameterGroup:
    Type: AWS::Redshift::ClusterParameterGroup
    Properties:
      Description: Cluster parameter group
      ParameterGroupFamily: redshift-1.0
      Parameters:
      - ParameterName: enable_user_activity_logging
        ParameterValue: 'true'
  RedshiftClusterSubnetGroup:
    Type: AWS::Redshift::ClusterSubnetGroup
    Properties:
      Description: Cluster subnet group
      SubnetIds:
      - Ref: PublicSubnet
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.0.0/24
      VpcId:
        Ref: VPC
  SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group
      SecurityGroupIngress:
      - CidrIp:
          Ref: InboundTraffic
        FromPort:
          Ref: PortNumber
        ToPort:
          Ref: PortNumber
        IpProtocol: tcp
      VpcId:
        Ref: VPC
  myInternetGateway:
    Type: AWS::EC2::InternetGateway
  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId:
        Ref: VPC
      InternetGatewayId:
        Ref: myInternetGateway
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId:
        Ref: VPC
  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId:
        Ref: PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId:
        Ref: myInternetGateway
  PublicSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId:
        Ref: PublicSubnet
      RouteTableId:
        Ref: PublicRouteTable
Outputs:
  ClusterEndpoint:
    Description: Cluster endpoint
    Value: !Sub "${RedshiftCluster.Endpoint.Address}:${RedshiftCluster.Endpoint.Port}"
  ClusterName:
    Description: Name of cluster
    Value:
      Ref: RedshiftCluster
  ParameterGroupName:
    Description: Name of parameter group
    Value:
      Ref: RedshiftClusterParameterGroup
  RedshiftClusterSubnetGroupName:
    Description: Name of cluster subnet group
    Value:
      Ref: RedshiftClusterSubnetGroup
  RedshiftClusterSecurityGroupName:
    Description: Name of cluster security group
    Value:
      Ref: SecurityGroup
```

## Weitere Informationen finden Sie auch unter
<a name="w2aac11c41c72b7"></a>

[AWS::Redshift::Cluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-redshift-cluster.html)

# Amazon RDS-Vorlagenausschnitte
<a name="quickref-rds"></a>

**Topics**
+ [Amazon RDS-DB-Instance-Ressource](#scenario-rds-instance)
+ [Amazon RDS-Oracle-Datenbank-DB-Instance-Ressource](#scenario-rds-oracleinstance)
+ [Amazon RDS DBSecurity Group-Ressource für den CIDR-Bereich](#scenario-rds-security-group-cidr)
+ [Amazon DBSecurity RDS-Gruppe mit einer EC2 Amazon-Sicherheitsgruppe](#scenario-rds-security-group-ec2)
+ [Mehrere VPC-Sicherheitsgruppen](#scenario-multiple-vpc-security-groups)
+ [Amazon RDS-Datenbank-Instance in einer VPC-Sicherheitsgruppe](#w2aac11c41c76c15)

## Amazon RDS-DB-Instance-Ressource
<a name="scenario-rds-instance"></a>

Dieses Beispiel zeigt eine Amazon-RDS-DB-Instance-Ressource mit einem verwalteten Masterbenutzerpasswort. Weitere Informationen finden Sie unter [Passwortverwaltung mit AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html) im *Amazon-RDS-Benutzerhandbuch* und [Passwortverwaltung mit AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-secrets-manager.html) im *Aurora-Benutzerhandbuch*. Da die optionale Eigenschaft `EngineVersion` nicht angegeben ist, wird die Standard-Engine-Version für diese DB-Instance verwendet. Einzelheiten zur Standard-Engine-Version und anderen Standardeinstellungen finden Sie unter [Erstellen DBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html). Die `DBSecurityGroups` Eigenschaft autorisiert den Netzwerkzugriff auf die `AWS::RDS::DBSecurityGroup` Ressourcen mit dem Namen `MyDbSecurityByEC2SecurityGroup` und. MyDbSecurityBy CIDRIPGroup Details hierzu finden Sie unter [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html). Die Ressource DB Instance hat auch ein Attribut `DeletionPolicy`, das auf `Snapshot`gesetzt ist. Mit diesem `Snapshot` `DeletionPolicy` Set CloudFormation wird ein Snapshot dieser DB-Instance erstellt, bevor sie beim Löschen des Stacks gelöscht wird.

### JSON
<a name="quickref-rds-example-1.json"></a>

```
 1. "MyDB" : {
 2.  "Type" : "AWS::RDS::DBInstance",
 3.  "Properties" : {
 4.      "DBSecurityGroups" : [
 5.         {"Ref" : "MyDbSecurityByEC2SecurityGroup"}, {"Ref" : "MyDbSecurityByCIDRIPGroup"} ],
 6.      "AllocatedStorage" : "5",
 7.      "DBInstanceClass" : "db.t2.small",
 8.      "Engine" : "MySQL",
 9.      "MasterUsername" : "MyName",
10.      "ManageMasterUserPassword" : true,
11.      "MasterUserSecret" : {
12.         "KmsKeyId" : {"Ref" : "KMSKey"}
13.      }
14.  },
15.  "DeletionPolicy" : "Snapshot"
16. }
```

### YAML
<a name="quickref-rds-example-1.yaml"></a>

```
 1. MyDB:
 2.   Type: AWS::RDS::DBInstance
 3.   Properties:
 4.     DBSecurityGroups:
 5.     - Ref: MyDbSecurityByEC2SecurityGroup
 6.     - Ref: MyDbSecurityByCIDRIPGroup
 7.     AllocatedStorage: '5'
 8.     DBInstanceClass: db.t2.small
 9.     Engine: MySQL
10.     MasterUsername: MyName
11.     ManageMasterUserPassword: true
12.     MasterUserSecret:
13.       KmsKeyId: !Ref KMSKey
14.   DeletionPolicy: Snapshot
```

## Amazon RDS-Oracle-Datenbank-DB-Instance-Ressource
<a name="scenario-rds-oracleinstance"></a>

In diesem Beispiel wird eine Oracle-Database-DB-Instance-Ressource mit einem verwalteten Masterbenutzerpasswort erstellt. Weitere Informationen finden Sie unter [Passwortverwaltung mit AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html) im *Amazon-RDS-Benutzerhandbuch*. Das Beispiel spezifiziert das `Engine` wie `oracle-ee` bei einem Lizenzmodell von bring-your-own-license. Einzelheiten zu den Einstellungen für Oracle-Datenbank-DB-Instances finden Sie unter [Create DBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html). Die Eigenschaft DBSecurity Groups autorisiert den Netzwerkzugriff auf die `AWS::RDS::DBSecurityGroup` Ressourcen mit dem Namen MyDbSecurityBy EC2 SecurityGroup und. MyDbSecurityBy CIDRIPGroup Details hierzu finden Sie unter [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html). Die Ressource DB Instance hat auch ein Attribut `DeletionPolicy`, das auf `Snapshot`gesetzt ist. Mit diesem `Snapshot` `DeletionPolicy` Set CloudFormation wird ein Snapshot dieser DB-Instance erstellt, bevor sie beim Löschen des Stacks gelöscht wird.

### JSON
<a name="quickref-rds-example-2.json"></a>

```
 1. "MyDB" : {
 2.  "Type" : "AWS::RDS::DBInstance",
 3.  "Properties" : {
 4.      "DBSecurityGroups" : [
 5.         {"Ref" : "MyDbSecurityByEC2SecurityGroup"}, {"Ref" : "MyDbSecurityByCIDRIPGroup"} ],
 6.      "AllocatedStorage" : "5",
 7.      "DBInstanceClass" : "db.t2.small",
 8.      "Engine" : "oracle-ee",
 9.      "LicenseModel" : "bring-your-own-license",
10.      "MasterUsername" : "master",
11.      "ManageMasterUserPassword" : true,
12.      "MasterUserSecret" : {
13.         "KmsKeyId" : {"Ref" : "KMSKey"}
14.      }
15.  },
16.  "DeletionPolicy" : "Snapshot"
17. }
```

### YAML
<a name="quickref-rds-example-2.yaml"></a>

```
 1. MyDB:
 2.   Type: AWS::RDS::DBInstance
 3.   Properties:
 4.     DBSecurityGroups:
 5.     - Ref: MyDbSecurityByEC2SecurityGroup
 6.     - Ref: MyDbSecurityByCIDRIPGroup
 7.     AllocatedStorage: '5'
 8.     DBInstanceClass: db.t2.small
 9.     Engine: oracle-ee
10.     LicenseModel: bring-your-own-license
11.     MasterUsername: master
12.     ManageMasterUserPassword: true
13.     MasterUserSecret:
14.       KmsKeyId: !Ref KMSKey
15.   DeletionPolicy: Snapshot
```

## Amazon RDS DBSecurity Group-Ressource für den CIDR-Bereich
<a name="scenario-rds-security-group-cidr"></a>

Dieses Beispiel zeigt eine Amazon RDS `DBSecurityGroup`-Ressource mit Ingress-Autorisierung für den angegebenen CIDR-Bereich im Format `ddd.ddd.ddd.ddd/dd`. Einzelheiten finden Sie unter [AWS: :RDS:: DBSecurity Group](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroup.html) and [Ingress](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-rds-dbsecuritygroup-ingress.html).

### JSON
<a name="quickref-rds-example-3.json"></a>

```
1. "MyDbSecurityByCIDRIPGroup" : {
2.  "Type" : "AWS::RDS::DBSecurityGroup",
3.  "Properties" : {
4.      "GroupDescription" : "Ingress for CIDRIP",
5.      "DBSecurityGroupIngress" : {
6.          "CIDRIP" : "192.168.0.0/32"
7.      }
8.  }
9. }
```

### YAML
<a name="quickref-rds-example-3.yaml"></a>

```
1. MyDbSecurityByCIDRIPGroup:
2.   Type: AWS::RDS::DBSecurityGroup
3.   Properties:
4.     GroupDescription: Ingress for CIDRIP
5.     DBSecurityGroupIngress:
6.       CIDRIP: "192.168.0.0/32"
```

## Amazon DBSecurity RDS-Gruppe mit einer EC2 Amazon-Sicherheitsgruppe
<a name="scenario-rds-security-group-ec2"></a>

Dieses Beispiel zeigt eine [AWS: :RDS:: DBSecurity -Gruppenressource](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroup.html) mit Eingangsautorisierung von einer EC2 Amazon-Sicherheitsgruppe, auf die von verwiesen wird. `MyEc2SecurityGroup`

Dazu definieren Sie eine EC2 Sicherheitsgruppe und verwenden dann die systeminterne `Ref` Funktion, um auf die EC2 Sicherheitsgruppe innerhalb Ihrer Gruppe zu verweisen. `DBSecurityGroup`

### JSON
<a name="quickref-rds-example-4.json"></a>

```
"DBInstance" : {
   "Type": "AWS::RDS::DBInstance",
   "Properties": {
      "DBName"            : { "Ref" : "DBName" },
      "Engine"            : "MySQL",
      "MasterUsername"    : { "Ref" : "DBUsername" },
      "DBInstanceClass"   : { "Ref" : "DBClass" },
      "DBSecurityGroups"  : [ { "Ref" : "DBSecurityGroup" } ],
      "AllocatedStorage"  : { "Ref" : "DBAllocatedStorage" },
      "MasterUserPassword": { "Ref" : "DBPassword" }
   }
},

"DBSecurityGroup": {
   "Type": "AWS::RDS::DBSecurityGroup",
   "Properties": {
      "DBSecurityGroupIngress": {
         "EC2SecurityGroupName": {
            "Fn::GetAtt": ["WebServerSecurityGroup", "GroupName"]
         }
      },
      "GroupDescription" : "Frontend Access"
   }
},

"WebServerSecurityGroup" : {
   "Type" : "AWS::EC2::SecurityGroup",
   "Properties" : {
      "GroupDescription" : "Enable HTTP access via port 80 and SSH access",
      "SecurityGroupIngress" : [
         {"IpProtocol" : "tcp", "FromPort" : 80, "ToPort" : 80, "CidrIp" : "0.0.0.0/0"},
         {"IpProtocol" : "tcp", "FromPort" : 22, "ToPort" : 22, "CidrIp" : "0.0.0.0/0"}
      ]
   }
}
```

### YAML
<a name="quickref-rds-example-4.yaml"></a>

Dieses Beispiel wurde aus dem folgenden vollständigen Beispiel extrahiert: [Drupal\$1Single\$1Instance\$1With\$1RDS.template](https://s3.amazonaws.com/cloudformation-templates-us-east-1/Drupal_Single_Instance_With_RDS.template)

```
DBInstance:
  Type: AWS::RDS::DBInstance
  Properties:
    DBName:
      Ref: DBName
    Engine: MySQL
    MasterUsername:
      Ref: DBUsername
    DBInstanceClass:
      Ref: DBClass
    DBSecurityGroups:
    - Ref: DBSecurityGroup
    AllocatedStorage:
      Ref: DBAllocatedStorage
    MasterUserPassword:
      Ref: DBPassword
DBSecurityGroup:
  Type: AWS::RDS::DBSecurityGroup
  Properties:
    DBSecurityGroupIngress:
      EC2SecurityGroupName:
        Ref: WebServerSecurityGroup
    GroupDescription: Frontend Access
WebServerSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: Enable HTTP access via port 80 and SSH access
    SecurityGroupIngress:
    - IpProtocol: tcp
      FromPort: 80
      ToPort: 80
      CidrIp: 0.0.0.0/0
    - IpProtocol: tcp
      FromPort: 22
      ToPort: 22
      CidrIp: 0.0.0.0/0
```

## Mehrere VPC-Sicherheitsgruppen
<a name="scenario-multiple-vpc-security-groups"></a>

Dieses Beispiel zeigt eine [AWS: :RDS:: DBSecurity Gruppenressource](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroup.html) mit Eingangsautorisierung für mehrere Amazon EC2 VPC-Sicherheitsgruppen in [AWS: :RDS::](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroupingress.html). DBSecurity GroupIngress

### JSON
<a name="quickref-rds-example-5.json"></a>

```
{
   "Resources" : {
      "DBinstance" : {
         "Type" : "AWS::RDS::DBInstance",
         "Properties" : {
            "AllocatedStorage" : "5",
            "DBInstanceClass" : "db.t2.small",
           "DBName" : {"Ref": "MyDBName" },
            "DBSecurityGroups" : [ { "Ref" : "DbSecurityByEC2SecurityGroup" } ],
            "DBSubnetGroupName" : { "Ref" : "MyDBSubnetGroup" },
            "Engine" : "MySQL",
           "MasterUserPassword": { "Ref" : "MyDBPassword" },
           "MasterUsername"    : { "Ref" : "MyDBUsername" }
        },
         "DeletionPolicy" : "Snapshot"
      },
      "DbSecurityByEC2SecurityGroup" : {
         "Type" : "AWS::RDS::DBSecurityGroup",
         "Properties" : {
            "GroupDescription" : "Ingress for Amazon EC2 security group",
           "EC2VpcId" : { "Ref" : "MyVPC" },
            "DBSecurityGroupIngress" : [ {
               "EC2SecurityGroupId" : "sg-b0ff1111",
               "EC2SecurityGroupOwnerId" : "111122223333"
            }, {
               "EC2SecurityGroupId" : "sg-ffd722222",
               "EC2SecurityGroupOwnerId" : "111122223333"
            } ]
         }
      }
   }
}
```

### YAML
<a name="quickref-rds-example-5.yaml"></a>

```
Resources:
  DBinstance:
    Type: AWS::RDS::DBInstance
    Properties:
      AllocatedStorage: '5'
      DBInstanceClass: db.t2.small
      DBName:
        Ref: MyDBName
      DBSecurityGroups:
      - Ref: DbSecurityByEC2SecurityGroup
      DBSubnetGroupName:
        Ref: MyDBSubnetGroup
      Engine: MySQL
      MasterUserPassword:
        Ref: MyDBPassword
      MasterUsername:
        Ref: MyDBUsername
    DeletionPolicy: Snapshot
  DbSecurityByEC2SecurityGroup:
    Type: AWS::RDS::DBSecurityGroup
    Properties:
      GroupDescription: Ingress for Amazon EC2 security group
      EC2VpcId:
        Ref: MyVPC
      DBSecurityGroupIngress:
      - EC2SecurityGroupId: sg-b0ff1111
        EC2SecurityGroupOwnerId: '111122223333'
      - EC2SecurityGroupId: sg-ffd722222
        EC2SecurityGroupOwnerId: '111122223333'
```

## Amazon RDS-Datenbank-Instance in einer VPC-Sicherheitsgruppe
<a name="w2aac11c41c76c15"></a>

Dieses Beispiel zeigt eine Amazon RDS-Datenbank-Instance, die mit einer Amazon EC2 VPC-Sicherheitsgruppe verknüpft ist.

### JSON
<a name="quickref-rds-example-6.json"></a>

```
{
  "DBEC2SecurityGroup": {
    "Type": "AWS::EC2::SecurityGroup",
    "Properties" : {
      "GroupDescription": "Open database for access",
      "SecurityGroupIngress" : [{
        "IpProtocol" : "tcp",
        "FromPort" : 3306,
        "ToPort" : 3306,
        "SourceSecurityGroupName" : { "Ref" : "WebServerSecurityGroup" }
      }]
    }
  },
  "DBInstance" : {
    "Type": "AWS::RDS::DBInstance",
    "Properties": {
      "DBName"            : { "Ref" : "DBName" },
      "Engine"            : "MySQL",
      "MultiAZ"           : { "Ref": "MultiAZDatabase" },
      "MasterUsername"    : { "Ref" : "DBUser" },
      "DBInstanceClass"   : { "Ref" : "DBClass" },
      "AllocatedStorage"  : { "Ref" : "DBAllocatedStorage" },
      "MasterUserPassword": { "Ref" : "DBPassword" },
      "VPCSecurityGroups" : [ { "Fn::GetAtt": [ "DBEC2SecurityGroup", "GroupId" ] } ]
    }
  }
}
```

### YAML
<a name="quickref-rds-example-6.yaml"></a>

```
DBEC2SecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: Open database for access
    SecurityGroupIngress:
    - IpProtocol: tcp
      FromPort: 3306
      ToPort: 3306
      SourceSecurityGroupName:
        Ref: WebServerSecurityGroup
DBInstance:
  Type: AWS::RDS::DBInstance
  Properties:
    DBName:
      Ref: DBName
    Engine: MySQL
    MultiAZ:
      Ref: MultiAZDatabase
    MasterUsername:
      Ref: DBUser
    DBInstanceClass:
      Ref: DBClass
    AllocatedStorage:
      Ref: DBAllocatedStorage
    MasterUserPassword:
      Ref: DBPassword
    VPCSecurityGroups:
    - !GetAtt DBEC2SecurityGroup.GroupId
```

# Route-53-Vorlagenausschnitte
<a name="quickref-route53"></a>

**Topics**
+ [Amazon Route 53-Ressourcendatensatz mit gehosteten Zone oder ID](#scenario-route53-recordset-by-host)
+ [Wird RecordSetGroup zum Einrichten gewichteter Ressourcendatensätze verwendet](#scenario-recordsetgroup-weighted)
+ [Wird verwendet RecordSetGroup , um einen Alias-Ressourcendatensatz einzurichten](#scenario-recordsetgroup-zoneapex)
+ [Alias-Ressourcendatensatz für eine Verteilung CloudFront](#scenario-user-friendly-url-for-cloudfront-distribution)

## Amazon Route 53-Ressourcendatensatz mit gehosteten Zone oder ID
<a name="scenario-route53-recordset-by-host"></a>

Wenn Sie einen Amazon Route 53-Ressourcendatensatz erstellen, müssen Sie die Hosting-Zone angeben, in der Sie ihn hinzufügen möchten. CloudFormation bietet zwei Möglichkeiten, eine Hosting-Zone anzugeben:
+ Sie können die gehostete Zone mit der Eigenschaft `HostedZoneId` explizit angeben.
+ Sie können die Hosting-Zone mithilfe der `HostedZoneName` Eigenschaft CloudFormation gefunden haben. Wenn Sie die `HostedZoneName` Eigenschaft verwenden und es mehrere Hosting-Zonen mit demselben Namen gibt, wird der Stack CloudFormation nicht erstellt.

### Hinzufügen RecordSet mit HostedZoneId
<a name="scenario-recordset-using-id"></a>

In diesem Beispiel wird ein Amazon Route 53-Ressourcendatensatz hinzugefügt, der einen `SPF`-Datensatz für den Domainnamen `mysite.example.com` enthält, der die Eigenschaft `HostedZoneId` verwendet, um die gehostete Zone anzugeben.

#### JSON
<a name="quickref-route53-example-1.json"></a>

```
 1. "myDNSRecord" : {
 2.   "Type" : "AWS::Route53::RecordSet",
 3.   "Properties" : 
 4.   {
 5.     "HostedZoneId" : "Z3DG6IL3SJCGPX",
 6.     "Name" : "mysite.example.com.",
 7.     "Type" : "SPF",
 8.     "TTL" : "900",
 9.     "ResourceRecords" : [ "\"v=spf1 ip4:192.168.0.1/16 -all\"" ]
10.   }
11. }
```

#### YAML
<a name="quickref-route53-example-1.yaml"></a>

```
1. myDNSRecord:
2.   Type: AWS::Route53::RecordSet
3.   Properties:
4.     HostedZoneId: Z3DG6IL3SJCGPX
5.     Name: mysite.example.com.
6.     Type: SPF
7.     TTL: '900'
8.     ResourceRecords:
9.     - '"v=spf1 ip4:192.168.0.1/16 -all"'
```

### Hinzufügen RecordSet mit HostedZoneName
<a name="scenario-recordset-using-name"></a>

In diesem Beispiel wird ein Amazon Route 53-Ressourcendatensatz für den Domainnnamen „mysite.example.com“ mit der Eigenschaft `HostedZoneName` zur Angabe der gehosteten Zone hinzugefügt.

#### JSON
<a name="quickref-route53-example-2.json"></a>

```
 1. "myDNSRecord2" : {
 2.             "Type" : "AWS::Route53::RecordSet",
 3.             "Properties" : {
 4.                 "HostedZoneName" : "example.com.",
 5.                 "Name" : "mysite.example.com.",
 6.                 "Type" : "A",
 7.                 "TTL" : "900",
 8.                 "ResourceRecords" : [
 9.                     "192.168.0.1",
10.                     "192.168.0.2"
11.                 ]
12.             }
13.         }
```

#### YAML
<a name="quickref-route53-example-2.yaml"></a>

```
 1. myDNSRecord2:
 2.   Type: AWS::Route53::RecordSet
 3.   Properties:
 4.     HostedZoneName: example.com.
 5.     Name: mysite.example.com.
 6.     Type: A
 7.     TTL: '900'
 8.     ResourceRecords:
 9.     - 192.168.0.1
10.     - 192.168.0.2
```

## Wird RecordSetGroup zum Einrichten gewichteter Ressourcendatensätze verwendet
<a name="scenario-recordsetgroup-weighted"></a>

In diesem Beispiel wird eine [AWS::Route53::RecordSetGruppe](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-route53-recordsetgroup.html) verwendet, um zwei CNAME-Einträge für „example.com“ einzurichten. Gehostete Zone. Die Eigenschaft `RecordSets` enthält die CNAME-Datensätze für den DNS-Namen „mysite.example.com“. Jeder Datensatz enthält eine Kennung (`SetIdentifier`) und eine Gewichtung (`Weight`). Der Anteil des Internetverkehrs, der zu den Ressourcen geleitet wird, basiert auf den folgenden Berechnungen:
+ `Frontend One`: `140/(140+60)` = `140/200` = 70%
+ `Frontend Two`: `60/(140+60)` = `60/200` = 30%

Weitere Informationen über gewichtete Ressourcendatensätze finden Sie unter [Gewichtetes Routing](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-weighted.html) im *Entwicklerhandbuch für Amazon Route 53*.

### JSON
<a name="quickref-route53-example-3.json"></a>

```
 1.         "myDNSOne" : {
 2.             "Type" : "AWS::Route53::RecordSetGroup",
 3.             "Properties" : {
 4.                 "HostedZoneName" : "example.com.",
 5.                 "Comment" : "Weighted RR for my frontends.",
 6.                 "RecordSets" : [
 7.                   {
 8.                     "Name" : "mysite.example.com.",
 9.                     "Type" : "CNAME",
10.                     "TTL" : "900",
11.                     "SetIdentifier" : "Frontend One",
12.                     "Weight" : "140",
13.                     "ResourceRecords" : ["example-ec2.amazonaws.com"]
14.                   },
15.                   {
16.                     "Name" : "mysite.example.com.",
17.                     "Type" : "CNAME",
18.                     "TTL" : "900",
19.                     "SetIdentifier" : "Frontend Two",
20.                     "Weight" : "60",
21.                     "ResourceRecords" : ["example-ec2-larger.amazonaws.com"]
22.                   }
23.                   ]
24.             }
25.         }
```

### YAML
<a name="quickref-route53-example-3.yaml"></a>

```
 1. myDNSOne:
 2.   Type: AWS::Route53::RecordSetGroup
 3.   Properties:
 4.     HostedZoneName: example.com.
 5.     Comment: Weighted RR for my frontends.
 6.     RecordSets:
 7.     - Name: mysite.example.com.
 8.       Type: CNAME
 9.       TTL: '900'
10.       SetIdentifier: Frontend One
11.       Weight: '140'
12.       ResourceRecords:
13.       - example-ec2.amazonaws.com
14.     - Name: mysite.example.com.
15.       Type: CNAME
16.       TTL: '900'
17.       SetIdentifier: Frontend Two
18.       Weight: '60'
19.       ResourceRecords:
20.       - example-ec2-larger.amazonaws.com
```

## Wird verwendet RecordSetGroup , um einen Alias-Ressourcendatensatz einzurichten
<a name="scenario-recordsetgroup-zoneapex"></a>

In den folgenden Beispielen wird eine [AWS::Route53::RecordSetGruppe](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-route53-recordsetgroup.html) verwendet, um einen Alias-Ressourcendatensatz mit dem Namen einzurichten`example.com`, der den Datenverkehr an einen ELB-Load-Balancer der Version 1 (Classic) und einen Load Balancer der Version 2 (Anwendung oder Netzwerk) weiterleitet. Die [AliasTarget](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-route53-recordset-aliastarget.html)Eigenschaft gibt die Hosting-Zonen-ID und den DNS-Namen für die `myELB` `LoadBalancer` mithilfe der `GetAtt` systemeigenen Funktion an. `GetAtt`ruft verschiedene Eigenschaften der `myELB` Ressource ab, je nachdem, ob Sie den Datenverkehr an einen Load Balancer der Version 1 oder Version 2 weiterleiten:
+ Version 1 Load Balancer: `CanonicalHostedZoneNameID` und `DNSName`
+ Version 2 Load Balancer: `CanonicalHostedZoneID` und `DNSName`

Weitere Informationen über Alias-Ressourcendatensätze finden Sie unter [Wählen zwischen Alias- und Nicht-Alias-Datensätzen](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-choosing-alias-non-alias.html) im *Route-53-Entwicklerhandbuch*.

### JSON für Version 1 Load Balancer
<a name="quickref-route53-example-4.json"></a>

```
 1.       "myELB" : {
 2.         "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
 3.         "Properties" : {
 4.             "AvailabilityZones" : [ "us-east-1a" ],
 5.             "Listeners" : [ {
 6.                 "LoadBalancerPort" : "80",
 7.                 "InstancePort" : "80",
 8.                 "Protocol" : "HTTP"
 9.             } ]
10.         }
11.       },
12.       "myDNS" : {
13.         "Type" : "AWS::Route53::RecordSetGroup",
14.         "Properties" : {
15.           "HostedZoneName" : "example.com.",
16.           "Comment" : "Zone apex alias targeted to myELB LoadBalancer.",
17.           "RecordSets" : [
18.             {
19.               "Name" : "example.com.",
20.               "Type" : "A",
21.               "AliasTarget" : {
22.                   "HostedZoneId" : { "Fn::GetAtt" : ["myELB", "CanonicalHostedZoneNameID"] },
23.                   "DNSName" : { "Fn::GetAtt" : ["myELB","DNSName"] }
24.               }
25.             }
26.           ]
27.         }
28.     }
```

### YAML für Version 1 Load Balancer
<a name="quickref-route53-example-4.yaml"></a>

```
 1. myELB:
 2.   Type: AWS::ElasticLoadBalancing::LoadBalancer
 3.   Properties:
 4.     AvailabilityZones:
 5.     - "us-east-1a"
 6.     Listeners:
 7.     - LoadBalancerPort: '80'
 8.       InstancePort: '80'
 9.       Protocol: HTTP
10. myDNS:
11.   Type: AWS::Route53::RecordSetGroup
12.   Properties:
13.     HostedZoneName: example.com.
14.     Comment: Zone apex alias targeted to myELB LoadBalancer.
15.     RecordSets:
16.     - Name: example.com.
17.       Type: A
18.       AliasTarget:
19.         HostedZoneId: !GetAtt 'myELB.CanonicalHostedZoneNameID'
20.         DNSName: !GetAtt 'myELB.DNSName'
```

### JSON für Version 2 Load Balancer
<a name="quickref-route53-example-4-v2.json"></a>

```
 1.       "myELB" : {
 2.         "Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
 3.         "Properties" : {
 4.             "Subnets" : [ 
 5.                 {"Ref": "SubnetAZ1"}, 
 6.                 {"Ref" : "SubnetAZ2"}
 7.             ]
 8.         }
 9.       },
10.       "myDNS" : {
11.         "Type" : "AWS::Route53::RecordSetGroup",
12.         "Properties" : {
13.           "HostedZoneName" : "example.com.",
14.           "Comment" : "Zone apex alias targeted to myELB LoadBalancer.",
15.           "RecordSets" : [
16.             {
17.               "Name" : "example.com.",
18.               "Type" : "A",
19.               "AliasTarget" : {
20.                   "HostedZoneId" : { "Fn::GetAtt" : ["myELB", "CanonicalHostedZoneID"] },
21.                   "DNSName" : { "Fn::GetAtt" : ["myELB","DNSName"] }
22.               }
23.             }
24.           ]
25.         }
26.     }
```

### YAML für Version 2 Load Balancer
<a name="quickref-route53-example-4-v2.yaml"></a>

```
 1. myELB:
 2.   Type: AWS::ElasticLoadBalancingV2::LoadBalancer
 3.   Properties:
 4.     Subnets:
 5.     - Ref: SubnetAZ1
 6.     - Ref: SubnetAZ2
 7. myDNS:
 8.   Type: AWS::Route53::RecordSetGroup
 9.   Properties:
10.     HostedZoneName: example.com.
11.     Comment: Zone apex alias targeted to myELB LoadBalancer.
12.     RecordSets:
13.     - Name: example.com.
14.       Type: A
15.       AliasTarget:
16.         HostedZoneId: !GetAtt 'myELB.CanonicalHostedZoneID'
17.         DNSName: !GetAtt 'myELB.DNSName'
```

## Alias-Ressourcendatensatz für eine Verteilung CloudFront
<a name="scenario-user-friendly-url-for-cloudfront-distribution"></a>

Im folgenden Beispiel wird ein Alias-A-Datensatz erstellt, der einen benutzerdefinierten Domänennamen auf eine bestehende CloudFront Distribution verweist. `myHostedZoneID`wird angenommen, dass es sich entweder um einen Verweis auf eine tatsächliche `AWS::Route53::HostedZone` Ressource in derselben Vorlage oder um einen Parameter handelt. `myCloudFrontDistribution`bezieht sich auf eine `AWS::CloudFront::Distribution` Ressource innerhalb derselben Vorlage. Der Aliaseintrag verwendet die standardmäßige CloudFront Hosting-Zonen-ID (`Z2FDTNDATAQYW2`) und löst den Domainnamen der Distribution automatisch anhand von`Fn::GetAtt`. Dieses Setup ermöglicht die Weiterleitung des Webverkehrs von der benutzerdefinierten Domain zur CloudFront Distribution, ohne dass eine IP-Adresse erforderlich ist.

**Anmerkung**  
Wenn Sie Alias-Ressourcen-Datensätze erstellen, müssen Sie `Z2FDTNDATAQYW2` für die Eigenschaft `HostedZoneId` angeben. Alias-Ressourcendatensätze für CloudFront können nicht in einer privaten Zone erstellt werden.

### JSON
<a name="quickref-route53-example-5.json"></a>

```
 1. {
 2.     "myDNS": {
 3.         "Type": "AWS::Route53::RecordSetGroup",
 4.         "Properties": {
 5.             "HostedZoneId": {
 6.                 "Ref": "myHostedZoneID"
 7.             },
 8.             "RecordSets": [
 9.                 {
10.                     "Name": {
11.                         "Ref": "myRecordSetDomainName"
12.                     },
13.                     "Type": "A",
14.                     "AliasTarget": {
15.                         "HostedZoneId": "Z2FDTNDATAQYW2",
16.                         "DNSName": {
17.                             "Fn::GetAtt": [
18.                                 "myCloudFrontDistribution",
19.                                 "DomainName"
20.                             ]
21.                         },
22.                         "EvaluateTargetHealth": false
23.                     }
24.                 }
25.             ]
26.         }
27.     }
28. }
```

### YAML
<a name="quickref-route53-example-5.yaml"></a>

```
 1. myDNS:
 2.   Type: AWS::Route53::RecordSetGroup
 3.   Properties:
 4.     HostedZoneId: !Ref myHostedZoneID
 5.     RecordSets:
 6.       - Name: !Ref myRecordSetDomainName
 7.         Type: A
 8.         AliasTarget:
 9.           HostedZoneId: Z2FDTNDATAQYW2
10.           DNSName: !GetAtt 
11.             - myCloudFrontDistribution
12.             - DomainName
13.           EvaluateTargetHealth: false
```

# Amazon S3-Vorlagenausschnitte
<a name="quickref-s3"></a>

Verwenden Sie diese Amazon S3 S3-Beispielvorlagen, um Ihre Amazon S3 S3-Buckets mit CloudFormation zu beschreiben. Weitere Beispiele finden Sie im Abschnitt [Beispiele](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html#aws-resource-s3-bucket--examples) in der `AWS::S3::Bucket` Ressource.

**Topics**
+ [Erstellen eines Amazon S3-Buckets mit Standardeinstellungen](#scenario-s3-bucket)
+ [Erstellen eines Amazon-S3-Buckets für das Hosten von Websites inklusive einer `DeletionPolicy`](#scenario-s3-bucket-website)
+ [Erstellen einer statischen Website mit einer benutzerdefinierten Domain](#scenario-s3-bucket-website-customdomain)

## Erstellen eines Amazon S3-Buckets mit Standardeinstellungen
<a name="scenario-s3-bucket"></a>

In diesem Beispiel wird mithilfe einer Ressource des Typs [AWS::S3::Bucket](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html) ein Bucket mit Standardeinstellungen erstellt.

### JSON
<a name="quickref-s3-example-1.json"></a>

```
1. "myS3Bucket" : {
2.       "Type" : "AWS::S3::Bucket"
3.       }
```

### YAML
<a name="quickref-s3-example-1.yaml"></a>

```
1. MyS3Bucket:
2.     Type: AWS::S3::Bucket
```

## Erstellen eines Amazon-S3-Buckets für das Hosten von Websites inklusive einer `DeletionPolicy`
<a name="scenario-s3-bucket-website"></a>

In diesem Beispiel wird ein Bucket als Website erstellt und die Blockierung des öffentlichen Zugriffs deaktiviert (öffentliche Leserechte sind für Buckets erforderlich, die für das Hosting von Websites eingerichtet wurden). Eine öffentliche Bucket-Policy wird dann zum Bucket hinzugefügt. Da für diese Bucket-Ressource ein `DeletionPolicy` Attribut auf gesetzt ist`Retain`, CloudFormation wird dieser Bucket beim Löschen des Stacks nicht gelöscht. Der Abschnitt `Output` verwendet `Fn::GetAtt` zum Abrufen des Attributs `WebsiteURL` und des Attributs `DomainName` der Ressource `S3Bucket` .

**Anmerkung**  
Die folgenden Beispiele gehen davon aus, dass die Einstellungen `BlockPublicPolicy` und `RestrictPublicBuckets` Öffentlicher Zugriff sperren auf Kontoebene deaktiviert wurden. 

### JSON
<a name="quickref-s3-example-2.json"></a>

```
 1. {
 2.     "AWSTemplateFormatVersion": "2010-09-09",
 3.     "Resources": {
 4.         "S3Bucket": {
 5.             "Type": "AWS::S3::Bucket",
 6.             "Properties": {
 7.                 "PublicAccessBlockConfiguration": {
 8.                     "BlockPublicAcls": false,
 9.                     "BlockPublicPolicy": false,
10.                     "IgnorePublicAcls": false,
11.                     "RestrictPublicBuckets": false
12.                 },
13.                 "WebsiteConfiguration": {
14.                     "IndexDocument": "index.html",
15.                     "ErrorDocument": "error.html"
16.                 }
17.             },
18.             "DeletionPolicy": "Retain",
19.             "UpdateReplacePolicy": "Retain"
20.         },
21.         "BucketPolicy": {
22.             "Type": "AWS::S3::BucketPolicy",
23.             "Properties": {
24.                 "PolicyDocument": {
25.                     "Id": "MyPolicy",
26.                     "Version": "2012-10-17", 		 	 	 
27.                     "Statement": [
28.                         {
29.                             "Sid": "PublicReadForGetBucketObjects",
30.                             "Effect": "Allow",
31.                             "Principal": "*",
32.                             "Action": "s3:GetObject",
33.                             "Resource": {
34.                                 "Fn::Join": [
35.                                     "",
36.                                     [
37.                                         "arn:aws:s3:::",
38.                                         {
39.                                             "Ref": "S3Bucket"
40.                                         },
41.                                         "/*"
42.                                     ]
43.                                 ]
44.                             }
45.                         }
46.                     ]
47.                 },
48.                 "Bucket": {
49.                     "Ref": "S3Bucket"
50.                 }
51.             }
52.         }
53.     },
54.     "Outputs": {
55.         "WebsiteURL": {
56.             "Value": {
57.                 "Fn::GetAtt": [
58.                     "S3Bucket",
59.                     "WebsiteURL"
60.                 ]
61.             },
62.             "Description": "URL for website hosted on S3"
63.         },
64.         "S3BucketSecureURL": {
65.             "Value": {
66.                 "Fn::Join": [
67.                     "",
68.                     [
69.                         "https://",
70.                         {
71.                             "Fn::GetAtt": [
72.                                 "S3Bucket",
73.                                 "DomainName"
74.                             ]
75.                         }
76.                     ]
77.                 ]
78.             },
79.             "Description": "Name of S3 bucket to hold website content"
80.         }
81.     }
82. }
```

### YAML
<a name="quickref-s3-example-2.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Resources:
 3.   S3Bucket:
 4.     Type: AWS::S3::Bucket
 5.     Properties:
 6.       PublicAccessBlockConfiguration:
 7.         BlockPublicAcls: false
 8.         BlockPublicPolicy: false
 9.         IgnorePublicAcls: false
10.         RestrictPublicBuckets: false
11.       WebsiteConfiguration:
12.         IndexDocument: index.html
13.         ErrorDocument: error.html
14.     DeletionPolicy: Retain
15.     UpdateReplacePolicy: Retain
16.   BucketPolicy:
17.     Type: AWS::S3::BucketPolicy
18.     Properties:
19.       PolicyDocument:
20.         Id: MyPolicy
21.         Version: 2012-10-17 		 	 	 
22.         Statement:
23.           - Sid: PublicReadForGetBucketObjects
24.             Effect: Allow
25.             Principal: '*'
26.             Action: 's3:GetObject'
27.             Resource: !Join 
28.               - ''
29.               - - 'arn:aws:s3:::'
30.                 - !Ref S3Bucket
31.                 - /*
32.       Bucket: !Ref S3Bucket
33. Outputs:
34.   WebsiteURL:
35.     Value: !GetAtt 
36.       - S3Bucket
37.       - WebsiteURL
38.     Description: URL for website hosted on S3
39.   S3BucketSecureURL:
40.     Value: !Join 
41.       - ''
42.       - - 'https://'
43.         - !GetAtt 
44.           - S3Bucket
45.           - DomainName
46.     Description: Name of S3 bucket to hold website content
```

## Erstellen einer statischen Website mit einer benutzerdefinierten Domain
<a name="scenario-s3-bucket-website-customdomain"></a>

Sie können Route 53 mit einer registrierten Domain verwenden. Im folgenden Beispiel wird vorausgesetzt, dass Sie in Route 53 bereits eine gehostete Zone für Ihre Domain erstellt haben. Das Beispiel erstellt zwei Buckets für das Hosten von Websites. Der Stamm-Bucket hostet die Inhalte, der andere Bucket leitet Anforderungen des Typs `www.domainname.com` zum Stamm-Bucket um. In den Datensätzen wird der Name Ihrer Domain Amazon S3-Endpunkten zugewiesen. 

Sie müssen auch eine Bucket-Richtlinie hinzufügen, wie in den oben aufgeführten Beispielen dargestellt.

Weitere Informationen zur Verwendung einer benutzerdefinierten Domain finden Sie unter [Tutorial: Konfigurieren einer statischen Website unter Verwendung einer bei Route 53 registrierten benutzerdefinierten Domain](https://docs.aws.amazon.com/AmazonS3/latest/userguide/website-hosting-custom-domain-walkthrough.html) im *Amazon Simple Storage Service User Guide*.

**Anmerkung**  
Die folgenden Beispiele gehen davon aus, dass die Einstellungen `BlockPublicPolicy` und `RestrictPublicBuckets` Öffentlicher Zugriff sperren auf Kontoebene deaktiviert wurden. 

### JSON
<a name="quickref-s3-example-3.json"></a>

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Mappings" : {
        "RegionMap" : {
            "us-east-1" : { "S3hostedzoneID" : "Z3AQBSTGFYJSTF", "websiteendpoint" : "s3-website-us-east-1.amazonaws.com" },
            "us-west-1" : { "S3hostedzoneID" : "Z2F56UZL2M1ACD", "websiteendpoint" : "s3-website-us-west-1.amazonaws.com" },
            "us-west-2" : { "S3hostedzoneID" : "Z3BJ6K6RIION7M", "websiteendpoint" : "s3-website-us-west-2.amazonaws.com" },            
            "eu-west-1" : { "S3hostedzoneID" : "Z1BKCTXD74EZPE", "websiteendpoint" : "s3-website-eu-west-1.amazonaws.com" },
            "ap-southeast-1" : { "S3hostedzoneID" : "Z3O0J2DXBE1FTB", "websiteendpoint" : "s3-website-ap-southeast-1.amazonaws.com" },
            "ap-southeast-2" : { "S3hostedzoneID" : "Z1WCIGYICN2BYD", "websiteendpoint" : "s3-website-ap-southeast-2.amazonaws.com" },
            "ap-northeast-1" : { "S3hostedzoneID" : "Z2M4EHUR26P7ZW", "websiteendpoint" : "s3-website-ap-northeast-1.amazonaws.com" },
            "sa-east-1" : { "S3hostedzoneID" : "Z31GFT0UA1I2HV", "websiteendpoint" : "s3-website-sa-east-1.amazonaws.com" }
        }
    },
    "Parameters": {
        "RootDomainName": {
            "Description": "Domain name for your website (example.com)",
            "Type": "String"
        }
    },
    "Resources": {
        "RootBucket": {
            "Type": "AWS::S3::Bucket",
            "Properties": {
                "BucketName" : {"Ref":"RootDomainName"},
                "PublicAccessBlockConfiguration": {
                    "BlockPublicAcls": false,
                    "BlockPublicPolicy": false,
                    "IgnorePublicAcls": false,
                    "RestrictPublicBuckets": false
                },
                "WebsiteConfiguration": {
                    "IndexDocument":"index.html",
                    "ErrorDocument":"404.html"
                }
            }
        },
        "WWWBucket": {
            "Type": "AWS::S3::Bucket",
            "Properties": {
                "BucketName": {
                    "Fn::Join": ["", ["www.", {"Ref":"RootDomainName"}]]
                },
                "AccessControl": "BucketOwnerFullControl",
                "WebsiteConfiguration": {
                    "RedirectAllRequestsTo": {
                        "HostName": {"Ref": "RootBucket"}
                    }
                }
            }
        },
        "myDNS": {
            "Type": "AWS::Route53::RecordSetGroup",
            "Properties": {
                "HostedZoneName": {
                    "Fn::Join": ["", [{"Ref": "RootDomainName"}, "."]]
                },
                "Comment": "Zone apex alias.",
                "RecordSets": [
                    {
                        "Name": {"Ref": "RootDomainName"},
                        "Type": "A",
                        "AliasTarget": {
                            "HostedZoneId": {"Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "S3hostedzoneID"]},
                            "DNSName": {"Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "websiteendpoint"]}
                        }
                    },
                    {
                        "Name": {
                            "Fn::Join": ["", ["www.", {"Ref":"RootDomainName"}]]
                        },
                        "Type": "CNAME",
                        "TTL" : "900",
                        "ResourceRecords" : [
                            {"Fn::GetAtt":["WWWBucket", "DomainName"]}
                        ]
                    }
                ]
            }
        }
    },
    "Outputs": {
        "WebsiteURL": {
            "Value": {"Fn::GetAtt": ["RootBucket", "WebsiteURL"]},
            "Description": "URL for website hosted on S3"
        }
    }
}
```

### YAML
<a name="quickref-s3-example-3.yaml"></a>

```
Parameters:
  RootDomainName:
    Description: Domain name for your website (example.com)
    Type: String
Mappings:
  RegionMap:
    us-east-1:
      S3hostedzoneID: Z3AQBSTGFYJSTF
      websiteendpoint: s3-website-us-east-1.amazonaws.com
    us-west-1:
      S3hostedzoneID: Z2F56UZL2M1ACD
      websiteendpoint: s3-website-us-west-1.amazonaws.com
    us-west-2:
      S3hostedzoneID: Z3BJ6K6RIION7M
      websiteendpoint: s3-website-us-west-2.amazonaws.com
    eu-west-1:
      S3hostedzoneID: Z1BKCTXD74EZPE
      websiteendpoint: s3-website-eu-west-1.amazonaws.com
    ap-southeast-1:
      S3hostedzoneID: Z3O0J2DXBE1FTB
      websiteendpoint: s3-website-ap-southeast-1.amazonaws.com
    ap-southeast-2:
      S3hostedzoneID: Z1WCIGYICN2BYD
      websiteendpoint: s3-website-ap-southeast-2.amazonaws.com
    ap-northeast-1:
      S3hostedzoneID: Z2M4EHUR26P7ZW
      websiteendpoint: s3-website-ap-northeast-1.amazonaws.com
    sa-east-1:
      S3hostedzoneID: Z31GFT0UA1I2HV
      websiteendpoint: s3-website-sa-east-1.amazonaws.com
Resources:
  RootBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref RootDomainName
      PublicAccessBlockConfiguration:
        BlockPublicAcls: false
        BlockPublicPolicy: false
        IgnorePublicAcls: false
        RestrictPublicBuckets: false
      WebsiteConfiguration:
        IndexDocument: index.html
        ErrorDocument: 404.html
  WWWBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub
        - www.${Domain}
        - Domain: !Ref RootDomainName
      AccessControl: BucketOwnerFullControl
      WebsiteConfiguration:
        RedirectAllRequestsTo:
          HostName: !Ref RootBucket
  myDNS:
    Type: AWS::Route53::RecordSetGroup
    Properties:
      HostedZoneName: !Sub 
        - ${Domain}.
        - Domain: !Ref RootDomainName
      Comment: Zone apex alias.
      RecordSets:
        - Name: !Ref RootDomainName
          Type: A
          AliasTarget:
            HostedZoneId: !FindInMap [ RegionMap, !Ref 'AWS::Region', S3hostedzoneID]
            DNSName: !FindInMap [ RegionMap, !Ref 'AWS::Region', websiteendpoint]
        - Name: !Sub
            - www.${Domain}
            - Domain: !Ref RootDomainName
          Type: CNAME
          TTL: 900
          ResourceRecords:
            - !GetAtt WWWBucket.DomainName
Outputs:
  WebsiteURL:
    Value: !GetAtt RootBucket.WebsiteURL
    Description: URL for website hosted on S3
```

# Amazon SNS-Vorlagenausschnitte
<a name="quickref-sns"></a>

Dieses Beispiel zeigt eine Amazon SNS-Themenressource. Es muss eine gültige E-Mail-Adresse vorhanden sein.

## JSON
<a name="quickref-sns-example-1.json"></a>

```
1. "MySNSTopic" : {
2.     "Type" : "AWS::SNS::Topic",
3.     "Properties" : {
4.         "Subscription" : [ {
5.             "Endpoint" : "add valid email address",
6.             "Protocol" : "email"
7.         } ]
8.     }
9. }
```

## YAML
<a name="quickref-sns-example-1.yaml"></a>

```
1. MySNSTopic:
2.   Type: AWS::SNS::Topic
3.   Properties:
4.     Subscription:
5.     - Endpoint: "add valid email address"
6.       Protocol: email
```

# Amazon SQS-Vorlagenausschnitte
<a name="scenario-sqs-queue"></a>

Dieses Beispiel zeigt eine Amazon SQS-Warteschlange.

## JSON
<a name="scenario-sqs-queue-example-1.json"></a>

```
1. "MyQueue" : {
2.     "Type" : "AWS::SQS::Queue",
3.     "Properties" : {
4.         "VisibilityTimeout" : "value"
5.     }
6. }
```

## YAML
<a name="scenario-sqs-queue-example-1.yaml"></a>

```
1. MyQueue:
2.   Type: AWS::SQS::Queue
3.   Properties:
4.     VisibilityTimeout: value
```

# Amazon Timestream Vorlage Schnipsel
<a name="scenario-timestream-queue"></a>

Amazon Timestream for InfluxDB macht es Anwendungsentwicklern und DevOps Teams leicht, vollständig verwaltete InfluxDB-Datenbanken AWS für Echtzeit-Zeitreihenanwendungen mithilfe von Open Source auszuführen. APIs Sie können schnell eine InfluxDB-Datenbank erstellen, die anspruchsvolle Zeitreihen-Workloads bewältigt. Mit ein paar einfachen API-Aufrufen können Sie eine InfluxDB-Datenbank mit automatisiertem Software-Patching, -Backups und -Recovery einrichten, migrieren, betreiben und skalieren. AWS [Sie finden diese Beispiele auch unter awslabs/amazon-timestream-tools/tree/mainline/integrations/cloudformation/timestream -influxdb on.](https://github.com/awslabs/amazon-timestream-tools/tree/mainline/integrations/cloudformation/timestream-influxdb) GitHub

**Topics**
+ [Minimale Stichprobe mit Standardwerten](#scenario-timestream-influxdb-example-1)
+ [Vollständigeres Beispiel mit Parametern](#scenario-timestream-influxdb-example-2)

Diese CloudFormation Vorlagen erstellen die folgenden Ressourcen, die benötigt werden, um eine Amazon Timestream for InfluxDB-Instance erfolgreich zu erstellen, eine Verbindung zu ihr herzustellen und sie zu überwachen:

**Amazon VPC**
+ `VPC`
+ Ein oder mehrere `Subnet`
+ `InternetGateway`
+ `RouteTable`
+ `SecurityGroup`

**Amazon S3**
+ `Bucket`

**Amazon Timestream**
+ `InfluxDBInstance`

## Minimale Stichprobe mit Standardwerten
<a name="scenario-timestream-influxdb-example-1"></a>

In diesem Beispiel wird eine öffentlich zugängliche Multi-AZ-Instance eingerichtet, die nach Möglichkeit Standardwerte verwendet.

### JSON
<a name="scenario-timestream-influxdb-example-1.json"></a>

```
{
  "Metadata": {
    "AWS::CloudFormation::Interface": {
      "ParameterGroups": [
        {
          "Label": {"default": "Amazon Timestream for InfluxDB Configuration"},
          "Parameters": [
            "DbInstanceName",
            "InfluxDBPassword"
          ]
        }
      ],
      "ParameterLabels": {
        "VPCCIDR": {"default": "VPC CIDR"}
      }
    }
  },
  "Parameters": {
    "DbInstanceName": {
      "Description": "The name that uniquely identifies the DB instance when interacting with the Amazon Timestream for InfluxDB API and CLI commands. This name will also be a prefix included in the endpoint. DB instance names must be unique per customer and per Region.",
      "Type": "String",
      "Default": "mydbinstance",
      "MinLength": 3,
      "MaxLength": 40,
      "AllowedPattern": "^[a-zA-z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*$"
    },
    "InfluxDBPassword": {
      "Description": "The password of the initial admin user created in InfluxDB. This password will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.",
      "Type": "String",
      "NoEcho": true,
      "MinLength": 8,
      "MaxLength": 64,
      "AllowedPattern": "^[a-zA-Z0-9]+$"
    }
  },
  "Resources": {
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {"CidrBlock": "10.0.0.0/16"}
    },
    "InternetGateway": {"Type": "AWS::EC2::InternetGateway"},
    "InternetGatewayAttachment": {
      "Type": "AWS::EC2::VPCGatewayAttachment",
      "Properties": {
        "InternetGatewayId": {"Ref": "InternetGateway"},
        "VpcId": {"Ref": "VPC"}
      }
    },
    "Subnet1": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "AvailabilityZone": {
          "Fn::Select": [
            0,
            {"Fn::GetAZs": ""}
          ]
        },
        "CidrBlock": {
          "Fn::Select": [
            0,
            {
              "Fn::Cidr": [
                {
                  "Fn::GetAtt": [
                    "VPC",
                    "CidrBlock"
                  ]
                },
                2,
                12
              ]
            }
          ]
        },
        "MapPublicIpOnLaunch": true
      }
    },
    "Subnet2": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "AvailabilityZone": {
          "Fn::Select": [
            1,
            {"Fn::GetAZs": ""}
          ]
        },
        "CidrBlock": {
          "Fn::Select": [
            1,
            {
              "Fn::Cidr": [
                {
                  "Fn::GetAtt": [
                    "VPC",
                    "CidrBlock"
                  ]
                },
                2,
                12
              ]
            }
          ]
        },
        "MapPublicIpOnLaunch": true
      }
    },
    "RouteTable": {
      "Type": "AWS::EC2::RouteTable",
      "Properties": {
        "VpcId": {"Ref": "VPC"}
      }
    },
    "DefaultRoute": {
      "Type": "AWS::EC2::Route",
      "DependsOn": "InternetGatewayAttachment",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "DestinationCidrBlock": "0.0.0.0/0",
        "GatewayId": {"Ref": "InternetGateway"}
      }
    },
    "Subnet1RouteTableAssociation": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "SubnetId": {"Ref": "Subnet1"}
      }
    },
    "Subnet2RouteTableAssociation": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "SubnetId": {"Ref": "Subnet2"}
      }
    },
    "InfluxDBSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupName": "influxdb-sg",
        "GroupDescription": "Security group allowing port 8086 ingress for InfluxDB",
        "VpcId": {"Ref": "VPC"}
      }
    },
    "InfluxDBSecurityGroupIngress": {
      "Type": "AWS::EC2::SecurityGroupIngress",
      "Properties": {
        "GroupId": {"Ref": "InfluxDBSecurityGroup"},
        "IpProtocol": "tcp",
        "CidrIp": "0.0.0.0/0",
        "FromPort": 8086,
        "ToPort": 8086
      }
    },
    "InfluxDBLogsS3Bucket": {
      "Type": "AWS::S3::Bucket",
      "DeletionPolicy": "Retain"
    },
    "InfluxDBLogsS3BucketPolicy": {
      "Type": "AWS::S3::BucketPolicy",
      "Properties": {
        "Bucket": {"Ref": "InfluxDBLogsS3Bucket"},
        "PolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Action": "s3:PutObject",
              "Effect": "Allow",
              "Resource": {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}/InfluxLogs/*"},
              "Principal": {"Service": "timestream-influxdb.amazonaws.com"}
            },
            {
              "Action": "s3:*",
              "Effect": "Deny",
              "Resource": [
                {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}/*"},
                {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}"}
              ],
              "Principal": "*",
              "Condition": {
                "Bool": {"aws:SecureTransport": false}
              }
            }
          ]
        }
      }
    },
    "DbInstance": {
      "Type": "AWS::Timestream::InfluxDBInstance",
      "DependsOn": "InfluxDBLogsS3BucketPolicy",
      "Properties": {
        "AllocatedStorage": 20,
        "DbInstanceType": "db.influx.medium",
        "Name": {"Ref": "DbInstanceName"},
        "Password": {"Ref": "InfluxDBPassword"},
        "PubliclyAccessible": true,
        "DeploymentType": "WITH_MULTIAZ_STANDBY",
        "VpcSecurityGroupIds": [
          {"Ref": "InfluxDBSecurityGroup"}
        ],
        "VpcSubnetIds": [
          {"Ref": "Subnet1"},
          {"Ref": "Subnet2"}
        ],
        "LogDeliveryConfiguration": {
          "S3Configuration": {
            "BucketName": {"Ref": "InfluxDBLogsS3Bucket"},
            "Enabled": true
          }
        }
      }
    }
  },
  "Outputs": {
    "VPC": {
      "Description": "A reference to the VPC used to create network resources",
      "Value": {"Ref": "VPC"}
    },
    "Subnets": {
      "Description": "A list of the subnets created",
      "Value": {
        "Fn::Join": [
          ",",
          [
            {"Ref": "Subnet1"},
            {"Ref": "Subnet2"}
          ]
        ]
      }
    },
    "Subnet1": {
      "Description": "A reference to the subnet in the 1st Availability Zone",
      "Value": {"Ref": "Subnet1"}
    },
    "Subnet2": {
      "Description": "A reference to the subnet in the 2nd Availability Zone",
      "Value": {"Ref": "Subnet2"}
    },
    "InfluxDBSecurityGroup": {
      "Description": "Security group with port 8086 ingress rule",
      "Value": {"Ref": "InfluxDBSecurityGroup"}
    },
    "InfluxDBLogsS3Bucket": {
      "Description": "S3 Bucket containing InfluxDB logs from the DB instance",
      "Value": {"Ref": "InfluxDBLogsS3Bucket"}
    },
    "DbInstance": {
      "Description": "A reference to the Timestream for InfluxDB DB instance",
      "Value": {"Ref": "DbInstance"}
    },
    "InfluxAuthParametersSecretArn": {
      "Description": "The Amazon Resource Name (ARN) of the AWS Secrets Manager secret containing the initial InfluxDB authorization parameters. The secret value is a JSON formatted key-value pair holding InfluxDB authorization values: organization, bucket, username, and password.",
      "Value": {
        "Fn::GetAtt": [
          "DbInstance",
          "InfluxAuthParametersSecretArn"
        ]
      }
    },
    "Endpoint": {
      "Description": "The endpoint URL to connect to InfluxDB",
      "Value": {
        "Fn::Join": [
          "",
          [
            "https://",
            {
              "Fn::GetAtt": [
                "DbInstance",
                "Endpoint"
              ]
            },
            ":8086"
          ]
        ]
      }
    }
  }
}
```

### YAML
<a name="scenario-timestream-influxdb-example-1.yaml"></a>

```
Metadata: 
  AWS::CloudFormation::Interface:
    ParameterGroups:
      -
        Label:
          default: "Amazon Timestream for InfluxDB Configuration"
        Parameters:
          - DbInstanceName
          - InfluxDBPassword
    ParameterLabels:
      VPCCIDR:
        default: VPC CIDR

Parameters:
  DbInstanceName:
    Description: The name that uniquely identifies the DB instance when interacting with the Amazon Timestream for InfluxDB API and CLI commands. This name will also be a prefix included in the endpoint. DB instance names must be unique per customer and per Region.
    Type: String
    Default: mydbinstance
    MinLength: 3
    MaxLength: 40
    AllowedPattern: ^[a-zA-z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*$
  InfluxDBPassword:
    Description: The password of the initial admin user created in InfluxDB. This password will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.
    Type: String
    NoEcho: true
    MinLength: 8
    MaxLength: 64
    AllowedPattern: ^[a-zA-Z0-9]+$

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
  InternetGateway:
    Type: AWS::EC2::InternetGateway
  InternetGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref VPC
  Subnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [0, !GetAZs '']
      CidrBlock: !Select [0, !Cidr [!GetAtt VPC.CidrBlock, 2, 12 ]]
      MapPublicIpOnLaunch: true
  Subnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [1, !GetAZs  '']
      CidrBlock: !Select [1, !Cidr [!GetAtt VPC.CidrBlock, 2, 12 ]]
      MapPublicIpOnLaunch: true
  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
  DefaultRoute:
    Type: AWS::EC2::Route
    DependsOn: InternetGatewayAttachment
    Properties:
      RouteTableId: !Ref RouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
  Subnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref Subnet1
  Subnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref Subnet2
  InfluxDBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: "influxdb-sg"
      GroupDescription: "Security group allowing port 8086 ingress for InfluxDB"
      VpcId: !Ref VPC
  InfluxDBSecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: !Ref InfluxDBSecurityGroup
      IpProtocol: tcp
      CidrIp: 0.0.0.0/0
      FromPort: 8086
      ToPort: 8086
  InfluxDBLogsS3Bucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
  InfluxDBLogsS3BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref InfluxDBLogsS3Bucket
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Action: "s3:PutObject"
            Effect: Allow
            Resource: !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}/InfluxLogs/*
            Principal:
              Service: timestream-influxdb.amazonaws.com
          - Action: "s3:*"
            Effect: Deny
            Resource:
              - !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}/*
              - !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}
            Principal: "*"
            Condition:
              Bool:
                aws:SecureTransport: false
  DbInstance:
    Type: AWS::Timestream::InfluxDBInstance
    DependsOn: InfluxDBLogsS3BucketPolicy
    Properties:
      AllocatedStorage: 20
      DbInstanceType: db.influx.medium
      Name: !Ref DbInstanceName
      Password: !Ref InfluxDBPassword
      PubliclyAccessible: true
      DeploymentType: WITH_MULTIAZ_STANDBY
      VpcSecurityGroupIds: 
        - !Ref InfluxDBSecurityGroup
      VpcSubnetIds:
        - !Ref Subnet1
        - !Ref Subnet2
      LogDeliveryConfiguration:
        S3Configuration:
          BucketName: !Ref InfluxDBLogsS3Bucket
          Enabled: true

Outputs:
  # Network Resources
  VPC:
    Description: A reference to the VPC used to create network resources
    Value: !Ref VPC
  Subnets:
    Description: A list of the subnets created
    Value: !Join [",", [!Ref Subnet1, !Ref Subnet2]]
  Subnet1:
    Description: A reference to the subnet in the 1st Availability Zone
    Value: !Ref Subnet1
  Subnet2:
    Description: A reference to the subnet in the 2nd Availability Zone
    Value: !Ref Subnet2
  InfluxDBSecurityGroup:
    Description: Security group with port 8086 ingress rule
    Value: !Ref InfluxDBSecurityGroup

  # Timestream for InfluxDB Resources
  InfluxDBLogsS3Bucket:
    Description: S3 Bucket containing InfluxDB logs from the DB instance
    Value: !Ref InfluxDBLogsS3Bucket
  DbInstance:
    Description: A reference to the Timestream for InfluxDB DB instance
    Value: !Ref DbInstance
  InfluxAuthParametersSecretArn:
    Description: "The Amazon Resource Name (ARN) of the AWS Secrets Manager secret containing the initial InfluxDB authorization parameters. The secret value is a JSON formatted key-value pair holding InfluxDB authorization values: organization, bucket, username, and password."
    Value: !GetAtt DbInstance.InfluxAuthParametersSecretArn
  Endpoint:
    Description: The endpoint URL to connect to InfluxDB
    Value: !Join ["", ["https://", !GetAtt DbInstance.Endpoint, ":8086"]]
```

## Vollständigeres Beispiel mit Parametern
<a name="scenario-timestream-influxdb-example-2"></a>

Diese Beispielvorlage ändert die Netzwerkressourcen dynamisch auf der Grundlage der angegebenen Parameter. Die Parameter umfassen `PubliclyAccessible` und `DeploymentType`.

### JSON
<a name="scenario-timestream-influxdb-example-2.json"></a>

```
{
  "Metadata": {
    "AWS::CloudFormation::Interface": {
      "ParameterGroups": [
        {
          "Label": {"default": "Network Configuration"},
          "Parameters": ["VPCCIDR"]
        },
        {
          "Label": {"default": "Amazon Timestream for InfluxDB Configuration"},
          "Parameters": [
            "DbInstanceName",
            "InfluxDBUsername",
            "InfluxDBPassword",
            "InfluxDBOrganization",
            "InfluxDBBucket",
            "DbInstanceType",
            "DbStorageType",
            "AllocatedStorage",
            "PubliclyAccessible",
            "DeploymentType"
          ]
        }
      ],
      "ParameterLabels": {
        "VPCCIDR": {"default": "VPC CIDR"}
      }
    }
  },
  "Parameters": {
    "VPCCIDR": {
      "Description": "Please enter the IP range (CIDR notation) for the new VPC",
      "Type": "String",
      "Default": "10.0.0.0/16"
    },
    "DbInstanceName": {
      "Description": "The name that uniquely identifies the DB instance when interacting with the Amazon Timestream for InfluxDB API and CLI commands. This name will also be a prefix included in the endpoint. DB instance names must be unique per customer and per Region.",
      "Type": "String",
      "Default": "mydbinstance",
      "MinLength": 3,
      "MaxLength": 40,
      "AllowedPattern": "^[a-zA-z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*$"
    },
    "InfluxDBUsername": {
      "Description": "The username of the initial admin user created in InfluxDB. Must start with a letter and can't end with a hyphen or contain two consecutive hyphens. For example, my-user1. This username will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.",
      "Type": "String",
      "Default": "admin",
      "MinLength": 1,
      "MaxLength": 64
    },
    "InfluxDBPassword": {
      "Description": "The password of the initial admin user created in InfluxDB. This password will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.",
      "Type": "String",
      "NoEcho": true,
      "MinLength": 8,
      "MaxLength": 64,
      "AllowedPattern": "^[a-zA-Z0-9]+$"
    },
    "InfluxDBOrganization": {
      "Description": "The name of the initial organization for the initial admin user in InfluxDB. An InfluxDB organization is a workspace for a group of users.",
      "Type": "String",
      "Default": "org",
      "MinLength": 1,
      "MaxLength": 64
    },
    "InfluxDBBucket": {
      "Description": "The name of the initial InfluxDB bucket. All InfluxDB data is stored in a bucket. A bucket combines the concept of a database and a retention period (the duration of time that each data point persists). A bucket belongs to an organization.",
      "Type": "String",
      "Default": "bucket",
      "MinLength": 2,
      "MaxLength": 64,
      "AllowedPattern": "^[^_\\\"][^\\\"]*$"
    },
    "DeploymentType": {
      "Description": "Specifies whether the Timestream for InfluxDB is deployed as Single-AZ or with a MultiAZ Standby for High availability",
      "Type": "String",
      "Default": "WITH_MULTIAZ_STANDBY",
      "AllowedValues": [
        "SINGLE_AZ",
        "WITH_MULTIAZ_STANDBY"
      ]
    },
    "AllocatedStorage": {
      "Description": "The amount of storage to allocate for your DB storage type in GiB (gibibytes).",
      "Type": "Number",
      "Default": 400,
      "MinValue": 20,
      "MaxValue": 16384
    },
    "DbInstanceType": {
      "Description": "The Timestream for InfluxDB DB instance type to run InfluxDB on.",
      "Type": "String",
      "Default": "db.influx.medium",
      "AllowedValues": [
        "db.influx.medium",
        "db.influx.large",
        "db.influx.xlarge",
        "db.influx.2xlarge",
        "db.influx.4xlarge",
        "db.influx.8xlarge",
        "db.influx.12xlarge",
        "db.influx.16xlarge"
      ]
    },
    "DbStorageType": {
      "Description": "The Timestream for InfluxDB DB storage type to read and write InfluxDB data.",
      "Type": "String",
      "Default": "InfluxIOIncludedT1",
      "AllowedValues": [
        "InfluxIOIncludedT1",
        "InfluxIOIncludedT2",
        "InfluxIOIncludedT3"
      ]
    },
    "PubliclyAccessible": {
      "Description": "Configures the DB instance with a public IP to facilitate access.",
      "Type": "String",
      "Default": true,
      "AllowedValues": [
        true,
        false
      ]
    }
  },
  "Conditions": {
    "IsMultiAZ": {
      "Fn::Equals": [
        {"Ref": "DeploymentType"},
        "WITH_MULTIAZ_STANDBY"
      ]
    },
    "IsPublic": {
      "Fn::Equals": [
        {"Ref": "PubliclyAccessible"},
        true
      ]
    }
  },
  "Resources": {
    "VPC": {
      "Type": "AWS::EC2::VPC",
      "Properties": {
        "CidrBlock": {"Ref": "VPCCIDR"}
      }
    },
    "InternetGateway": {
      "Type": "AWS::EC2::InternetGateway",
      "Condition": "IsPublic"
    },
    "InternetGatewayAttachment": {
      "Type": "AWS::EC2::VPCGatewayAttachment",
      "Condition": "IsPublic",
      "Properties": {
        "InternetGatewayId": {"Ref": "InternetGateway"},
        "VpcId": {"Ref": "VPC"}
      }
    },
    "Subnet1": {
      "Type": "AWS::EC2::Subnet",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "AvailabilityZone": {
          "Fn::Select": [
            0,
            {"Fn::GetAZs": ""}
          ]
        },
        "CidrBlock": {
          "Fn::Select": [
            0,
            {
              "Fn::Cidr": [
                {
                  "Fn::GetAtt": [
                    "VPC",
                    "CidrBlock"
                  ]
                },
                2,
                12
              ]
            }
          ]
        },
        "MapPublicIpOnLaunch": {
          "Fn::If": [
            "IsPublic",
            true,
            false
          ]
        }
      }
    },
    "Subnet2": {
      "Type": "AWS::EC2::Subnet",
      "Condition": "IsMultiAZ",
      "Properties": {
        "VpcId": {"Ref": "VPC"},
        "AvailabilityZone": {
          "Fn::Select": [
            1,
            {"Fn::GetAZs": ""}
          ]
        },
        "CidrBlock": {
          "Fn::Select": [
            1,
            {
              "Fn::Cidr": [
                {
                  "Fn::GetAtt": [
                    "VPC",
                    "CidrBlock"
                  ]
                },
                2,
                12
              ]
            }
          ]
        },
        "MapPublicIpOnLaunch": {
          "Fn::If": [
            "IsPublic",
            true,
            false
          ]
        }
      }
    },
    "RouteTable": {
      "Type": "AWS::EC2::RouteTable",
      "Properties": {
        "VpcId": {"Ref": "VPC"}
      }
    },
    "DefaultRoute": {
      "Type": "AWS::EC2::Route",
      "Condition": "IsPublic",
      "DependsOn": "InternetGatewayAttachment",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "DestinationCidrBlock": "0.0.0.0/0",
        "GatewayId": {"Ref": "InternetGateway"}
      }
    },
    "Subnet1RouteTableAssociation": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "SubnetId": {"Ref": "Subnet1"}
      }
    },
    "Subnet2RouteTableAssociation": {
      "Type": "AWS::EC2::SubnetRouteTableAssociation",
      "Condition": "IsMultiAZ",
      "Properties": {
        "RouteTableId": {"Ref": "RouteTable"},
        "SubnetId": {"Ref": "Subnet2"}
      }
    },
    "InfluxDBSecurityGroup": {
      "Type": "AWS::EC2::SecurityGroup",
      "Properties": {
        "GroupName": "influxdb-sg",
        "GroupDescription": "Security group allowing port 8086 ingress for InfluxDB",
        "VpcId": {"Ref": "VPC"}
      }
    },
    "InfluxDBSecurityGroupIngress": {
      "Type": "AWS::EC2::SecurityGroupIngress",
      "Properties": {
        "GroupId": {"Ref": "InfluxDBSecurityGroup"},
        "IpProtocol": "tcp",
        "CidrIp": "0.0.0.0/0",
        "FromPort": 8086,
        "ToPort": 8086
      }
    },
    "InfluxDBLogsS3Bucket": {
      "Type": "AWS::S3::Bucket",
      "DeletionPolicy": "Retain"
    },
    "InfluxDBLogsS3BucketPolicy": {
      "Type": "AWS::S3::BucketPolicy",
      "Properties": {
        "Bucket": {"Ref": "InfluxDBLogsS3Bucket"},
        "PolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Action": "s3:PutObject",
              "Effect": "Allow",
              "Resource": {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}/InfluxLogs/*"},
              "Principal": {"Service": "timestream-influxdb.amazonaws.com"}
            },
            {
              "Action": "s3:*",
              "Effect": "Deny",
              "Resource": [
                {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}/*"},
                {"Fn::Sub": "arn:aws:s3:::${InfluxDBLogsS3Bucket}"}
              ],
              "Principal": "*",
              "Condition": {
                "Bool": {"aws:SecureTransport": false}
              }
            }
          ]
        }
      }
    },
    "DbInstance": {
      "Type": "AWS::Timestream::InfluxDBInstance",
      "DependsOn": "InfluxDBLogsS3BucketPolicy",
      "Properties": {
        "DbStorageType": {"Ref": "DbStorageType"},
        "AllocatedStorage": {"Ref": "AllocatedStorage"},
        "DbInstanceType": {"Ref": "DbInstanceType"},
        "Name": {"Ref": "DbInstanceName"},
        "Username": {"Ref": "InfluxDBUsername"},
        "Password": {"Ref": "InfluxDBPassword"},
        "Organization": {"Ref": "InfluxDBOrganization"},
        "Bucket": {"Ref": "InfluxDBBucket"},
        "PubliclyAccessible": {
          "Fn::If": [
            "IsPublic",
            true,
            false
          ]
        },
        "DeploymentType": {"Ref": "DeploymentType"},
        "VpcSecurityGroupIds": [
          {"Ref": "InfluxDBSecurityGroup"}
        ],
        "VpcSubnetIds": {
          "Fn::If": [
            "IsMultiAZ",
            [
              {"Ref": "Subnet1"},
              {"Ref": "Subnet2"}
            ],
            [
              {"Ref": "Subnet1"}
            ]
          ]
        },
        "LogDeliveryConfiguration": {
          "S3Configuration": {
            "BucketName": {"Ref": "InfluxDBLogsS3Bucket"},
            "Enabled": true
          }
        }
      }
    }
  },
  "Outputs": {
    "VPC": {
      "Description": "A reference to the VPC used to create network resources",
      "Value": {"Ref": "VPC"}
    },
    "Subnets": {
      "Description": "A list of the subnets created",
      "Value": {
        "Fn::If": [
          "IsMultiAZ",
          {
            "Fn::Join": [
              ",",
              [
                {"Ref": "Subnet1"},
                {"Ref": "Subnet2"}
              ]
            ]
          },
          {"Ref": "Subnet1"}
        ]
      }
    },
    "Subnet1": {
      "Description": "A reference to the subnet in the 1st Availability Zone",
      "Value": {"Ref": "Subnet1"}
    },
    "Subnet2": {
      "Condition": "IsMultiAZ",
      "Description": "A reference to the subnet in the 2nd Availability Zone",
      "Value": {"Ref": "Subnet2"}
    },
    "InfluxDBSecurityGroup": {
      "Description": "Security group with port 8086 ingress rule",
      "Value": {"Ref": "InfluxDBSecurityGroup"}
    },
    "InfluxDBLogsS3Bucket": {
      "Description": "S3 Bucket containing InfluxDB logs from the DB instance",
      "Value": {"Ref": "InfluxDBLogsS3Bucket"}
    },
    "DbInstance": {
      "Description": "A reference to the Timestream for InfluxDB DB instance",
      "Value": {"Ref": "DbInstance"}
    },
    "InfluxAuthParametersSecretArn": {
      "Description": "The Amazon Resource Name (ARN) of the AWS Secrets Manager secret containing the initial InfluxDB authorization parameters. The secret value is a JSON formatted key-value pair holding InfluxDB authorization values: organization, bucket, username, and password.",
      "Value": {
        "Fn::GetAtt": [
          "DbInstance",
          "InfluxAuthParametersSecretArn"
        ]
      }
    },
    "Endpoint": {
      "Description": "The endpoint URL to connect to InfluxDB",
      "Value": {
        "Fn::Join": [
          "",
          [
            "https://",
            {
              "Fn::GetAtt": [
                "DbInstance",
                "Endpoint"
              ]
            },
            ":8086"
          ]
        ]
      }
    }
  }
}
```

### YAML
<a name="scenario-timestream-influxdb-example-2.yaml"></a>

```
Metadata: 
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - 
        Label:
          default: "Network Configuration"
        Parameters:
          - VPCCIDR
      -
        Label:
          default: "Amazon Timestream for InfluxDB Configuration"
        Parameters:
          - DbInstanceName
          - InfluxDBUsername
          - InfluxDBPassword
          - InfluxDBOrganization
          - InfluxDBBucket
          - DbInstanceType
          - DbStorageType
          - AllocatedStorage
          - PubliclyAccessible
          - DeploymentType
    ParameterLabels:
      VPCCIDR:
        default: VPC CIDR

Parameters:
  # Network Configuration
  VPCCIDR:
    Description: Please enter the IP range (CIDR notation) for the new VPC
    Type: String
    Default: 10.0.0.0/16
  # Timestream for InfluxDB Configuration
  DbInstanceName:
    Description: The name that uniquely identifies the DB instance when interacting with the Amazon Timestream for InfluxDB API and CLI commands. This name will also be a prefix included in the endpoint. DB instance names must be unique per customer and per Region.
    Type: String
    Default: mydbinstance
    MinLength: 3
    MaxLength: 40    
    AllowedPattern: ^[a-zA-z][a-zA-Z0-9]*(-[a-zA-Z0-9]+)*$
  # InfluxDB initial user configurations
  InfluxDBUsername:
    Description: The username of the initial admin user created in InfluxDB. Must start with a letter and can't end with a hyphen or contain two consecutive hyphens. For example, my-user1. This username will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS Secrets Manager in your account.
    Type: String
    Default: admin
    MinLength: 1
    MaxLength: 64
  InfluxDBPassword:
    Description: The password of the initial admin user created in InfluxDB. This password will allow you to access the InfluxDB UI to perform various administrative tasks and also use the InfluxDB CLI to create an operator token. These attributes will be stored in a Secret created in AWS in your account.
    Type: String
    NoEcho: true
    MinLength: 8
    MaxLength: 64
    AllowedPattern: ^[a-zA-Z0-9]+$
  InfluxDBOrganization:
    Description: The name of the initial organization for the initial admin user in InfluxDB. An InfluxDB organization is a workspace for a group of users.
    Type: String
    Default: org
    MinLength: 1
    MaxLength: 64
  InfluxDBBucket:
    Description: The name of the initial InfluxDB bucket. All InfluxDB data is stored in a bucket. A bucket combines the concept of a database and a retention period (the duration of time that each data point persists). A bucket belongs to an organization.
    Type: String
    Default: bucket
    MinLength: 2
    MaxLength: 64
    AllowedPattern: ^[^_\"][^\"]*$
  DeploymentType:
    Description: Specifies whether the Timestream for InfluxDB is deployed as Single-AZ or with a MultiAZ Standby for High availability
    Type: String
    Default: WITH_MULTIAZ_STANDBY
    AllowedValues:
      - SINGLE_AZ
      - WITH_MULTIAZ_STANDBY
  AllocatedStorage:
    Description: The amount of storage to allocate for your DB storage type in GiB (gibibytes).
    Type: Number
    Default: 400
    MinValue: 20
    MaxValue: 16384
  DbInstanceType:
    Description: The Timestream for InfluxDB DB instance type to run InfluxDB on.
    Type: String
    Default: db.influx.medium
    AllowedValues:
      - db.influx.medium
      - db.influx.large
      - db.influx.xlarge
      - db.influx.2xlarge
      - db.influx.4xlarge
      - db.influx.8xlarge
      - db.influx.12xlarge
      - db.influx.16xlarge
  DbStorageType:
    Description: The Timestream for InfluxDB DB storage type to read and write InfluxDB data.
    Type: String
    Default: InfluxIOIncludedT1
    AllowedValues:
      - InfluxIOIncludedT1
      - InfluxIOIncludedT2
      - InfluxIOIncludedT3
  PubliclyAccessible:
    Description: Configures the DB instance with a public IP to facilitate access.
    Type: String
    Default: true
    AllowedValues:
      - true
      - false

Conditions:
  IsMultiAZ: !Equals [!Ref DeploymentType, WITH_MULTIAZ_STANDBY]
  IsPublic: !Equals [!Ref PubliclyAccessible, true]

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VPCCIDR
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Condition: IsPublic
  InternetGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Condition: IsPublic
    Properties:
      InternetGatewayId: !Ref InternetGateway
      VpcId: !Ref VPC
  Subnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [0, !GetAZs '']
      CidrBlock: !Select [0, !Cidr [!GetAtt VPC.CidrBlock, 2, 12 ]]
      MapPublicIpOnLaunch: !If [IsPublic, true, false]
  Subnet2:
    Type: AWS::EC2::Subnet
    Condition: IsMultiAZ
    Properties:
      VpcId: !Ref VPC
      AvailabilityZone: !Select [1, !GetAZs  '']
      CidrBlock: !Select [1, !Cidr [!GetAtt VPC.CidrBlock, 2, 12 ]]
      MapPublicIpOnLaunch: !If [IsPublic, true, false]
  RouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
  DefaultRoute:
    Type: AWS::EC2::Route
    Condition: IsPublic
    DependsOn: InternetGatewayAttachment
    Properties:
      RouteTableId: !Ref RouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
  Subnet1RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref Subnet1
  Subnet2RouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Condition: IsMultiAZ
    Properties:
      RouteTableId: !Ref RouteTable
      SubnetId: !Ref Subnet2
  InfluxDBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: "influxdb-sg"
      GroupDescription: "Security group allowing port 8086 ingress for InfluxDB"
      VpcId: !Ref VPC
  InfluxDBSecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId: !Ref InfluxDBSecurityGroup
      IpProtocol: tcp
      CidrIp: 0.0.0.0/0
      FromPort: 8086
      ToPort: 8086
  InfluxDBLogsS3Bucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
  InfluxDBLogsS3BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref InfluxDBLogsS3Bucket
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Action: "s3:PutObject"
            Effect: Allow
            Resource: !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}/InfluxLogs/*
            Principal:
              Service: timestream-influxdb.amazonaws.com
          - Action: "s3:*"
            Effect: Deny
            Resource:
              - !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}/*
              - !Sub arn:aws:s3:::${InfluxDBLogsS3Bucket}
            Principal: "*"
            Condition:
              Bool:
                aws:SecureTransport: false
  DbInstance:
    Type: AWS::Timestream::InfluxDBInstance
    DependsOn: InfluxDBLogsS3BucketPolicy
    Properties:
      DbStorageType: !Ref DbStorageType
      AllocatedStorage: !Ref AllocatedStorage
      DbInstanceType: !Ref DbInstanceType
      Name: !Ref DbInstanceName
      Username: !Ref InfluxDBUsername
      Password: !Ref InfluxDBPassword
      Organization: !Ref InfluxDBOrganization
      Bucket: !Ref InfluxDBBucket
      PubliclyAccessible: !If [IsPublic, true, false]
      DeploymentType: !Ref DeploymentType
      VpcSecurityGroupIds: 
        - !Ref InfluxDBSecurityGroup
      VpcSubnetIds: !If
        - IsMultiAZ
        -
          - !Ref Subnet1
          - !Ref Subnet2
        -
          - !Ref Subnet1
      LogDeliveryConfiguration:
        S3Configuration:
          BucketName: !Ref InfluxDBLogsS3Bucket
          Enabled: true

Outputs:
  # Network Resources
  VPC:
    Description: A reference to the VPC used to create network resources
    Value: !Ref VPC
  Subnets:
    Description: A list of the subnets created
    Value: !If
      - IsMultiAZ
      - !Join [",", [!Ref Subnet1, !Ref Subnet2]]
      - !Ref Subnet1
  Subnet1:
    Description: A reference to the subnet in the 1st Availability Zone
    Value: !Ref Subnet1
  Subnet2:
    Condition: IsMultiAZ
    Description: A reference to the subnet in the 2nd Availability Zone
    Value: !Ref Subnet2
  InfluxDBSecurityGroup:
    Description: Security group with port 8086 ingress rule
    Value: !Ref InfluxDBSecurityGroup

  # Timestream for InfluxDB Resources
  InfluxDBLogsS3Bucket:
    Description: S3 Bucket containing InfluxDB logs from the DB instance
    Value: !Ref InfluxDBLogsS3Bucket
  DbInstance:
    Description: A reference to the Timestream for InfluxDB DB instance
    Value: !Ref DbInstance
  InfluxAuthParametersSecretArn:
    Description: "The Amazon Resource Name (ARN) of the AWS Secrets Manager secret containing the initial InfluxDB authorization parameters. The secret value is a JSON formatted key-value pair holding InfluxDB authorization values: organization, bucket, username, and password."
    Value: !GetAtt DbInstance.InfluxAuthParametersSecretArn
  Endpoint:
    Description: The endpoint URL to connect to InfluxDB
    Value: !Join ["", ["https://", !GetAtt DbInstance.Endpoint, ":8086"]]
```

# Bereitstellen von Windows basierten Stacks mit CloudFormation
<a name="cfn-windows-stacks"></a>

Diese Seite enthält Links zur technischen Referenzdokumentation für CloudFormation Ressourcen, die häufig in Windows basierten Bereitstellungen verwendet werden.

CloudFormation bietet Unterstützung für die Bereitstellung und Verwaltung von Microsoft Windows Stacks über. Infrastructure as Code (IaC) Sie können es CloudFormation für die automatisierte Bereitstellung von Windows EC2-basierten Instances SQL Server auf Amazon RDS und Microsoft Active Directory über diese verwenden. Directory Service

AWS bietet vorkonfigurierte Amazon Machine Images (AMIs), die speziell für Windows Plattformen entwickelt wurden, um Sie bei der schnellen Bereitstellung von Anwendungen auf Amazon EC2 zu unterstützen. Dazu AMIs gehören Microsoft Standardeinstellungen und AWS spezifische Anpassungen. Mit CloudFormation können Sie ein geeignetes AMI auswählen, eine Instance starten und über Remote Desktop Connection darauf zugreifen, genau wie bei jeder anderenWindows Server. Sie AMIs enthalten wichtige Softwarekomponenten, darunter EC2Launch (Versionen variieren je nach Windows Server Edition) AWS Systems Manager, CloudFormation, AWS -Tools für PowerShell, und verschiedene Netzwerk-, Speicher- und Grafiktreiber, um eine optimale Leistung und Kompatibilität mit AWS Diensten zu gewährleisten. Weitere Informationen finden Sie in der [AWS Windows AMI-Referenz](https://docs.aws.amazon.com/ec2/latest/windows-ami-reference/windows-amis.html).

CloudFormation unterstützt auch Softwarekonfigurationstools wie `UserData` Skripte, die Befehle ausführen PowerShell oder Batch-Befehle ausführen können, wenn eine EC2-Instance zum ersten Mal gestartet wird. Es bietet auch Hilfsskripte (`cfn-init`,,`cfn-signal` `cfn-get-metadata`und `cfn-hup`) und unterstützt die `AWS::CloudFormation::Init`-Metadaten zur Verwaltung von Paketen, Dateien und Diensten auf Windows-Instances.

Für Unternehmensumgebungen CloudFormation ermöglicht es den Domänenbeitritt, die Windows Lizenzverwaltung über EC2-Lizenzmodelle und die sichere Handhabung von Anmeldeinformationen mit. AWS Secrets Manager In Kombination mit versionsgesteuerten Vorlagen und wiederholbaren Bereitstellungen CloudFormation unterstützt es Unternehmen dabei, konsistente, sichere und skalierbare Windows Umgebungen für mehrere Konten aufrechtzuerhalten. AWS-Regionen 

Einzelheiten zu CloudFormation Ressourcen, die häufig in Windows basierten Bereitstellungen verwendet werden, finden Sie in den folgenden technischen Referenzthemen.


| Ressourcentyp | Description | 
| --- | --- | 
|  [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html)  |  Zum Starten von Windows EC2-Instances.  | 
|  [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)  |  So definieren Sie Firewall-Regeln für Windows-Workloads.  | 
|  [AWS::AutoScaling::AutoScalingGroup (Gruppieren)](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html)  |  Für die Skalierung von Windows EC2-Instances.  | 
|  [AWS::DirectoryService::MicrosoftAD](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-directoryservice-microsoftad.html)  |  Für die Bereitstellung von Microsoft Active Directory.  | 
|  [AWS::FSx::FileSystem](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-fsx-filesystem.html)  |  Für die Bereitstellung FSx für Windows Dateiserver.  | 
|  [AWS: :RDS:: DBInstance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html)  |  Für die Bereitstellung von SQL Server auf Amazon RDS.  | 
|  [AWS::CloudFormation::Init](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-init.html)  |  Wird in den EC2-Metadaten für die Konfiguration von Instances verwendet.  Weitere Informationen finden Sie unter [Bootstrapping-basierte Stacks Windows CloudFormation](cfn-windows-stacks-bootstrapping.md).  | 
|  [AWS::SecretsManager::Secret](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-secretsmanager-secret.html)  |  Für die sichere Verwaltung von Anmeldeinformationen und Windows-Kennwörtern.  | 
|  [AWS::SSM::Parameter](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ssm-parameter.html)  |  Zum sicheren Speichern von Konfigurationswerten.  | 
|  [AWS::IAM::InstanceProfile](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-instanceprofile.html) [AWS::IAM::Role](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html)  |  Für die Erteilung von Berechtigungen für Anwendungen, die auf EC2-Instances laufen.  | 

# Bootstrapping-basierte Stacks Windows CloudFormation
<a name="cfn-windows-stacks-bootstrapping"></a>

In diesem Thema wird beschrieben, wie Sie einen Windows-Stack booten und Probleme bei der Stackerstellung beheben. 

**Topics**
+ [Benutzerdaten in EC2-Instances](#cfn-windows-bootstrapping-user-data)
+ [CloudFormation Hilfsskripte](#cfn-windows-bootstrapping-helper-scripts)
+ [Beispiel für das Bootstrapping eines Windows-Stacks](#cfn-windows-bootstrapping-example)
+ [Backslashes in Windows-Dateipfaden entschärfen](#cfn-windows-stacks-escape-backslashes)
+ [Dienste Windows-Verwaltung](#cfn-windows-stacks-manage-windows-services)
+ [Beheben Sie Probleme bei der Stapelerstellung](#cfn-windows-stacks-troubleshooting)

## Benutzerdaten in EC2-Instances
<a name="cfn-windows-bootstrapping-user-data"></a>

Benutzerdaten sind ein Amazon EC2-Feature, mit dem Sie Skripte oder Konfigurationsinformationen an eine EC2-Instance übergeben können, wenn diese gestartet wird. 

Für Windows EC2-Instances:
+ Sie können entweder Batch-Skripte (mit `<script>`-Tags) oder PowerShell-Skripte (mit `<powershell>`-Tags) verwenden.
+ Die Ausführung des Skripts wird von EC2Launchübernommen.

**Wichtig**  
Wenn Sie Ihr eigenes Windows AMI für die Verwendung mit erstellen CloudFormation, stellen Sie sicher, dass EC2Launch v2 ordnungsgemäß konfiguriert ist. EC2Launchv2 ist erforderlich, damit CloudFormation Bootstrapping-Tools Windows Instanzen während der Stack-Erstellung ordnungsgemäß initialisieren und konfigurieren können. Weitere Informationen finden Sie unter [Verwenden Sie den EC2Launch v2-Agent, um Aufgaben während des Starts der EC2-Windows-Instance auszuführen](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2launch-v2.html) im *Amazon EC2-Benutzerhandbuch*.  
Informationen dazu AWS Windows AMIs finden Sie in der [AWSWindowsAMI-Referenz](https://docs.aws.amazon.com/ec2/latest/windows-ami-reference/windows-amis.html).

## CloudFormation Hilfsskripte
<a name="cfn-windows-bootstrapping-helper-scripts"></a>

Hilfsskripte sind Dienstprogramme für die Konfiguration von Instances während des Bootstrapping-Prozesses. In Verbindung mit Amazon EC2-Benutzerdaten bieten sie leistungsstarke Konfigurationsoptionen.

CloudFormation stellt die folgenden Python-Hilfsskripten bereit, mit denen Sie Software installieren und Dienste auf einer Amazon EC2 EC2-Instance starten können, die Sie als Teil Ihres Stacks erstellen:
+  `cfn-init`- Zum Abrufen und Interpretieren von Ressourcen-Metadaten, Installieren von Paketen, Erstellen von Dateien und Starten von Diensten.
+  `cfn-signal`- Signalisieren Sie mit,`CreationPolicy` damit Sie andere Ressourcen im Stack synchronisieren können, wenn die vorausgesetzte Ressource oder Anwendung bereit ist.
+  `cfn-get-metadata`- Zum Abrufen von Metadaten für eine Ressource oder eines Pfads zu einem bestimmten Schlüssel.
+  `cfn-hup`- Verwenden Sie diese Option, um nach Aktualisierungen von Metadaten zu suchen und benutzerdefinierte Hooks auszuführen, wenn Änderungen entdeckt werden.

Sie können die Skripts direkt aus Ihrer Vorlage aufrufen. Die Skripts funktionieren in Verbindung mit Ressourcen-Metadaten, die in derselben Vorlage festgelegt werden. Die Skripts laufen in der Amazon EC2-Instance während der Stack-Erstellung.

Weitere Informationen finden Sie in der [Referenz zu CloudFormation Hilfsskripten](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html) im *CloudFormation Template Reference Guide.*

## Beispiel für das Bootstrapping eines Windows-Stacks
<a name="cfn-windows-bootstrapping-example"></a>

Schauen wir uns ein Beispiel für eine Windows Server-Vorlage an, die die folgenden Aktionen ausführt:
+ Startet eine EC2-Instance mit dem Namen `TestInstance` von einem Windows Server 2022 AMI.
+ Erzeugt eine einfache Testdatei, um zu überprüfen, ob `cfn-init` funktioniert.
+ Konfiguriert `cfn-hup` für die laufende Konfigurationsverwaltung.
+ Verwendet ein `CreationPolicy`, um sicherzustellen, dass die Instance den erfolgreichen Abschluss signalisiert.

Das Hilfsskript `cfn-init` wird verwendet, um jede dieser Aktionen auf der Grundlage der Informationen in der Ressource `AWS::CloudFormation::Init` in der Vorlage durchzuführen.

Der Abschnitt `AWS::CloudFormation::Init` heißt `TestInstance` und beginnt mit der folgenden Erklärung.

```
TestInstance:
  Type: AWS::EC2::Instance
  Metadata:
    AWS::CloudFormation::Init:
      configSets:
        default:
          - create_files
          - start_services
```

Danach wird der Abschnitt `files` von `AWS::CloudFormation::Init` deklariert.

```
      create_files:
        files:
          c:\cfn\test.txt:
            content: !Sub |
              Hello from ${AWS::StackName}
          c:\cfn\cfn-hup.conf:
            content: !Sub |
              [main]
              stack=${AWS::StackName}
              region=${AWS::Region}
              interval=2
          c:\cfn\hooks.d\cfn-auto-reloader.conf:
            content: !Sub |
              [cfn-auto-reloader-hook]
              triggers=post.update
              path=Resources.TestInstance.Metadata.AWS::CloudFormation::Init
              action=cfn-init.exe -v -s ${AWS::StackName} -r TestInstance -c default --region ${AWS::Region}
```

Hier werden drei Dateien erstellt und im Verzeichnis `C:\cfn` auf der Serverinstance abgelegt:
+ `test.txt`, eine einfache Testdatei, die überprüft, ob `cfn-init` korrekt funktioniert und Dateien mit dynamischem Inhalt erstellen kann.
+ `cfn-hup.conf`, die Konfigurationsdatei für `cfn-hup` mit einem 2-Minuten-Prüfintervall.
+ `cfn-auto-reloader.conf`, die Konfigurationsdatei für den Hook, der von `cfn-hup` verwendet wird, um eine Aktualisierung (Aufruf von `cfn-init`) zu initiieren, wenn sich die Metadaten in `AWS::CloudFormation::Init` ändern.

Als nächstes folgt der Abschnitt `start_services`, der die Windows-Dienste konfiguriert.

```
      start_services:
        services:
          windows:
            cfn-hup:
              enabled: true
              ensureRunning: true
              files:
                - c:\cfn\cfn-hup.conf
                - c:\cfn\hooks.d\cfn-auto-reloader.conf
```

Dieser Abschnitt stellt sicher, dass der Dienst `cfn-hup` gestartet wird und automatisch neu startet, wenn die Konfigurationsdateien geändert werden. Der Dienst sucht nach Änderungen an den CloudFormation Metadaten und wird erneut ausgeführt`cfn-init`, wenn Aktualisierungen erkannt werden.

Als nächstes folgt der Abschnitt `Properties` .

```
TestInstance:
  Type: AWS::EC2::Instance
  CreationPolicy:
    ResourceSignal:
      Timeout: PT20M
  Metadata:
    AWS::CloudFormation::Init:
      # ... metadata configuration ...
  Properties:
    InstanceType: t2.large
    ImageId: '{{resolve:ssm:/aws/service/ami-windows-latest/Windows_Server-2022-English-Full-Base}}'
    SecurityGroupIds:
      - !Ref InstanceSecurityGroup
    KeyName: !Ref KeyPairName
    UserData:
      Fn::Base64: !Sub |
        <powershell>
        cfn-init.exe -v -s ${AWS::StackName} -r TestInstance -c default --region ${AWS::Region}
        cfn-signal.exe -e $lastexitcode --stack ${AWS::StackName} --resource TestInstance --region ${AWS::Region}
        </powershell>
```

In diesem Abschnitt enthält die Eigenschaft `UserData` ein PowerShell-Skript, das von EC2Launchausgeführt wird und von `<powershell>`-Tags umgeben ist. Das Skript wird `cfn-init` mit dem `default` configSet ausgeführt und verwendet dann, `cfn-signal` um den Exit-Code an CloudFormation zurückzumelden. Das `CreationPolicy` wird verwendet, um sicherzustellen, dass die Instance ordnungsgemäß konfiguriert ist, bevor die Stack-Erstellung als abgeschlossen gilt.

Die Eigenschaft `ImageId` verwendet einen öffentlichen Parameter des Systems Manager Parameter Store, um automatisch die neueste Windows Server 2022 AMI-ID abzurufen. Dieser Ansatz macht regionalspezifische AMI-Zuordnungen überflüssig und stellt sicher, dass Sie immer das aktuellste AMI erhalten. Die Verwendung von Systems Manager Manager-Parametern für AMI IDs ist eine bewährte Methode zur Pflege aktueller AMI-Referenzen. Wenn Sie eine Verbindung zu Ihrer Instance herstellen möchten, vergewissern Sie sich, dass die Eigenschaft `SecurityGroupIds` auf eine Sicherheitsgruppe verweist, die den RDP-Zugriff erlaubt.

Das `CreationPolicy` wird als Teil der Ressourceneigenschaften deklariert und gibt eine Timeout-Periode an. Der Befehl `cfn-signal` in den Benutzerdaten signalisiert, wenn die Konfiguration der Instance abgeschlossen ist:

```
TestInstance:
  Type: AWS::EC2::Instance
  CreationPolicy:
    ResourceSignal:
      Timeout: PT20M
  Properties:
    # ... other properties ...
```

Da der Bootstrapping-Prozess minimal ist und nur Dateien erstellt und Dienste gestartet werden, `CreationPolicy` wartet der 20 Minuten (PT20M), bevor das Timeout eintritt. Die Zeitüberschreitung wird im Format ISO 8601 Dauer angegeben. Beachten Sie, dass Windows-Instances in der Regel länger zum Starten brauchen als Linux-Instances. Testen Sie daher gründlich, um die besten Timeout-Werte für Ihre Bedürfnisse zu ermitteln.

Wenn alles gut geht, wird `CreationPolicy` erfolgreich abgeschlossen und Sie können auf die Instance Windows Server über ihre öffentliche IP-Adresse zugreifen. Sobald die Stack-Erstellung abgeschlossen ist, werden die Instanz-ID und die öffentliche IP-Adresse auf der Registerkarte **Ausgaben der Konsole** angezeigt. CloudFormation 

```
Outputs:
  InstanceId:
    Value: !Ref TestInstance
    Description: Instance ID of the Windows Server
  PublicIP:
    Value: !GetAtt TestInstance.PublicIp
    Description: Public IP address of the Windows Server
```

Sie können auch manuell überprüfen, ob das Bootstrapping korrekt funktioniert hat, indem Sie sich über RDP mit der Instance verbinden und überprüfen, ob die Datei `C:\cfn\test.txt` existiert und den erwarteten Inhalt enthält. Weitere Informationen zum Verbinden mit Windows Instances finden Sie unter [Verbinden mit Ihrer Windows Instance über RDP](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connecting_to_windows_instance.html) im *Amazon EC2-Benutzerhandbuch*.

## Backslashes in Windows-Dateipfaden entschärfen
<a name="cfn-windows-stacks-escape-backslashes"></a>

Denken Sie beim Verweisen auf Windows Pfade in CloudFormation Vorlagen immer daran, Backslashes (`\`) entsprechend dem verwendeten Vorlagenformat korrekt zu maskieren.
+ Für JSON-Vorlagen müssen Sie doppelte Backslashes in Windows-Dateipfaden verwenden, da JSON den Backslash als Escape-Zeichen behandelt. Der erste Backslash umgeht den zweiten, was zu der Interpretation eines einzelnen, buchstäblichen Backslashs führt.

  ```
  "commands" : {
    "1-extract" : {
      "command" : "C:\\SharePoint\\SharePointFoundation2010.exe /extract:C:\\SharePoint\\SPF2010 /quiet /log:C:\\SharePoint\\SharePointFoundation2010-extract.log"
    }
  }
  ```
+ Für YAML-Vorlagen sind einfache Backslashes in der Regel ausreichend.

  ```
  commands:
    1-extract:
      command: C:\SharePoint\SharePointFoundation2010.exe /extract:C:\SharePoint\SPF2010 /quiet /log:C:\SharePoint\SharePointFoundation2010-extract.log
  ```

## Dienste Windows-Verwaltung
<a name="cfn-windows-stacks-manage-windows-services"></a>

Sie verwalten Windows-Dienste auf die gleiche Weise wie Linux-Dienste, nur dass Sie einen `windows`-Schlüssel anstelle von `sysvinit`verwenden. Das folgende Beispiel startet den Dienst `cfn-hup`, setzt ihn auf Automatisch und startet den Dienst neu, wenn `cfn-init` die Konfigurationsdateien `c:\cfn\cfn-hup.conf` oder `c:\cfn\hooks.d\cfn-auto-reloader.conf` ändert.

```
        services:
          windows:
            cfn-hup:
              enabled: true
              ensureRunning: true
              files:
                - c:\cfn\cfn-hup.conf
                - c:\cfn\hooks.d\cfn-auto-reloader.conf
```

Sie können andere Windows-Dienste auf die gleiche Weise verwalten, indem Sie den Namen und nicht den Anzeigenamen verwenden, um auf den Dienst zu verweisen.

## Beheben Sie Probleme bei der Stapelerstellung
<a name="cfn-windows-stacks-troubleshooting"></a>

Wenn Ihr Stack bei der Erstellung fehlschlägt, wird standardmäßig ein Rollback durchgeführt. Dies ist zwar in der Regel ein gutes Standardverhalten, da unnötige Kosten vermieden werden, es ist aber schwierig zu debuggen, warum bei der Stack-Erstellung ein Fehler auftrat.

**Um dieses Verhalten zu deaktivieren, wenn Sie Ihren Stack mit der CloudFormation Konsole erstellen oder aktualisieren, wählen Sie unter Optionen für Stapelfehler die Option **Erfolgreich bereitgestellte Ressourcen beibehalten** aus.** Weitere Informationen finden Sie unter [Wählen Sie aus, wie mit Fehlern bei der Bereitstellung von Ressourcen umgegangen werden soll](stack-failure-options.md). Damit können Sie sich bei Ihrer Instance anmelden und die Protokolldateien einsehen, um Probleme bei der Ausführung Ihrer Startskripte zu ermitteln.

Wichtige Protokolle, die sich Sie ansehen sollten:
+ Das EC2-Konfigurationsprotokoll unter `%ProgramData%\Amazon\EC2Launch\log\agent.log`
+ Das **cfn-init**-Protokoll bei `C:\cfn\log\cfn-init.log` (überprüfen Sie Exit-Codes und Fehlermeldungen für bestimmte Fehlerpunkte)

Weitere Protokolle finden Sie in den folgenden Themen im *Amazon-EC2-Benutzerhandbuch*:
+ [EC2LaunchVerzeichnisstruktur](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2config-service.html#UsingConfigXML_WinAMI)
+ [EC2Launch v2 Verzeichnisstruktur](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2launch-v2.html#ec2launch-v2-directory)

Weitere Informationen zur Behebung von Bootstrapping-Problemen finden Sie unter [Wie behebe ich Probleme mit Hilfsskripten, die in einem CloudFormation Stapel mit Instanzen kein Bootstrap](https://repost.aws/knowledge-center/cloudformation-helper-scripts-windows) durchführen können? Windows .

# Erweitern Sie die Funktionen Ihrer Vorlage mit CloudFormation bereitgestellten Ressourcentypen
<a name="cloudformation-supplied-resource-types"></a>

CloudFormation bietet mehrere Ressourcentypen, die Sie in Ihrer Stack-Vorlage verwenden können, um deren Funktionen über die einer einfachen Stack-Vorlage hinaus zu erweitern.

Zu diesen Ressourcentypen gehören:


| Ressourcentyp | Description | Dokumentation | 
| --- | --- | --- | 
|  Benutzerdefinierte Ressourcen  |  Der `AWS::CloudFormation::CustomResource` Ressourcentyp ermöglicht es Ihnen, benutzerdefinierte Ressourcen zu erstellen, die bestimmte Bereitstellungsaufgaben ausführen oder Ressourcen einbeziehen können, die nicht als CloudFormation Ressourcentypen verfügbar sind.  |  [Benutzerdefinierte Ressourcen](template-custom-resources.md) | 
|  Makros  |  Der `AWS::CloudFormation::Macro` Ressourcentyp definiert einen wiederverwendbaren Code, der eine benutzerdefinierte Verarbeitung von CloudFormation Vorlagen durchführen kann. Makros können Ihre Vorlagen ändern, zusätzliche Ressourcen generieren oder andere benutzerdefinierte Operationen bei der Erstellung oder Aktualisierung von Stacks durchführen.  | [Vorlagenmakros](template-macros.md) | 
|  Verschachtelte Stacks  |  Der `AWS::CloudFormation::Stack` Ressourcentyp ermöglicht es Ihnen, verschachtelte Stapel innerhalb Ihrer CloudFormation Vorlagen zu erstellen, um eine modularere und wiederverwendbarere Stack-Architektur zu erreichen.  | [Verschachtelte Stacks](using-cfn-nested-stacks.md) | 
|  StackSet  |  Der `AWS::CloudFormation::StackSet` Ressourcentyp erstellt oder aktualisiert einen. CloudFormation StackSet Dabei handelt es sich um einen Container für Stacks, die in mehreren Regionen eingesetzt werden können. AWS-Konten   | [Verwaltung von Stacks mit StackSets](what-is-cfnstacksets.md) | 
|  Wartebedingung  |  Der Ressourcentyp `AWS::CloudFormation::WaitCondition` pausiert die Erstellung oder Aktualisierung von Stackn, bis eine bestimmte Bedingung erfüllt ist, beispielsweise der erfolgreiche Abschluss eines lang laufenden Prozesses oder die Verfügbarkeit externer Ressourcen.   | [Bedingungen warten](using-cfn-waitcondition.md) | 
|  Warten Bedingung Griff  |  Der Ressourcentyp `AWS::CloudFormation::WaitConditionHandle` funktioniert zusammen mit dem Ressourcentyp `AWS::CloudFormation::WaitCondition` . Es bietet eine vordefinierte URL, die verwendet wird, um Signale zu senden, die anzeigen, dass eine bestimmte Bedingung erfüllt ist. Diese Signale ermöglichen es, den Prozess der Stack-Erstellung oder Aktualisierung fortzusetzen.  | [Bedingungen warten](using-cfn-waitcondition.md) | 

# Erstellen Sie eine benutzerdefinierte Bereitstellungslogik mit benutzerdefinierten Ressourcen
<a name="template-custom-resources"></a>

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::MyCustomResourceTypeName` Ressourcentyp `AWS::CloudFormation::CustomResource` oder. 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.

**Topics**
+ [So funktionieren benutzerdefinierte Ressourcen](#how-custom-resources-work)
+ [Zeitüberschreitung bei der Antwort](#response-timeout)
+ [CloudFormation Referenz für benutzerdefinierte Ressourcenanfragen und Antworten](crpg-ref.md)
+ [Amazon SNS-gestützte benutzerdefinierte Ressourcen](template-custom-resources-sns.md)
+ [Lambda-gestützte benutzerdefinierte Ressourcen](template-custom-resources-lambda.md)

**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 [Erweiterungen mit der CloudFormation Registry verwalten](registry.md).

## So funktionieren benutzerdefinierte Ressourcen
<a name="how-custom-resources-work"></a>

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. 

1. 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.

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

1. 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](crpg-ref.md).

   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",
      "RequestId" : "unique id for this create request",
      "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::TestResource",
      "LogicalResourceId" : "MyTestResource",
      "ResourceProperties" : {
         "Name" : "Value",
         "List" : [ "1", "2", "3" ]
      }
   }
   ```

1. 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](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html) 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](crpg-ref.md).
**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](security-best-practices.md#creds) .

   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",
      "RequestId" : "unique id for this create request",
      "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10",
      "LogicalResourceId" : "MyTestResource",
      "PhysicalResourceId" : "TestResource1",
      "Data" : {
         "OutputName1" : "Value1",
         "OutputName2" : "Value2",
      }
   }
   ```

1. 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::](resources-section-structure.md#resource-properties-getatt) 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)](vpc-interface-endpoints.md).

## Zeitüberschreitung bei der Antwort
<a name="response-timeout"></a>

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](crpg-ref.md). 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.

# CloudFormation Referenz für benutzerdefinierte Ressourcenanfragen und Antworten
<a name="crpg-ref"></a>

CloudFormation verwaltet benutzerdefinierte Ressourcen über ein Request-Response-Protokoll, das mit Ihrem Anbieter für benutzerdefinierte Ressourcen kommuniziert. Jede Anfrage umfasst einen Anforderungstyp (`Create``Update`, oder`Delete`) und folgt diesem allgemeinen Arbeitsablauf:

1. Ein Vorlagenentwickler definiert eine benutzerdefinierte Ressource mit einem `ServiceToken` und `ServiceTimeout` in der Vorlage und initiiert einen Stack-Vorgang.

1. CloudFormation sendet über SNS oder Lambda eine JSON-Anfrage an den Anbieter benutzerdefinierter Ressourcen.

1. Der benutzerdefinierte Ressourcenanbieter verarbeitet die Anfrage und gibt eine JSON-Antwort an eine vorsignierte Amazon S3 S3-Bucket-URL zurück, bevor der Timeout-Zeitraum abläuft.

1. CloudFormation liest die Antwort und fährt mit dem Stack-Vorgang fort. Wenn vor Ablauf des Timeouts keine Antwort eingeht, gilt die Anfrage als nicht erfolgreich und der Stack-Vorgang schlägt fehl.

Weitere Informationen finden Sie unter [So funktionieren benutzerdefinierte Ressourcen](template-custom-resources.md#how-custom-resources-work).

In diesem Abschnitt werden die Struktur, die Parameter und die erwarteten Antworten für jeden Anforderungstyp beschrieben.

**Anmerkung**  
Die Gesamtgröße des Antworttexts darf 4 096 Bytes nicht überschreiten.

## Einrichtung der Vorlage
<a name="crpg-ref-template-setup"></a>

Bei der Definition einer benutzerdefinierten Ressource in einer Vorlage verwendet [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html)der Vorlagenentwickler die folgenden Eigenschaften:

`ServiceToken`  
Ein Amazon SNS SNS-Themen-ARN oder eine Lambda-Funktions-ARN aus derselben Region wie der Stack.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`ServiceTimeout`  
Die maximale Zeit in Sekunden, bis das Timeout eines benutzerdefinierten Ressourcenvorgangs abläuft. Es muss ein Wert zwischen 1 und 3600 sein. Standard: 3600 Sekunden (1 Stunde).  
*Required*: No  
*Typ:* Zeichenfolge

Zusätzliche Ressourceneigenschaften werden unterstützt. Ressourceneigenschaften werden wie `ResourceProperties` in der Anfrage enthalten sein. Der benutzerdefinierte Ressourcenanbieter muss ermitteln, welche Eigenschaften gültig sind und welche Werte zulässig sind.

## Objekt anfordern
<a name="crpg-ref-requesttypes"></a>

------
#### [ Create ]

Wenn der Vorlagenentwickler einen Stapel erstellt, der eine benutzerdefinierte Ressource enthält, CloudFormation sendet er eine Anfrage mit der `RequestType` Einstellung auf`Create`.

Erstellenanforderungen enthalten die folgenden Felder:

`RequestType`  
`Create`.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`RequestId`  
Eine eindeutige ID für die Anforderung.  
Kombinieren Sie `StackId` mit `RequestId` und es bildet sich ein Wert, mit dem Sie eine Anforderung für eine bestimmte benutzerdefinierte Ressource eindeutig identifizieren können.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`StackId`  
Der Amazon-Ressourcenname (ARN), der den Stack identifiziert, der die benutzerdefinierte Ressource enthält.  
Kombinieren Sie `StackId` mit `RequestId` und es bildet sich ein Wert, mit dem Sie eine Anforderung für eine bestimmte benutzerdefinierte Ressource eindeutig identifizieren können.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`ResponseURL`  
Die Antwort-URL identifiziert einen vorsignierten S3-Bucket, der Antworten vom Anbieter für benutzerdefinierte Ressourcen empfängt. CloudFormation  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`ResourceType`  
Der vom Developer der Vorlagen gewählte Ressourcentyp der benutzerdefinierten Ressource in der CloudFormation -Vorlage. Namen für benutzerdefinierte Ressourcentypen dürfen bis zu 60 Zeichen lang sein und sowohl alphanumerische Zeichen als auch folgende Zeichen enthalten: `_@-`.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`LogicalResourceId`  
Der vom Entwickler der Vorlagen gewählte Name (logische ID) der benutzerdefinierten Ressource in der CloudFormation -Vorlage.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`ResourceProperties`  
Dieses Feld enthält den Inhalt des `Properties`-Objekts, das vom Vorlagen-Entwickler gesendet wurde. Sein Inhalt wird durch benutzerdefinierte Ressourcenanbieter definiert.  
*Required*: No  
*Typ*: JSON-Objekt

*Beispiel*

```
{
   "RequestType" : "Create",
   "RequestId" : "unique-request-id",
   "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/id",
   "ResponseURL" : "pre-signed-url-for-create-response",
   "ResourceType" : "Custom::MyCustomResourceType",
   "LogicalResourceId" : "resource-logical-id",
   "ResourceProperties" : {
      "key1" : "string",
      "key2" : [ "list" ],
      "key3" : { "key4" : "map" }
   }
}
```

------
#### [ Update ]

Wenn der Vorlagenentwickler Änderungen an den Eigenschaften einer benutzerdefinierten Ressource innerhalb der Vorlage vornimmt und den Stack aktualisiert, CloudFormation sendet er eine Anfrage an den Anbieter für benutzerdefinierte Ressourcen mit der `RequestType` Einstellung auf`Update`. Das bedeutet, dass Ihr benutzerdefinierter Ressourcencode keine Änderungen in den Ressourcen erkennen muss, da er weiß, dass sich seine Eigenschaften geändert haben, wenn der Anfragetyp `Update`ist.

Aktualisierungsanforderungen enthalten die folgenden Felder:

`RequestType`  
`Update`.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`RequestId`  
Eine eindeutige ID für die Anforderung.  
Kombinieren Sie `StackId` mit `RequestId` und es bildet sich ein Wert, mit dem Sie eine Anforderung für eine bestimmte benutzerdefinierte Ressource eindeutig identifizieren können.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`StackId`  
Der Amazon-Ressourcenname (ARN), der den Stack identifiziert, der die benutzerdefinierte Ressource enthält.  
Kombinieren Sie `StackId` mit `RequestId` und es bildet sich ein Wert, mit dem Sie eine Anforderung für eine bestimmte benutzerdefinierte Ressource eindeutig identifizieren können.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`ResponseURL`  
Die Antwort-URL identifiziert einen vorsignierten S3-Bucket, der Antworten vom Anbieter für benutzerdefinierte Ressourcen empfängt. CloudFormation  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`ResourceType`  
Der vom Developer der Vorlagen gewählte Ressourcentyp der benutzerdefinierten Ressource in der CloudFormation -Vorlage. Namen für benutzerdefinierte Ressourcentypen dürfen bis zu 60 Zeichen lang sein und sowohl alphanumerische Zeichen als auch folgende Zeichen enthalten: `_@-`. Bei einer Aktualisierung kann der Typ nicht geändert werden.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`LogicalResourceId`  
Der vom Entwickler der Vorlagen gewählte Name (logische ID) der benutzerdefinierten Ressource in der CloudFormation -Vorlage.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`PhysicalResourceId`  
Eine benutzerdefinierte, vom Ressourcenanbieter definierte physische ID, die für diesen Anbieter eindeutig ist.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`ResourceProperties`  
Dieses Feld enthält den Inhalt des `Properties`-Objekts, das vom Vorlagen-Entwickler gesendet wurde. Sein Inhalt wird durch benutzerdefinierte Ressourcenanbieter definiert.  
*Required*: No  
*Typ*: JSON-Objekt

`OldResourceProperties`  
Wird nur für `Update`-Anforderungen verwendet. Gibt die bisherigen Ressourceneigenschafts-Werte an, die der Vorlagenentwickler zu einem früheren Zeitpunkt in der CloudFormation -Vorlage deklariert hatte.  
*Erforderlich*: Ja  
*Typ*: JSON-Objekt

*Beispiel*

```
{
   "RequestType" : "Update",
   "RequestId" : "unique-request-id",
   "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/id",
   "ResponseURL" : "pre-signed-url-for-update-response",
   "ResourceType" : "Custom::MyCustomResourceType",
   "LogicalResourceId" : "resource-logical-id",
   "PhysicalResourceId" : "provider-defined-physical-id",
   "ResourceProperties" : {
      "key1" : "new-string",
      "key2" : [ "new-list" ],
      "key3" : { "key4" : "new-map" }
   },
   "OldResourceProperties" : {
      "key1" : "string",
      "key2" : [ "list" ],
      "key3" : { "key4" : "map" }
   }
}
```

------
#### [ Delete ]

Wenn der Vorlagenentwickler den Stack löscht oder die benutzerdefinierte Ressource aus der Vorlage entfernt und dann den Stapel aktualisiert, CloudFormation sendet er eine Anfrage mit `RequestType` der Einstellung auf. `Delete`

Anforderungen zum Löschen enthalten die folgenden Felder:

`RequestType`  
`Delete`.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`RequestId`  
Eine eindeutige ID für die Anforderung.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`StackId`  
Der Amazon-Ressourcenname (ARN), der den Stack identifiziert, der die benutzerdefinierte Ressource enthält.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`ResponseURL`  
Die Antwort-URL identifiziert einen vorsignierten S3-Bucket, der Antworten vom Anbieter für benutzerdefinierte Ressourcen empfängt. CloudFormation  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`ResourceType`  
Der vom Developer der Vorlagen gewählte Ressourcentyp der benutzerdefinierten Ressource in der CloudFormation -Vorlage. Namen für benutzerdefinierte Ressourcentypen dürfen bis zu 60 Zeichen lang sein und sowohl alphanumerische Zeichen als auch folgende Zeichen enthalten: `_@-`.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`LogicalResourceId`  
Der vom Entwickler der Vorlagen gewählte Name (logische ID) der benutzerdefinierten Ressource in der CloudFormation -Vorlage.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`PhysicalResourceId`  
Eine benutzerdefinierte, vom Ressourcenanbieter definierte physische ID, die für diesen Anbieter eindeutig ist.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`ResourceProperties`  
Dieses Feld enthält den Inhalt des `Properties`-Objekts, das vom Vorlagen-Entwickler gesendet wurde. Sein Inhalt wird durch benutzerdefinierte Ressourcenanbieter definiert.  
*Required*: No  
*Typ*: JSON-Objekt

*Beispiel*

```
{
   "RequestType" : "Delete",
   "RequestId" : "unique-request-id",
   "StackId" : "arn:aws:cloudformation:us-west-2:123456789012:stack/mystack/id",
   "ResponseURL" : "pre-signed-url-for-delete-response",
   "ResourceType" : "Custom::MyCustomResourceType",
   "LogicalResourceId" : "resource-logical-id",
   "PhysicalResourceId" : "provider-defined-physical-id",
   "ResourceProperties" : {
      "key1" : "string",
      "key2" : [ "list" ],
      "key3" : { "key4" : "map" }
   }
}
```

------

## Antwortobjekt
<a name="crpg-ref-responses"></a>

Der benutzerdefinierte Ressourcenanbieter sendet für alle Anforderungstypen eine Antwort an die vorsignierte URL. Wenn der benutzerdefinierte Ressourcenanbieter keine Antwort sendet, CloudFormation wartet er, bis das Zeitlimit für den Vorgang überschritten wird.

Die Antwort muss ein JSON-Objekt mit den folgenden Feldern sein:

`Status`  
Es muss entweder `SUCCESS` oder `FAILED` sein.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`RequestId`  
Eine eindeutige ID für die Anforderung. Kopieren Sie diesen Wert genau so, wie er in der Anfrage erscheint.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`StackId`  
Der Amazon-Ressourcenname (ARN), der den Stack identifiziert, der die benutzerdefinierte Ressource enthält. Kopieren Sie diesen Wert genau so, wie er in der Anfrage erscheint.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`LogicalResourceId`  
Der vom Entwickler der Vorlagen gewählte Name (logische ID) der benutzerdefinierten Ressource in der CloudFormation -Vorlage. Kopieren Sie diesen Wert genau so, wie er in der Anfrage erscheint.  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`PhysicalResourceId`  
Dieser Wert sollte eine eindeutige Kennung für den Anbieter der benutzerdefinierten Ressource sein und kann bis zu 1 KB groß sein. Der Wert muss eine nicht leere Zeichenfolge sein und muss für alle Antworten für dieselbe Ressource identisch sein.  
Beim Aktualisieren von benutzerdefinierten Ressourcen `PhysicalResourceId` bestimmt der zurückgegebene Wert für das Aktualisierungsverhalten. Wenn der Wert gleich bleibt, wird dies CloudFormation als normales Update betrachtet. Wenn sich der Wert ändert, CloudFormation interpretiert das Update als Ersatz und sendet eine Löschanforderung an die alte Ressource. Weitere Informationen finden Sie unter [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html).  
*Erforderlich*: Ja  
*Typ:* Zeichenfolge

`Reason`  
Beschreibt den Grund für eine Reaktion auf einen Fehler.  
Erforderlich, wenn `Status` ein `FAILED` ist. Er ist andernfalls optional.  
*Required*: Conditional  
*Typ:* Zeichenfolge

`NoEcho`  
Gibt an, ob die Ausgabe der benutzerdefinierten Ressource maskiert wird, wenn sie mithilfe der `Fn::GetAtt`-Funktion abgerufen wird. Wenn diese Option auf `true` gesetzt ist. werden alle zurückgegebenen Werte mit Sternchen (\$1\$1\$1\$1\$1) maskiert *außer denen, die im `Metadata` Abschnitt der Vorlage* gespeichert sind. CloudFormation transformiert, ändert oder bearbeitet keine Informationen im `Metadata` Abschnitt. Der Standardwert ist `false`.  
Weitere Informationen über die Verwendung von `NoEcho` zur Maskierung sensibler Informationen finden Sie in der bewährten Methode [Keine Anmeldeinformationen in Vorlagen einbetten](security-best-practices.md#creds) .  
Nur für `Update` Antworten `Create` und verfügbar. Wird für `Delete` Antworten nicht unterstützt.  
*Required*: No  
*Typ*: Boolesch

`Data`  
Die vom benutzerdefinierten Ressourcenanbieter definierten Namen-Wert-Paare, die mit der Antwort gesendet werden. Sie können auf die hier namentlich angegebenen Werte in der Vorlage mit `Fn::GetAtt` zugreifen.  
Nur für `Create` `Update` Antworten verfügbar. Wird für `Delete` Antworten nicht unterstützt.  
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 APIs diese Oberflächeneigenschaftswerte (z. B.`DescribeStackEvents`) sichtbar.
*Required*: No  
*Typ*: JSON-Objekt

### Beispiele für erfolgreiche Antworten
<a name="crpg-ref-success-response-examples"></a>

#### `Create`und `Update` Antwort
<a name="crpg-ref-success-response-example-1"></a>

```
{
   "Status": "SUCCESS",
   "RequestId": "unique-request-id",
   "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/name/id",
   "LogicalResourceId": "resource-logical-id", 
   "PhysicalResourceId": "provider-defined-physical-id",
   "NoEcho": true,
   "Data": {
      "key1": "value1",
      "key2": "value2"
   }
}
```

#### `Delete`-Antwort
<a name="crpg-ref-success-response-example-2"></a>

```
{
   "Status": "SUCCESS",
   "RequestId": "unique-request-id",
   "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/name/id",
   "LogicalResourceId": "resource-logical-id", 
   "PhysicalResourceId": "provider-defined-physical-id"
}
```

### Beispiel für eine gescheiterte Antwort
<a name="crpg-ref-failed-response-example"></a>

```
{
   "Status": "FAILED",
   "RequestId": "unique-request-id",
   "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/name/id",
   "LogicalResourceId": "resource-logical-id",
   "PhysicalResourceId": "provider-defined-physical-id",
   "Reason": "Required failure reason string"
}
```

# 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`.

# Lambda-gestützte benutzerdefinierte Ressourcen
<a name="template-custom-resources-lambda"></a>

Wenn Sie eine Lambda-Funktion einer benutzerdefinierten Ressource zuordnen, wird die Funktion immer dann aufgerufen, wenn die benutzerdefinierte Ressource erstellt, aktualisiert oder gelöscht wird. CloudFormation ruft eine Lambda-API auf, um die Funktion aufzurufen und alle Anforderungsdaten (z. B. Anforderungstyp und Ressourceneigenschaften) an die Funktion zu übergeben. Die Leistungsfähigkeit und Anpassungsfähigkeit von Lambda-Funktionen in Kombination mit CloudFormation ermöglichen eine Vielzahl von Szenarien, z. B. das dynamische Nachschlagen von AMI IDs während der Stack-Erstellung oder die Implementierung und Verwendung von Hilfsfunktionen wie String-Reversal-Funktionen.

Eine Einführung in benutzerdefinierte Ressourcen und ihre Funktionsweise finden Sie unter [So funktionieren benutzerdefinierte Ressourcen](template-custom-resources.md#how-custom-resources-work).

**Topics**
+ [Exemplarische Vorgehensweise: Erstellen Sie einen Verzögerungsmechanismus mit einer Lambda-gestützten benutzerdefinierten Ressource](walkthrough-lambda-backed-custom-resources.md)
+ [`cfn-response`-Modul](cfn-lambda-function-code-cfnresponsemodule.md)

# Exemplarische Vorgehensweise: Erstellen Sie einen Verzögerungsmechanismus mit einer Lambda-gestützten benutzerdefinierten Ressource
<a name="walkthrough-lambda-backed-custom-resources"></a>

In dieser exemplarischen Vorgehensweise wird anhand einer Beispielvorlage gezeigt, wie Sie eine Lambda-gestützte benutzerdefinierte Ressource konfigurieren und starten. CloudFormation Diese Vorlage erstellt einen Verzögerungsmechanismus, der Stack-Bereitstellungen für eine bestimmte Zeit pausiert. Dies kann nützlich sein, wenn Sie bei der Bereitstellung von Ressourcen bewusst Verzögerungen einführen müssen, z. B. wenn Sie darauf warten, dass sich Ressourcen stabilisieren, bevor abhängige Ressourcen erstellt werden.

**Anmerkung**  
Während zuvor Lambda-gestützte benutzerdefinierte Ressourcen für das Abrufen von AMI empfohlen wurden IDs, empfehlen wir jetzt die Verwendung von Parametern. AWS Systems Manager Dieser Ansatz macht Ihre Vorlagen wiederverwendbarer und einfacher zu verwalten. Weitere Informationen finden Sie unter [Abrufen eines Klartextwertes aus dem Systems Manager Parameter Store](dynamic-references-ssm.md). 

**Topics**
+ [-Übersicht](#walkthrough-lambda-backed-custom-resources-overview)
+ [Beispielvorlage](#walkthrough-lambda-backed-custom-resources-sample-template)
+ [Exemplarische Vorgehensweise für eine Vorlage](#walkthrough-lambda-backed-custom-resources-sample-template-walkthrough)
+ [Voraussetzungen](#walkthrough-lambda-backed-custom-resources-prerequisites)
+ [Starten des Stapels](#walkthrough-lambda-backed-custom-resources-createfunction-createstack)
+ [Bereinigen von Ressourcen](#walkthrough-lambda-backed-custom-resources-createfunction-cleanup)
+ [Ähnliche Informationen](#w2aac11c45b9c24b9c23)

## -Übersicht
<a name="walkthrough-lambda-backed-custom-resources-overview"></a>

Die in dieser exemplarischen Vorgehensweise verwendete Beispielstapelvorlage erstellt eine Lambda-gestützte benutzerdefinierte Ressource. Diese benutzerdefinierte Ressource führt zu einer konfigurierbaren Verzögerung (standardmäßig 60 Sekunden) bei der Stack-Erstellung. Die Verzögerung tritt bei Stack-Aktualisierungen nur auf, wenn die Eigenschaften der benutzerdefinierten Ressource geändert werden.

Die Vorlage enthält die folgenden Ressourcen:
+ eine benutzerdefinierte Ressource,
+ eine Lambda-Funktion und
+ eine IAM-Rolle, in die Lambda Logs schreiben kann. CloudWatch

Sie definiert auch zwei Ausgaben:
+ Die tatsächliche Zeit, zu der die Funktion gewartet hat.
+ Eine eindeutige Kennung, die bei jeder Ausführung der Lambda-Funktion generiert wird.



**Anmerkung**  
CloudFormation ist ein kostenloser Service, aber Lambda berechnet Gebühren auf der Grundlage der Anzahl der Anfragen für Ihre Funktionen und der Zeit, in der Ihr Code ausgeführt wird. Weitere Informationen über Lambda-Preise finden Sie unter [AWS Lambda Preisgestaltung](https://aws.amazon.com/lambda/pricing/).

## Beispielvorlage
<a name="walkthrough-lambda-backed-custom-resources-sample-template"></a>

Sie können die Lambda-gestützte Beispielvorlage für benutzerdefinierte Ressourcen mit dem Verzögerungsmechanismus unten sehen:

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-json"></a>

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Resources": {
    "LambdaExecutionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Statement": [{
            "Effect": "Allow",
            "Principal": { "Service": ["lambda.amazonaws.com"] },
            "Action": ["sts:AssumeRole"]
          }]
        },
        "Path": "/",
        "Policies": [{
          "PolicyName": "AllowLogs",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": ["logs:*"],
              "Resource": "*"
            }]
          }
        }]
      }
    },
    "CFNWaiter": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Handler": "index.handler",
        "Runtime": "python3.9",
        "Timeout": 900,
        "Role": { "Fn::GetAtt": ["LambdaExecutionRole", "Arn"] },
        "Code": {
          "ZipFile": { "Fn::Join": ["\n", [
            "from time import sleep",
            "import json",
            "import cfnresponse",
            "import uuid",
            "",
            "def handler(event, context):",
            "  wait_seconds = 0",
            "  id = str(uuid.uuid1())",
            "  if event[\"RequestType\"] in [\"Create\", \"Update\"]:",
            "    wait_seconds = int(event[\"ResourceProperties\"].get(\"ServiceTimeout\", 0))",
            "    sleep(wait_seconds)",
            "  response = {",
            "    \"TimeWaited\": wait_seconds,",
            "    \"Id\": id ",
            "  }",
            "  cfnresponse.send(event, context, cfnresponse.SUCCESS, response, \"Waiter-\"+id)"
          ]]}
        }
      }
    },
    "CFNWaiterCustomResource": {
      "Type": "AWS::CloudFormation::CustomResource",
      "Properties": {
        "ServiceToken": { "Fn::GetAtt": ["CFNWaiter", "Arn"] },
        "ServiceTimeout": 60
      }
    }
  },
  "Outputs": {
    "TimeWaited": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "TimeWaited"] },
      "Export": { "Name": "TimeWaited" }
    },
    "WaiterId": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "Id"] },
      "Export": { "Name": "WaiterId" }
    }
  }
}
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-yaml"></a>

```
AWSTemplateFormatVersion: "2010-09-09"
Resources:
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - "lambda.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: "AllowLogs"
          PolicyDocument:
            Statement:
              - Effect: "Allow"
                Action:
                  - "logs:*"
                Resource: "*"
  CFNWaiter:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Runtime: python3.9 
      Timeout: 900
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        ZipFile:
          !Sub |
          from time import sleep
          import json
          import cfnresponse
          import uuid
​
          def handler(event, context):
            wait_seconds = 0
            id = str(uuid.uuid1())
            if event["RequestType"] in ["Create", "Update"]:
              wait_seconds = int(event["ResourceProperties"].get("ServiceTimeout", 0))
              sleep(wait_seconds)
            response = {
              "TimeWaited": wait_seconds,
              "Id": id 
            }
            cfnresponse.send(event, context, cfnresponse.SUCCESS, response, "Waiter-"+id)
  CFNWaiterCustomResource:
    Type: AWS::CloudFormation::CustomResource
    Properties:
      ServiceToken: !GetAtt CFNWaiter.Arn
      ServiceTimeout: 60
Outputs:
  TimeWaited:
    Value: !GetAtt CFNWaiterCustomResource.TimeWaited
    Export:
      Name: TimeWaited
  WaiterId:
    Value: !GetAtt CFNWaiterCustomResource.Id
    Export:
      Name: WaiterId
```

## Exemplarische Vorgehensweise für eine Vorlage
<a name="walkthrough-lambda-backed-custom-resources-sample-template-walkthrough"></a>

Die folgenden Schnipsel erläutern relevante Teile der Beispielvorlage, damit Sie verstehen, wie die Lambda-Funktion mit einer benutzerdefinierten Ressource verknüpft ist und die Ausgabe verstehen.

[AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html)Ressource `CFNWaiter`  
-Bei der `AWS::Lambda::Function` Ressource gilt der Quellcode der Funktion, der Handler-Name, die Laufzeitumgebung sowie der Amazon Resource Name (ARN) der Ausführungsrolle.  
Die `Handler` Eigenschaft ist auf gesetzt, `index.handler` da sie einen Python-Quellcode verwendet. Weitere Informationen zu akzeptierten Handler-Identifikatoren bei der Verwendung von Quellcodes für Inline-Funktionen finden Sie unter [ AWS::Lambda::Function Code](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html#cfn-lambda-function-code-zipfile).  
Das `Runtime` wird als `python3.9` angegeben, da die Quelldatei ein Python-Code ist.  
Der Wert `Timeout` ist auf 900 Sekunden eingestellt.  
Die Eigenschaft `Role` verwendet die Funktion `Fn::GetAtt`, um den ARN der Ausführungsrolle `LambdaExecutionRole` zu erhalten, die in der Ressource `AWS::IAM::Role` in der Vorlage deklariert ist.  
Die Eigenschaft `Code` definiert den Funktionscode inline mit einer Python-Funktion. Die Python-Funktion in der Beispielvorlage macht Folgendes:  
+ Erstellen Sie eine eindeutige ID mit der UUID
+ Prüfen Sie, ob die Anfrage eine Erstellungs- oder Aktualisierungsanfrage ist
+ Ruhezustand für die für `ServiceTimeout` angegebene Dauer während `Create` oder `Update` Anfragen
+ Geben Sie die Wartezeit und die eindeutige ID zurück

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-lambda-resource-json"></a>

```
...
    "CFNWaiter": {
      "Type": "AWS::Lambda::Function",
      "Properties": {
        "Handler": "index.handler",
        "Runtime": "python3.9",
        "Timeout": 900,
        "Role": { "Fn::GetAtt": ["LambdaExecutionRole", "Arn"] },
        "Code": {
          "ZipFile": { "Fn::Join": ["\n", [
            "from time import sleep",
            "import json",
            "import cfnresponse",
            "import uuid",
            "",
            "def handler(event, context):",
            "  wait_seconds = 0",
            "  id = str(uuid.uuid1())",
            "  if event[\"RequestType\"] in [\"Create\", \"Update\"]:",
            "    wait_seconds = int(event[\"ResourceProperties\"].get(\"ServiceTimeout\", 0))",
            "    sleep(wait_seconds)",
            "  response = {",
            "    \"TimeWaited\": wait_seconds,",
            "    \"Id\": id ",
            "  }",
            "  cfnresponse.send(event, context, cfnresponse.SUCCESS, response, \"Waiter-\"+id)"
          ]]}
        }
      }
    },
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-lambda-resource-yaml"></a>

```
...
  CFNWaiter:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Runtime: python3.9 
      Timeout: 900
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        ZipFile:
          !Sub |
          from time import sleep
          import json
          import cfnresponse
          import uuid
​
          def handler(event, context):
            wait_seconds = 0
            id = str(uuid.uuid1())
            if event["RequestType"] in ["Create", "Update"]:
              wait_seconds = int(event["ResourceProperties"].get("ServiceTimeout", 0))
              sleep(wait_seconds)
            response = {
              "TimeWaited": wait_seconds,
              "Id": id 
            }
            cfnresponse.send(event, context, cfnresponse.SUCCESS, response, "Waiter-"+id)
...
```

[AWS::IAM::Role](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html)Ressource `LambdaExecutionRole`  
Die Ressource `AWS::IAM:Role` erstellt eine Ausführungsrolle für die Lambda-Funktion, die eine "assume role"-Richtlinie enthält, die es Lambda erlaubt, sie zu verwenden. Es enthält auch eine Richtlinie, die den Zugriff auf CloudWatch Protokolle ermöglicht.

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-iam-role-json"></a>

```
...
    "LambdaExecutionRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Statement": [{
            "Effect": "Allow",
            "Principal": { "Service": ["lambda.amazonaws.com"] },
            "Action": ["sts:AssumeRole"]
          }]
        },
        "Path": "/",
        "Policies": [{
          "PolicyName": "AllowLogs",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": ["logs:*"],
              "Resource": "*"
            }]
          }
        }]
      }
    },
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-iam-role-yaml"></a>

```
...
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - "lambda.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: "AllowLogs"
          PolicyDocument:
            Statement:
              - Effect: "Allow"
                Action:
                  - "logs:*"
                Resource: "*"
...
```

[AWS::CloudFormation::CustomResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-customresource.html)Ressource `CFNWaiterCustomResource`  
Die benutzerdefinierte Ressource verlinkt auf die Lambda-Funktion mit ihrem ARN über `!GetAtt CFNWaiter.Arn`. Es wird eine Wartezeit von 60 Sekunden für Erstellungs- und Aktualisierungsvorgänge implementiert, wie in `ServiceTimeout`festgelegt. Die Ressource wird nur dann für einen Aktualisierungsvorgang aufgerufen, wenn die Eigenschaften geändert werden.

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-custom-resource-json"></a>

```
...
    "CFNWaiterCustomResource": {
      "Type": "AWS::CloudFormation::CustomResource",
      "Properties": {
        "ServiceToken": { "Fn::GetAtt": ["CFNWaiter", "Arn"] },
        "ServiceTimeout": 60
      }
    }
  },
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-custom-resource-yaml"></a>

```
...
  CFNWaiterCustomResource:
    Type: AWS::CloudFormation::CustomResource
    Properties:
      ServiceToken: !GetAtt CFNWaiter.Arn
      ServiceTimeout: 60
...
```

`Outputs`  
Die `Outputs` dieser Vorlage sind die `TimeWaited` und die `WaiterId`. Der `TimeWaited`-Wert verwendet eine `Fn::GetAtt`-Funktion, um die Zeit anzugeben, die die Kellnerressource tatsächlich gewartet hat. Die `WaiterId`-Funktion verwendet eine `Fn::GetAtt`-Funktion, um die eindeutige ID bereitzustellen, die erzeugt und mit der Ausführung verknüpft wurde.

### JSON
<a name="walkthrough-lambda-backed-custom-resources-sample-template-output-json"></a>

```
...
  "Outputs": {
    "TimeWaited": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "TimeWaited"] },
      "Export": { "Name": "TimeWaited" }
    },
    "WaiterId": {
      "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "Id"] },
      "Export": { "Name": "WaiterId" }
    }
  }
}
...
```

### YAML
<a name="walkthrough-lambda-backed-custom-resources-sample-template-output-yaml"></a>

```
...
Outputs:
  TimeWaited:
    Value: !GetAtt CFNWaiterCustomResource.TimeWaited
    Export:
      Name: TimeWaited
  WaiterId:
    Value: !GetAtt CFNWaiterCustomResource.Id
    Export:
      Name: WaiterId
...
```

## Voraussetzungen
<a name="walkthrough-lambda-backed-custom-resources-prerequisites"></a>

Sie benötigen IAM-Berechtigungen, um alle entsprechenden Dienste wie Lambda und verwenden zu können. CloudFormation

## Starten des Stapels
<a name="walkthrough-lambda-backed-custom-resources-createfunction-createstack"></a>

**So erstellen Sie den Stack**

1. Suchen Sie die gewünschte Vorlage (YAML oder JSON) aus dem Abschnitt [Beispielvorlage](#walkthrough-lambda-backed-custom-resources-sample-template) und speichern Sie sie auf Ihrem Rechner unter dem Namen `samplelambdabackedcustomresource.template`.

1. Öffnen Sie die CloudFormation Konsole unter. [https://console.aws.amazon.com/cloudformation/](https://console.aws.amazon.com/cloudformation/)

1. Wählen Sie auf der Seite **Stack** oben rechts **Stack erstellen** und dann **Mit neuen Ressourcen (Standard)**.

1. Für **Voraussetzung - Vorlage vorbereiten**wählen Sie **Vorhandene Vorlage auswählen**.

1. Für **Vorlage angeben**, wählen Sie **Eine Vorlagendatei hochladen**und dann **Datei auswählen**.

1. Wählen Sie die Vorlagendatei `samplelambdabackedcustomresource.template`, die Sie zuvor gespeichert haben.

1. Wählen Sie **Weiter** aus.

1. Für **Stapelname**, geben Sie **SampleCustomResourceStack** ein und wählen **Weiter**.

1. Für diese Anleitung müssen Sie keine Tags hinzufügen oder erweiterte Einstellungen angeben, wählen Sie daher **Weiter** aus.

1. Vergewissern Sie sich, dass der Name des Stapels korrekt ist, und wählen Sie dann **Erstellen**.

Es kann mehrere Minuten dauern CloudFormation , bis Ihr Stack erstellt ist. Betrachten Sie die Stack-Ereignisse, um den Fortschritt zu überwachen. Weitere Informationen finden Sie unter [Stack-Informationen von der CloudFormation Konsole aus anzeigen](cfn-console-view-stack-data-resources.md).

Wenn die Stack-Erstellung erfolgreich war, wurden alle Ressourcen im Stack, wie die Lambda-Funktion und die benutzerdefinierte Ressource, erstellt. Sie haben erfolgreich eine Lambda-Funktion und eine benutzerdefinierte Ressource verwendet.

Wenn die Lambda-Funktion einen Fehler zurückgibt, sehen Sie sich die Protokolle der Funktion in der CloudWatch [Logs-Konsole](https://console.aws.amazon.com/cloudwatch/home#logs:) an. Der Name des Protokollstreams ist die physische ID der benutzerdefinierten Ressource, die Sie durch Anzeigen der Ressourcen des Stacks finden können. Weitere Informationen finden Sie unter [Protokolldaten anzeigen](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#ViewingLogData) im * CloudWatch Amazon-Benutzerhandbuch*.

## Bereinigen von Ressourcen
<a name="walkthrough-lambda-backed-custom-resources-createfunction-cleanup"></a>

Löschen Sie den Stack, um alle Stack-Ressourcen zu bereinigen, die Sie erstellt haben, damit Ihnen keine unnötigen Ressourcen in Rechnung gestellt werden.

**So löschen Sie den Stack**

1. Wählen Sie in der CloudFormation Konsole den **SampleCustomResourceStack**Stack aus.

1. Wählen Sie die Option **Actions** und anschließend **Delete Stack** aus.

1. Wählen Sie im Bestätigungsdialogfeld **Yes, Delete** aus.

Alle erstellten Ressourcen werden gelöscht.

Da Sie nun wissen, wie Sie Lambda-gestützte benutzerdefinierte Ressourcen erstellen und verwenden können, können Sie die Beispielvorlage und den Code aus dieser Anleitung verwenden, um andere Stacks und Funktionen zu erstellen und mit ihnen zu experimentieren.

## Ähnliche Informationen
<a name="w2aac11c45b9c24b9c23"></a>
+ [CloudFormation Referenz für benutzerdefinierte Ressourcen](crpg-ref.md)
+ [AWS::CloudFormation::CustomResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-customresource.html)

# `cfn-response`-Modul
<a name="cfn-lambda-function-code-cfnresponsemodule"></a>

In Ihrer CloudFormation Vorlage können Sie eine Lambda-Funktion als Ziel einer benutzerdefinierten Ressource angeben. Wenn Sie die Eigenschaft `ZipFile` verwenden, um den-Quellcode Ihrer [Funktion](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html) anzugeben, können Sie das `cfn-response`-Modul laden, um Antworten von Ihrer Lambda-Funktion an eine benutzerdefinierte Ressource zu senden. Das Modul `cfn-response` ist eine Bibliothek, die das Senden von Antworten an die benutzerdefinierte Ressource, die Ihre Lambda-Funktion aufgerufen hat, vereinfacht. Das Modul verfügt über eine `send`-Methode, die ein-[Antwortobjekt](crpg-ref.md#crpg-ref-responses) über eine von Amazon S3 vorgegebene URL (die `ResponseURL`) an eine benutzerdefinierte Ressource sendet.

Das `cfn-response`-Modul ist nur verfügbar, wenn Sie die `ZipFile`-Eigenschaft verwenden, um Ihren Quell-Code zu schreiben. Es ist für Quellcode, der in Amazon S3-Buckets gespeichert wird, nicht verfügbar. Für Code in -Buckets müssen Sie eigene Funktionen schreiben um Antworten senden zu können.

**Anmerkung**  
Nach dem Ausführen der `send`-Methode wird die Lambda-Funktion beendet, und alles, was Sie nach dieser Methode schreiben, wird ignoriert.

## Laden des `cfn-response`-Moduls
<a name="cfn-lambda-function-code-cfnresponsemodule-loading"></a>

Verwenden Sie bei Node.js-Funktionen die `require()`-Funktion, um das `cfn-response`-Modul zu laden. Im folgenden Codebeispiel wird ein `cfn-response`-Objekt mit dem Namen `response` erstellt:

```
var response = require('cfn-response');
```

Verwenden Sie bei Python die `import`-Anweisung, um das `cfnresponse`-Modul zu laden, wie im folgenden Beispiel veranschaulicht:

**Anmerkung**  
Verwenden Sie genau dieses Import-Statement Wenn Sie andere Varianten desselben Import-Anweisung verwenden, beachtet CloudFormation das Antwortmodul nicht.

```
import cfnresponse
```

## Parameter für die `send`-Methode
<a name="cfn-lambda-function-code-cfnresponsemodule-send-parameters"></a>

Mit der `send`-Methode können Sie die folgenden Parameter verwenden.

`event`  
Die Felder in einer [benutzerdefinierten Ressourcenanforderung](crpg-ref.md#crpg-ref-requesttypes).

`context`  
Ein Objekt, das für Lambda-Funktionen festgelegt wurde und das Sie verwenden können, um festzulegen, wann die Funktion und alle Callbacks abschließend ausgeführt wurden, oder um aus der Lambda-Ausführungsumgebung auf Informationen zuzugreifen. Weitere Informationen finden Sie unter [Erstellen von Lambda-Funktionen mit Node.js](https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html) im *AWS Lambda -Entwicklerleitfaden*.

`responseStatus`  
Gibt an, ob die Funktion erfolgreich abgeschlossen wurde. Verwenden Sie die `cfnresponse`-Modulkonstanten, um den Status festzulegen: `SUCCESS` für erfolgreiche Ausführungen und `FAILED` für fehlgeschlagene Ausführungen.

`responseData`  
Das `Data`-Feld für ein benutzerdefiniertes Ressourcen-[Antwortobjekt](crpg-ref.md#crpg-ref-responses). Die Daten sind eine Liste von Name-Wert-Paaren.

`physicalResourceId`  
Optional. Die eindeutige Kennung der benutzerdefinierten Ressource, die die Funktion aufgerufen hat. Standardmäßig verwendet das Modul den Namen des Amazon CloudWatch Logs-Protokollstreams, der mit der Lambda-Funktion verknüpft ist.  
Der für eine `PhysicalResourceId` zurückgegebene Wert kann benutzerdefinierte Vorgänge zur Ressourcenaktualisierung ändern. Wenn der zurückgegebene Wert derselbe ist, wird es als normale Aktualisierung betrachtet. Wenn der zurückgegebene Wert anders ist, CloudFormation erkennt das Update als Ersatz und sendet eine Löschanforderung an die alte Ressource. Weitere Informationen finden Sie unter [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-customresource.html).

`noEcho`  
Optional. Gibt an, ob die Ausgabe der benutzerdefinierten Ressource maskiert wird, wenn sie mithilfe der Funktion `Fn::GetAtt` abgerufen wird. Wird „`true`“ festgelegt, werden alle zurückgegebenen Werte mit Sternchen (\$1\$1\$1\$1\$1) maskiert, mit Ausnahme der Informationen, die an den folgenden Speicherorten gespeichert sind. Dieser Wert ist standardmäßig `false`.  
Durch die Verwendung des `NoEcho`-Attributs werden keine Informationen maskiert, die im Folgenden gespeichert sind:  
+ Der `Metadata` Vorlagenbereich. CloudFormation transformiert, modifiziert oder redigiert keine Informationen, die Sie in den `Metadata` Abschnitt aufnehmen. Weitere Informationen finden Sie unter [Metadaten](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html).
+ Der `Outputs`-Vorlagenabschnitt. Weitere Informationen finden Sie unter [Ausgaben](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html):
+ Das `Metadata`-Attribut einer Ressourcendefinition. Weitere Informationen finden Sie unter [`Metadata`-Attribut](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html).
Es wird dringend empfohlen, diese Mechanismen nicht zu verwenden, um vertrauliche Informationen wie Passwörter oder Geheimnisse einzugeben.
Weitere Informationen über die Verwendung von `NoEcho` zur Maskierung sensibler Informationen finden Sie in der bewährten Methode [Keine Anmeldeinformationen in Vorlagen einbetten](security-best-practices.md#creds) .

## Beispiele
<a name="cfn-lambda-function-code-cfnresponsemodule-examples"></a>

### Node.js
<a name="cfn-lambda-function-code-zipfile-examplenodejs"></a>

Im folgenden Beispiel für Node.js verwendet die eingebettete Lambda-Funktion einen Eingabewert und multipliziert diesen mit 5. Eingebettete bzw. Inline-Funktionen sind besonders nützlich für kleinere Funktionen, da Sie den Quellcode hiermit direkt in einer Vorlage festlegen können, statt ein Paket zu erstellen und dieses in einen Amazon S3-Bucket hochzuladen. Die Funktion verwendet die `cfn-response` `send`-Methode zum Senden des Ergebnisses zurück an die benutzerdefinierte Ressource, die sie aufgerufen hat.

#### JSON
<a name="cfn-lambda-function-code-zipfile-examplenodejs.json"></a>

```
"ZipFile": { "Fn::Join": ["", [
  "var response = require('cfn-response');",
  "exports.handler = function(event, context) {",
  "  var input = parseInt(event.ResourceProperties.Input);",
  "  var responseData = {Value: input * 5};",
  "  response.send(event, context, response.SUCCESS, responseData);",
  "};"
]]}
```

#### YAML
<a name="cfn-lambda-function-code-zipfile-examplenodejs-yaml"></a>

```
ZipFile: >
  var response = require('cfn-response');
  exports.handler = function(event, context) {
    var input = parseInt(event.ResourceProperties.Input);
    var responseData = {Value: input * 5};
    response.send(event, context, response.SUCCESS, responseData);
  };
```

### Python
<a name="cfn-lambda-function-code-zipfile-examplepython"></a>

Im folgenden Beispiel für Python verwendet die Lambda-Inline-Funktion einen Ganzzahlwert und multipliziert diesen mit 5.

#### JSON
<a name="cfn-lambda-function-code-zipfile-examplepython.json"></a>

```
"ZipFile" : { "Fn::Join" : ["\n", [
  "import json",
  "import cfnresponse",
  "def handler(event, context):",
  "   responseValue = int(event['ResourceProperties']['Input']) * 5",
  "   responseData = {}",
  "   responseData['Data'] = responseValue",
  "   cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, \"CustomResourcePhysicalID\")"
]]}
```

#### YAML
<a name="cfn-lambda-function-code-zipfile-examplepython.yaml"></a>

```
ZipFile: |
  import json
  import cfnresponse
  def handler(event, context):
    responseValue = int(event['ResourceProperties']['Input']) * 5
    responseData = {}
    responseData['Data'] = responseValue
    cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, "CustomResourcePhysicalID")
```

## Modul-Quellcode
<a name="cfn-lambda-function-code-cfnresponsemodule-source"></a>

**Topics**
+ [Asynchroner Node.js Quellcode](#cfn-lambda-function-code-cfnresponsemodule-source-nodejs-async)
+ [Node.js Quellcode](#cfn-lambda-function-code-cfnresponsemodule-source-nodejs)
+ [Python Quellcode](#cfn-lambda-function-code-cfnresponsemodule-source-python)

### Asynchroner Node.js Quellcode
<a name="cfn-lambda-function-code-cfnresponsemodule-source-nodejs-async"></a>

Im Folgenden finden Sie den Quellcode des Antwortmoduls für die Node.js-Funktionen, wenn der Handler asynchron ist. Überprüfen Sie den Code, um zu verstehen, was das Modul tut, und um die Implementierung in Ihre eigenen Antwortfunktionen zu vereinfachen.

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT-0

exports.SUCCESS = "SUCCESS";
exports.FAILED = "FAILED";

exports.send = function(event, context, responseStatus, responseData, physicalResourceId, noEcho) {

    return new Promise((resolve, reject) => {
        var responseBody = JSON.stringify({
            Status: responseStatus,
            Reason: "See the details in CloudWatch Log Stream: " + context.logStreamName,
            PhysicalResourceId: physicalResourceId || context.logStreamName,
            StackId: event.StackId,
            RequestId: event.RequestId,
            LogicalResourceId: event.LogicalResourceId,
            NoEcho: noEcho || false,
            Data: responseData
        });

        console.log("Response body:\n", responseBody);

        var https = require("https");
        var url = require("url");

        var parsedUrl = url.parse(event.ResponseURL);
        var options = {
            hostname: parsedUrl.hostname,
            port: 443,
            path: parsedUrl.path,
            method: "PUT",
            headers: {
                "content-type": "",
                "content-length": responseBody.length
            }
        };

        var request = https.request(options, function(response) {
            console.log("Status code: " + parseInt(response.statusCode));
            resolve(context.done());
        });

        request.on("error", function(error) {
            console.log("send(..) failed executing https.request(..): " + maskCredentialsAndSignature(error));
            reject(context.done(error));
        });

        request.write(responseBody);
        request.end();
    })
}
 
function maskCredentialsAndSignature(message) {
    return message.replace(/X-Amz-Credential=[^&\s]+/i, 'X-Amz-Credential=*****')
        .replace(/X-Amz-Signature=[^&\s]+/i, 'X-Amz-Signature=*****');
}
```

### Node.js Quellcode
<a name="cfn-lambda-function-code-cfnresponsemodule-source-nodejs"></a>

Im Folgenden finden Sie den Quellcode des Antwortmoduls für die Node.js-Funktionen, wenn der Handler nicht asynchron ist. Überprüfen Sie den Code, um zu verstehen, was das Modul tut, und um die Implementierung in Ihre eigenen Antwortfunktionen zu vereinfachen.

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT-0
 
exports.SUCCESS = "SUCCESS";
exports.FAILED = "FAILED";

exports.send = function(event, context, responseStatus, responseData, physicalResourceId, noEcho) {

    var responseBody = JSON.stringify({
        Status: responseStatus,
        Reason: "See the details in CloudWatch Log Stream: " + context.logStreamName,
        PhysicalResourceId: physicalResourceId || context.logStreamName,
        StackId: event.StackId,
        RequestId: event.RequestId,
        LogicalResourceId: event.LogicalResourceId,
        NoEcho: noEcho || false,
        Data: responseData
    });

    console.log("Response body:\n", responseBody);

    var https = require("https");
    var url = require("url");

    var parsedUrl = url.parse(event.ResponseURL);
    var options = {
        hostname: parsedUrl.hostname,
        port: 443,
        path: parsedUrl.path,
        method: "PUT",
        headers: {
            "content-type": "",
            "content-length": responseBody.length
        }
    };

    var request = https.request(options, function(response) {
        console.log("Status code: " + parseInt(response.statusCode));
        context.done();
    });

    request.on("error", function(error) {
        console.log("send(..) failed executing https.request(..): " + maskCredentialsAndSignature(error));
        context.done();
    });

    request.write(responseBody);
    request.end();
}
```

### Python Quellcode
<a name="cfn-lambda-function-code-cfnresponsemodule-source-python"></a>

Im Folgenden finden Sie den Quellcode des Antwortmoduls für Python-Funktionen:

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0
 
from __future__ import print_function
import urllib3
import json
import re

SUCCESS = "SUCCESS"
FAILED = "FAILED"

http = urllib3.PoolManager()


def send(event, context, responseStatus, responseData, physicalResourceId=None, noEcho=False, reason=None):
    responseUrl = event['ResponseURL']

    responseBody = {
        'Status' : responseStatus,
        'Reason' : reason or "See the details in CloudWatch Log Stream: {}".format(context.log_stream_name),
        'PhysicalResourceId' : physicalResourceId or context.log_stream_name,
        'StackId' : event['StackId'],
        'RequestId' : event['RequestId'],
        'LogicalResourceId' : event['LogicalResourceId'],
        'NoEcho' : noEcho,
        'Data' : responseData
    }

    json_responseBody = json.dumps(responseBody)

    print("Response body:")
    print(json_responseBody)

    headers = {
        'content-type' : '',
        'content-length' : str(len(json_responseBody))
    }

    try:
        response = http.request('PUT', responseUrl, headers=headers, body=json_responseBody)
        print("Status code:", response.status)


    except Exception as e:

        print("send(..) failed executing http.request(..):", mask_credentials_and_signature(e))
 
 
def mask_credentials_and_signature(message):
    message = re.sub(r'X-Amz-Credential=[^&\s]+', 'X-Amz-Credential=*****', message, flags=re.IGNORECASE)
    return re.sub(r'X-Amz-Signature=[^&\s]+', 'X-Amz-Signature=*****', message, flags=re.IGNORECASE)
```

# Führen Sie eine benutzerdefinierte Verarbeitung von CloudFormation Vorlagen mit Vorlagenmakros durch
<a name="template-macros"></a>

Mit Makros können Sie benutzerdefinierte Verarbeitungsvorgänge für Vorlagen durchführen, von einfachen Aktionen wie find-and-replace Operationen bis hin zu umfangreichen Transformationen ganzer Vorlagen.

Um sich ein Bild von der Bandbreite der Möglichkeiten zu machen, sollten Sie sich die `AWS::Serverless` Transformationen `AWS::Include` und die Transformationen ansehen. Dabei handelt es sich um Makros, die von folgenden Anbietern bereitgestellt werden: CloudFormation
+ [AWS::Include transform](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html) ermöglicht es Ihnen, Boilerplate-Vorlagenschnipsel in Ihre Vorlagen einzufügen.
+ [AWS::Serverlesstransform verwendet](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-serverless.html) eine gesamte Vorlage, die in der AWS SAM-Syntax ( AWS Serverless Application Model) geschrieben ist, transformiert und erweitert sie in eine konforme Vorlage. CloudFormation [Weitere Informationen zu serverlosen Anwendungen finden Sie AWS Serverless Application Model im AWS SAM Entwicklerhandbuch.](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html)

**Topics**
+ [Fakturierung](#template-macros-billing)
+ [Makrobeispiele](#template-macros-examples-list)
+ [Zugehörige Ressourcen](#template-macros-related-resources)
+ [Überblick über CloudFormation Makros](template-macros-overview.md)
+ [Erstellen Sie eine CloudFormation Makrodefinition](template-macros-author.md)
+ [Beispiel für ein einfaches Makro zur Ersetzung von Strings](macros-example.md)
+ [Fehlersuche in der verarbeiteten Vorlage](template-macros-troubleshoot-processed-template.md)

## Fakturierung
<a name="template-macros-billing"></a>

Wenn ein Makro ausgeführt wird, werden dem Besitzer der Lambda-Funktion alle mit der Ausführung dieser Funktion verbundenen Kosten in Rechnung gestellt.

Die `AWS::Serverless` Transformationen `AWS::Include` und sind Makros, die von gehostet werden. CloudFormation Ihre Nutzung ist kostenlos.

## Makrobeispiele
<a name="template-macros-examples-list"></a>

[Zusätzlich zu den Beispielen in diesem Abschnitt finden Sie in unserem Repository Beispielmakros, einschließlich Quellcode und Vorlagen. GitHub ](https://github.com/aws-cloudformation/aws-cloudformation-templates/tree/main/CloudFormation/MacrosExamples) Diese Beispiele werden "wie besehen" für Schulungszwecke zur Verfügung gestellt.

## Zugehörige Ressourcen
<a name="template-macros-related-resources"></a>
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-macro.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-macro.html)
+ [CloudFormation TransformAbschnitt „Vorlage“](transform-section-structure.md)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-transform.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-transform.html)
+ [AWS::Serverless-Transformation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-serverless.html)
+ [AWS::Include-Transformation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html)

# Überblick über CloudFormation Makros
<a name="template-macros-overview"></a>

Die Bearbeitung von Vorlagen mit Makros besteht aus zwei wesentlichen Schritten: Erstellen des Makros selbst und dann Verwenden des Makros, um die Verarbeitung Ihrer Vorlagen durchzuführen.

Um eine Makrodefinition zu erstellen, müssen Sie Folgendes erstellen:
+ Eine Lambda-Funktion, die die Verarbeitung der Vorlage durchführt. Diese Lambda-Funktion akzeptiert entweder einen Ausschnitt oder eine ganze Vorlage und alle zusätzlichen Parameter, die Sie definieren. Sie gibt den bearbeiteten Vorlagenausschnitt oder die gesamte Vorlage als Antwort zurück.
+ Eine Ressource vom Typ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-macro.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-macro.html), die es Benutzern ermöglicht, die Lambda-Funktion aus CloudFormation Vorlagen heraus aufzurufen. Diese Ressource spezifiziert den ARN der Lambda-Funktion, die für dieses Makro aufgerufen werden soll, und zusätzliche optionale Eigenschaften, die beim Debuggen helfen. Um diese Ressource in einem Konto zu erstellen, erstellen Sie eine Vorlage, die die `AWS::CloudFormation::Macro` Ressource enthält, und erstellen Sie dann entweder einen Stack oder ein Stack-Set mit selbstverwalteten Berechtigungen aus der Vorlage. CloudFormation StackSetsunterstützt derzeit nicht das Erstellen oder Aktualisieren von Stack-Sets mit vom Dienst verwalteten Berechtigungen anhand von Vorlagen, die auf Makros verweisen.

Um ein Makro zu verwenden, referenzieren Sie das Makro in Ihrer Vorlage:
+ Um einen Abschnitt oder einen Teil einer Vorlage zu bearbeiten, referenzieren Sie das Makro in einer `Fn::Transform`-Funktion, die sich relativ zu dem Inhalt der Vorlage befindet, den Sie umwandeln möchten. Bei Verwendung von `Fn::Transform` können Sie außerdem beliebige Parameter übergeben.
+ Um eine gesamte Vorlage zu bearbeiten, referenzieren Sie das Makro im Abschnitt [Transform](transform-section-structure.md) der Vorlage.

Als Nächstes erstellen Sie normalerweise einen Änderungssatz und führen diesen aus. (Durch die Verarbeitung von Makros können mehrere Ressourcen hinzugefügt werden, die Ihnen möglicherweise nicht bekannt sind. Um sicherzustellen, dass Sie alle durch Makros eingeführten Änderungen kennen, wird dringend empfohlen, Änderungssätze zu verwenden.) CloudFormation übergibt den angegebenen Vorlageninhalt zusammen mit allen zusätzlich angegebenen Parametern an die in der Makro-Ressource angegebene Lambda-Funktion. Die Lambda-Funktion gibt den bearbeiteten Vorlageninhalt zurück, sei es ein Ausschnitt oder eine ganze Vorlage.

Nachdem alle Makros in der Vorlage aufgerufen wurden, wird ein Änderungssatz CloudFormation generiert, der den verarbeiteten Vorlageninhalt enthält. Nachdem Sie den Änderungssatz überprüft haben, führen Sie ihn aus, um die Änderungen anzuwenden.

![\[Verwenden Sie die intrinsische Funktion Fn::Transform oder den Abschnitt Transform der Vorlage, um den Vorlageninhalt und die zugehörigen Parameter an die dem Makro zugrunde liegende Lambda-Funktion zu übergeben, die den verarbeiteten Vorlageninhalt zurückgibt.\]](http://docs.aws.amazon.com/de_de/AWSCloudFormation/latest/UserGuide/images/template-macro-use.png)


## Wie Sie Stapel direkt erstellen
<a name="template-macros-change-sets"></a>

Um einen Stack mit einer Vorlage zu erstellen oder zu aktualisieren, die auf Makros verweist, erstellen Sie normalerweise einen Änderungssatz und führen ihn dann aus. Ein Änderungssatz beschreibt die Aktionen, die CloudFormation basierend auf der verarbeiteten Vorlage ausführen wird. Verarbeitungsmakros können mehrere Ressourcen hinzufügen, die Ihnen möglicherweise nicht bekannt sind. Um sicherzustellen, dass Sie alle Änderungen kennen, die durch Makros eingeführt werden, wird dringend die Verwendung von Änderungssätzen empfohlen. Nachdem Sie den Änderungssatz überprüft haben, können Sie ihn ausführen, um die Änderungen tatsächlich anzuwenden.

Ein Makro kann Ihrer Vorlage IAM-Ressourcen hinzufügen. Für diese Ressourcen erfordert CloudFormation, dass Sie [ihre Funktionen angeben](control-access-with-iam.md#using-iam-capabilities). Da Sie vor der Verarbeitung Ihrer Vorlage nicht wissen CloudFormation können, welche Ressourcen hinzugefügt wurden, müssen Sie bei der Erstellung des Änderungssatzes möglicherweise die IAM-Funktionen bestätigen, je nachdem, ob die referenzierten Makros IAM-Ressourcen enthalten. Wenn Sie den Änderungssatz ausführen, CloudFormation verfügt er auf diese Weise über die erforderlichen Funktionen, um IAM-Ressourcen zu erstellen.

Um einen Stack direkt aus einer verarbeiteten Vorlage zu erstellen oder zu aktualisieren, ohne zuvor die vorgeschlagenen Änderungen in einem Änderungssatz zu prüfen, geben Sie bei einer `CreateStack`- oder `UpdateStack`-Anfrage die `CAPABILITY_AUTO_EXPAND`-Fähigkeit an. Sie sollten Stacks nur dann direkt von einer Stack-Vorlage mit Makros erstellen, wenn Sie wissen, welche Verarbeitungsschritte das Makro ausführt. Sie können Änderungssätze nicht mit Stack-Set-Makros verwenden; Sie müssen Ihr Stack-Set direkt aktualisieren.

Weitere Informationen finden Sie unter [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html) oder [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStack.html) in der *AWS CloudFormation API-Referenz*.

**Wichtig**  
Wenn Ihre Stack-Set-Vorlage auf ein oder mehrere Makros verweist, müssen Sie das Stack-Set direkt aus der verarbeiteten Vorlage erstellen, ohne vorher die resultierenden Änderungen in einem Änderungssatz zu überprüfen. Verarbeitungsmakros können mehrere Ressourcen hinzufügen, die Ihnen möglicherweise nicht bekannt sind. Bevor Sie einen Stack-Set aus einer Vorlage erstellen oder aktualisieren, die direkt auf Makros verweist, sollten Sie sicherstellen, dass Sie wissen, welche Verarbeitung die Makros ausführen.

Um die Anzahl der Schritte beim Starten von Stacks aus Vorlagen, die auf Makros verweisen, zu reduzieren, können Sie die `package` Befehle und verwenden. `deploy` AWS CLI Weitere Informationen erhalten Sie unter [Laden Sie lokale Artefakte in einen S3-Bucket hoch mit dem AWS CLI](using-cfn-cli-package.md) und [Erstellen Sie einen Stapel, der Transformationen enthält](service_code_examples.md#deploy-sdk).

## Überlegungen
<a name="template-macros-considerations"></a>

Wenn Sie mit Makros arbeiten, beachten Sie bitte die folgenden Hinweise und Einschränkungen:
+ Makros werden nur dort unterstützt AWS-Regionen , wo Lambda verfügbar ist. Eine Liste der Regionen, in denen Lambda verfügbar ist, finden Sie unter [AWS Lambda Endpunkte und Kontingente](https://docs.aws.amazon.com/general/latest/gr/lambda-service.html).
+ Alle verarbeiteten Vorlagenausschnitte müssen gültiges -JSON sein.
+ Alle verarbeiteten Vorlagenausschnitte müssen Validierungsprüfungen für eine Stack-Erstellung, Stack-Aktualisierung, Stack-Set-Erstellung oder einen Stack-Set-Aktualisierungs-Vorgang durchlaufen.
+ CloudFormation löst zuerst Makros auf und verarbeitet dann die Vorlage. Die resultierende Vorlage muss gültiger JSON-Code sein und darf nicht größer als das Vorlagengrößenlimit sein.
+ Aufgrund der Reihenfolge, in der Elemente in einer Vorlage CloudFormation verarbeitet werden, kann ein Makro keine Module in den verarbeiteten Vorlageninhalt aufnehmen, zu dem es zurückkehrt. CloudFormation Weitere Informationen finden Sie unter [Makro-Bewertungsreihenfolge](template-macros-author.md#template-macros-order).
+ Wenn Sie die Funktion zum Aktualisieren des Rollbacks verwenden, CloudFormation wird eine Kopie der Originalvorlage verwendet. Es wird ein Rollback auf die ursprüngliche Vorlage ausgeführt, selbst wenn der Codeausschnitt geändert wurde.
+ Das Einfügen von Makros innerhalb von Makros funktioniert nicht, da wir Makros nicht rekursiv verarbeiten.
+ Die intrinsische `Fn::ImportValue`-Funktion wird derzeit in Makros nicht unterstützt.
+ Die in der Vorlage enthaltenen intrinsischen Funktionen werden nach allen Makros ausgewertet. Daher können die von Ihrem Makro zurückgegebenen verarbeiteten Vorlageninhalte Aufrufe von intrinsischen Funktionen beinhalten, die wie gewohnt ausgewertet werden.
+ StackSets unterstützt derzeit nicht das Erstellen oder Aktualisieren von Stack-Sets mit vom Service verwalteten Berechtigungen anhand von Vorlagen, die auf Makros verweisen. CloudFormation

## Umfang und Berechtigungen des Makrokontos
<a name="template-macros-permissions"></a>

Makros können Sie nur in dem Konto verwenden, in dem sie als Ressource angelegt wurden. Der Name des Makros muss innerhalb eines bestimmten Kontos eindeutig sein. Sie können jedoch die gleiche Funktionalität in mehreren Konten zur Verfügung stellen, indem Sie den kontenübergreifenden Zugriff auf die zugrundeliegende Lambda-Funktion aktivieren und dann Makrodefinitionen erstellen, die sich in mehreren Konten auf diese Funktion beziehen. Im folgenden Beispiel enthalten drei Konten Makrodefinitionen, die jeweils auf dieselbe Lambda-Funktion verweisen.

![\[Indem Sie den kontoübergreifenden Zugriff auf die Lambda-Funktion zulassen, AWS können Sie Makros in mehreren Konten erstellen, die auf diese Funktion verweisen.\]](http://docs.aws.amazon.com/de_de/AWSCloudFormation/latest/UserGuide/images/template-macro-accounts.png)


Um eine Makrodefinition zu erstellen, muss der Benutzer die Berechtigung haben, einen Stack oder Stack-Set innerhalb des angegebenen Kontos zu erstellen.

 CloudFormation Um ein in einer Vorlage enthaltenes Makro erfolgreich ausführen zu können, muss der Benutzer über `Invoke` Berechtigungen für die zugrunde liegende Lambda-Funktion verfügen. Um eine mögliche Eskalation von Berechtigungen zu verhindern, gibt sich bei der CloudFormation Ausführung des Makros die Identität des Benutzers aus.

Weitere Informationen finden Sie unter [Verwalten von Berechtigungen in AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-permissions.html) im *AWS Lambda Entwicklerhandbuch* und [Aktionen, Ressourcen und Bedingungsschlüssel für AWS Lambda](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awslambda.html) in der *Service Authorization Reference*.

# Erstellen Sie eine CloudFormation Makrodefinition
<a name="template-macros-author"></a>

Wenn Sie eine Makrodefinition erstellen, macht die Makrodefinition die zugrunde liegende Lambda-Funktion im angegebenen Konto verfügbar, sodass sie zur Verarbeitung der Vorlagen CloudFormation aufgerufen wird.

## Ereignis-Mapping
<a name="template-macros-event-mapping"></a>

Wenn die Lambda-Funktion eines Makros CloudFormation aufgerufen wird, sendet es eine Anfrage im JSON-Format mit der folgenden Struktur:

```
{
    "region" : "us-east-1",
    "accountId" : "$ACCOUNT_ID",
    "fragment" : { ... },
    "transformId" : "$TRANSFORM_ID",
    "params" : { ... },
    "requestId" : "$REQUEST_ID",
    "templateParameterValues" : { ... }
}
```
+ `region`

  Die Region, in der sich das Makro befindet.
+ `accountId`

  Die Konto-ID des Kontos, von dem aus das Makro die Lambda-Funktion aufruft.
+ `fragment`

  Der Vorlageninhalt, der für die benutzerdefinierte Verarbeitung zur Verfügung steht, im JSON-Format.
  + Bei Makros, die im Vorlagenabschnitt `Transform` enthalten sind, ist dies die gesamte Vorlage mit Ausnahme des Abschnitts `Transform`.
  + Bei Makros, die in einem intrinsischen `Fn::Transform`-Funktionsaufruf enthalten sind, sind dies alle Geschwisterknoten (und ihre Unterknoten), basierend auf der Position der intrinsischen Funktion innerhalb der Vorlage, mit Ausnahme der `Fn::Transform` Funktion. Weitere Informationen finden Sie unter [Umfang der Makro-Vorlage](#template-macros-scope).
+ `transformId`

  Der Name des Makros, das diese Funktion aufruft.
+ `params`

  Bei `Fn::Transform` Funktionsaufrufen alle angegebenen Parameter für die Funktion. CloudFormation wertet diese Parameter nicht aus, bevor sie an die Funktion übergeben werden.

  Für Makros, die im Vorlagenabschnitt `Transform` enthalten sind, ist dieser Abschnitt leer.
+ `requestId`

  Die ID der Anforderung, die diese Funktion aufruft.
+ `templateParameterValues`

  Alle im [Parameters](parameters-section-structure.md) Abschnitt der Vorlage angegebenen Parameter. CloudFormation wertet diese Parameter aus, bevor sie an die Funktion übergeben werden.

## Reaktionsformat
<a name="template-macros-response-format"></a>

CloudFormation erwartet, dass die Lambda-Funktion eine Antwort im folgenden JSON-Format zurückgibt:

```
{
    "requestId" : "$REQUEST_ID",
    "status" : "$STATUS",
    "fragment" : { ... },
    "errorMessage": "optional error message for failures"
}
```
+ `requestId`

  Die ID der Anforderung, die diese Funktion aufruft. Diese muss mit der Anforderungs-ID übereinstimmen, die CloudFormation beim Aufrufen der Funktion angegeben wurde.
+ `status`

  Der Status der Anforderung (Groß- und Kleinschreibung wird nicht berücksichtigt). Sollte auf gesetzt sein. `success` CloudFormation behandelt jede andere Antwort als Fehler.
+ `fragment`

  Der Inhalt der verarbeiteten Vorlage CloudFormation , der in die verarbeitete Vorlage aufgenommen werden soll, einschließlich gleichgeordneter Elemente. CloudFormation ersetzt den Vorlageninhalt, der an die Lambda-Funktion übergeben wird, durch das Vorlagenfragment, das es in der Lambda-Antwort empfängt.

  Der Inhalt der verarbeiteten Vorlage muss gültiges JSON sein und seine Aufnahme in die verarbeitete Vorlage muss zu einer gültigen Vorlage führen.

  Wenn Ihre Funktion den Vorlageninhalt, den CloudFormation an sie übergibt, nicht verändert, Sie diesen Inhalt aber dennoch in die bearbeitete Vorlage aufnehmen müssen, muss Ihre Funktion diesen Vorlageninhalt in ihrer Antwort an CloudFormation zurückgeben.
+ `errorMessage`

  Die Fehlermeldung, die erklärt, warum die Transformation fehlgeschlagen ist. CloudFormation zeigt diese Fehlermeldung im Bereich **Ereignisse** der Seite **Stack-Details** für Ihren Stack an.

  Beispiel:

  ```
  Error creating change set: Transform
                              AWS-Konto account
                              number::macro name failed with:
                              error message string.
  ```

## Erstellen Sie eine Makrodefinition
<a name="create-a-macro-definition"></a>

**Um eine Makrodefinition zu erstellen CloudFormation**

1. [Erstellen Sie eine Lambda-Funktion](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html) die die Verarbeitung der Vorlageninhalte übernimmt. Es kann jeden Teil einer Vorlage verarbeiten, bis hin zur gesamten Vorlage. 

1. Erstellen Sie eine CloudFormation Vorlage, die einen `AWS::CloudFormation::Macro` Ressourcentyp enthält, und geben Sie die `FunctionName` Eigenschaften `Name` und an. Die `FunctionName` Eigenschaft muss den ARN der Lambda-Funktion enthalten, die aufgerufen werden soll, wenn das Makro CloudFormation ausgeführt wird.

1. (Optional) Um die Fehlersuche zu erleichtern, können Sie beim Erstellen des Ressourcentyps `AWS::CloudFormation::Macro` für Ihr Makro auch die Eigenschaften `LogGroupName` und `LogRoleArn` angeben. Mit diesen Eigenschaften können Sie die Protokollgruppe CloudWatch Logs angeben, an die Fehlerprotokollierungsinformationen CloudFormation gesendet werden, wenn die dem Makro zugrunde liegende Lambda-Funktion aufgerufen wird, und die Rolle CloudFormation sollte beim Senden von Logeinträgen an diese Logs übernommen werden.

1. [Erstellen Sie einen Stapel](cfn-console-create-stack.md) unter Verwendung der Vorlage mit dem Makro in dem Konto, in dem Sie es verwenden möchten. Oder [erstellen Sie ein Stack-Set mit selbstverwalteten Berechtigungen](stacksets-getting-started-create-self-managed.md) unter Verwendung der Vorlage mit dem Makro im Administratorkonto und erstellen Sie dann Stack-Instances in den Zielkonten.

1. Nachdem CloudFormation die Stacks, die die Makrodefinition enthalten, erfolgreich erstellt wurden, kann das Makro innerhalb dieser Konten verwendet werden. Sie verwenden ein Makro, indem Sie es in einer Vorlage an der Stelle referenzieren, die für die zu bearbeitenden Vorlageninhalte relevant ist.

## Umfang der Makro-Vorlage
<a name="template-macros-scope"></a>

Makros, die im Abschnitt `Transform` einer Vorlage referenziert werden, können den gesamten Inhalt dieser Vorlage verarbeiten.

Makros, die in einer `Fn::Transform`-Funktion referenziert werden, können den Inhalt eines beliebigen der Geschwisterelemente (einschließlich untergeordneter) der `Fn::Transform`-Funktion in der Vorlage verarbeiten.

Beispielsweise kann `AWS::Include` im untenstehenden Vorlagenbeispiel die `MyBucket`-Eigenschaften verarbeiten, basierend auf der Position der `Fn::Transform`-Funktion, die sie enthält. `MyMacro` kann den Inhalt der gesamten Vorlage verarbeiten, da sie in den Abschnitt `Transform` aufgenommen wurde.

```
# Start of processable content for MyMacro
AWSTemplateFormatVersion: 2010-09-09 
 Transform: [MyMacro]
 Resources:
    WaitCondition:
      Type: AWS::CloudFormation::WaitCondition
    MyBucket:
      Type: AWS::S3::Bucket
      # Start of processable content for AWS::Include
      Properties:
        BucketName: amzn-s3-demo-bucket1
        Tags: [{"key":"value"}] 
        'Fn::Transform':
          - Name: 'AWS::Include'
              Parameters:
                Location: s3://amzn-s3-demo-bucket2/MyFileName.yaml
        CorsConfiguration: []
        # End of processable content for AWS::Include
    MyEc2Instance:
      Type: AWS::EC2::Instance
      Properties:
        ImageID: ami-1234567890abcdef0
# End of processable content for MyMacro
```

## Makro-Bewertungsreihenfolge
<a name="template-macros-order"></a>

Sie können in einer bestimmten Vorlage auf mehrere Makros verweisen, einschließlich Transformationen, die von bereitgestellt werden CloudFormation, z. B. auf und. [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html)

Makros werden so ausgewertet, dass sie aufgrund ihrer Position in der Vorlage von den am tiefsten verschachtelten nach außen bis zu den allgemeinsten reichen. Makros an derselben Stelle in der Vorlage werden seriell anhand der Reihenfolge, in der sie aufgelistet sind, ausgewertet.

Transformationen wie `AWS::Include` und `AWS::Transform` werden in Bezug auf die Reihenfolge und den Anwendungsbereich wie alle anderen Makros behandelt.

Im nachfolgenden Vorlagenbeispiel wird beispielsweise das `PolicyAdder` Makro zuerst CloudFormation ausgewertet, da es sich dabei um das am tiefsten verschachtelte Makro in der Vorlage handelt. CloudFormation führt dann `MyMacro` vor der Auswertung eine Auswertung durch, `AWS::Serverless` da es bereits im Abschnitt aufgeführt ist. `AWS::Serverless` `Transform`

```
AWSTemplateFormatVersion: 2010-09-09
 Transform: [MyMacro, AWS::Serverless]
 Resources:
    WaitCondition:
      Type: AWS::CloudFormation::WaitCondition
    MyBucket:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: amzn-s3-demo-bucket
        Tags: [{"key":"value"}]
        'Fn::Transform':
          - Name: PolicyAdder
        CorsConfiguration: []
    MyEc2Instance:
      Type: AWS::EC2::Instance
      Properties:
        ImageID: ami-1234567890abcdef0
```

# Beispiel für ein einfaches Makro zur Ersetzung von Strings
<a name="macros-example"></a>

Das folgende Beispiel führt Sie durch den Prozess der Verwendung von Makros, von der Definition des Makros in einer Vorlage über die Erstellung einer Lambda-Funktion für das Makro bis hin zur Verwendung des Makros in einer Vorlage.

In diesem Beispiel erstellen wir ein einfaches Makro, das die angegebene Zeichenfolge anstelle des angegebenen Zielinhalts in die verarbeitete Vorlage einfügt. Dann fügen wir damit ein leeres `WaitHandleCondition` an der angegebenen Stelle in der bearbeiteten Vorlage ein.

## Ein Makro erstellen
<a name="macros-example-definiton"></a>

Bevor wir ein Makro verwenden, müssen wir zunächst zwei Dinge erledigen: die Lambda-Funktion erstellen, die die gewünschte Vorlagenverarbeitung durchführt, und dann diese Lambda-Funktion verfügbar machen, CloudFormation indem wir eine Makrodefinition erstellen.

Die folgende Beispielvorlage enthält die Definition für unser Beispielmakro. Um das Makro in einem bestimmten Format verfügbar zu machen AWS-Konto, erstellen Sie einen Stack aus der Vorlage. Die Makrodefinition gibt den Makronamen und eine kurze Beschreibung an und verweist auf den ARN der Lambda-Funktion, die CloudFormation aufgerufen wird, wenn dieses Makro in einer Vorlage verwendet wird. (Wir haben keine `LogGroupName`- oder `LogRoleARN`-Eigenschaft für die Fehlerprotokollierung eingefügt). 

In diesem Beispiel nehmen wir an, dass der mit dieser Vorlage erstellte Stapel den Namen `JavaMacroFunc`trägt. Da die Makroeigenschaft `Name` auf den Stapelnamen gesetzt ist, heißt das resultierende Makro auch `JavaMacroFunc` .

```
AWSTemplateFormatVersion: 2010-09-09
  Resources:
    Macro:
      Type: AWS::CloudFormation::Macro
      Properties:
        Name: !Sub '${AWS::StackName}'
        Description: Adds a blank WaitConditionHandle named WaitHandle
        FunctionName: 'arn:aws:lambda:us-east-1:012345678910:function:JavaMacroFunc'
```

## Das Makro verwenden
<a name="macros-example-usage"></a>

Um unser Makro zu verwenden, fügen wir es in eine Vorlage ein, indem wir die intrinsische Funktion `Fn::Transform` verwenden.

 CloudFormation Ruft unser Beispielmakro auf, wenn wir mit der folgenden Vorlage einen Stack erstellen. Die zugrundeliegende Lambda-Funktion ersetzt eine angegebene Zeichenfolge durch eine andere angegebene Zeichenfolge. In diesem Fall ergibt sich daraus eine leere `AWS::CloudFormation::WaitConditionHandle`-Eigenschaft, die in die verarbeitete Vorlage eingefügt wird.

```
Parameters:
  ExampleParameter:
    Type: String
    Default: 'SampleMacro'

Resources:
  2a:
    Fn::Transform:
      Name: "JavaMacroFunc"
      Parameters:
        replacement: 'AWS::CloudFormation::WaitConditionHandle'
        target: '$$REPLACEMENT$$'
    Type: '$$REPLACEMENT$$'
```
+ Das aufzurufende Makro wird als `JavaMacroFunc`angegeben, das aus dem vorherigen Makrodefinitionsbeispiel stammt.
+ Dem Makro werden zwei Parameter, `target` und `replacement`, übergeben, die die Zielzeichenfolge und ihren gewünschten Ersatzwert darstellen.
+ Das Makro kann auf den Inhalt des `Type`-Knotens zugreifen, da `Type` ein Geschwisterelement der `Fn::Transform`-Funktion ist, das sich auf das Makro bezieht.
+ Die resultierende `AWS::CloudFormation::WaitConditionHandle`-Eigenschaft wird als `2a` benannt.
+ Die Vorlage enthält auch einen Vorlagenparameter (`ExampleParameter`), auf den das Makro ebenfalls Zugriff hat (in diesem Fall aber nicht verwendet wird).

## Lambda-Eingabedaten
<a name="macros-example-request"></a>

Wenn unsere Beispielvorlage während der Stack-Erstellung CloudFormation verarbeitet wird, übergibt sie die folgende Event-Mapping an die Lambda-Funktion, auf die in der `JavaMacroFunc` Makrodefinition verwiesen wird.
+ `region` : `us-east-1`
+ `accountId` : `012345678910`
+ `fragment` :

  ```
  {
    "Type": "$$REPLACEMENT$$"
  }
  ```
+ `transformId` : `012345678910::JavaMacroFunc`
+ `params` : 

  ```
  {
      "replacement": "AWS::CloudFormation::WaitConditionHandle",
      "target": "$$REPLACEMENT$$"
  }
  ```
+ `requestId` : `5dba79b5-f117-4de0-9ce4-d40363bfb6ab`
+ `templateParameterValues` :

  ```
  {
      "ExampleParameter": "SampleMacro"
  }
  ```

`fragment` enthält JSON, das das Vorlagenfragment darstellt, das das Makro verarbeiten kann. Dieses Fragment besteht aus den Geschwistern des `Fn::Transform`-Funktionsaufrufs, nicht aber aus dem Funktionsaufruf selbst. Außerdem enthält `params` JSON, das die Makroparameter repräsentiert. In diesem Fall Ersatz und Ziel. Ebenso enthält `templateParameterValues` JSON, das die für die gesamte Vorlage angegebenen Parameter repräsentiert.

## Code der Lambda-Funktion
<a name="macros-example-function"></a>

Im Folgenden finden Sie den eigentlichen Code für die Lambda-Funktion, die dem Beispielmakro `JavaMacroFunc` zugrunde liegt. Es durchläuft das in der Antwort enthaltene Vorlagenfragment (als Zeichenfolge, Liste oder Zuordnung) und sucht nach der angegebenen Zielzeichenfolge. Wenn die angegebene Zeichenfolge gefunden wird, ersetzt die Lambda-Funktion die Zielzeichenfolge durch die angegebene Ersatzzeichenfolge. Wenn nicht, lässt die Funktion das Vorlagenfragment unverändert. Anschließend gibt die Funktion eine Zuordnung der erwarteten Eigenschaften zurück, auf die weiter unten näher eingegangen wird. CloudFormation

```
package com.macroexample.lambda.demo;

import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class LambdaFunctionHandler implements RequestHandler<Map<String, Object>, Map<String, Object>> {

	private static final String REPLACEMENT = "replacement";
	private static final String TARGET = "target";
	private static final String PARAMS = "params";
	private static final String FRAGMENT = "fragment";
	private static final String REQUESTID = "requestId";
	private static final String STATUS = "status";
	private static final String SUCCESS = "SUCCESS";
	private static final String FAILURE = "FAILURE";
    @Override
    public Map<String, Object> handleRequest(Map<String, Object> event, Context context) {
        // TODO: implement your handler
    	final Map<String, Object> responseMap = new HashMap<String, Object>();
        responseMap.put(REQUESTID, event.get(REQUESTID));
        responseMap.put(STATUS, FAILURE);
    	try {
	        if (!event.containsKey(PARAMS)) {
	        	throw new RuntimeException("Params are required");
	        }
	    	
	        final Map<String, Object> params = (Map<String, Object>) event.get(PARAMS);
	        if (!params.containsKey(REPLACEMENT) || !params.containsKey(TARGET)) {
	        	throw new RuntimeException("replacement or target under Params are required");
	        }
	    	
	    	final String replacement = (String) params.get(REPLACEMENT);
	    	final String target = (String) params.get(TARGET);
	    	final Object fragment = event.getOrDefault(FRAGMENT, new HashMap<String, Object>());
	    	final Object retFragment;
	    	if (fragment instanceof String) {
	    		retFragment = iterateAndReplace(replacement, target, (String) fragment);
	    	} else if (fragment instanceof List) {
	    		retFragment = iterateAndReplace(replacement, target, (List<Object>) fragment);
	    	} else if (fragment instanceof Map) {
	    		retFragment = iterateAndReplace(replacement, target, (Map<String, Object>) fragment);
	    	} else {
	    		retFragment = fragment;
	    	}
	        responseMap.put(STATUS, SUCCESS);
	        responseMap.put(FRAGMENT, retFragment);
	        return responseMap;
    	} catch (Exception e) {
    		e.printStackTrace();
    		context.getLogger().log(e.getMessage());
    		return responseMap;
    	}
    }
    
    private Map<String, Object> iterateAndReplace(final String replacement, final String target, final Map<String, Object> fragment) {
    	final Map<String, Object> retFragment = new HashMap<String, Object>();
    	final List<String> replacementKeys = new ArrayList<>();
    	fragment.forEach((k, v) -> {
    		if (v instanceof String) {
    			retFragment.put(k, iterateAndReplace(replacement, target, (String)v));
    		} else if (v instanceof List) {
    			retFragment.put(k, iterateAndReplace(replacement, target, (List<Object>)v));
    		} else if (v instanceof Map ) {
    			retFragment.put(k, iterateAndReplace(replacement, target, (Map<String, Object>) v));
    		} else {
    			retFragment.put(k, v);
    		}
    	});
    	return retFragment;
    }

    private List<Object> iterateAndReplace(final String replacement, final String target, final List<Object> fragment) {
    	final List<Object> retFragment = new ArrayList<>();
    	fragment.forEach(o -> {
    		if (o instanceof String) {
    			retFragment.add(iterateAndReplace(replacement, target, (String) o));
    		} else if (o instanceof List) {
    			retFragment.add(iterateAndReplace(replacement, target, (List<Object>) o));
    		} else if (o instanceof Map) {
    			retFragment.add(iterateAndReplace(replacement, target, (Map<String, Object>) o));
    		} else {
    			retFragment.add(o);
    		}
    	});
    	return retFragment;
    }
    
    private String iterateAndReplace(final String replacement, final String target, final String fragment) {
    	System.out.println(replacement + " == " + target + " == " + fragment );
    	if (fragment != null AND_AND fragment.equals(target))
    		return replacement;
    	return fragment;
    }
}
```

## Antwort der Lambda-Funktion
<a name="macros-example-response"></a>

Im Folgenden finden Sie das Mapping, zu dem die Lambda-Funktion CloudFormation zur Verarbeitung zurückkehrt. 
+ `requestId` : `5dba79b5-f117-4de0-9ce4-d40363bfb6ab`
+ `status` : `SUCCESS`
+ `fragment` :

  ```
  {
    "Type": "AWS::CloudFormation::WaitConditionHandle"
  }
  ```

Die `requestId` Übereinstimmungen, die von gesendet wurden CloudFormation, und ein `status` Wert von `SUCCESS` bedeuten, dass die Lambda-Funktion das in der Anfrage enthaltene Vorlagenfragment erfolgreich verarbeitet hat. In dieser Antwort enthält `fragment` JSON, das den Inhalt darstellt, der anstelle des ursprünglichen Vorlagenausschnitts in die verarbeitete Vorlage eingefügt werden soll.

## Ergebnis der verarbeiteten Vorlage
<a name="macros-example-processed"></a>

Nachdem sie CloudFormation eine erfolgreiche Antwort von der Lambda-Funktion erhalten hat, fügt sie das zurückgegebene Vorlagenfragment in die verarbeitete Vorlage ein.

Nachfolgend sehen Sie die resultierende verarbeitete Vorlage für unser Beispiel. Der intrinsische Funktionsaufruf `Fn::Transform`, der auf das Makro `JavaMacroFunc` verwies, ist nicht mehr enthalten. Das von der Lambda-Funktion zurückgegebene Vorlagenfragment wird an der entsprechenden Stelle eingefügt, sodass der Inhalt `"Type": "$$REPLACEMENT$$"` durch `"Type": "AWS::CloudFormation::WaitConditionHandle"` ersetzt wurde.

```
{
    "Parameters": {
        "ExampleParameter": {
            "Default": "SampleMacro",
            "Type": "String"
        }
    },
    "Resources": {
        "2a": {
            "Type": "AWS::CloudFormation::WaitConditionHandle"
        }
    }
}
```

# Fehlersuche in der verarbeiteten Vorlage
<a name="template-macros-troubleshoot-processed-template"></a>

Wenn Sie ein Makro verwenden, finden Sie die verarbeitete Vorlage in der CloudFormation Konsole.

Das Stadium einer Vorlage zeigt ihren Bearbeitungsstatus an:
+ `Original`: Die Vorlage, die der Benutzer ursprünglich zur Erstellung oder Aktualisierung des Stacks oder Stack-Sets übermittelt hat.
+ `Processed`: Die Vorlage, die CloudFormation verwendet wird, um den Stack oder das Stack-Set nach der Verarbeitung aller referenzierten Makros zu erstellen oder zu aktualisieren. Die verarbeitete Vorlage wird als JSON formatiert, auch wenn die ursprüngliche Vorlage als YAML formatiert wurde.

Verwenden Sie zur Fehlersuche die verarbeitete Vorlage. Wenn eine Vorlage keine Makros referenziert, sind die ursprünglichen und verarbeiteten Vorlagen identisch.

Weitere Informationen finden Sie unter [Stack-Informationen von der CloudFormation Konsole aus anzeigen](cfn-console-view-stack-data-resources.md).

Verwenden Sie den [get-template](service_code_examples.md#get-template-sdk)Befehl AWS CLI , um die verarbeitete Vorlage abzurufen.

## Größenbeschränkung
<a name="template-macros-size-limitation"></a>

Die maximale Größe für eine verarbeitete Stack-Vorlage beträgt 51 200 Byte, falls sie direkt an eine `CreateStack`-, `UpdateStack`- oder `ValidateTemplate`-Anforderung übergeben wird, oder 1 MB, wenn sie unter Verwendung einer Amazon-S3-Vorlagen-URL als S3-Objekt übergeben wird. Während der Verarbeitung wird jedoch der temporäre Status der Vorlage CloudFormation aktualisiert, da die in der Vorlage enthaltenen Makros seriell verarbeitet werden. Aus diesem Grund kann die Größe der Vorlage während der Verarbeitung vorübergehend die zulässige Größe einer vollständig verarbeiteten Vorlage überschreiten. CloudFormation ermöglicht einen gewissen Puffer für diese in Bearbeitung befindlichen Vorlagen. Allerdings sollten Sie beim Entwurf Ihrer Vorlagen und Makros immer die maximal zulässige Größe für eine verarbeitete Stack-Vorlage im Blick behalten.

Wenn bei der Verarbeitung Ihrer Vorlage ein `Transformation data limit exceeded` Fehler CloudFormation zurückgegeben wird, hat Ihre Vorlage die maximale Vorlagengröße überschritten, die während der Verarbeitung CloudFormation zulässig ist.

Sie können das Problem u. U. wie folgt beheben:
+ Teilen Sie Ihre Vorlage in mehrere Vorlagen auf, um zu vermeiden, dass die maximale Vorlagengröße während der Verarbeitung überschritten wird. Beispiel:
  + Verwenden Sie verschachtelte Stack-Vorlagen, um Teile der Vorlage einzukapseln. Weitere Informationen finden Sie unter [Aufteilung einer Vorlage in wiederverwendbare Teile mit verschachtelten Stapeln](using-cfn-nested-stacks.md).
  + Erstellen Sie mehrere Stacks und verwenden Sie Stack-übergreifende Referenzen, damit Informationen zwischen den Stacks ausgetauscht werden können. Weitere Informationen finden Sie unter [Verweisen Sie auf Ressourcenausgaben in einem anderen CloudFormation Stack](walkthrough-crossstackref.md).
+ Reduzieren Sie die Größe des von einem bestimmten Makro zurückgegebenen Vorlagenfragments. CloudFormation manipuliert den Inhalt von Fragmenten, die von Makros zurückgegeben werden, nicht.

# Aufteilung einer Vorlage in wiederverwendbare Teile mit verschachtelten Stapeln
<a name="using-cfn-nested-stacks"></a>

Wenn Ihre Infrastruktur wächst, müssen Sie möglicherweise immer wieder identische Ressourcenkonfigurationen für mehrere Vorlagen erstellen. Um diese Redundanz zu vermeiden, können Sie diese gemeinsamen Konfigurationen in spezielle Vorlagen aufteilen. Dann können Sie die Ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html) in anderen Vorlagen verwenden, um auf diese speziellen Vorlagen zu verweisen und so verschachtelte Stapel zu erstellen.

Nehmen wir zum Beispiel an, Sie haben eine Load Balancer-Konfiguration, die Sie für die meisten Ihrer Stacks verwenden. Anstatt dieselbe Konfigurationen zu kopieren und in Ihre Vorlagen einzufügen, können Sie eine dedizierte Vorlage für den Load Balancer erstellen. Dann können Sie diese Vorlage in anderen Vorlagen referenzieren, die dieselbe Load Balancer-Konfiguration benötigen.

Verschachtelte Stapel können ihrerseits weitere verschachtelte Stapel enthalten, so dass eine Hierarchie von Stapeln entsteht, wie in der folgenden Abbildung dargestellt. Der-*WurzelStack* ist der oberste Stack, zu dem letztlich alle verschachtelten Stack gehören. Jeder verschachtelte Stapel hat einen unmittelbaren übergeordneten Stapel. Für die erste Ebene von verschachtelten Stapeln ist der Stammstapel auch der übergeordnete Stapel.
+ Stack A ist der Root-Stack für alle anderen – verschachtelten – Stacks in der Hierarchie.
+ Für Stack B ist Stack A sowohl der übergeordnete Stack als auch der Root-Stack.
+ Für Stack D ist Stack C der übergeordnete Stack, während Stack B der übergeordnete Stack für Stack C ist.

![\[Verschachtelte Stacks, die als Teil eines anderen Stacks erstellt werden, besitzen einen unmittelbar übergeordneten Stack sowie den Root-Stack in der Hauptebene.\]](http://docs.aws.amazon.com/de_de/AWSCloudFormation/latest/UserGuide/images/cfn-console-nested-stacks.png)


**Topics**
+ [Vorher-Nachher-Beispiel für die Aufteilung einer Vorlage](#create-nested-stack-template)
+ [Beispiel für eine verschachtelte Stack-Architektur](#nested-stack-examples)
+ [Ausführen von Stapeloperationen auf verschachtelten Stapeln](#perform-stack-operations-on-nested-stacks)
+ [Ähnliche Informationen](#nested-stacks-related-information)

## Vorher-Nachher-Beispiel für die Aufteilung einer Vorlage
<a name="create-nested-stack-template"></a>

Dieses Beispiel zeigt, wie Sie eine einzelne, große CloudFormation Vorlage mithilfe verschachtelter Vorlagen in ein strukturierteres und wiederverwendbares Design umstrukturieren können. Die Vorlage "Vor der Verschachtelung von Stapeln" zeigt zunächst alle in einer Datei definierten Ressourcen an. Das kann unübersichtlich und schwer zu verwalten werden, wenn die Anzahl der Ressourcen wächst. Die Vorlage "Nach Verschachtelung der Stapel" teilt die Ressourcen in kleinere, separate Vorlagen auf. Jeder verschachtelte Stapel verwaltet einen bestimmten Satz zusammengehöriger Ressourcen, wodurch die Gesamtstruktur übersichtlicher und leichter zu pflegen ist.


| Vor der Verschachtelung von Stapeln | Nach der Verschachtelung von Stapeln | 
| --- | --- | 
| <pre>AWSTemplateFormatVersion: 2010-09-09<br />Parameters:<br />  InstanceType:<br />    Type: String<br />    Default: t2.micro<br />    Description: The EC2 instance type<br />  <br />  Environment:<br />    Type: String<br />    Default: Production<br />    Description: The deployment environment<br /><br />Resources:<br />  MyEC2Instance:<br />    Type: AWS::EC2::Instance<br />    Properties:<br />      ImageId: ami-1234567890abcdef0<br />      InstanceType: !Ref InstanceType<br /><br />  MyS3Bucket:<br />    Type: AWS::S3::Bucket</pre> | <pre>AWSTemplateFormatVersion: 2010-09-09<br />Resources:<br />  MyFirstNestedStack:<br />    Type: AWS::CloudFormation::Stack<br />    Properties:<br />      TemplateURL: https://s3.amazonaws.com/amzn-s3-demo-bucket/first-nested-stack.yaml<br />      Parameters:<br />        # Pass parameters to the nested stack if needed<br />        InstanceType: t3.micro<br /><br />  MySecondNestedStack:<br />    Type: AWS::CloudFormation::Stack<br />    Properties:<br />      TemplateURL: https://s3.amazonaws.com/amzn-s3-demo-bucket/second-nested-stack.yaml<br />      Parameters:<br />        # Pass parameters to the nested stack if needed<br />        Environment: Testing<br />    DependsOn: MyFirstNestedStack</pre> | 

## Beispiel für eine verschachtelte Stack-Architektur
<a name="nested-stack-examples"></a>

Dieser Abschnitt demonstriert eine verschachtelte Stack-Architektur, die aus einem Top-Level-Stack besteht, der auf einen verschachtelten Stack verweist. Der verschachtelte Stack setzt eine Node.js Lambda-Funktion ein, erhält einen Parameterwert vom Stack der obersten Ebene und gibt eine Ausgabe zurück, die über den Stack der obersten Ebene exponiert wird.

**Topics**
+ [Schritt 1: Erstellen Sie eine Vorlage für den verschachtelten Stack auf Ihrem lokalen System](#create-a-nested-stack-template)
+ [Schritt 2: Erstellen Sie eine Vorlage für den Top-Level-Stack auf Ihrem lokalen System](#create-a-nested-stack-parent-template)
+ [Schritt 3: Paketieren und verteilen Sie die Vorlagen](#create-a-nested-stack-parent-template)

### Schritt 1: Erstellen Sie eine Vorlage für den verschachtelten Stack auf Ihrem lokalen System
<a name="create-a-nested-stack-template"></a>

Das folgende Beispiel zeigt das Format der verschachtelten Stapelvorlage.

#### YAML
<a name="nested-stack-child-example.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Description: Nested stack template for Lambda function deployment
 3. Parameters:
 4.   MemorySize:
 5.     Type: Number
 6.     Default: 128
 7.     MinValue: 128
 8.     MaxValue: 10240
 9.     Description: Lambda function memory allocation (128-10240 MB)
10. Resources:
11.   LambdaFunction:
12.     Type: AWS::Lambda::Function
13.     Properties:
14.       FunctionName: !Sub "${AWS::StackName}-Function"
15.       Runtime: nodejs18.x
16.       Handler: index.handler
17.       Role: !GetAtt LambdaExecutionRole.Arn
18.       Code:
19.         ZipFile: |
20.           exports.handler = async (event) => {
21.             return {
22.               statusCode: 200,
23.               body: JSON.stringify('Hello from Lambda!')
24.             };
25.           };
26.       MemorySize: !Ref MemorySize
27.   LambdaExecutionRole:
28.     Type: AWS::IAM::Role
29.     Properties:
30.       AssumeRolePolicyDocument:
31.         Version: '2012-10-17'
32.         Statement:
33.           - Effect: Allow
34.             Principal:
35.               Service: lambda.amazonaws.com
36.             Action: sts:AssumeRole
37.       ManagedPolicyArns:
38.         - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
39. Outputs:
40.   LambdaArn:
41.     Description: ARN of the created Lambda function
42.     Value: !GetAtt LambdaFunction.Arn
```

### Schritt 2: Erstellen Sie eine Vorlage für den Top-Level-Stack auf Ihrem lokalen System
<a name="create-a-nested-stack-parent-template"></a>

Das folgende Beispiel zeigt das Format der Stack-Vorlage der obersten Ebene und der Ressource [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html), die auf den Stack verweist, den Sie im vorherigen Schritt erstellt haben.

#### YAML
<a name="nested-stack-parent-example.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Description: Top-level stack template that deploys a nested stack
 3. Resources:
 4.   NestedStack:
 5.     Type: AWS::CloudFormation::Stack
 6.     Properties:
 7.       TemplateURL: /path_to_template/nested-template.yaml
 8.       Parameters:
 9.         MemorySize: 256
10. Outputs:
11.   NestedStackLambdaArn:
12.     Description: ARN of the Lambda function from nested stack
13.     Value: !GetAtt NestedStack.Outputs.LambdaArn
```

### Schritt 3: Paketieren und verteilen Sie die Vorlagen
<a name="create-a-nested-stack-parent-template"></a>

**Anmerkung**  
Wenn Sie lokal mit Vorlagen arbeiten, kann Ihnen der AWS CLI **package** Befehl dabei helfen, Vorlagen für die Bereitstellung vorzubereiten. Es verarbeitet automatisch den Upload lokaler Artefakte zu Amazon S3 (einschließlich `TemplateURL`) und erzeugt eine neue Vorlagendatei mit aktualisierten Verweisen auf diese S3-Speicherorte. Weitere Informationen finden Sie unter [Laden Sie lokale Artefakte in einen S3-Bucket hoch mit dem AWS CLI](using-cfn-cli-package.md). 

Als nächstes können Sie den Befehl [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html) verwenden, um die verschachtelte Vorlage in einen Amazon S3-Bucket hochzuladen.

```
aws cloudformation package \
  --s3-bucket amzn-s3-demo-bucket \
  --template /path_to_template/top-level-template.yaml \
  --output-template-file packaged-template.yaml \
  --output json
```

Der Befehl erzeugt eine neue Vorlage unter dem durch `--output-template-file`angegebenen Pfad. Es ersetzt die Referenz `TemplateURL` durch den Amazon S3-Speicherort, wie unten gezeigt.

**Resultierende Vorlage**

```
AWSTemplateFormatVersion: 2010-09-09
Description: Top-level stack template that deploys a nested stack
Resources:
  NestedStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: https://s3.us-west-2.amazonaws.com/amzn-s3-demo-bucket/8b3bb7aa7abfc6e37e2d06b869484bed.template
      Parameters:
        MemorySize: 256
Outputs:
  NestedStackLambdaArn:
    Description: ARN of the Lambda function from nested stack
    Value:
      Fn::GetAtt:
      - NestedStack
      - Outputs.LambdaArn
```

Nachdem Sie den Befehl **package** ausgeführt haben, können Sie die verarbeitete Vorlage mit dem Befehl [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/) bereitstellen. Bei verschachtelten Stapeln, die IAM-Ressourcen enthalten, müssen Sie die IAM-Fähigkeiten bestätigen, indem Sie die Option `--capabilities` einfügen.

```
aws cloudformation deploy \
  --template-file packaged-template.yaml \
  --stack-name stack-name \
  --capabilities CAPABILITY_NAMED_IAM
```

## Ausführen von Stapeloperationen auf verschachtelten Stapeln
<a name="perform-stack-operations-on-nested-stacks"></a>

Wenn Sie mit verschachtelten Stapeln arbeiten, müssen Sie diese bei Operationen sorgfältig behandeln. Bestimmte Stack-Operationen, wie beispielsweise Stack-Aktualisierungen, sollten vom Root-Stack aus initiiert werden und nicht direkt auf den verschachtelten Stacks ausgeführt werden. Wenn Sie einen Stammstapel aktualisieren, werden nur verschachtelte Stapel mit Vorlagenänderungen aktualisiert. 

Außerdem kann das Vorhandensein von verschachtelten Stapeln die Operationen auf dem Stammstapel beeinflussen. Wenn zum Beispiel ein verschachtelter Stack im Zustand `UPDATE_ROLLBACK_IN_PROGRESS` stecken bleibt, wartet der Root-Stack, bis dieser verschachtelte Stack sein Rollback beendet hat, bevor er fortfährt. Bevor Sie mit den Aktualisierungsvorgängen fortfahren, vergewissern Sie sich, dass Sie über IAM-Berechtigungen verfügen, um eine Stack-Aktualisierung abzubrechen, falls diese zurückgesetzt wird. Weitere Informationen finden Sie unter [Steuern CloudFormation Sie den Zugriff mit AWS Identity and Access Management](control-access-with-iam.md).

Verwenden Sie die folgenden Verfahren, um den Stammstapel und die verschachtelten Stapel zu finden.

**So zeigen Sie den Root-Stack eines verschachtelten Stacks an**

1. Melden Sie sich bei der an AWS-Managementkonsole und öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Wählen Sie auf der Seite **Stapel** den Namen des verschachtelten Stapels, dessen Stammstapel Sie sehen möchten.

   Verschachtelte Stapel zeigen **NESTED** über ihrem Stapelnamen an.

1. Wählen Sie auf der Registerkarte **Stackinfo** im Abschnitt **Übersicht** den Stacknamen aus, der als **Wurzelstack**aufgeführt ist.

**So zeigen Sie die verschachtelten Stacks eines Root-Stacks an**

1. Wählen Sie im Stammstapel, dessen verschachtelte Stapel Sie anzeigen möchten, die Registerkarte **Ressourcen** .

1. Suchen Sie in der Spalte **Typ** nach Ressourcen des Typs. **AWS::CloudFormation::Stack**

## Ähnliche Informationen
<a name="nested-stacks-related-information"></a>
+ [Verschachteln eines vorhandenen Stacks](resource-import-nested-stacks.md)
+ [Verstehen des Aktualisierungsverhaltens von Stack-Ressourcen](using-cfn-updating-stacks-update-behaviors.md)
+ [Weiteres Rollback von fehlgeschlagenen verschachtelten Stack-Updates](using-cfn-updating-stacks-continueupdaterollback.md#nested-stacks)
+ [Rollback-Fehler bei verschachtelten Stapeln](troubleshooting.md#troubleshooting-errors-nested-stacks-are-stuck)

# Wartebedingungen in einer CloudFormation Vorlage erstellen
<a name="using-cfn-waitcondition"></a>

In diesem Thema wird erklärt, wie Sie eine Wartebedingung in einer Vorlage erstellen, um die Erstellung von Stapelressourcen 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:
+ Sie erstellt eine Wartebedingung wie jede andere Ressource und setzt den Status der Wartebedingung auf `CREATE_IN_PROGRESS`.
+ CloudFormation wartet, bis die erforderliche Anzahl von Erfolgssignalen empfangen wurde oder die Zeitüberschreitung der Wartebedingung abgelaufen ist. 
+ Wenn er die erforderliche Anzahl von Erfolgssignalen erhält, bevor die Timeout-Periode abläuft:
  + Der Status der Wartebedingung ändert sich zu `CREATE_COMPLETE`.
  + Die Erstellung von Stapeln geht weiter
+ Wenn die Zeitüberschreitung abläuft oder ein Fehlersignal empfangen wird:
  + Der Status der Wartebedingung ändert sich zu `CREATE_FAILED`.
  + Stapel rollt zurück

**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](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-creationpolicy.html).

**Anmerkung**  
Wenn Sie diese Option verwenden AWS PrivateLink, müssen Ressourcen in der VPC, die auf Wartebedingungen reagieren, Zugriff auf 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 CloudFormation keine Antwort und der Stack-Vorgang schlägt fehl. Weitere Informationen finden Sie unter [Zugriff CloudFormation über einen Schnittstellenendpunkt (AWS PrivateLink)](vpc-interface-endpoints.md) und [Kontrolle des Zugriffs von VPC-Endpunkten mit Bucket-Richtlinien](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies-vpc-endpoint.html).

**Topics**
+ [Erstellen einer Wartebedingung in Ihrer Vorlage](#creating-wait-condition)
+ [Syntax des Wartezustandssignals](#wait-condition-signal-syntax)
+ [Zugriff auf Signaldaten](#wait-condition-access-signal-data)

## Erstellen einer Wartebedingung in Ihrer Vorlage
<a name="creating-wait-condition"></a>

**1. Warten Bedingung Griff**  
Sie beginnen mit der Definition einer [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-waitconditionhandle.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-waitconditionhandle.html)-Ressource in der Vorlage des Stacks. Diese Ressource generiert die vordefinierte URL, die zum Senden von Signalen benötigt wird. So können Sie ein Signal senden, ohne Ihre AWS -Anmeldedaten angeben zu müssen. Beispiel: 

```
Resources:
  MyWaitHandle:
    Type: AWS::CloudFormation::WaitConditionHandle
```

**2. Wartebedingung**  
Als nächstes definieren Sie eine [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-waitcondition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-waitcondition.html)-Ressource in der Vorlage des Stacks. Die Grundstruktur eines `AWS::CloudFormation::WaitCondition` sieht wie folgt aus: 

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

Die Ressource `AWS::CloudFormation::WaitCondition` hat zwei erforderliche Eigenschaften und eine optionale Eigenschaft.
+ `Handle` (erforderlich)- Ein Verweis auf ein in der Vorlage deklariertes `WaitConditionHandle` .
+ `Timeout`(erforderlich) — Die Anzahl der Sekunden, die auf den CloudFormation Empfang der erforderlichen Anzahl von Signalen gewartet werden müssen. `Timeout`ist 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.

Normalerweise möchten Sie, dass eine Wartebedingung sofort nach der Erstellung einer bestimmten Ressource beginnt. Dazu fügen Sie das `DependsOn` Attribut einer Wartebedingung hinzu. Wenn Sie einer Wartebedingung ein `DependsOn` Attribut hinzufügen, CloudFormation erstellt zuerst die Ressource im `DependsOn` Attribut und dann die Wartebedingung. Weitere Informationen finden Sie unter [DependsOn-Attribut](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-dependson.html).

Das folgende Beispiel demonstriert eine Wartebedingung, die: 
+ Beginnt nach der erfolgreichen Erstellung der Ressource `MyEC2Instance` .
+ Verwendet die Ressource `MyWaitHandle` als `WaitConditionHandle`.
+ Hat eine Zeitüberschreitung von 4500 Sekunden
+ Hat den Standardwert `Count` von 1 (da keine Eigenschaft `Count` angegeben ist).

```
  MyWaitCondition:
    Type: AWS::CloudFormation::WaitCondition
    DependsOn: MyEC2Instance
    Properties:
      Handle: !Ref MyWaitHandle
      Timeout: '4500'
```

**3. Senden eines Signals**  
Um Erfolg oder Misserfolg zu signalisieren CloudFormation, führen Sie in der Regel Code oder ein Skript aus. Beispielsweise kann eine Anwendung, die auf einer EC2-Instance ausgeführt wird, einige zusätzliche Konfigurationsaufgaben ausführen und dann ein Signal an senden, CloudFormation um den Abschluss anzuzeigen.

Das Signal muss an die vordefinierte URL gesendet werden, die durch das Handle der Wartebedingung erzeugt wurde. Sie verwenden diese vordefinierte URL, um Erfolg oder Misserfolg zu signalisieren.

**Um ein Signal zu senden**

1. Um die vordefinierte URL innerhalb der Vorlage abzurufen, verwenden Sie die intrinsische Funktion `Ref` mit dem logischen Namen des Handles der Wartebedingung. 

   Wie im folgenden Beispiel gezeigt, kann Ihre Vorlage eine Amazon EC2-Instance deklarieren und die vordefinierte URL mit der Eigenschaft Amazon EC2 `UserData` an EC2-Instances übergeben. Auf diese Weise können Skripts 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" }
   ```

   Das Ergebnis ist eine `UserData`-Ausgabe, die ähnlich aussieht:

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

   Hinweis: In den Befehlszeilentools AWS-Managementkonsole und den Befehlszeilentools wird die vorsignierte URL als physische ID der Ressource „Wait Condition Handle“ angezeigt.

1. (Optional) Um zu erkennen, wann der Stack in den Wartezustand eintritt, 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 Wartebedingungs-Handle-Erstellungsereignis überwachen und die vorsignierte URL aus der Benachrichtigungsnachricht abrufen.
   + Sie können die Ereignisse des Stacks auch mit dem, AWS-Managementkonsole dem AWS CLI oder einem SDK überwachen.

1. 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 [Syntax des Wartezustandssignals](#wait-condition-signal-syntax) angegeben ist.

   Sie müssen die in der `Count` Eigenschaft angegebene Anzahl von Erfolgssignalen senden, um mit der Stack-Erstellung CloudFormation fortzufahren. 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 *`/tmp/a`* die folgende 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://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 Wartezustandssignals
<a name="wait-condition-signal-syntax"></a>

Wenn Sie Signale an die URL senden, die vom Handle der Wartebedingung erzeugt wird, müssen Sie das folgende JSON-Format verwenden:

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

### Eigenschaften
<a name="wait-condition-signal-properties"></a>

Das Feld `Status` muss einen der folgenden Werte enthalten:
+ `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 Feld `Data` kann jede beliebige Information enthalten, die Sie mit dem Signal zurücksenden möchten. Sie können auf den `Data` Wert zugreifen, indem Sie die GetAtt Funktion [Fn::](resources-section-structure.md#resource-properties-getatt) in der Vorlage verwenden.

Das Feld `Reason` ist eine Zeichenkette, deren Inhalt außer der JSON-Konformität keinen weiteren Einschränkungen unterliegt.

## Zugriff auf Signaldaten
<a name="wait-condition-access-signal-data"></a>

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

```
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 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html)Befehl oder auf der Registerkarte **Ausgaben** der CloudFormation Konsole anzeigen.

Die `Fn::GetAtt` Funktion gibt das `UniqueId` und `Data` als name/value Paar innerhalb einer JSON-Struktur zurück. Beispiel:

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

# Erstellen Sie wiederverwendbare Ressourcenkonfigurationen, die in allen Vorlagen mit CloudFormation Modulen enthalten sein können
<a name="modules"></a>

*Module* sind eine Möglichkeit für Sie, Ressourcenkonfigurationen für die Aufnahme in Stack-Vorlagen auf transparente, verwaltbare und wiederholbare Weise zu erstellen. Module können gängige Servicekonfigurationen und Best Practices als modulare, anpassbare Bausteine zusammenfassen, die Sie in Ihre Stack-Vorlagen aufnehmen können. Module ermöglichen es Ihnen, Ressourcenkonfigurationen, die Best Practices, Fachwissen und akzeptierte Richtlinien (für Bereiche wie Sicherheit, Compliance, Governance und Branchenvorschriften) in Ihre Vorlagen einbeziehen, ohne fundierte Kenntnisse über die Feinheiten der Ressourcenimplementierung erwerben zu müssen.

Ein Netzwerkexperte könnte beispielsweise ein Modul erstellen, das integrierte Sicherheitsgruppen und ingress/egress Regeln enthält, die den Sicherheitsrichtlinien entsprechen. Sie könnten dieses Modul dann in Ihre Vorlage aufnehmen, um eine sichere Netzwerkinfrastruktur in Ihrem Stack bereitzustellen, ohne Zeit damit verbringen zu müssen, herauszufinden VPCs, wie Subnetze, Sicherheitsgruppen und Gateways funktionieren. Und da Module versioniert sind, kann der Modulautor eine neue Version des Moduls erstellen, wenn sich die Sicherheitsrichtlinien im Laufe der Zeit ändern, die diese Änderungen enthält.

Zu den Merkmalen der Verwendung von Modulen in Ihren Vorlagen gehören:
+ **Vorhersehbarkeit** — Ein Modul muss sich an das Schema halten, das es in der CloudFormation Registrierung registriert, sodass Sie wissen, in welche Ressourcen es aufgelöst werden kann, wenn Sie es in Ihre Vorlage aufnehmen.
+ **Wiederverwendbarkeit**- Sie können dasselbe Modul für mehrere Vorlagen und Konten verwenden.
+ **Rückverfolgbarkeit** — CloudFormation Behält das Wissen darüber bei, welche Ressourcen in einem Stack von einem Modul bereitgestellt wurden, sodass Sie die Quelle der Ressourcenänderungen leicht nachvollziehen können.
+ **Verwaltbarkeit** — Sobald Sie ein Modul registriert haben, können Sie es über die CloudFormation Registrierung verwalten, einschließlich Versionierung, Konto- und regionaler Verfügbarkeit.

Ein Modul kann enthalten:
+ Eine oder mehrere Ressourcen, die aus dem Modul bereitgestellt werden sollen, zusammen mit allen zugehörigen Daten wie Ausgaben oder Bedingungen.
+ Alle Modulparameter, mit denen Sie bei jeder Verwendung des Moduls benutzerdefinierte Werte angeben können.

Informationen zur Entwicklung von Modulen finden Sie unter [Entwickeln von Modulen](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/modules.html) im *CloudFormation CLI-Benutzerhandbuch*.

**Topics**
+ [Überlegungen zur Verwendung von Modulen](#module-considerations)
+ [Verstehen der Modulversionierung](module-versioning.md)
+ [Verwenden Sie Module aus der CloudFormation privaten Registry](modules-using.md)
+ [Verwenden Sie Parameter, um Modulwerte anzugeben](module-using-params.md)
+ [Referenzmodulressourcen in CloudFormation Vorlagen](module-ref-resources.md)

## Überlegungen zur Verwendung von Modulen
<a name="module-considerations"></a>
+ Für die Nutzung von Modulen fallen keine zusätzlichen Kosten an. Sie zahlen nur für die Ressourcen, die diese Module in Ihren Stacks auflösen.
+ CloudFormation Kontingente, wie z. B. die maximal zulässige Anzahl von Ressourcen in einem Stapel oder die maximale Größe des Vorlagentexts, gelten für die verarbeitete Vorlage, unabhängig davon, ob die in dieser Vorlage enthaltenen Ressourcen aus Modulen stammen oder nicht. Weitere Informationen finden Sie unter [CloudFormation Kontingente verstehen](cloudformation-limits.md).
+ Tags, die Sie auf Stack-Ebene angeben, werden den einzelnen Ressourcen zugewiesen, die vom Modul abgeleitet werden.
+ Auf Modulebene angegebene Hilfsskripten werden bei der Verarbeitung der Vorlage nicht auf die einzelnen Ressourcen übertragen, die im Modul enthalten sind. CloudFormation 
+ Die im Modul angegebenen Ausgaben werden an Ausgaben auf Vorlagenebene weitergegeben.

  Jeder Ausgabe wird eine logische ID zugewiesen, die eine Verkettung des logischen Namens des Moduls und des Ausgabenamens ist, wie im Modul definiert. Weitere Informationen finden Sie unter [Holen Sie sich exportierte Ausgaben aus einem bereitgestellten CloudFormation Stack](using-cfn-stack-exports.md).
+ Die im Modul angegebenen Parameter werden nicht an Parameter auf Vorlagenebene weitergegeben.

  Sie können jedoch Parameter auf Vorlagenebene erstellen, die auf Parameter auf Modulebene verweisen. Weitere Informationen finden Sie unter [Verwenden Sie Parameter, um Modulwerte anzugeben](module-using-params.md).

# Verstehen der Modulversionierung
<a name="module-versioning"></a>

Die CloudFormation Registrierung dient als Repository, in dem Sie Module für die Verwendung in Ihrer Region registrieren AWS-Konto und verwalten können. Sie können Module aus verschiedenen Quellen, einschließlich Drittanbietern AWS, und Ihre eigenen benutzerdefinierten Erweiterungen innerhalb Ihres Kontos und Ihrer Region registrieren. Weitere Informationen finden Sie unter [Erweiterungen mit der CloudFormation Registry verwalten](registry.md).

Module können unterschiedliche Versionen haben, so dass Sie angeben können, welche Version eines Moduls Sie verwenden möchten. Diese Versionskontrolle ist besonders nützlich, wenn Sie ein Modul aktualisieren oder ändern müssen, ohne dass bestehende Stacks, die von diesem Modul abhängen, beschädigt werden.

Beachten Sie die folgenden Punkte, wenn Sie mehrere Versionen eines Moduls verwenden:
+  CloudFormation Verwendet bei Stack-Vorgängen die Version des Moduls, die derzeit als Standardversion in der Region AWS-Konto und der Region registriert ist, in der der Stack-Vorgang ausgeführt wird. Dies schließt Module ein, die in anderen Modulen verschachtelt sind.

  Beachten Sie daher, dass die Verwendung derselben Vorlage zu unterschiedlichen Ergebnissen führen kann, wenn Sie verschiedene Versionen desselben Moduls als Standardversion in verschiedenen Konten oder Regionen registriert haben.
+  CloudFormation Verwendet bei Stack-Operationen die Version der Ressource, die derzeit als Standardversion in der Region AWS-Konto und registriert ist, in der der Stack-Vorgang ausgeführt wird. Dies schließt die Ressourcen ein, die durch das Einschließen von Modulen generiert wurden.
+ Durch das Ändern der Standardversion eines Moduls wird kein Stack-Aktualisierungsvorgang ausgelöst. Wenn Sie jedoch das nächste Mal eine Stack-Operation mit einer beliebigen Vorlage ausführen, die dieses Modul enthält, z. B. ein Stack-Update, CloudFormation wird die neue Standardversion für den Vorgang verwendet.

  Die einzige Ausnahme besteht darin, ein Stack-Update mit der Option **Vorherige Vorlagenoption verwenden** durchzuführen, wie unten beschrieben.
+ Wenn Sie bei Stack-Aktualisierungsvorgängen die Option „**Vorherige Vorlage verwenden**“ angeben, wird die zuvor verarbeitete Vorlage für das Stack-Update CloudFormation verwendet und das Modul nicht erneut verarbeitet, wenn Sie Änderungen daran vorgenommen haben.
+ Um einheitliche Ergebnisse zu gewährleisten, sollten Sie, wenn Sie Module in eine Stack-Vorlage zur Verwendung mit Stack-Sets aufnehmen, sicherstellen, dass in allen Konten und Regionen, in denen Sie Ihre Stack-Instances einsetzen wollen, dieselbe Version des Moduls als Standardversion eingestellt ist. Dies gilt auch für Module, die in anderen Modulen verschachtelt sind. Weitere Informationen finden Sie unter [Verwaltung von Stacks über Konten und Regionen hinweg mit StackSets](what-is-cfnstacksets.md).

## Voraussetzungen für die Aktivierung der öffentlichen Module von Drittanbietern
<a name="requirements-for-modules"></a>

Um ein öffentliches Modul eines Drittanbieters in Ihrem Konto und Ihrer Region erfolgreich zu aktivieren, muss für jede öffentliche Erweiterung (Ressource oder Modul) eines Drittanbieters, die in dem Modul enthalten ist, Folgendes zutreffen:
+ **Aktivierung der Erweiterung**- Die Erweiterung muss in dem Konto und der Region aktiviert sein, in der Sie sie verwenden möchten. Weitere Informationen finden Sie unter [Verwenden Sie öffentliche Erweiterungen von Drittanbietern aus der CloudFormation Registrierung](registry-public.md).
+ **Alias-Registrierung**- Wenn die Erweiterung im Modul einen Typnamen-Alias verwendet, muss die Erweiterung in Ihrem Konto und in der Region mit demselben Typnamen-Alias registriert werden. Weitere Informationen finden Sie unter [Verwenden Sie Aliase, um auf Erweiterungen zu verweisen](registry-public.md#registry-public-enable-alias).
+ **Versionskompatibilität**- Die derzeit aktivierte Version der Erweiterung muss eine der unterstützten Hauptversionen dieser Erweiterung sein, die im Modul angegeben sind.

Wenn Sie nicht die richtigen öffentlichen Erweiterungen und Erweiterungsversionen von Drittanbietern aktiviert haben, schlägt der Vorgang fehl und es CloudFormation wird eine Fehlermeldung angezeigt, in der die Erweiterungen und Versionen aufgeführt werden, die aktiviert werden müssen, bevor das Modul erfolgreich aktiviert werden kann.

# Verwenden Sie Module aus der CloudFormation privaten Registry
<a name="modules-using"></a>

In diesem Thema wird erklärt, wie Module in CloudFormation Vorlagen verwendet werden. Betrachten Sie Module als vorgefertigte Bündel von Ressourcen, die Sie zu Ihren Vorlagen hinzufügen können.

Um ein Modul zu verwenden, gehen Sie wie folgt vor:
+ **Modul registrieren** — Sie registrieren Module in der CloudFormation Registrierung als private Erweiterungen. Vergewissern Sie sich, dass es in der AWS-Konto und der Region, in der Sie arbeiten, registriert ist. Weitere Informationen finden Sie unter [CloudFormation Konzepte der Registrierung](registry-concepts.md).
+ **Fügen Sie es in Ihre Vorlage** ein — Fügen Sie das Modul dem [Resources](resources-section-structure.md) Abschnitt Ihrer CloudFormation Vorlage hinzu, genau wie Sie es mit anderen Ressourcen tun würden. Sie müssen auch alle erforderlichen Eigenschaften für das Modul angeben.
+ **Den Stack erstellen oder aktualisieren** — Wenn Sie einen Stack-Vorgang starten, CloudFormation wird eine verarbeitete Vorlage generiert, die alle enthaltenen Module in die entsprechenden Ressourcen auflöst. 
+ **Vorschau der Änderungen**- Bevor Sie Änderungen vornehmen, können Sie mit einem Änderungssatz sehen, welche Ressourcen hinzugefügt oder geändert werden. Weitere Informationen finden Sie unter [CloudFormation Stapel mithilfe von Änderungssätzen aktualisieren](using-cfn-updating-stacks-changesets.md).

Betrachten Sie das folgende Beispiel: Sie haben eine Vorlage, die sowohl Ressourcen als auch Module enthält. Die Vorlage enthält eine einzelne Ressource,,`ResourceA` sowie ein Modul, `ModuleParent`. Dieses Modul enthält zwei Ressourcen, `ResourceB` und,`ResourceC` sowie ein verschachteltes Modul, `ModuleChild`. `ModuleChild` enthält eine einzelne Ressource, `ResourceD`. Wenn Sie aus dieser Vorlage einen Stack erstellen, wird die Vorlage CloudFormation verarbeitet und die Module in die entsprechenden Ressourcen aufgelöst. Der resultierende Stack hat vier Ressourcen:,`ResourceA`,`ResourceB` `ResourceC`und `ResourceD`.

![\[CloudFormation Löst während eines Stack-Vorgangs die beiden in der Stack-Vorlage enthaltenen Module in die entsprechenden vier Ressourcen auf.\]](http://docs.aws.amazon.com/de_de/AWSCloudFormation/latest/UserGuide/images/modules-resource-inclusion.png)


CloudFormation verfolgt, welche Ressourcen in einem Stapel aus Modulen erstellt wurden. Sie können diese Informationen auf den Registerkarten **Ereignisse**, **Ressourcen** und **Abweichungen** für einen bestimmten Stack anzeigen und sie sind auch in der Änderungssatzvorschau enthalten.

Module sind von Ressourcen in einer Vorlage unterscheidbar, da sie der folgenden vierteiligen Namenskonvention entsprechen, im Gegensatz zu der typischen dreiteiligen Konvention, die von Ressourcen verwendet wird:

```
organization::service::use-case::MODULE
```

# Verwenden Sie Parameter, um Modulwerte anzugeben
<a name="module-using-params"></a>

In können Sie Vorlagenparameter verwenden CloudFormation, um Ihre Stacks anzupassen, indem Sie bei der Erstellung oder Aktualisierung des Stacks Eingabewerte angeben. Mit diesen Parametern können Sie bestimmte Aspekte des Stacks nach Ihren Bedürfnissen ändern. Weitere Informationen zur Definition von Vorlagenparametern finden Sie unter [CloudFormation ParametersVorlagensyntax](parameters-section-structure.md).

In ähnlicher Weise können Module auch Parameter haben. Mit diesen Modulparametern können Sie benutzerdefinierte Werte aus der Vorlage (oder einem anderen Modul), die das Modul verwendet, in das Modul eingeben. Das Modul kann dann diese benutzerdefinierten Werte verwenden, um Eigenschaftswerte für die darin enthaltenen Ressourcen festzulegen.

Sie können auch Vorlagenparameter definieren, die Moduleigenschaften festlegen, so dass Sie Werte eingeben können, die zum Zeitpunkt des Stapelvorgangs an das Modul übergeben werden. 

Wenn ein Modul ein verschachteltes Modul enthält, das seine eigenen Modulparameter hat, können Sie entweder:
+ Werte für die Parameter des verschachtelten Moduls direkt im übergeordneten Modul angeben.
+ Entsprechende Modulparameter im übergeordneten Modul definieren, die es ermöglichen, die Parameter des verschachtelten Moduls durch die Vorlage (oder das Modul) festzulegen, in der das übergeordnete Modul enthalten ist.

## Verwenden von Vorlagenparametern zur Angabe von Modulparameterwerten
<a name="module-using-params-example-1"></a>

Das folgende Beispiel zeigt, wie Vorlagenparameter definiert werden, die Werte an ein Modul übergeben.

Diese Vorlage, die `My::S3::SampleBucket::MODULE` enthält, definiert einen Vorlagenparameter,,`BucketName` der es dem Benutzer ermöglicht, während des Stack-Vorgangs einen S3 Bucket-Namen anzugeben.

```
# Template containing My::S3::SampleBucket::MODULE
Parameters:
  BucketName:
    Description: Name for your sample bucket
    Type: String
Resources:
  MyBucket:
    Type: 'My::S3::SampleBucket::MODULE'
    Properties:
      BucketName: !Ref BucketName
```

## Festlegen von Eigenschaften für Ressourcen in einem untergeordneten Modul aus dem übergeordneten Modul
<a name="module-using-params-example-2"></a>

Das folgende Beispiel veranschaulicht, wie Parameterwerte in einem Modul angegeben werden, das in einem anderen Modul verschachtelt ist.

Dieses erste Modul, `My::S3::SampleBucketPrivate::MODULE`, ist das untergeordnete Modul. Es definiert zwei Parameter: `BucketName` und `AccessControl`. Die für diese Parameter angegebenen Werte werden verwendet, um die Eigenschaften `BucketName` und `AccessControl` der Ressource `AWS::S3::Bucket`, die das Modul enthält, anzugeben. Unten sehen Sie das Vorlagenfragment für `My::S3::SampleBucketPrivate::MODULE`.

```
# My::S3::SampleBucketPrivate::MODULE
AWSTemplateFormatVersion: 2010-09-09
Description: A sample S3 Bucket with Versioning and DeletionPolicy.
Parameters:
  BucketName:
    Description: Name for the bucket
    Type: String
  AccessControl:
    Description: AccessControl for the bucket
    Type: String
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref BucketName
      AccessControl: !Ref AccessControl
      DeletionPolicy: Retain
      VersioningConfiguration:
        Status: Enabled
```

Als Nächstes ist das vorherige Modul in ein übergeordnetes Modul, `My::S3::SampleBucket::MODULE`, verschachtelt. Das übergeordnete Modul, `My::S3::SampleBucket::MODULE`, legt die Parameter des untergeordneten Moduls auf folgende Weise fest:
+ Es setzt den Parameter `AccessControl` von `My::S3::SampleBucketPrivate::MODULE` auf `Private`.
+ Für `BucketName` definiert es einen Modulparameter, der es ermöglicht, den Bucket-Namen in der Vorlage (oder dem Modul) anzugeben, die/das `My::S3::SampleBucket::MODULE` enthält.

```
# My::S3::SampleBucket::MODULE
AWSTemplateFormatVersion: 2010-09-09
Description: A sample S3 Bucket. With Private AccessControl.
Parameters:
  BucketName:
    Description: Name for your sample bucket
    Type: String
Resources:
  MyBucket:
    Type: 'My::S3::SampleBucketPrivate::MODULE'
    Properties:
      BucketName: !Ref BucketName
      AccessControl: Private
```

## Angeben von Beschränkungen für Modulparameter
<a name="modules-using-parameters-constraints"></a>

Modulparameter unterstützen nicht die Durchsetzung von Beschränkungen. Um eine Einschränkungsprüfung für einen Modulparameter durchzuführen, erstellen Sie einen Vorlagenparameter mit den gewünschten Einschränkungen. Dann referenzieren Sie diesen Vorlagenparameter in Ihrem Modulparameter. Weitere Informationen zur Definition von Vorlagenparametern finden Sie unter [CloudFormation ParametersVorlagensyntax](parameters-section-structure.md).

# Referenzmodulressourcen in CloudFormation Vorlagen
<a name="module-ref-resources"></a>

In CloudFormation Vorlagen müssen Sie häufig Eigenschaften für eine Ressource festlegen, die auf dem Namen oder der Eigenschaft einer anderen Ressource basieren. Weitere Informationen finden Sie unter [Ressourcen referenzieren](resources-section-structure.md#using-cross-resource-references).

Um auf eine Ressource zu verweisen, die in einem Modul in Ihrer CloudFormation Vorlage enthalten ist, müssen Sie zwei logische Namen kombinieren:
+ Der logische Name, den Sie dem Modul selbst gegeben haben, als Sie es in Ihre Vorlage aufgenommen haben.
+ Der logische Name der spezifischen Ressource innerhalb dieses Moduls.

Sie können diese beiden logischen Namen mit oder ohne einen Punkt (.) zwischen ihnen kombinieren. Wenn der logische Name des Moduls beispielsweise `MyModule` und der logische Name der Ressource `MyBucket`lautet, können Sie sich auf diese Ressource entweder als `MyModule.MyBucket` oder `MyModuleMyBucket`beziehen.

Um die logischen Namen von Ressourcen innerhalb eines Moduls zu finden, können Sie das Schema des Moduls konsultieren, das in der CloudFormation Registrierung oder mithilfe der [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeType.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeType.html)Operation verfügbar ist. Das Schema listet alle Ressourcen und ihre logischen Namen auf, die Teil des Moduls sind.

Sobald Sie den vollständigen logischen Namen haben, können Sie CloudFormation Funktionen wie `GetAtt` und verwenden, `Ref` um auf Eigenschaftswerte von Modulressourcen zuzugreifen. 

Sie haben zum Beispiel ein Modul `My::S3::SampleBucket::MODULE`, das eine Ressource `AWS::S3::Bucket` mit dem logischen Namen `S3Bucket`enthält. Um mit der Funktion `Ref` auf den Namen dieses Buckets zu verweisen, kombinieren Sie den Namen des Moduls in Ihrer Vorlage (`MyBucket`) mit dem logischen Namen der Ressource im Modul (`S3Bucket`). Der vollständige logische Name lautet entweder `MyBucket.S3Bucket` oder `MyBucketS3Bucket`.

**-Beispielvorlage**  
Die folgende Beispielvorlage erstellt einen S3-Bucket unter Verwendung des Moduls `My::S3::SampleBucket::MODULE` . Außerdem wird eine Amazon SQS-Warteschlange erstellt und ihr Name mit dem Bucket-Namen aus dem Modul identisch gemacht. Außerdem gibt die Vorlage den Amazon Resource Name (ARN) des erstellten S3-Buckets aus.

```
# Template that uses My::S3::SampleBucket::MODULE
Parameters:
  BucketName:
    Description: Name for your sample bucket
    Type: String
Resources:
  MyBucket:
    Type: My::S3::SampleBucket::MODULE
    Properties:
      BucketName: !Ref BucketName
  exampleQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: !Ref MyBucket.S3Bucket
Outputs:
  BucketArn:
    Value: !GetAtt MyBucket.S3Bucket.Arn
```