

# CloudFormation テンプレートの使用
<a name="template-guide"></a>

AWS CloudFormation テンプレートは、スタックの一部として作成、更新、または削除する AWS リソースを定義します。これは複数のセクションで構成されていますが、必須のセクションは [Resources](resources-section-structure.md) セクションのみであり、このセクションは少なくとも 1 つのリソースを宣言する必要があります。

以下の方法で、ポリシーストアを作成できます。
+ **AWS Infrastructure Composer** – テンプレートを設計するためのビジュアルインターフェイス。
+ **テキストエディタ** – テンプレートを JSON または YAML 構文で記述します。
+ **IaC ジェネレーター** – CloudFormation で現在管理されていないアカウントでプロビジョニングされたリソースからテンプレートを生成します。IaC ジェネレーターは、ご使用のリージョンで Cloud Control API によってサポートされている幅広いリソースタイプに対応しています。

このセクションでは、CloudFormation テンプレートのさまざまなセクションを使用する方法と、スタックテンプレートの作成を開始する方法に関する包括的なガイドを提供します。次のトピックについて説明します。

**Topics**
+ [テンプレートが保存される場所](#where-they-get-stored)
+ [テンプレートの検証](#template-validation)
+ [テンプレートの開始方法](#getting-started)
+ [サンプルテンプレート](#sample-templates)
+ [テンプレート形式](template-formats.md)
+ [テンプレートセクション](template-anatomy.md)
+ [Infrastructure Composer](infrastructure-composer-for-cloudformation.md)
+ [AWS CloudFormation 言語サーバー](ide-extension.md)
+ [IaC ジェネレーター](generate-IaC.md)
+ [他のサービスに格納されている値を取得定する](dynamic-references.md)
+ [AWS 値の取得](pseudo-parameter-reference.md)
+ [スタックの出力を取得する](using-cfn-stack-exports.md)
+ [実行時に既存のリソースを指定する](cloudformation-supplied-parameter-types.md)
+ [チュートリアル](walkthroughs.md)
+ [テンプレートスニペット](template-snippets.md)
+ [Windows ベースのスタック](cfn-windows-stacks.md)
+ [CloudFormation 提供のリソースタイプを使用する](cloudformation-supplied-resource-types.md)
+ [モジュールを使用して再利用可能なリソース設定の作成](modules.md)

## テンプレートが保存される場所
<a name="where-they-get-stored"></a>

**Amazon S3 バケット**  
CloudFormation テンプレートは Amazon S3 バケットに保存できます。スタックを作成または更新する際に、テンプレートを直接アップロードする代わりに、テンプレートの S3 URL を指定できます。

AWS マネジメントコンソール または AWS CLI を通じてテンプレートを直接アップロードすると、S3 バケットが自動的に作成されます。詳細については、「[CloudFormation コンソールからスタックを作成する](cfn-console-create-stack.md)」を参照してください。

**Git リポジトリ**  
[Git 同期](git-sync.md)を使用すると、Git リポジトリにテンプレートを保存できます。スタックを作成または更新する際に、テンプレートを直接アップロードしたり、S3 URL を参照したりする代わりに、テンプレートを含む Git リポジトリの場所とブランチを指定できます。CloudFormation は、指定されたリポジトリとブランチでテンプレートの変更を自動的にモニタリングします。詳細については、「[Git 同期を使用してリポジトリソースコードからスタックを作成する](git-sync-create-stack-from-repository-source-code.md)」を参照してください。

## テンプレートの検証
<a name="template-validation"></a>

**構文の検証**  
テンプレートの JSON または YAML 構文を検証するには、[validate-template](service_code_examples.md#validate-template-sdk) CLI コマンドを使用するか、またはコンソールでテンプレートを指定します。コンソールは検証を自動的に実行します。詳細については、「[CloudFormation コンソールからスタックを作成する](cfn-console-create-stack.md)」を参照してください。

ただし、これらのメソッドはテンプレートの構文のみを検証し、リソースのために指定したプロパティ値は検証しません。

**その他の検証ツール**  
より複雑な検証とベストプラクティスチェックには、次のような追加のツールを使用できます。
+ [CloudFormation Linter (cfn-lint)](https://github.com/aws-cloudformation/cfn-lint) – [CloudFormation リソースプロバイダースキーマ](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/resource-type-schemas.html)に照らしてテンプレートを検証します。リソースプロパティの有効な値の確認やベストプラクティスが含まれます。
+ [CloudFormation Rain (rain fmt)](https://github.com/aws-cloudformation/rain) – CloudFormation テンプレートを一貫性のある標準にフォーマットするか、または JSON から YAML (もしくは YAML から JSON) にテンプレートを再フォーマットします。YAML を使用する際のコメントを保持し、組み込み関数の使用を短い構文に切り替えます (可能な場合)。

## テンプレートの開始方法
<a name="getting-started"></a>

CloudFormation テンプレートの作成を開始するには、次のステップに従います。

1. **リソースを選択する** – EC2 インスタンス、VPC、セキュリティグループなど、スタックに含める AWS リソースを特定します。

1. **テンプレートを記述する** – テンプレートを JSON または YAML 形式で記述し、リソースとそのプロパティを定義します。

1. **テンプレートの保存** – テンプレートは、`.json`、`.yaml`、`.txt` などのファイル拡張子でローカルに保存します。

1. **テンプレートを検証する** – [テンプレートの検証](#template-validation) セクションで説明されている方法を使用してテンプレートを検証します。

1. **スタックを作成する** – 検証済みテンプレートを使用してスタックを作成します。

### CloudFormation テンプレートリファレンスを使用する予定
<a name="additional-resources"></a>

テンプレートを作成すると、「[AWS リソースおよびプロパティタイプのリファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html)」でさまざまなリソースタイプの詳細な構文に関するドキュメントを確認できます。

多くの場合、スタックテンプレートには、ランタイムまで使用できないプロパティ値を割り当てる組み込み関数と、リソースの動作を制御するための特別な属性が必要です。テンプレートを作成するときは、以下のガイダンスのリソースを参照してください。
+ [組み込み関数リファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html) – 一般的に使用される組み込み関数には、次のようなものがあります。
  + `Ref` – パラメータの値またはリソースの物理 ID を取得します。
  + `Sub` – 文字列のプレースホルダーを実際の値に置き換えます。
  + `GetAtt` – テンプレート内のリソースから属性の値を返します。
  + `Join` – 値のセットを 1 つの文字列に結合します。
+ [リソース属性リファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-product-attribute-reference.html) – 一般的に使用される特殊な属性には、次のようなものがあります。
  + `DependsOn` – この属性を使用して、あるリソースに続けて別のリソースを作成する必要があることを指定できます。
  + `DeletionPolicy` – この属性を使用して、リソースの削除を CloudFormation でどのように処理するかを指定します。

## サンプルテンプレート
<a name="sample-templates"></a>

CloudFormation は、使用を開始するために使用できるオープンソースのスタックテンプレートを提供します。詳細については、GitHub ウェブサイトの「[CloudFormation Sample Templates](https://github.com/aws-cloudformation/aws-cloudformation-templates)」を参照してください。

これらのテンプレートは本番用ではないことに留意してください。どのように機能するかを知り、ニーズに適応させ、会社のコンプライアンス基準を満たしているようにするために時間を設けるべきです。

このリポジトリ内の各テンプレートは、[CloudFormation Linter](https://github.com/aws-cloudformation/cfn-lint) (cfn-lint) チェックに合格します。また、Center for Internet Security (CIS) の上位 20 個の AWS CloudFormation Guard ルールの基本的なセットにも合格します。ただし、サンプルの焦点を 1 つのユースケースに置くことが理にかなっている一部のルールは例外です。

# CloudFormation テンプレート形式
<a name="template-formats"></a>

CloudFormation テンプレートは JSON または YAML 形式で作成できます。いずれの形式も同じ目的に資するものですが、読みやすさと複雑さの点で明確に異なる利点があります。
+ **JSON** – JSON は、マシンが解析して生成しやすい軽量のデータ交換形式です。ただし、特に複雑な設定では、人間による読み書きが煩雑になる可能性があります。JSON では、テンプレートはネストされた中括弧 `{}` と括弧 `[]` を使用して構築され、リソース、パラメータ、および他のコンポーネントを定義します。この構文では、すべての要素を明示的に宣言する必要があります。これにより、テンプレートは冗長になる可能性がありますが、構造化された形式への厳密な準拠を実現できます。
+ **YAML** – YAML は、JSON と比較して、人間にとってより読みやすく、冗長性がより低くなるように設計されています。中括弧や括弧ではなくインデントを使用してネストを示すため、リソースとパラメータの階層をより簡単に視覚化できます。YAML は、特により複雑なテンプレートを扱う場合、その明確さと使いやすさを理由としてより好まれることがよくあります。ただし、YAML によるインデントへの依拠により、スペーシングに一貫性がない場合にエラーが発生する可能性があるため、精度を維持するには細心の注意が必要です。

## テンプレート構造
<a name="template-structure"></a>

CloudFormation テンプレートは、さまざまなセクションに分かれており、各セクションは特定のタイプの情報を保持するように設計されています。特定の順序で宣言する必要があるセクションと、順序は重要でないセクションがあります。ただし、あるセクションの値が前のセクションの値を参照している場合があるため、テンプレートを構築する際には、次の例で示されている論理的な順序を使用すると便利です。

テンプレートを作成するときは、`Resources` セクションなどの主要セクションを重複して使用しないでください。CloudFormation はテンプレートを受け入れる場合がありますが、テンプレートを処理するときに未定義の動作が発生し、リソースを誤ってプロビジョニングしたり、不可解なエラーを返したりする可能性があります。

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

次の例は、使用可能なすべてのセクションを含む JSON 形式のテンプレートの構造を示しています。

```
{
  "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>

次の例は、使用可能なすべてのセクションを含む YAML 形式のテンプレートの構造を示しています。

```
---
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
```

## コメント
<a name="template-comments"></a>

JSON 形式のテンプレートでは、コメントはサポートされていません。JSON には、設計上、コメントの構文は含まれていません。つまり、JSON 構造内にコメントを直接追加することはできません。ただし、説明のためのメモやドキュメントを含める必要がある場合は、メタデータを追加することを検討できます。詳細については、「[Metadata 属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html)」を参照してください。

YAML 形式のテンプレートでは、`#` 記号を使用してインラインコメントを含めることができます。

以下は、インラインコメントを使用した YAML テンプレートの例です。

```
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
```

## 仕様
<a name="template-formats.supported-specifications"></a>

CloudFormation は、次の JSON および YAML の仕様をサポートしています。

JSON  
CloudFormation は ECMA-404 JSON スタンダードに従います。JSON フォーマットの詳細については、[http://www.json.org](http://www.json.org) をご覧ください。

YAML  
CloudFormation は YAML バージョン 1.1 仕様をサポートしていますが、いくつかの例外があります。CloudFormation は次の機能をサポートしていません。  
+ `binary`、`omap`、`pairs`、`set`、および`timestamp` タグ
+ エイリアス
+ ハッシュ結合
YAML の詳細については、[https://yaml.org/](https://yaml.org/) を参照してください。

## 詳細はこちら
<a name="template-formats.learnmore"></a>

テンプレート内で指定する各リソースについて、JSON または YAML のいずれかの構文規則に従って、プロパティとその値を定義します。各形式のテンプレート構文の詳細については、[CloudFormation テンプレートセクション](template-anatomy.md) を参照してください。

# CloudFormation テンプレートでの正規表現の使用
<a name="cfn-regexes"></a>

CloudFormation テンプレート内では、正規表現 (regex と呼ばれることもあります) をさまざまな場所で使用できます (例えば、テンプレート[パラメータ](parameters-section-structure.md)の作成時の `AllowedPattern` プロパティ)。

CloudFormation の正規表現はすべて、Java の正規表現構文に準拠しています。Java の正規表現構文とそのコンストラクトの包括的な説明については、「[java.util.regex.Pattern](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/regex/Pattern.html)」を参照してください。

CloudFormation テンプレートを JSON 構文で記述する場合は、追加のバックスラッシュを追加して、正規表現のバックスラッシュ文字 (\$1) をエスケープする必要があります。これは、JSON がバックスラッシュをエスケープ文字として解釈するため、正規表現でリテラルバックスラッシュとして扱われるようにエスケープする必要があるためです。

たとえば、数字を示す `\d` を正規表現に含める場合、JSON テンプレートでは `\\d` と記述する必要があります。

次の例では、`AllowedPattern` プロパティは、4 つの連続した数字 (`\d{4}`) に一致する正規表現を指定します。ただし、正規表現は JSON テンプレートで定義されているため、バックスラッシュ文字は追加のバックスラッシュ (`\\d`) でエスケープする必要があります。

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

CloudFormation テンプレートを YAML 構文で記述する場合は、正規表現を一重引用符 ('') で囲む必要があります。追加のエスケープは必要ありません。

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

**注記**  
CloudFormation の正規表現は、`AllowedPattern` などの特定のコンテキストでの検証目的でのみサポートされます。これらは、パターンマッチングではなく正確な文字列比較のみを実行する `Fn::Equals` などの CloudFormation 組み込み関数のパターンマッチングオペレーションとしてはサポートされていません。

# CloudFormation テンプレートセクション
<a name="template-anatomy"></a>

あらゆる CloudFormation テンプレートは 1 つ以上のセクションで構成され、それぞれが特定の目的を果たします。

**[リソース]** セクションはあらゆる CloudFormation テンプレートで必要であり、テンプレートの中核となります。このセクションは、Amazon EC2 インスタンスや Amazon S3 バケットなど、スタックリソースとそのプロパティを指定します。各リソースは、一意の論理 ID、タイプ、および特定の設定の詳細で定義されます。

**[パラメータ]** セクションはオプションですが、テンプレートをより柔軟にする上で重要な役割を果たします。これにより、ユーザーはスタックを作成または更新する際、実行時に値を渡すことができます。これらのパラメータは `Resources` および `Outputs` セクションで参照できるため、テンプレート自体の変更なしでのカスタマイズが可能です。例えば、パラメータを使用して、デプロイによって異なるインスタンスタイプまたは環境設定を指定できます。

**[出力]** セクションもオプションで、スタックのプロパティを表示する際に返される値を定義します。出力は、リソース識別子や URL などの有用な情報を提供します。これらの情報は、運用上の目的や他のスタックとの統合のために活用できます。このセクションでは、テンプレートによって作成されたリソースに関する重要な詳細を取得して使用する方法について説明します。

他のオプションのセクションには、条件値を管理するためのルックアップテーブルのように機能する **[マッピング]** が含まれます。マッピングでは、key-value ペアを定義し、`Resources` および `Outputs` セクションの `Fn::FindInMap` 組み込み関数で使用します。これは、AWS リージョン や環境などの条件に基づいて設定を調整する必要があるシナリオで役立ちます。

**[メタデータ]** と **[ルール]** のセクションは、あまり一般的に使用されてはいませんが、追加機能を提供します。`Metadata` はテンプレートに関する追加情報を含むことができ、`Rules` はスタックの作成または更新中にパラメータ、またはパラメータの組み合わせを検証し、特定の基準を満たしていることを確認します。**[条件]** セクションは、環境タイプなどの条件に基づいて特定のリソースが作成されるか、またはプロパティに値が割り当てられるかを制御することで、柔軟性をさらに高めます。

最後に、**[変換]** セクションを使用して、テンプレートの処理中にマクロを適用します。サーバーレスアプリケーション (Lambda アプリケーションとも呼ばれる) の場合、使用する [AWS サーバーレスアプリケーションモデル (AWSSAM)](https://github.com/awslabs/serverless-application-specification) のバージョンを指定します。変換を指定する場合は、AWS SAM 構文を使用して、テンプレート内のリソースを宣言できます。このモデルでは、使用できる構文と、その処理方法を定義します。`AWS::Include` トランスフォームを使用すると、メインの CloudFormation テンプレートとは別に保存されているテンプレートスニペットを含めるもできます。

次のトピックでは、各セクションの使用に関する詳細と例を示します。

**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)
+ [形式バージョン](format-version-structure.md)
+ [Description](template-description-structure.md)

# CloudFormation テンプレートの Resources 構文
<a name="resources-section-structure"></a>

`Resources` セクションは、CloudFormation テンプレートで必須の最上位セクションです。CloudFormation にスタックの一部としてプロビジョニングおよび設定させる AWS リソースを宣言します。

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

`Resources` セクションでは、次の構文を使用します。

### 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
      ...
```

## 論理 ID (論理名とも呼ばれます)
<a name="resources-section-logical-id"></a>

CloudFormation テンプレート内では、リソースは論理リソース名によって識別されます。これら名前は英数字 (A～Z、a～z、0～9) でなければならず、テンプレート内で一意である必要があります。論理名は、テンプレートの他のセクションのリソースを参照するために使用されます。

## リソースタイプ
<a name="resources-section-resource-type"></a>

リソースには、AWS リソースの種類を定義する `Type` 属性が必要です。`Type` 属性の形式は `AWS::ServiceName::ResourceType` です。例えば、Amazon S3 バケットの `Type` 属性は `AWS::S3::Bucket` です。

サポートされているリソースタイプの一覧については、「[AWS リソースおよびプロパティタイプのリファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html)」を参照してください。

## リソースプロパティ
<a name="resources-section-resource-properties"></a>

リソースプロパティは、特定のリソースタイプの設定の詳細を定義するために指定できる追加オプションです。一部のプロパティは必須で、他のプロパティはオプションです。デフォルト値が設定されたプロパティもあり、そうしたプロパティを指定するのは任意です。

各リソースタイプのためにサポートされているプロパティの詳細については、「[AWS リソースおよびプロパティタイプのリファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html)」のトピックを参照してください。

プロパティの値には、リテラル文字列、文字列のリスト、ブール値、動的参照、パラメータ参照、疑似参照、または関数によって返される値を使用できます。次の例は、異なるプロパティ値の型を宣言する方法を示しています。

### 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
```

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

特定のリソースは、論理 ID の他に物理 ID も持っています。これは、そのリソースに実際に割り当てられている名前です (EC2 インスタンス ID、S3 バケット名など)。CloudFormation テンプレートに記載していないリソースを識別するには物理 ID を使用しますが、リソースの作成後にのみ使用できます。たとえば、EC2 インスタンスリソースに `MyEC2Instance` の論理 ID を指定します。CloudFormation は、インスタンスを作成すると、自動的に物理 ID (`i-1234567890abcdef0`) を生成してインスタンスに割り当てます。この物理 ID を使用して、Amazon EC2 コンソールでインスタンスを特定したり、そのプロパティ (DNS 名など) を表示したりすることができます。

Amazon S3 バケットをはじめとする各種リソースに明示的に物理名を指定していない場合は、CloudFormation が一意の物理名を自動的に生成します。CloudFormation スタックの名前、CloudFormation テンプレートに指定されているリソースの論理名、一意の ID を組み合わせた物理名です。例えば、`MyStack` というスタックに論理名が `MyBucket` の Amazon S3 バケットがある場合、そのバケットに物理名 `MyStack-MyBucket-abcdefghijk1` を含む名前を付けます。

カスタム名をサポートしているリソースの場合は、リソースを迅速に識別するために、独自の物理名を割り当てることができます。たとえば、ログを保存する S3 バケットに `MyPerformanceLogs` という名前を指定できます。詳細については、「[Name タイプ](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-name.html)」を参照してください。

## リソースの参照
<a name="using-cross-resource-references"></a>

あるリソースのプロパティを設定する際に、別のリソースの名前やプロパティに基づいて設定しなければならないことがよくあります。例えば、EC2 セキュリティグループを使用する EC2 インスタンス、または S3 バケットを利用する CloudFront ディストリビューションを作成できます。これらのリソースはすべて、同じ CloudFormation テンプレートで作成できます。

CloudFormation には、他のリソースとそのプロパティを参照するための組み込み関数が用意されています。こうした組み込み関数を使用すると、リソース間に依存関係を確立し、リソース間で値を渡すことができます。

### `Ref` 関数
<a name="resource-properties-ref"></a>

同じ CloudFormation テンプレート内に定義されたリソースを識別できるプロパティを取得するには、`Ref` 関数を一般的に使用します。返される内容は、リソースのタイプによって異なります。ほとんどのリソースの場合、リソースの物理名が返されます。ただし、リソースタイプによっては、`AWS::EC2::EIP` リソースの IP アドレスや Amazon SNS トピックの Amazon リソースネーム (ARN) といった別の値が返されることもあります。

次の例では、プロパティで `Ref` 関数を使用する方法を示します。これらの各例では、`Ref` 関数はテンプレートの他の場所で宣言された `LogicalResourceName` リソースの実際の名前を返します。YAML 例の `!Ref` 構文例は、`Ref` 関数をより短く記述する方法です。

#### 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
```

`Ref` 関数の詳細については、「[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)」を参照してください。

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

`Ref` 関数は、リソースに対して返されるパラメータまたは値が目的の値そのものである場合に役立ちます。ただし、リソースの他の属性が必要になる場合もあります。たとえば、S3 オリジンを含む CloudFront ディストリビューションを作成するには、DNS 形式のアドレスを使用してバケットの場所を指定する必要があります。いくつかのリソースには、その値をテンプレートで使用できる追加の属性があります。にこれらの属性を取得するには、`Fn::GetAtt` 関数を使用します。

次の例では、プロパティで `GetAtt` 関数を使用する方法を示します。`Fn::GetAtt` 関数は、2 つのパラメーターを受け取ります。1 つはリソースの論理名、もう 1 つは取得する属性の名前です。YAML 例の `!GetAtt` 構文例は、`GetAtt` 関数をより短く記述する方法です。

#### 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
```

`GetAtt` 関数の詳細については、「[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)」を参照してください。

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

次の例は、リソースを宣言する方法と、CloudFormation テンプレートが同じテンプレートと既存の AWS リソース内で定義された他のリソースを参照する方法を示しています。

**Topics**
+ [カスタム名で単一のリソースを宣言する](#resources-section-structure-examples-single-resource)
+ [`Ref` 関数を使用した他のリソースの参照](#resources-section-structure-examples-ref)
+ [`Fn::GetAtt` 関数を使用したリソース属性の参照](#resources-section-structure-examples-getatt)

### カスタム名で単一のリソースを宣言する
<a name="resources-section-structure-examples-single-resource"></a>

次の例では、論理名 `MyBucket` を持つ `AWS::S3::Bucket` タイプの 1 のリソースが宣言されます。`BucketName` プロパティは *amzn-s3-demo-bucket* に設定されます。これは、S3 バケットに必要な名前に置き換える必要があります。

このリソース宣言を使用してスタックを作成すると、CloudFormation がデフォルト設定の Amazon S3 バケットを作成します。Amazon EC2 インスタンス や Auto Scaling グループのようなその他のリソースの場合、CloudFormation はさらに多くの情報を必要とします。

#### 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
```

### `Ref` 関数を使用した他のリソースの参照
<a name="resources-section-structure-examples-ref"></a>

次の例は、EC2 インスタンスとセキュリティグループを定義するリソース宣言を示しています。`Ec2Instance` リソースは、`Ref` 関数を使用して、`SecurityGroupIds` プロパティの一部として `InstanceSecurityGroup` リソースを参照します。また、テンプレートで宣言されていない既存のセキュリティグループ (`sg-12a4c434`) も含まれます。既存の AWS リソースを参照するには、リテラル文字列を使用します。

#### 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
```

### `Fn::GetAtt` 関数を使用したリソース属性の参照
<a name="resources-section-structure-examples-getatt"></a>

次の例は、CloudFront ディストリビューションリソースと S3 バケットを定義するリソース宣言を示しています。`MyDistribution` リソースは、バケットの `DomainName` 属性を取得するための `Fn::GetAtt` 関数を使用して、`MyBucket` リソースの DNS 名を指定します。`Fn::GetAtt` 関数では、2 つのパラメーターが配列として指定されています。複数のパラメーターを受け取る関数に対しては、配列を使用してパラメーターを指定します。

#### 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 テンプレートの Parameters 構文
<a name="parameters-section-structure"></a>

オプションの `Parameters` セクションを使用して、テンプレートをカスタマイズします。パラメータを使用すると、スタックを作成または更新するたびにテンプレートにカスタム値を入力できます。テンプレートでパラメータを使用することで、特定のシナリオに合わせて調整できる再利用可能で柔軟なテンプレートを構築できます。

適切なタイプのパラメータを定義することにより、コンソールを使用してスタックを作成するとき、既存リソースの識別子のリストから選択できるようになります。詳細については、「[CloudFormation が提供するパラメータタイプを使用して、実行時に既存のリソースを指定する](cloudformation-supplied-parameter-types.md)」を参照してください。

パラメータは、スタックリソースのプロパティ値を指定する一般的な方法です。ただし、リージョンに依存する設定もあれば、他の条件や依存関係のためにユーザーには理解しにくい複雑な設定もあります。このような場合、マッピングを使用するなどして、ユーザーがより単純な値を指定して (またはまったく値を指定しないで) 必要な結果を得ることができるように、テンプレート自体に何らかのロジックを組み込むことをお勧めします。詳細については、「[CloudFormation テンプレートの Mappings 構文](mappings-section-structure.md)」を参照してください。

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

テンプレートの `Parameters` セクションでパラメータを宣言します。これは、次の一般的な構文を使用します。

### 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
```

パラメーターは、値と値に対する制約を定義する属性のリストを含みます。必須属性は `Type` だけで、`String` や `Number` のほか、CloudFormation に用意されているパラメータタイプを設定できます。どのような値を指定するかを説明する `Description` 属性を追加することもできます。**[Create Stack]** ウィザードでテンプレートを使用すると、パラメータの名前と説明が **[Specify Parameters]** ページに表示されます。

**注記**  
デフォルトでは、CloudFormation コンソールでは入力パラメータが論理 ID によりアルファベット順に一覧表示されます。このデフォルトの順序付けを上書きし、関連するパラメータをグループ化するには、テンプレートで `AWS::CloudFormation::Interface` メタデータキーを使用します。詳細については、「[`AWS::CloudFormation::Interface` メタデータを使用した CloudFormation パラメータの整理](aws-cloudformation-interface.md)」を参照してください。

デフォルト値を持つパラメータについては、ユーザーが別の値を指定しない限り、CloudFormation でデフォルト値が使用されます。デフォルトの属性を省略する場合は、ユーザーにそのパラメータの値を指定するよう求める必要があります。ただし、ユーザーに値を指定するよう求めた場合、その値の有効性は保証されません。パラメータの値を検証するには、制限を宣言するか、AWS 固有のパラメータタイプを指定することができます。

デフォルト値のないパラメータの場合、ユーザーはスタックの作成時にキー名の値を指定する必要があります。指定しないと、CloudFormation はスタックを作成できないため、例外をスローします。

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

## プロパティ
<a name="parameters-section-structure-properties"></a>

`AllowedPattern`  
`String` または `CommaDelimitedList` タイプに使用できるパターンを表す正規表現。タイプ `String` のパラメータに適用される場合、パターンは指定されたパラメータ値全体と一致する必要があります。タイプ `CommaDelimitedList` のパラメータに適用される場合、パターンはリスト内の各値と一致する必要があります。  
*必須:* いいえ

`AllowedValues`  
パラメーターに許容される一連の値を含む配列。タイプ `String` のパラメータに適用する場合、パラメータ値は許可された値のいずれかである必要があります。タイプ `CommaDelimitedList` のパラメータに適用される場合、リスト内の各値は、指定および許可された値のいずれかである必要があります。  
*必須:* いいえ  
YAML を使用していて、`AllowedValues` に `Yes` と `No` 文字列を使用する場合、一重引用符を使用して YAML パーサーがこれらのブール値を考慮することを防ぎます。

`ConstraintDescription`  
制約が違反された場合に、制約について説明する文字列。たとえば、制約の説明を指定しないとき、許容されているパターンが `[A-Za-z0-9]+` であるパラメーターの場合、ユーザーが無効な値を指定すると次のエラーメッセージが表示されます。  
`Malformed input-Parameter MyParameter must match pattern [A-Za-z0-9]+`  
*must only contain letters (uppercase and lowercase) and numbers* などの制約の説明を追加することによって、次のようにカスタマイズされたエラーメッセージを表示することができます。  
`Malformed input-Parameter MyParameter must only contain uppercase and lowercase letters and numbers`  
*必須:* いいえ

`Default`  
スタックの作成時に値を指定しなかった場合に、テンプレートで使用される適切な型の値。パラメーターの制約を定義する場合は、これらの制約に従う値を指定する必要があります。  
*必須:* いいえ

`Description`  
パラメーターについて説明する最大 4000 文字の文字列。  
*必須:* いいえ

`MaxLength`  
`String` 型に使用できる最大文字数を決定する整数値。  
*必須:* いいえ

`MaxValue`  
`Number` 型に使用できる数値の最大値を決定する数値。  
*必須:* いいえ

`MinLength`  
`String` 型に使用できる最小文字数を決定する整数値。  
*必須:* いいえ

`MinValue`  
`Number` 型に使用できる数値の最小値を決定する数値。  
*必須:* いいえ

`NoEcho`  
パラメータ値をマスクして、コンソール、コマンドラインツール、または API に表示されないようにするかどうか。`NoEcho` 属性を `true` に設定すると、CloudFormation は、スタックまたはスタックイベントを記述するすべての呼び出しに対して、アスタリスク (\$1\$1\$1\$1\$1) としてマスクされたパラメータ値を返します。ただし、以下に指定された場所に保存されている情報は除きます。  
*必須:* いいえ  
`NoEcho` 属性を使用しても、以下に保存されている情報はマスクされません。  
+ `Metadata` テンプレートセクション。CloudFormation は、`Metadata` セクションに含める情報の変換、変更、または編集を行いません。詳細については、「[メタデータ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html)」を参照してください。
+ `Outputs` テンプレートセクション。詳細については、「[出力](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html)」を参照してください。
+ リソース定義の `Metadata` 属性。詳細については、「[`Metadata` 属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html)」を参照してください。
パスワードやシークレットなどの機密情報を含めるには、これらのメカニズムを使用しないことを強くお勧めします。
機密情報は、CloudFormation テンプレートに直接埋め込むのではなく、スタックテンプレートの動的パラメータを使用して CloudFormation の外部 (AWS Systems Manager パラメータストアや AWS Secrets Manager など) に保存して管理した上で 参照することをお勧めします。  
詳細については、「[テンプレートに認証情報を埋め込まない](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/security-best-practices.html#creds)」のベストプラクティスを参照してください。
リソースのプライマリ識別子の一部であるリソースプロパティには、`NoEcho` パラメータや機密データを含めないことを強くお勧めします。  
プライマリリソース識別子を形成するプロパティに `NoEcho` パラメータが含まれている場合、CloudFormation はプライマリリソース識別子に*実際の平文値*を使用する場合があります。このリソース ID は、派生した出力または送信先に表示されます。  
リソースタイプのプライマリ識別子を構成するリソースプロパティを確認するには、「[AWS リソースおよびプロパティタイプのリファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html)」でそのリソースのリソースリファレンスドキュメントを参照してください。**[Return values]** (戻り値) セクションの `Ref` 関数の戻り値は、リソースタイプのプライマリ識別子を構成するリソースプロパティを表します。

`Type`  <a name="parameters-section-structure-properties-type"></a>
パラメーターのデータ型 (`DataType`)。  
*必須:* はい  
CloudFormation では次のパラメータタイプをサポートしています。    
`String`  
リテラル文字列。`MinLength`、`MaxLength`、`Default`、`AllowedValues`、`AllowedPattern` の各属性を使用して制約を宣言できます。  
たとえば、次のように指定します。`"MyUserName"`  
`Number`  
整数または浮動小数点値。CloudFormation は、このパラメータを数値として検証しますが、テンプレート内の他の場所で使用した場合には (`Ref` 組み込み関数を使用した場合など) 文字列として扱います。  
`MinValue`、`MaxValue`、`Default`、`AllowedValues` の各属性を使用して制約を宣言できます。  
たとえば、次のように指定します。`"8888"`  
`List<Number>`  
カンマで区切られた整数または浮動小数点値の配列。CloudFormation は、このパラメータを数値として検証しますが、テンプレート内の他の場所で使用した場合には (`Ref` 組み込み関数を使用した場合など) 文字列のリストとして扱います。  
たとえば、`"80,20"` と指定し、`Ref` を使用した場合には `["80","20"]` となります。  
`CommaDelimitedList`  
カンマで区切られたリテラル文字列の配列。文字列の合計数は、カンマの合計数よりも 1 つ多いはずです。また、各メンバー文字列の前後の空白は削除されます。  
たとえば、`"test,dev,prod"` と指定し、`Ref` を使用した場合には `["test","dev","prod"]` となります。  
AWS 固有のパラメータタイプ  
Amazon EC2 キーペアの名前や VPC の ID などの AWS の値です。詳細については、「[実行時に既存のリソースを指定する](cloudformation-supplied-parameter-types.md)」を参照してください。  
Systems Manager パラメータタイプ  
Systems Manager パラメーターストア内の既存のパラメーターに対応するパラメーター。Systems Manager パラメータキーは Systems Manager パラメータタイプの値として指定します。CloudFormation は Parameter Store から最新の値を取得し、スタックに使用します。詳細については、「[実行時に既存のリソースを指定する](cloudformation-supplied-parameter-types.md)」を参照してください。

## パラメーターの一般要件
<a name="parameters-section-structure-requirements"></a>

パラメーターを使用するときに以下の要件が適用されます。
+ CloudFormation テンプレートに指定できるパラメータは最大 200 個です。
+ 各パラメータには、英数字でテンプレート内のどの論理名とも重複しない論理名 (論理 ID と呼ばれます) を指定する必要があります。
+ 各パラメータには、CloudFormation でサポートされているパラメータタイプを割り当てる必要があります。詳細については、「[Type](#parameters-section-structure-properties-type)」を参照してください。
+ CloudFormation がスタックを正常にプロビジョニングするには、各パラメータに実行時に値を割り当てる必要があります。別の値が指定されている場合を除き、必要に応じて、使用する CloudFormation のデフォルト値を指定できます。
+ パラメーターは、同じテンプレート内から宣言および参照する必要があります。テンプレートの `Resources` および `Outputs` セクションのパラメーターを参照できます。

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

**Topics**
+ [シンプルな文字列パラメータ](#parameters-section-structure-example-1)
+ [パスワードパラメータ](#parameters-section-structure-example-2)
+ [パラメータの参照](#parameters-section-structure-example-3)
+ [カンマ区切りリストのパラメータ](#parameters-section-structure-example-4)
+ [カンマ区切りリストのパラメータから値を返します](#parameters-section-structure-example-5)

### シンプルな文字列パラメータ
<a name="parameters-section-structure-example-1"></a>

以下の例では、`String` タイプの `InstanceTypeParameter` というパラメータを宣言します。このパラメータを使用すると、スタックの Amazon EC2 インスタンスタイプを指定できます。スタックの作成時または更新時に値が指定されていない場合、CloudFormation はデフォルト値の `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
```

### パスワードパラメータ
<a name="parameters-section-structure-example-2"></a>

次の例では、デフォルト値のない `String` タイプの `DBPwd` というパラメータを宣言します。`NoEcho` プロパティは `true` に設定され、スタックの説明にパラメータ値が表示されないようにします。指定できる最小値は `1`、最大値は `41` です。パターンには、英文字の大文字と小文字、および数字を使用できます。この例では、`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]*$
```

### パラメータの参照
<a name="parameters-section-structure-example-3"></a>

パラメータを参照するには、`Ref` 組み込み関数を使用します。CloudFormation は、パラメータの値を使用してスタックをプロビジョニングします。同じテンプレートの `Resources` および `Outputs` セクションのパラメーターを参照できます。

次の例では、EC2 インスタンスリソースの `InstanceType` プロパティが `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
```

### カンマ区切りリストのパラメータ
<a name="parameters-section-structure-example-4"></a>

`CommaDelimitedList` パラメータタイプは、1 つのプロパティに複数の値を指定する必要がある場合に役立ちます。次の例では、デフォルト値 (3 つの CIDR ブロックがカンマで区切られている) を使用した `DbSubnetIpBlocks` というパラメータを宣言します。

#### 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"
```

### カンマ区切りリストのパラメータから値を返します
<a name="parameters-section-structure-example-5"></a>

パラメータのカンマ区切りリストから特定の値を参照するには、テンプレートの `Resources` セクションで、`Fn::Select` 組み込み関数を使用します。次の例のように、必要なオブジェクトのインデックス値とオブジェクトのリストを渡します。

#### 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
```

## 関連リソース
<a name="parameters-section-structure-related-resources"></a>

CloudFormation では、動的参照を使用してプロパティ値を動的に指定することもできます。例えば、Systems Manager パラメータストアに保存されている Secure String を参照する必要がある場合があります。詳細については、「[動的参照を使用して他のサービスに格納されている値を取得する](dynamic-references.md)」を参照してください。

`Ref` または `Sub` 関数内で擬似パラメータを使用して、値を動的に入力することもできます。詳細については、「[擬似パラメータを使用して AWS 値を取得する](pseudo-parameter-reference.md)」を参照してください。

# CloudFormation テンプレートの Outputs 構文
<a name="outputs-section-structure"></a>

オプションの `Outputs` セクションは、スタックの出力値を宣言します。これらの出力値は、さまざまな方法で使用できます。
+ **リソースに関する重要な詳細をキャプチャする** – 出力は、リソースに関する重要な情報をキャプチャする便利な方法です。たとえば、見つけやすいバケットを作成するスタックの S3 バケット名を出力できます。出力値を表示するには、CloudFormation コンソールの **[出力]** タブまたは [describe-stacks](service_code_examples.md#describe-stacks-sdk) CLI コマンドを使用します。
+ **クロススタック参照** – 出力値を他のスタックにインポートして、[スタック間で参照を作成](using-cfn-stack-exports.md)できます。これは、複数のスタック間でリソースまたは設定を共有する必要がある場合に役立ちます。

**重要**  
CloudFormation は、`Outputs` セクションに含める情報の編集または難読化を行いません。このセクションを使用して、パスワードやシークレットなどの機密情報を出力しないことを強くお勧めします。  
出力値は、スタックオペレーションの完了後に使用できます。スタックのステータスが「`IN_PROGRESS`」[ステータス](view-stack-events.md#cfn-console-view-stack-data-resources-status-codes)のいずれかのとき、スタックの出力値は利用できません。出力値が常に利用できない場合があるため、サービスランタイムとスタック出力値の間の依存関係を確立することはお勧めしません。

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

`Outputs` セクションは、キー名 `Outputs` で構成されます。1 つのテンプレートで宣言できる出力は最大 200 個です。

次の例は、`Outputs` セクションの構造を示します。

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

出力の宣言全体を中括弧で囲みます。複数の出力をカンマで区切ります。

```
"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
```

### 出力フィールド
<a name="outputs-section-structure-output-fields"></a>

`Outputs` セクションでは、次のフィールドを含めることができます。

**論理 ID (論理名とも呼ばれます)**  
現在の出力の識別子。論理 ID は英数字 (`a–z`、`A–Z`、`0–9`) とし、テンプレート内で一意である必要があります。

**`Description` (オプション)**  
出力値について説明する `String` 型。説明の宣言の値は、長さ 0～1024 バイトのリテラル文字列である必要があります。説明の指定には、パラメータまたは機能を使用できません。

**`Value` (必須)**  
[describe-stacks](service_code_examples.md#describe-stacks-sdk) コマンドから返されるプロパティの値。出力の値には、リテラル、パラメータ参照、疑似パラメータ、マッピング値、および組み込み関数を含めることができます。

**`Export` (オプション)**  
クロススタック参照にエクスポートされるリソース出力の名前。  
組み込み関数を使用して、エクスポートの `Name` の値をカスタマイズできます。  
詳細については、「[デプロイされた CloudFormation スタックからエクスポートされた出力を取得する](using-cfn-stack-exports.md)」を参照してください。

出力と条件を関連付けるには、テンプレートの [Conditions](conditions-section-structure.md) セクションで条件を定義します。

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

以下の例では、スタック出力のしくみを示しています。

**Topics**
+ [スタック出力](#outputs-section-structure-examples-stack-output)
+ [`Fn::Sub` を使用してエクスポート名をカスタマイズする](#outputs-section-structure-examples-cross-stack)
+ [`Fn::Join` を使用してエクスポート名をカスタマイズする](#outputs-section-structure-examples-join-export-name)
+ [`Fn::Join` を使用して構築された URL を返す](#outputs-section-structure-examples-join-export-url)

### スタック出力
<a name="outputs-section-structure-examples-stack-output"></a>

次の例では、`BackupLoadBalancerDNSName` という名前の出力によって、論理 ID が `BackupLoadBalancer` であるリソースの DNS 名が `CreateProdResources` 条件が true の場合に返されます。`InstanceID` という名前の出力は、論理 ID `EC2Instance` を持つ EC2 インスタンスの ID を返します。

#### 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
```

### `Fn::Sub` を使用してエクスポート名をカスタマイズする
<a name="outputs-section-structure-examples-cross-stack"></a>

次の例では、`StackVPC` という名前の出力が VPC の ID を返し、スタック名の先頭に `VPCID` が追加された名前でクロススタックリファレンスの値をエクスポートします。

#### 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"
```

`Fn::Sub` 関数の詳細については、「[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)」を参照してください。

### `Fn::Join` を使用してエクスポート名をカスタマイズする
<a name="outputs-section-structure-examples-join-export-name"></a>

また、`Fn::Join` 関数を使用して、パラメータ、リソース属性、および他の文字列に基づいて値を生成することもできます。

次の例では、`Fn::Sub` 関数の代わりに `Fn::Join` 関数を使用してエクスポート名をカスタマイズします。この `Fn::Join` 関数の例は、コロンを区切り文字として使用して、スタック名と名前 `VPCID` を連結します。

#### 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 ] ]
```

`Fn::Join` 関数の詳細については、「[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)」を参照してください。

### `Fn::Join` を使用して構築された URL を返す
<a name="outputs-section-structure-examples-join-export-url"></a>

WordPress サイトを作成するテンプレートの次の例では、`InstallURL` は、`http://` 、リソース `ElasticLoadBalancer` の DNS 名、`/wp-admin/install.php` を連結する `Fn::Join` 関数呼び出しによって返される文字列です。出力値は次の例のようになります。

```
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
```

`Fn::Join` 関数の詳細については、「[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 テンプレートの Mappings 構文
<a name="mappings-section-structure"></a>

オプションの `Mappings` セクションは、特定の条件または依存関係に基づいて値を指定するために使用できる key-value ペアを作成するのに役立ちます。

`Mappings` セクションの一般的なユースケースの 1 つは、スタックがデプロイされている AWS リージョン に基づいて値を設定することです。これは `AWS::Region` 疑似パラメータを使用することで実現できます。`AWS::Region` 擬似パラメータは、CloudFormation によってスタックが作成されるリージョンに解決される値です。擬似パラメータは、スタックの作成時に CloudFormation によって解決されます。

マップ内の値を取得するには、テンプレートの `Resources` セクション内で `Fn::FindInMap` 組み込み関数を使用できます。

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

`Mappings` セクションでは、次の構文を使用します。

### 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` はマッピングの論理名です。
+ マッピング内では、各マッピングは、別のマッピングが後に続くキーです。
+ キーは、名前と値のペアのマップであり、マッピング内で一意である必要があります。
+ 名前と値のペアは、ラベルとマッピングする値から構成されます。値に名前を付けることで、1 つのキーに対して値のセットを複数、対応付けることができます。
+ マッピングに含まれるキーは、リテラル文字列であることが必要です。
+ 値はタイプ `String` または `List` です。

**注記**  
`Mappings` セクションにパラメータ、擬似パラメータまたは組み込み関数を含めることはできません。  
マッピングの値が現在スタックで使用されていない場合は、マップのみを更新することはできません。リソースを追加、変更、または削除する変更を含める必要があります。

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

**Topics**
+ [基本的なマッピング](#mappings-section-structure-basic-example)
+ [複数の値のマッピング](#mappings-section-structure-multiple-values-example)
+ [マッピングから値を返します](#mappings-section-structure-return-value-example)
+ [入力パラメーターと `Fn::FindInMap`](#mappings-section-structure-input-parameter-example)

### 基本的なマッピング
<a name="mappings-section-structure-basic-example"></a>

以下に示したのは、`Mappings` というマップを持つ `RegionToInstanceType` セクションの例です。キーは 5 つ存在し、それぞれ単一の文字列値を含んだ名前と値のペアに対応しています。キーはリージョンの名前です。名前と値の各ペアは、キーで表されるリージョンで利用可能な T ファミリーのインスタンスタイプです。名前と値のペアには、名前 (この例では `InstanceType`) と値があります。

#### 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
```

### 複数の値のマッピング
<a name="mappings-section-structure-multiple-values-example"></a>

次の例には、2 つの値のセットにマッピングされたリージョンキーがあります。1 つは `MyAMI1` という名前で、もう 1 つは `MyAMI2` という名前です。

**注記**  
これらの例に示す AMI ID は、デモンストレーション用のプレースホルダーです。可能な場合は、`Mappings` セクションの代わりに AWS Systems Manager パラメータへの動的参照を使用することを検討してください。使用する AMI が変更されるたびに、すべてのテンプレートが新しい ID で更新されることを回避するには、AWS Systems Manager パラメータを使用してスタックの作成時または更新時に最新の AMI ID を取得します。一般的に使用される AMI の最新バージョンは、Systems Manager のパブリックパラメータとしても利用できます。詳細については、「[動的参照を使用して他のサービスに格納されている値を取得する](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
```

### マッピングから値を返します
<a name="mappings-section-structure-return-value-example"></a>

`Fn::FindInMap` 関数を使用すると、指定したキーによって名前付きの値を取得できます。次に示したのは、Amazon EC2 というリソースを含んだテンプレートの例です。このリソースの `InstanceType` プロパティを、`FindInMap` 関数によって割り当てています。`FindInMap` 関数で、(`AWS::Region` 擬似パラメータを使用して) スタックを作成する AWS リージョン としてキーを指定し、マッピング先の値の名前として `InstanceType` を指定しています。`ImageId` は Systems Manager パラメータを使用して、最新の Amazon Linux 2 AMI を動的に取得します。疑似 Parameters の詳細については、「[擬似パラメータを使用して AWS 値を取得する](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]
```

### 入力パラメーターと `Fn::FindInMap`
<a name="mappings-section-structure-input-parameter-example"></a>

次のサンプルテンプレートは、複数のマッピングを使用して EC2 インスタンスを作成する方法を示しています。テンプレートはネストされたマッピングを使用して、ターゲットの AWS リージョン と環境タイプ (`Dev` または `Prod`) に基づいて適切なインスタンスタイプとセキュリティグループを自動的に選択します。また、Systems Manager パラメータを使用して、最新の Amazon Linux 2 AMI を動的に取得します。

#### 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]
```

## 関連リソース
<a name="mappings-section-related-resources"></a>

これらの関連トピックは、`Fn::FindInMap` 関数を使用するテンプレートを作成する際に役立ちます。
+ [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 の機能強化](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 テンプレートの Metadata 構文
<a name="metadata-section-structure"></a>

`Metadata` は、JSON オブジェクトまたは YAML オブジェクトを使用して追加情報を保存します。テンプレートで使用できるテンプレートレベルのメタデータのタイプは次のとおりです。

カスタムメタデータ  
ユーザー定義のキーと値のペアを保存します。たとえば、リソースの作成には影響しないが、インフラストラクチャ、チーム、またはデプロイの詳細に関する追加のコンテキストを提供する追加情報を提供できます。

`AWS::CloudFormation::Interface`  
CloudFormation コンソールに表示される場合の入力パラメータのグループ化と順序を定義します。デフォルトでは、CloudFormation コンソールではパラメータが論理 ID によりアルファベット順にソートされます。

`AWS::CloudFormation::Designer`  
CloudFormation Designer (Designer) は 2025 年 2 月 5 日にサポートが終了しました。



**重要**  
スタックの更新時に、`Metadata` セクションを単独で更新することはできません。更新できるのは、リソースを追加、変更、または削除する変更を含める場合だけです。  
CloudFormation は、`Metadata` セクションに含める情報の変換、変更、または編集を行いません。このため、パスワードやシークレットなどの機密情報を保存しないことを強くお勧めします。

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

CloudFormation テンプレートでカスタムメタデータを宣言するには、次の構文を使用します。

### 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"
```

`AWS::CloudFormation::Interface` の構文については、「[`AWS::CloudFormation::Interface` メタデータを使用した CloudFormation パラメータの整理](aws-cloudformation-interface.md)」を参照してください。

# `AWS::CloudFormation::Interface` メタデータを使用した CloudFormation パラメータの整理
<a name="aws-cloudformation-interface"></a>

`AWS::CloudFormation::Interface` は、CloudFormation コンソールでパラメータをグループ化およびソートする方法を定義するメタデータキーです。デフォルトでは、コンソールでスタックを作成または更新すると、コンソールに入力パラメータが論理 ID のアルファベット順にリストされます。ユーザーがパラメーター値を効率的に指定できるように、このキーを使用して、パラメーターのグループ化とソートを独自に定義することができます。たとえば、すべての EC2 関連パラメーターを 1 つのグループに含め、すべての VPC 関連パラメーターを別のグループに含めることができます。

メタデータキーで、作成するグループ、各グループに含めるパラメーター、コンソールで各パラメーターがそのグループ内に表示される順序を指定できます。

パラメータのラベルを定義することもできます。ラベルは、パラメーターの論理 ID の代わりにコンソールに表示されるフレンドリ名または説明です。ラベルは、各パラメーターに指定する値をユーザーが理解するのに役立ちます。たとえば、`KeyPair` パラメーターには `Select an EC2 key pair` というラベルを付けることができます。

メタデータキーで参照するすべてのパラメーターは、テンプレートの `Parameters` セクションで宣言する必要があります。

**注記**  
CloudFormation コンソールのみが `AWS::CloudFormation::Interface` メタデータキーを使用します。AWS CLI および API 呼び出しはこのキーを使用しません。

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

CloudFormation テンプレートでこのエンティティを宣言するには、次の構文を使用します。

### 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
```

## プロパティ
<a name="w2aac11c23c29c17c17"></a>

`ParameterGroups`  
パラメーターグループタイプ、グループ名を指定する場所、各グループ内のパラメーター、パラメーターが表示される順序のリスト。  
*必須:* いいえ    
`Label`  
パラメーターグループの名前。  
*必須:* いいえ  
`default`  
CloudFormation コンソールがパラメータグループの命名に使用するデフォルトのラベル。  
*必須:* いいえ  
タイプ: 文字列  
`Parameters`  
グループに含めるパラメーター論理 ID (大文字小文字が区別されます) のリスト。パラメーターは、テンプレートの `Parameters` セクションで既に定義されている必要があります。パラメーターは、1 つのパラメーターグループにのみ含めることができます。  
コンソールには、`Other parameters` グループ内の、パラメーターグループに関連付けないパラメーターがアルファベット順でリストされます。  
*必須:* いいえ  
*タイプ*: 文字列値のリスト

`ParameterLabels`  
スタックが作成または更新されたときに CloudFormation コンソールに表示されるパラメータとそのフレンドリ名のマッピング。  
*必須:* いいえ    
パラメータラベル  
パラメーターのラベル。ラベルは、スタックが作成または更新されるときに CloudFormation コンソールが [**Specify Parameters**] (パラメータを指定) に表示するフレンドリ名または説明を定義します。パラメータラベルは、テンプレートの `Parameters` セクションで宣言された有効なパラメーターの論理 ID (大文字と小文字を区別) にする必要があります。  
*必須:* いいえ  
`default`  
CloudFormation コンソールがパラメータの命名に使用するデフォルトのラベル。  
*必須:* いいえ  
タイプ: 文字列

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

次の例では、2 つのパラメーターグループ `Network Configuration` および `Amazon EC2 Configuration` を定義します。`Network Configuration` グループには、`VPCID`、`SubnetId`、`SecurityGroupID` の各パラメーターが含まれます。これらは、テンプレートの `Parameters` セクション (非表示) で定義されます。コンソールにこれらのパラメーターが表示される順序は、パラメーターがリストされる順序によって定義されます (先頭は `VPCID` パラメーター)。この例では、`Amazon EC2 Configuration` パラメーターも同様にグループ化およびソートされています。

この例では、`VPCID` パラメーターのラベルも定義しています。コンソールには、パラメータの論理 ID (`VPCID`) の代わりに [**Which VPC should this be deployed to? (どの VPC をこれにデプロイする必要がありますか。)**] が表示されます。

### 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?"
```

### コンソールに表示されたパラメータグループ
<a name="w2aac11c23c29c17c19c11"></a>

次の図は、この例のメタデータキーを使用すると、スタックが作成または更新されたときにパラメータグループがコンソールにどのように表示されるかを示しています。**コンソールのパラメータグループ** 

![\[コンソールにこの例のパラメータグループが表示されます。\]](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/images/console-create-stack-parameter-groups.png)


# CloudFormation テンプレートの Rules 構文
<a name="rules-section-structure"></a>

`Rules` セクションは、カスタム検証ロジックを有効にする CloudFormation テンプレートのオプション部分です。このセクションが含まれている場合、CloudFormation がリソースを作成または更新する前にパラメータ値を検証するルール関数が含まれます。

ルールは、標準のパラメータ制約が不十分な場合に便利です。例えば、SSL が有効になっている場合は、証明書とドメイン名の両方を指定する必要があります。ルールを使用すると、これらの依存関係を確実に満たすことができます。

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

`Rules` セクションでは、次の構文を使用します。

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

テンプレートの `Rules` セクションは、キーの名前 `Rules` とそれに続く単一のコロンで構成されます。すべてのルール宣言を囲むには、中括弧を使用する必要があります。複数のルールを宣言する場合は、カンマで区切ります。ルールごとに、引用符で囲んだ論理名、単一のコロン、およびルール条件とアサーションを囲む中括弧から成る形式で宣言します。

```
{
    "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
```

### ルールフィールド
<a name="rules-section-fields"></a>

`Rules` セクションでは、次のフィールドを含めることができます。

**論理 ID (論理名とも呼ばれます)**  
各ルール用の一意の識別子。

**`RuleCondition` (オプション)**  
ルールがいつ有効になるかを決定するプロパティ。ルール条件を定義しない場合、ルールのアサーションが常に有効になります。それぞれのルールごとに、定義できるルール条件は 1 つだけです。

**`Assertions` (必須)**  
特定のパラメータの許容値を指定する 1 つ以上のステートメント。

**`Assert`**  
`true` に評価される必要がある条件。

**`AssertDescription`**  
アサーションが失敗したときに表示されるメッセージ。

## ルール固有の組み込み関数
<a name="rules-specific-intrinsic-section-structure"></a>

ルールを定義するには、「ルール固有の関数」を使用します。これは、テンプレートの `Rules` セクションでのみ使用できる関数です。関数をネストすることができますが、ルール条件またはアサーションの最終結果は、`true` または `false` である必要があります。

以下のルール関数を使用できます。
+ [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)

これらの関数は、ルールの条件またはアサーションで使用されます。条件プロパティによって、CloudFormation がアサーションを適用するかどうかが決まります。条件が `true` に評価された場合、プロビジョニング済み製品の作成または更新時に、CloudFormation はアサーションを評価してパラメータ値が有効かどうか確認します。パラメータ値が無効である場合、CloudFormation はスタックの作成や更新を行いません。条件が `false` に評価される場合、CloudFormation はパラメータ値を確認せず、スタックオペレーションに進みます。

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

**Topics**
+ [パラメーター値の条件付きの確認](#template-constraint-rules-example-verify)
+ [パラメータ間の検証](#template-cross-parameter-rules-example)

### パラメーター値の条件付きの確認
<a name="template-constraint-rules-example-verify"></a>

次の例では、2 つのルールが `InstanceType` パラメータの値をチェックします。環境パラメータの値 (`test` または `prod`) に応じて、ユーザーは `InstanceType` パラメータに対して `t3.medium` または `t3.large` を指定する必要があります。`InstanceType` および `Environment` パラメータは、同じテンプレートの `Parameters` セクションで宣言する必要があります。

#### 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'
```

### パラメータ間の検証
<a name="template-cross-parameter-rules-example"></a>

次のサンプルテンプレートは、パラメータ間の相互検証にルールを使用する方法を示しています。これらは、ロードバランサーの背後で Auto Scaling グループ上に稼働するサンプルウェブサイトを作成します。このウェブサイトは、入力パラメータに応じてポート 80 または 443 で利用できます。Auto Scaling グループ内のインスタンスは、任意のポートでリッスンするように設定できます (デフォルトは 8888)。

このテンプレート内のルールは、スタックの作成前に入力パラメータを検証します。これらのルールは、すべてのサブネットが指定された VPC に属していることを確認し、`UseSSL` パラメータが `Yes` に設定されている場合に、SSL 証明書の ARN とホストゾーン名の両方が指定されていることを検証します。

**注記**  
このテンプレートからスタックを作成した場合、AWS リソースに対する料金が発生します。

#### 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 テンプレートの Conditions 構文
<a name="conditions-section-structure"></a>

オプションの `Conditions` セクションには、エンティティが作成または設定される状況を定義するステートメントが含まれています。例えば、条件を作成し、それをリソースまたは出力に関連付けることで、条件が true の場合にのみ CloudFormation がリソースまたは出力を作成できるようになります。同様に、条件をプロパティに関連付けて、条件が true の場合にのみ CloudFormation がプロパティを特定の値に設定するようにできます。条件が false の場合、CloudFormation はプロパティをユーザーが指定した代替値に設定します。

テンプレートを再利用して、テスト環境と本番環境などのさまざまなコンテキストでリソースを作成する場合は、条件を使用できます。例えば、テンプレートでは、`prod` または `test` のいずれかを入力として受け取る `EnvironmentType` 入力パラメータを追加できます。`prod` 環境では、特定の機能を備えた EC2 インスタンスを含めることができますが、`test` 環境ではコストを節約するために機能を制限したインスタンスを使用する場合があります。この条件定義により、各環境タイプに応じて作成されるリソースとその構成方法を定義できます。

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

`Conditions` セクションは、キー名 `Conditions` で構成されます。各条件宣言には、論理 ID と 1 つ以上の組み込み関数が含まれます。

### 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:
      ...
```

## 条件の仕組み
<a name="conditions-section-structure-overview"></a>

条件を使用するには、次の手順に従います。

1. **パラメータ定義の追加** – テンプレートの `Parameters` セクションで条件が評価する入力を定義します。これらの入力パラメータの値に基づいて、条件は true または false と評価されます。擬似パラメータは自動的に利用可能であり、`Parameters` セクションで明示的な定義を必要としないことに注意してください。疑似 Parameters の詳細については、「[擬似パラメータを使用して AWS 値を取得する](pseudo-parameter-reference.md)」を参照してください。

1. **条件定義の追加** – `Fn::If`、`Fn::Equals`、などの組み込み関数を使用して `Conditions` セクションで条件を定義します。これらの条件は、CloudFormation が関連するリソースをいつ作成するかを指定します。条件は以下に基づいて定義できます。
   + 入力または擬似パラメータ値
   + その他の条件
   + 値のマッピング

   ただし、リソースの論理 ID やその属性を条件で参照することはできません。

1. **リソースまたは出力に条件を関連付ける** – `Condition` キーと条件の論理 ID を使用して、リソースまたは出力の条件を参照します。必要に応じて、テンプレートの他の部分 (プロパティ値など) の `Fn::If` を使用して、条件に基づいて値を設定します。詳細については、「[`Condition` キーの使用](#using-conditions-in-templates)」を参照してください。

CloudFormation は、スタックを作成または更新するときに条件を評価します。CloudFormation は、true に関連付けられたエンティティを作成し、false に関連付けられたをエンティティを無視します。また、CloudFormation は、リソースを変更する前に、スタックの更新ごとにこれらの条件を再評価します。true の条件に関連付けられているエンティティは更新され、false の条件に関連付けられているエンティティは削除されます。

**重要**  
スタックの更新時に、条件を単独で更新することはできません。条件を更新できるのは、リソースを追加、変更、または削除する変更を含める場合だけです。

## 条件の組み込み関数
<a name="conditions-section-structure-functions"></a>

次の組み込み関数を使用して条件を定義できます。
+ [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)

**注記**  
`Fn::If` は、テンプレートの `Resources` セクションと `Outputs` セクションのメタデータ属性、更新ポリシー属性、およびプロパティ値でのみ使用できます。

## `Condition` キーの使用
<a name="using-conditions-in-templates"></a>

条件を定義すると、`Condition` キーを使用して、テンプレート内の `Resources` や `Outputs` などの複数の場所に条件を適用できます。`Condition` キーは条件の論理名を参照し、指定された条件の評価結果を返します。

**Topics**
+ [条件をリソースに関連付ける](#associate-conditions-with-resources)
+ [条件を出力に関連付ける](#associate-conditions-with-outputs)
+ [他の条件での条件の参照](#reference-conditions-in-other-conditions)
+ [`Fn::If` を使用して条件付きでプロパティ値を返す](#conditional-return-property-values-using-fn-if)

### 条件をリソースに関連付ける
<a name="associate-conditions-with-resources"></a>

条件付きでリソースを作成するには、`Condition` キーと条件の論理 ID をリソースの属性として追加します。CloudFormation は、 条件が true に評価される場合にだけ リソースを作成します。

#### 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
```

### 条件を出力に関連付ける
<a name="associate-conditions-with-outputs"></a>

条件を出力に関連付けることもできます。CloudFormation は、 関連付けられた条件が true に評価された場合にのみ出力を作成します。

#### 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
```

### 他の条件での条件の参照
<a name="reference-conditions-in-other-conditions"></a>

`Conditions` セクションで条件を定義する際、`Condition` キーを使用して他の条件を参照できます。これにより、複数の条件を組み合わせて、より複雑な条件付きロジックを作成できます。

次の例では、`IsProduction` および `IsFeatureEnabled` 条件が true に評価された場合にのみ、`IsProdAndFeatureEnabled` 条件が true に評価されます。

#### 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
```

### `Fn::If` を使用して条件付きでプロパティ値を返す
<a name="conditional-return-property-values-using-fn-if"></a>

より詳細な制御を行う場合には、`Fn::If` 組み込み関数を使用すると、リソースまたは出力内の 2 つのプロパティ値のいずれかを条件付きで返すことができます。この関数は条件を評価し、条件が true の場合は 1 つの値を返し、条件が false の場合は別の値を返します。

#### 条件付きプロパティの値
<a name="using-fn-if-for-conditional-values"></a>

次の例は、環境条件に基づいて EC2 インスタンスタイプを設定する方法を示します。`IsProduction` 条件が true に評価された場合、インスタンスタイプは `c5.xlarge` に設定されます。それ以外の場合、`t3.small` に設定されます。

##### 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
```

#### 条件付きプロパティの削除
<a name="using-fn-if-with-novalue"></a>

`AWS::NoValue` 擬似パラメータを戻り値として使用し、条件が false の場合に対応するプロパティを削除することもできます。

##### 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"
```

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

**Topics**
+ [環境ベースのリソースの作成](#environment-based-resource-creation)
+ [複数条件のリソースプロビジョニング](#multi-condition-resource-provisioning)

### 環境ベースのリソースの作成
<a name="environment-based-resource-creation"></a>

次の例では、EC2 インスタンスをプロビジョニングし、環境タイプが `prod` の場合にのみ、条件付きで新しい EBS ボリュームを作成してアタッチします。環境が `test` の場合、追加のボリュームなしで EC2 インスタンスを作成するだけです。

#### 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
```

### 複数条件のリソースプロビジョニング
<a name="multi-condition-resource-provisioning"></a>

次の例では、バケット名が指定されている場合、条件付きで S3 バケットを作成し、環境が `prod` に設定されている場合にのみバケットポリシーをアタッチします。バケット名が指定されていない場合、または環境が `test` の場合、リソースは作成されません。

#### 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: ...
```

この例では、`CreateBucketPolicy` 条件が、`Condition` キーを使用して他の条件を参照する方法を示しています。ポリシーは、`IsProduction` および `CreateBucket` 条件の両方が true に評価された場合にのみ作成されます。

**注記**  
条件を使用するより複雑な例については、「*CloudFormation テンプレートリファレンスガイド*」の「[Condition 属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-condition.html)」トピックを参照してください。

# CloudFormation テンプレートの Transform セクション
<a name="transform-section-structure"></a>

`Transform` セクション (オプション) では、CloudFormation が何らかの方法でテンプレートを処理するために使用するマクロを 1 つ以上指定します。

マクロを使うと、テキストの検索や置換といった簡単なタスクを実行できるほか、テンプレート全体に対して広範に変換を行うことができます。CloudFormation は、指定された順にマクロを実行します。変更セットを作成すると、CloudFormation は処理したテンプレートコンテンツを変更セットに含めます。その後、変更内容を確認して変更セットを実行できます。マクロの仕組みの詳細については、「[テンプレートマクロを使用して CloudFormation テンプレートでカスタム処理を実行する](template-macros.md)」を参照してください。

CloudFormation は、トランスフォームもサポートしています。トランスフォームとは、CloudFormation がホストするマクロのことです。トランスフォームの実行順序とスコープは、自分で作成したマクロと同じように処理されます。詳細については、「[変換のリファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-reference.html)」を参照してください。

複数のマクロを宣言するには、リスト形式を使用して 1 つ以上のマクロを指定します。

例えば、以下のテンプレートサンプルでは、CloudFormation はまず `MyMacro` を評価し、次に `AWS::Serverless` を評価します。どちらも `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 テンプレート形式のバージョン構文
<a name="format-version-structure"></a>

`AWSTemplateFormatVersion` セクション (オプション) は、テンプレートが準拠するテンプレート形式バージョンを識別します。最新のテンプレートの形式バージョンは `2010-09-09` であり、現時点で唯一の有効な値です。

テンプレート形式のバージョンは API のバージョンと同じではありません。テンプレート形式のバージョンは API のバージョンとは関係なく変更できます。

テンプレートフォーマットのバージョン宣言の値は、リテラル文字列にする必要があります。テンプレートの形式バージョンの指定には、パラメータまたは機能を使用できません。値を指定しない場合、CloudFormation は最新のテンプレートの形式バージョンを使用します。次のスニペットは、有効なテンプレートの Format Version セクションの例です。

## 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 テンプレートの Description 構文
<a name="template-description-structure"></a>

`Description` セクション (オプション) では、テンプレートを記述するテキスト文字列を含めることができます。このセクションは、必ずテンプレートの Format Version セクションの後に記述する必要があります。

説明の宣言の値は、長さ 0 ～ 1024 バイトのリテラル文字列である必要があります。説明の指定には、パラメーターまたは機能を使用できません。次のスニペットは、説明の宣言の例です。

**重要**  
スタックの更新時に、`Description` セクションを単独で更新することはできません。更新できるのは、リソースを追加、変更、または削除する変更を含める場合だけです。

## 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.
```

# Infrastructure Composer を使用してテンプレートを視覚的に作成
<a name="infrastructure-composer-for-cloudformation"></a>

AWS Infrastructure Composer (以前は **[Application Composer]** と呼ばれていた) は、AWS で最新のアプリケーションを視覚的に構成および設定できるようにします。コードを記述する代わりに、さまざまなリソースをドラッグとドロップの操作でアプリケーションを視覚的に構築できます。

*CloudFormation コンソールモードの Infrastructure Composer* は、CloudFormation テンプレートを視覚的に操作するために推奨されるツールです。CloudFormation コンソールからアクセスできるこのバージョンの Infrastructure Composer は、CloudFormation デザイナーと呼ばれる古いツールからの改良版です。

CloudFormation コンソールモードで Infrastructure Composer を使用すると、カードと呼ばれるさまざまなリソースをビジュアルキャンバスにドラッグ、ドロップ、設定、接続できます。この視覚的なアプローチにより、テンプレートを直接操作しなくても、アプリケーションアーキテクチャの設計と編集が簡単になります。「[CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/)」からこのモードにアクセスするには、左側のナビゲーションメニューから **[Infrastructure Composer]** を選択します。

詳細については、「AWS Infrastructure Composer Developer Guide」の「[How to compose in AWS Infrastructure Composer](https://docs.aws.amazon.com/infrastructure-composer/latest/dg/using-composer-basics.html)」を参照してください。

## CloudFormation コンソールモードで Infrastructure Composer を使用する理由
<a name="app-composer-for-cloudformation-why-use"></a>

Infrastructure Composer でテンプレートを視覚化することにより、CloudFormation テンプレートおよびアプリケーションアーキテクチャのギャップと改善対象領域を特定しやすくなります。Infrastructure Composer は、CloudFormation スタックの視覚的な構築および変更を簡単かつ効率的に行うことができるため、開発の操作性が向上します。最初のドラフトから開始してデプロイ可能なコードを作成し、Infrastructure Composer のビジュアルデザイナーでデベロッパーのワークフローを組み込むことができます。

## Infrastructure Composer コンソールと異なる内容
<a name="app-composer-for-cloudformation-differences"></a>

Infrastructure Composer の CloudFormation コンソールバージョンには標準の Infrastructure Composer コンソールと同様の機能がありますが、いくつかの違いがあります。Lambda 関連のカード (**[Lambda 関数]** および **[Lambda レイヤー]**) には、CloudFormation コンソールモードの Infrastructure Composer では利用できないコードビルドおよびパッケージングソリューションが必要です。ローカル同期は、このモードでは利用できません。

ただし、これらの Lambda 関連のカードおよびローカル同期機能は、「[Infrastructure Composer コンソール](https://console.aws.amazon.com/composer/home)」または AWS Toolkit for Visual Studio Code で使用できます。詳細については、「AWS Toolkit for Visual Studio Code ユーザー ガイド」の「[AWS Infrastructure Composer デベロッパーガイド](https://docs.aws.amazon.com/infrastructure-composer/latest/dg/what-is-composer.html)」および「[Infrastructure Composer](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/appcomposer.html)」を参照してください。

# AWS CloudFormation 言語サーバー
<a name="ide-extension"></a>

AWS CloudFormation 言語サーバーは、Infrastructure as Code (IaC) の作成と AWS リソースのデプロイを安全かつ確実に高速化する機能を提供します。[言語サーバープロトコル](https://microsoft.github.io/language-server-protocol/) (LSP) に従って、ホバー、自動補完、静的検証による診断、定義およびコードアクションの参照に関するドキュメントを提供します。これらの従来の言語サーバー機能に加えて、サーバーは CloudFormation を介して AWS リソースを探索およびデプロイするためのオンライン機能を追加しています。これには、変更セットを使用してテンプレートを検証してデプロイする機能、スタック差分、イベント、リソース、および出力を表示する機能、タイプ別にスタックを一覧表示してリソースを参照する機能、ライブリソースの状態を CloudFormation テンプレートに直接挿入する機能などが含まれます。

**Topics**
+ [AWS CloudFormation 言語サーバーと統合している IDE](#ide-extension-supported-ides)
+ [開始方法](#ide-extension-getting-started)
+ [IDE で CloudFormation プロジェクトを初期化する (VS Code のみ)](#ide-extension-initialize-project)
+ [オープンソース](#ide-extension-open-source)
+ [サポートが必要ですか?](#ide-extension-need-help)

## AWS CloudFormation 言語サーバーと統合している IDE
<a name="ide-extension-supported-ides"></a>

AWS は、次の IDE の AWS Toolkit を介して CloudFormation 言語サーバーとの既成統合を提供します。
+ [Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.aws-toolkit-vscode)
+ IntelliJ IDEA、WebStorm、PyCharm などの [JetBrains IDE](https://plugins.jetbrains.com/plugin/11349-aws-toolkit) (バージョン 2025.3 以降)

次の IDE も CloudFormation 言語サーバーをサポートします。
+ [Kiro](https://kiro.dev/downloads/)
+ [カーソル](https://cursor.com/)
+ ほとんどの VS Code フォークとディストリビューション

CloudFormation 言語サーバーは [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) (LSP) に準拠しているため、他の統合も設定できます。言語サーバーを他のエディタと統合する手順については、[インストールガイド](https://github.com/aws-cloudformation/cloudformation-languageserver/blob/main/INSTALLATION.md)を参照してください。

## 開始方法
<a name="ide-extension-getting-started"></a>

**Topics**
+ [前提条件](#ide-extension-prerequisites)
+ [ステップ 1: AWS Toolkit をインストールまたはアップグレードする](#ide-extension-install-toolkit)
+ [ステップ 2: AWS Toolkit で CloudFormation にアクセスする](#ide-extension-access-toolkit-panel)
+ [ステップ 3: テンプレートを検証、テスト、および改善する](#ide-extension-validate-test-refine)
+ [ステップ 4: テンプレート内をナビゲートする](#ide-extension-navigate-template)
+ [ステップ 5: 検証してデプロイする](#ide-extension-validate-deploy)

### 前提条件
<a name="ide-extension-prerequisites"></a>

開始する前に、以下を確認してください。
+ サポートされている IDE をサポートされているオペレーティングシステム (macOS、Windows、または Linux) でを使用している。
+ 目的の IDE 用の AWS Toolkit の最新バージョンをインストールしている (最新バージョンにアップグレードしている)。

AWS CloudFormation 言語サーバーの一部の機能には、アクティブな AWS アカウント と設定済みの認証情報が必要です。有効な認証情報を使用して、AWS Toolkit を通じて AWS アカウント にサインインする必要があります。

### ステップ 1: AWS Toolkit をインストールまたはアップグレードする
<a name="ide-extension-install-toolkit"></a>

IDE の拡張機能またはプラグインマネージャーから最新バージョンの AWS Toolkit のインストールまたは最新バージョンへの更新を行い、IDE を再起動します。

インストール後、AWS Toolkit は自動的に CloudFormation IDE のサポートを有効にします。AWS CloudFormation 言語サーバーともに AWS Toolkit を初めてインストールまたはアップグレードすると、匿名の使用状況データを収集するために AWS のアクセス許可を付与するよう求められます。このデータは、AWS が CloudFormation 言語サーバーを改善し、オーサリングエクスペリエンスを向上させるのに役立ちます。機密情報は収集されず、AWS はテンプレートコンテンツ、リソース設定、または識別可能な顧客データを記録したり保存したりしません。IDE 設定からテレメトリ設定は、いつでも変更できます。変更を有効にするには、IDE を再起動します。収集された使用状況データは、機能インタラクションとパフォーマンスメトリクスのみに焦点を当てています。これらのインサイトは、AWS が検証の迅速化、オートコンプリートの強化、エラー診断の改良など、改善点を特定して優先順位を付けるのに役立ちます。

### ステップ 2: AWS Toolkit で CloudFormation にアクセスする
<a name="ide-extension-access-toolkit-panel"></a>

AWS Toolkit をインストールした後、IDE で CloudFormation パネルを開きます。VS Code で、アクティビティバーから AWS Toolkit パネルを開き、**[CLOUDFORMATION]** を選択します。JetBrains IDE で、サイドバーから **AWS Toolkit** ツールウィンドウを開き、**[CloudFormation]** タブを選択します。

CloudFormation パネルには、以下のセクションが含まれています。
+ **[リージョン]**: 現在の AWS リージョン を表示します。VS Code では、リージョン名を選択するか、コマンドパレットから **[AWS CloudFormation: Select Region]** コマンドを使用して変更できます。JetBrains IDE では、リージョンは AWS Toolkit 接続設定を使用して設定されます。
+ **[スタック]**: アカウントの CloudFormation スタックのページ分割されたリストを表示します。スタックを展開して、そのスタックに関連付けられた変更セットを一覧表示する **[Change Sets]** ノードを表示します。[View Stack Detail] アクションを使用して、スタックの概要、イベント、出力、リソースが表示されるスタックの詳細ビューを開きます。
+ **[Resources]**: リソースタイプを追加すると、パネルにアカウントのそのタイプの AWS リソースが表示されます。テンプレートを表示、更新、コピー、またはテンプレートにインポートできます。

JetBrains IDE では、ツリーの上にあるツールバーから、**[Validate and Deploy]**、**[Rerun Validate and Deploy]**、**Add Resource Type]**、**[Refresh]** などの一般的なアクションにすばやくアクセスできます。アクションには、ツリーノードの右クリックコンテキストメニューからもアクセスできます。

### ステップ 3: テンプレートを検証、テスト、および改善する
<a name="ide-extension-validate-test-refine"></a>

CloudFormation テンプレートを作成すると、IDE はインテリジェントオーサリング支援を提供し、正確で準拠したインフラストラクチャをより迅速に作成できるようにします。CloudFormation 言語サーバーは、バックグラウンドで実行され、次のオーサリング機能を提供します。
+ コード補完: CloudFormation スキーマに基づいてリソースタイプ、パラメータ、およびプロパティを提案します。
+ 既存の AWS リソースの追加: AWS アカウント からテンプレートに既存のリソースをインポートできます。IDE は、[AWS クラウドコントロール API (CCAPI)](https://docs.aws.amazon.com/cloudcontrolapi/latest/userguide/what-is-cloudcontrolapi.html) を使用してリソースのライブ設定とプロパティを取得し、テンプレート内の既存のインフラストラクチャのクローンを作成または再利用するのを支援します。
+ パラメータに抽出する: カーソルがテンプレートのリテラル値 (`t2.micro` などの文字列) にある場合、IDE は、値を `Parameters` セクションに抽出してリテラルを新しいパラメータへの `!Ref` でリテラルを置き換えるリファクタリングアクションを提供します。同じリテラル値が複数の場所に表示されている場合は、すべてのインスタンスを一度に抽出することができます。

#### リソースをテンプレートに追加するには
<a name="ide-extension-add-resources-to-template"></a>
+ **リソースタイプを追加する**: AWS Toolkit CloudFormation パネルの **[リソース]** で、参照するリソースタイプを追加します。VS Code では、**[Add \$1]** アイコンをクリックするか、コマンドパレットから **[AWS CloudFormation: Add Resource Types]** コマンドを使用します。JetBrains では、ツールバーの **[Add Resource Type]** ボタンをクリックするか、**[Resources]** ノードを右クリックします。
+ **リソースタイプを検索する**: 検索ダイアログで、追加する AWS リソースタイプを入力します。例:
  + `AWS::S3::Bucket`
  + `AWS::Lambda::Function`
+ **リソースを参照する**: **[リソース]** セクションには、アカウントで検出された AWS リソースのページ分割されたリストが表示されます。多くのリソースがある場合は、最初のページのみが表示されます。追加のページ間を移動し、使用可能なすべてのリソースを表示するには、ナビゲーションコントロールを使用します。
+ テンプレートに含めるリソースを選択します。
+ リソースをテンプレートに挿入するには、目標に応じて、2 つの方法があります。
  + **既存のリソースのクローンを作成する**: 既存の AWS リソースのライブ設定とプロパティを使用して、テンプレートに新しいリソースを作成します。
  + **既存のリソースをインポートする**: ライブの状態を使用して実際のリソースをテンプレートに追加することで、そのリソースをスタックに挿入します。

**ヒント**
+ **[リソース]** セクションはいつでも更新して、アカウントまたはリージョンで利用可能なリソースの最新リストを表示できます。
+ リソースをインポートしている場合は、同じアカウントの既存の CloudFormation スタックに既に属しているリソースを追加しないでください。
+ リソースが既に CloudFormation によって管理されているかどうかを確認するには、リソースの横にある情報アクションを使用します。VS Code では、**[i]** アイコンをクリックします。JetBrains IDE では、リソースを右クリックして **[Get Stack Management Info]** を選択します。

##### 関連リソースを追加する
<a name="ide-extension-add-related-resources"></a>

VS Code では、コマンド **[AWS CloudFormation: Add Related Resources by Type]** を使用して、関連リソースを選択したリソースに追加できます。テンプレートで既に定義されているリソースタイプから選択すると、IDE には、通常そのタイプに関連付けられているか、そのタイプに依存するリソースのリストが表示されます。例えば、`AWS::EC2::Instance` を選択した場合、IDE は `AWS::EC2::SecurityGroup` や `AWS::EC2::Subnet` などの関連リソースの追加を提案する場合があります。この機能は、互換性のあるリソースタイプを手作業で検索することなく、接続されたインフラストラクチャコンポーネントをすばやく構築するのに役立ちます。現在、この機能は JetBrains IDE ではサポートされていません。

#### 静的検証
<a name="ide-extension-static-validation"></a>

CloudFormation 言語サーバーは、[AWS CloudFormation Linter (cfn-lint)](https://github.com/aws-cloudformation/cfn-lint) と [AWS CloudFormation Guard](https://docs.aws.amazon.com/cfn-guard/latest/ug/what-is-guard.html) による組み込みの静的検証を提供します。これらの検証は、テンプレートを作成したときにバックグラウンドで実行され、デプロイ前に構文エラー、コンプライアンスギャップ、ベストプラクティスの問題を特定するのに役立ちます。

**静的検証の概要**

IDE には 2 種類のリアルタイム静的検証が示されます。
+ CloudFormation Linter (`cfn-lint`): CloudFormation リソース仕様とスキーマルールに対してテンプレートを検証します。
+ Guard (`cfn-guard`): コンプライアンスルールと組織ポリシーパックに対してテンプレートを検証します。

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

CloudFormation Linter は、IDE に統合されており、入力時にテンプレートの構文と構造を自動的にチェックします。
+ **スキーマの検証**: 構文とスキーマのエラーを検出して、テンプレートが CloudFormation リソーススキーマに準拠していることを確認します。
+ **エラーの強調表示**: デプロイのブロッカーまたは警告を表すインラインマーカーが問題の下に表示されます。
+ **マウスホバーのヘルプ**: エラーの上にマウスを置くと、その問題に関連する診断メッセージが IDE に表示されます。利用可能な場合は、クイック修正も提供されます。

##### Guard 統合
<a name="ide-extension-cfn-guard-integration"></a>

Guard は、コンプライアンスポリシーとセキュリティポリシーを定義するルールセットに対してテンプレートを検証します。IDE は CloudFormation 言語サーバーを介してリアルタイムで Guard 検証を実行し、テンプレートの作成中にすぐにフィードバックを提供します。
+ **デフォルトルールパック**: IDE には、リソースのセキュリティと設定の健全性に関する基本的なベストプラクティスに焦点を当てた、事前登録済みの一連の Guard ルールが含まれています。詳細については、[Guard ルールレジストリ](https://github.com/aws-cloudformation/aws-guard-rules-registry)を参照してください。
+ **ルールパックの追加**: ルールセットを追加または変更するには、IDE 設定を開いて Guard 設定セクションにナビゲートし、追加の Guard ルールパックを選択またはアップロードします。

**ヒント**: 診断インジケーターの理解
+ 青のインジケーター: ベストプラクティスのヒントまたは最適化の推奨事項。
+ 黄色のインジケーター: ノンブロッキングの問題 (タグやパラメータの欠落など) に関する警告。
+ 赤のインジケーター: 無効なプロパティ名、必須フィールドの欠落、スキーマの不一致などのデプロイブロッカー。

### ステップ 4: テンプレート内をナビゲートする
<a name="ide-extension-navigate-template"></a>

IDE は、`Parameters`、`Resources`、`Outputs`、`Mappings` などのセクションに整理された CloudFormation テンプレートの構造化された階層ビューを提供し、各リソースタイプと論理 ID を示します。これにより、大きなテンプレート内の特定のリソースやパラメータをすばやく見つけてナビゲートすることが容易になります。VS Code では、この構造は **[Explorer]** サイドバーの **[Outline]** パネルに表示されます。JetBrains IDE では、**[Structure]** ツールウィンドウを開くと現在開いているファイルのテンプレート構造が表示されます。

`GetAtt` や `Ref` などの組み込み関数用に **[定義に進む]** を使用して、テンプレート内の参照されるリソースやパラメータに直接ジャンプすることができます。これは、依存関係を追跡し、リソースの関係を理解し、編集をより効率的に行うことに役立ちます。

### ステップ 5: 検証してデプロイする
<a name="ide-extension-validate-deploy"></a>

CloudFormation テンプレートをデプロイする準備ができたら、検証とデプロイ機能を使用して変更セットを作成します。テンプレートが IDE によって検証されます。ブロッキングエラーが見つからない場合は、[ドリフト対応変更セット](drift-aware-change-sets.md)の作成に進みます。次に、IDE に差分ビューが表示されるので、変更セットを実行する前に、提案されたすべての変更を確認できます。

VS Code では、コマンドパレットを開き、**[AWS CloudFormation: Validate and Deploy]** を実行します。テンプレート、スタック名、パラメータ、機能、その他のデプロイオプションの選択がコマンドパレットでステップごとにガイドされます。JetBrains IDE では、ツールバー **[Validate and Deploy]** ボタンを使用するか、エディタでテンプレートファイルを右クリックするか、ツリーでスタックを右クリックします。JetBrains でウィザードダイアログが表示され、テンプレートの選択、スタック名、パラメータ、機能、タグ、詳細オプションなど、すべてのデプロイオプションを設定できます。

#### 検証の仕組み
<a name="ide-extension-how-validation-works"></a>

IDE は[デプロイ前の検証チェック](validate-stack-deployments.md)を自動的に実行し、次のような一般的な障害の原因に対してテンプレートを検証します。
+ 無効なプロパティ構文またはスキーマの不一致: これらの問題は通常、オーサリング中に `cfn-lint` によって検出されますが、それらに対処せずにデプロイを進めた場合、CloudFormation のデプロイ時の検証で、スタックが作成または更新される前に同じエラーが表示されます。
+ リソース名が、アカウント内の既存のリソースと競合しています。
+ S3 バケット名の競合や暗号化の欠落など、サービス固有の制約。

検証でエラーが検出された場合、IDE では問題が直接テンプレート内で強調表示され、診断パネルにエラーが一覧表示されます。各問題には、推奨される修正とともに、障害の原因となった特定のプロパティまたはリソースが含まれます。ブロックエラーがない場合は、デプロイフェーズに進むことができます。

警告が見つかった場合 (ノンブロッキングの問題)、ダイアログが表示され、デプロイを続行するか、キャンセルして修正することができます。

IDE で [[ドリフト対応変更セット]](drift-aware-change-sets.md) が開き、現在のテンプレートとデプロイされたスタック設定の違いが表示されます。これにより、実行前に変更セットを確認、確認、またはキャンセルできます。デプロイをキャンセルすると、変更セットが削除されます。

ドリフト対応変更セットは、スタックドリフトを安全に処理できるようにすることで、CloudFormation のデプロイプロセスを強化します。スタックドリフトは、リソースの実際の状態が CloudFormation テンプレートで定義されているものと異なる場合に発生します。これは多くの場合、AWS マネジメントコンソール、CLI、または SDK を介して行われた手動による変更が原因です。CloudFormation の[ドリフト対応変更セット](drift-aware-change-sets.md) は、処理されたスタック設定をライブのリソースの状態と比較し、IDE はこれらの違いを明らかにするので、デプロイ前にリソースをコンプライアンス状態に戻すことができます。

#### スタックイベントを表示する
<a name="ide-extension-view-stack-events"></a>

デプロイが開始されたら、進捗状況を CloudFormation パネルからリアルタイムでモニタリングできます。**[スタックイベント]** には、デプロイ中に実行されたオペレーションのリストが表示されます。各イベントには、次のような詳細が含まれます:
+ **[タイムスタンプ]** — イベントが発生した時刻
+ **[リソース]**: 作成、更新、または削除される特定の AWS リソース
+ **[ステータス]**: オペレーションの現在の状態 (`CREATE_IN_PROGRESS`、`UPDATE_COMPLETE`、`ROLLBACK_IN_PROGRESS` など)
+ **[理由]**: 該当する場合、追加のコンテキストまたはエラーメッセージ

このパネルからスタックの **[リソース]** と **[出力]** を表示することもできます。**[スタックイベント]** ビューは、デプロイの進行状況を追跡し、潜在的な問題を特定し、スタックが正常に完了したことを確認するのに役立ちます。

## IDE で CloudFormation プロジェクトを初期化する (VS Code のみ)
<a name="ide-extension-initialize-project"></a>

IDE で CloudFormation プロジェクトを初期化すると、正しいフォルダ、環境設定、および AWS 認証情報を使用して構造化ワークスペースをセットアップできるため、テンプレートを確実に検証してデプロイできます。IDE から直接新しい CloudFormation プロジェクトを初期化して、この推奨セットアップを作成できます。現在、この機能は VS Code でのみ使用可能で、JetBrains IDE ではサポートされていません。

**CloudFormation プロジェクトを初期化するには:**
+ **コマンドパレットを開きます**
  + VS Code から、コマンドパレット (macOS の `Ctrl+Shift+P` または `Cmd+Shift+P`) を開きます。
  + **[AWS CloudFormation: CFN Init: プロジェクトを初期化する]** を選択します。
+ **プロジェクトディレクトリを選択する**
  + デフォルト: IDE は現在の作業ディレクトリを使用します。
  + このパスを CloudFormation テンプレートを保存する任意のフォルダに変更することができます。
+ **AWS 認証情報プロファイルを選択する**
  + AWS 認証情報プロファイルを選択するように求められます。選択したプロファイルは、環境の検出、検証、デプロイに使用されます。
+ **環境をセットアップする**
  + 環境を作成または選択するように求められます。
  + 環境は、テンプレートをデプロイまたは検証する場所と方法 (開発、ベータ、本番稼働など) を定義します。**[AWS CloudFormation: CFN Init: 環境を追加する]** を使用して、環境を選択または変更できます。
  + **[AWS CloudFormation: CFN Init: Remove Environment]** を使用して、選択した環境を削除できます。
+ **(オプション) パラメータファイルをインポートする**
  + 既存のパラメータファイルが既にある場合、IDE は初期化中にそれらをインポートすることを許可します。
  + IDE は互換性のあるファイルを自動的に検出し、テンプレートの検証とデプロイで使用するためにそれらをプロジェクトにリンクします。
+ **プロジェクトを命名して確定する**
  + ベータ環境などのプロジェクト名を提供し、セットアップを完了します。
  + IDE は、最初のプロジェクト構造と設定ファイルを作成します。

IDE から直接、検証を実行したり、デプロイをプレビューしたり、環境を切り替えたりできます。

## オープンソース
<a name="ide-extension-open-source"></a>

AWS CloudFormation 言語サーバーは、Apache-2.0 ライセンスでオープンソース化されているため、テンプレート診断、スキーマ検証、および静的分析の実行方法に対する完全な透明性を提供します。これにより、ツールを採用する前にソースレベルの可視性を必要とする顧客のセキュリティとコンプライアンスの摩擦が軽減されます。

コードベースは GitHub で一般公開されています: [https://github.com/aws-cloudformation/cloudformation-languageserver/](https://github.com/aws-cloudformation/cloudformation-languageserver/)。

## サポートが必要ですか?
<a name="ide-extension-need-help"></a>

AWS re:Post で [CloudFormation コミュニティ](https://repost.aws/tags/TAm3R3LNU3RfSX9L23YIpo3w)をお試しください。

# IaC ジェネレーターを使用して既存のリソースからテンプレートを生成する
<a name="generate-IaC"></a>

IaC ジェネレーター (Infrastructure as Code ジェネレーター) では、まだ CloudFormation の管理対象になっていないアカウントにプロビジョニングされた AWS リソースを使用してテンプレートを生成することができます。

IaC ジェネレーターの利点は次のとおりです。
+ CloudFormation 管理でアプリケーション全体を使用するか、AWS CDK アプリに移行します。
+ プロパティでリソースプロパティを記述することなくテンプレートを生成し、それを JSON または YAML 構文に変換します。
+ 新しいアカウントかリージョンにリソースをレプリケートするときは、こちらのテンプレートを使用します。

IaC 生成プロセスは、以下のステップで構成されています。

1. **リソースのスキャン** – 最初のステップは、リソースのスキャンを開始することです。このスキャンはリージョン全体で実行され、30 日後に失効します。この間、同じスキャンから複数のテンプレートを作成できます。

1. **テンプレートの作成** – テンプレートを作成するには、次の 2 つのオプションがあります。
   + 新しいテンプレートを最初から作成し、スキャンしたリソースと関連リソースをそこに追加します。
   + 既存の CloudFormation スタックを開始点として使用して、スキャンされたリソースと関連リソースをそのテンプレートに追加します。

1. **リソースのインポート** – テンプレートを使用して、リソースを CloudFormation スタックとしてインポートするか、AWS CDK アプリに移行します。

IaC ジェネレーターの機能は、すべての商用リージョンで利用可能で、多くの一般的な AWS リソースタイプをサポートしています。サポートされているリソースの一覧については、「[リソースタイプのサポート](resource-import-supported-resources.md)」を参照してください。

**Topics**
+ [考慮事項](#iac-generator-considerations)
+ [リソースのスキャンに必要な IAM アクセス許可](#iac-generator-permissions)
+ [テンプレートの生成、管理、削除によく使用されるコマンド](#iac-generator-commonly-used-commands)
+ [テンプレートを AWS CDK に移行する](#iac-generator-cdk-migrate)
+ [CloudFormation IaC ジェネレーターを使用してリソーススキャンを開始する](iac-generator-start-resource-scan.md)
+ [CloudFormation コンソールでスキャンの概要を表示する](generate-IaC-view-scan-summary.md)
+ [IaC ジェネレーターを使用してスキャンされたリソースから CloudFormation テンプレートを作成する](iac-generator-create-template-from-scanned-resources.md)
+ [スキャンしたリソースから CloudFormation スタックを作成する](iac-generator-create-stack-from-scanned-resources.md)
+ [書き込み専用プロパティを解決する](generate-IaC-write-only-properties.md)

## 考慮事項
<a name="iac-generator-considerations"></a>

読み取り権限のある AWS リソースであれば、JSON テンプレートまたは YAML テンプレートを生成できます。IaC ジェネレーターの機能のテンプレートは、リソースプロパティをプロパティごとに記述することなく、クラウドリソースを確実かつ迅速にモデル化します。

次の表は、IaC の生成機能に使用できるクォータの一覧です。


| 名前 | フルスキャン | 部分スキャン | 
| --- | --- | --- | 
|  1 回のスキャンで処理できるリソースの最大数  |  100,000  |  100,000  | 
|  1 日あたりのスキャン数 (スキャンするリソースの数が 10,000 未満の場合)  |  10  |  10  | 
|  1 日あたりのスキャン数 (スキャンするリソースの数が 10,000 以上の場合)  |  1  |  1  | 
|  アカウントあたりの同時に生成されるテンプレートの数  |  5  |  5  | 
|  1 回のテンプレート生成で同時にモデル化されるリソースの数  |  5  |  5  | 
|  1 つのテンプレートでモデル化できるリソースの合計数  |  500  |  500  | 
|  生成されたテンプレートのアカウントあたりの最大数  |  1,000  |  1,000  | 

**重要**  
IaC ジェネレーターは、お使いのリージョンの Cloud Control API でサポートされている AWS リソースのみをサポートします。詳細については、「[リソースタイプのサポート](resource-import-supported-resources.md)」を参照してください。

## リソースのスキャンに必要な IAM アクセス許可
<a name="iac-generator-permissions"></a>

IaC ジェネレーターでリソースをスキャンするときは、お使いの IAM プリンシパル (ユーザー、ロール、またはグループ) に次のものが必要です。
+ CloudFormation のスキャンのアクセス許可
+ ターゲットの AWS サービスの読み取りアクセス許可

スキャンの範囲は、ユーザーが読み取りアクセス許可を持っているリソースに限られます。アクセス許可がないためにスキャンに失敗することはありませんが、そのようなリソースは除外されます。

スキャンとテンプレート管理のアクセス許可を付与する IAM ポリシーの例については、「[すべての IaC ジェネレーターオペレーションを許可する](security_iam_id-based-policy-examples.md#iam-policy-example-for-iac-generator)」を参照してください。

## テンプレートの生成、管理、削除によく使用されるコマンド
<a name="iac-generator-commonly-used-commands"></a>

IaC ジェネレーターの操作用によく使用されるコマンドには以下が含まれます。
+ [start-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/start-resource-scan.html) - AWS リージョンでアカウント内のリソースのスキャンを開始します。
+ [describe-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-resource-scan.html) - リソーススキャンの進行状況をモニタリングします。
+ [list-resource-scans](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scans.html) - AWS リージョン内のリソーススキャンを一覧表示します。
+ [list-resource-scan-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-resources.html) - リソーススキャン中に見つかったリソースを一覧表示します。
+  [list-resource-scan-related-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-related-resources.html) - スキャンしたリソースに関連するリソースを一覧表示します。
+ [create-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-generated-template.html) - スキャンされたリソースのセットから CloudFormation テンプレートを生成します。
+ [update-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-generated-template.html) - 生成されたテンプレートを更新します。
+ [describe-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-generated-template.html) - 生成されたテンプレートに関する情報を返します。
+ [list-generated-templates](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-generated-templates.html) - アカウントと現在のリージョンで生成されたすべてのテンプレートを一覧表示します。
+ [delete-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/delete-generated-template.html) - 生成されたテンプレートを削除します。

## テンプレートを AWS CDK に移行する
<a name="iac-generator-cdk-migrate"></a>

AWS Cloud Development Kit (AWS CDK) は、一般的なプログラミング言語を使って CloudFormation リソースを開発、管理、デプロイするときに使用できるオープンソースのソフトウェア開発フレームワークです。

AWS CDK CLI は、IaC ジェネレーターとの統合を提供します。CloudFormation テンプレートを変換し、ユーザーのリソースを含む新しい CDK アプリを作成するには、AWS CDK CLI `cdk migrate` コマンドを使用します。その後、AWS CDK を使用してリソースを管理し、CloudFormation にデプロイできます。

詳細については、「AWS Cloud Development Kit (AWS CDK) デベロッパーガイド」の「[Migrate to AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/migrate.html)」を参照してください。

# CloudFormation IaC ジェネレーターを使用してリソーススキャンを開始する
<a name="iac-generator-start-resource-scan"></a>

既存のリソースからテンプレートを作成する前に、リソースをスキャンして現在のリソースとその関係性を特定する必要があります。

リソーススキャンは、次のいずれかの方法で開始できます。IaC ジェネレーターを使用するのが初めての場合は、1 つ目の方法をお勧めします。
+ **すべてのリソースをスキャン (フルスキャン)** – 現在のアカウントおよびリージョンにある既存のリソースをすべてスキャンします。このスキャンでは、リソース 1,000 件に対して最大 10 分かかります。
+ **特定のリソースをスキャン (部分スキャン）** – 現在のアカウントおよびリージョンの中からスキャンするリソースタイプを手動で選択します。この方法は 1 つ目の方法よりも処理時間が短く、的を絞ったスキャンが行えるため、反復的なテンプレート開発に向いています。

スキャンが完了すると、テンプレートの生成時に含めるリソースとその関連リソースを選択できます。部分スキャンを使用する場合、関連リソースは、次のいずれかの場合にのみテンプレート生成中に使用できます。
+ スキャンを開始する前に関連リソースを具体的に選択した場合、または
+ 選択したリソースタイプを特定するときに必要となった場合。

例えば、`AWS::EKS::Cluster` を選択せずに `AWS::EKS::Nodegroup` を選択した場合、ノードグループを特定するには事前にクラスターを特定することが必要になるため、IaC ジェネレーターは自動的に `AWS::EKS::Cluster` リソースをスキャンに含めます。上記以外の場合、スキャンには具体的に選択したリソースのみが含まれます。

**注記**  
先に進む前に、IaC ジェネレーターを操作するための必要な権限を持っていることを確認します。詳細については、「[リソースのスキャンに必要な IAM アクセス許可](generate-IaC.md#iac-generator-permissions)」を参照してください。

**Topics**
+ [リソーススキャンを開始する (コンソール)](#start-resource-scan-console)
+ [リソーススキャンを開始する (AWS CLI)](#start-resource-scan-cli)

## リソーススキャンを開始する (コンソール)
<a name="start-resource-scan-console"></a>

**すべてのリソースタイプのリソーススキャンを開始するには (フルスキャン）**

1. CloudFormation コンソールの [IaC ジェネレーターページ](https://console.aws.amazon.com/cloudformation/home?#iac-generator)を開きます。

1. 画面上部のナビゲーションバーで、スキャンするリソースを含む AWS リージョンを選択します。

1. **[スキャン]** パネルで** [新しいスキャンを開始]** を選択し、**[すべてのリソースをスキャン]** を選択します。

**特定のリソースタイプのリソーススキャンを開始するには (部分スキャン）**

1. CloudFormation コンソールの [IaC ジェネレーターページ](https://console.aws.amazon.com/cloudformation/home?#iac-generator)を開きます。

1. 画面上部のナビゲーションバーで、スキャンするリソースを含む AWS リージョンを選択します。

1. **[スキャン]** パネルで **[新しいスキャンを開始]** を選択し、**[特定のリソースをスキャン]** を選択します。

1. **[部分スキャンを開始]** ダイアログボックスで、最大 100 個のリソースタイプを選択し、**[スキャンを開始]** を選択します。

## リソーススキャンを開始する (AWS CLI)
<a name="start-resource-scan-cli"></a>

**すべてのリソースタイプのリソーススキャンを開始するには (フルスキャン）**  
以下の [start-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/start-resource-scan.html) コマンドを使用します。*us-east-1* を、スキャンするリソースを含む AWS リージョンに置き換えます。

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

成功した場合、このコマンドはスキャンの ARN を返します。`ResourceScanId` プロパティの ARN を書き留めます。テンプレートを作成するには、これが必要です。

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

**特定のリソースタイプのリソーススキャンを開始するには (部分スキャン）**

1. 以下の [cat](https://en.wikipedia.org/wiki/Cat_(Unix)) コマンドを使用して、スキャンするリソースタイプをホームディレクトリの `config.json` という名前の JSON ファイルに保存します。以下は、Amazon EC2 インスタンス、セキュリティグループ、およびすべての Amazon S3 リソースをスキャンする場合のスキャン設定の例です。

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

1. [start-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/start-resource-scan.html) コマンドに `--scan-filters` オプションを付けて、作成した `config.json` ファイルと共に部分スキャンを開始します。*us-east-1* を、スキャンするリソースを含む AWS リージョンに置き換えます。

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

   成功した場合、このコマンドはスキャンの ARN を返します。`ResourceScanId` プロパティの ARN を書き留めます。テンプレートを作成するには、これが必要です。

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

**リソーススキャンの進行状況を監視する**  
[describe-resource-scan](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-resource-scan.html) コマンドを使用します。`--resource-scan-id` オプションでは、サンプル ARN を実際の 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
```

成功すると、このコマンドは以下のような出力を返します。

```
{
    "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
}
```

部分スキャンでは、出力は以下のようになります。

```
{
    "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::*"
            ]
        }
    ]
}
```

出力のフィールドの説明については、「AWS CloudFormation API リファレンス」の「[DescribeResourceScan](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeResourceScan.html)」を参照してください。

# CloudFormation コンソールでスキャンの概要を表示する
<a name="generate-IaC-view-scan-summary"></a>

スキャンが完了したら、スキャン中に見つかったリソースを視覚化した図を表示して、さまざまな製品タイプ全体でのリソースの集中を特定することができます。

**スキャン中に見つかったリソースに関する情報を表示する**

1. CloudFormation コンソールの [IaC ジェネレーターページ](https://console.aws.amazon.com/cloudformation/home?#iac-generator)を開きます。

1. 画面上部のナビゲーションバーで、スキャンするリソースが含まれる AWS リージョンを選択します。

1. ナビゲーションペインで、**[IaC ジェネレーター]** をクリックします。

1. **[スキャンされたリソースの内訳]** に、スキャンされたリソースの視覚的な内訳が **[コンピューティング]** や **[ストレージ]** などの製品タイプ別に表示されます。

1. 表示される製品タイプの数をカスタマイズするには、**[表示されたデータをフィルタリング]** を選択します。フィルタリングは、視覚化された図をカスタマイズして、最も関心のある製品タイプに焦点を当てるようにするために役立ちます。

1. ページの右側には、**[スキャン概要の詳細]** パネルがあります。パネルを開くには、**[パネルを開く]** アイコンを選択します。

![\[IaC ジェネレーターコンソールは、スキャンされたリソースの視覚的な内訳を提供します。\]](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/images/IaC-generator-scan-summary.png)


# IaC ジェネレーターを使用してスキャンされたリソースから CloudFormation テンプレートを作成する
<a name="iac-generator-create-template-from-scanned-resources"></a>

このトピックでは、IaC ジェネレーター機能を使用してスキャンされたリソースからテンプレートを作成する方法について説明します。

## スキャンしたリソースからテンプレートを作成する (コンソール)
<a name="create-template-from-scanned-resources-console"></a>

**スキャンしたリソースからスタックテンプレートを作成するには**

1. CloudFormation コンソールの [IaC ジェネレーターページ](https://console.aws.amazon.com/cloudformation/home?#iac-generator)を開きます。

1. 画面上部のナビゲーションバーで、スキャンしたリソースが含まれる AWS リージョンを選択します。

1. **[テンプレート]** セクションから **[テンプレートを作成]** を選択します。

1. **[新しいテンプレートから開始]** を選択します。

   1. **[テンプレート名]** に、テンプレートの名前を入力します。

   1. (オプション) **[削除ポリシー]** を **[置換ポリシーを更新]** に設定します。

   1. **[次へ]** をクリックし、スキャンしたリソースをテンプレートに追加します。

1. **[スキャンしたリソースを追加]** で、スキャンしたリソースのリストを参照し、テンプレートに追加するリソースを選択します。リソースは、リソース識別子、リソースタイプ、タグのいずれかでフィルターできます。フィルターは相互に包括的です。

1. 必要なリソースすべてをテンプレートに追加したときに、**[次へ]** を選択し、**[スキャンしたリソースを追加]** ページを閉じて **[関連リソースを追加]** ページに進みます。

1. 関連リソースの推奨リストを確認します。Amazon EC2 インスタンスやセキュリティグループなどの関連リソースは、相互に依存しており、通常は同じワークロードに属しています。生成されたテンプレートに含める関連リソースを選択します。
**注記**  
このテンプレートには、関連リソースをすべて追加することが推奨されます。

1. テンプレートの詳細、スキャンしたリソース、関連リソースを確認します。

1. **[テンプレートを作成]** をクリックし、**[確認して作成]** ページを閉じてテンプレートを作成します。

## スキャンしたリソースからテンプレートを作成する (AWS CLI)
<a name="create-template-from-scanned-resources-cli"></a>

**スキャンしたリソースからスタックテンプレートを作成するには**

1. スキャン中に見つかったリソースを一覧表示するには、[list-resource-scan-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-resources.html) コマンドを使用し、オプションで出力を制限する `--resource-identifier` オプションを指定します。`--resource-scan-id` オプションでは、サンプル ARN を実際の 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
   ```

   以下はレスポンスの例です。`ManagedByStack` は CloudFormation がリソースを既に管理しているかどうかを示します。出力をコピーします。これは次のステップで必要になります。

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

   出力の各フィールドについては、「AWS CloudFormation API リファレンス」の「[ScannedResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ScannedResource.html)」を参照してください。

1. `cat` コマンドを使用して、リソースタイプと識別子をホームディレクトリの `resources.json` という名前の JSON ファイルに保存します。前のステップの出力例に基づいた JSON の例を次に示します。

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

1. 作成した `resources.json` ファイルとともに [list-resource-scan-related-resources](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-resource-scan-related-resources.html) コマンドを使用して、スキャンしたリソースに関連するリソースを一覧表示します。

   ```
   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
   ```

   以下はレスポンスの例です。`ManagedByStack` は CloudFormation がリソースを既に管理しているかどうかを示します。これらのリソースを、前のステップで作成した JSON ファイルに追加します。テンプレートを作成するには、これが必要です。

   ```
   {
       "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
           }
       ]
   }
   ```

   出力の各フィールドについては、「AWS CloudFormation API リファレンス」の「[ScannedResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ScannedResource.html)」を参照してください。
**注記**  
リソースの入力リストの長さは 100 を超えることはできません。100 を超えるリソースの関連リソースを一覧表示するには、100 のバッチで **list-resource-scan-related-resources** を実行した後、結果を統合します。  
一覧に、重複したリソースが出力される場合があるため注意が必要です。

1. これらの変更とともに、次のように [create-generated-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-generated-template.html) コマンドを使用して新しいスタックテンプレートを作成します。
   + `us-east-1` を、スキャンされたリソースが含まれる AWS リージョンに置き換えます。
   + `MyTemplate` を、作成するテンプレートの名前に置き換えます。

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

   次は、`resources.json` ファイルの例です。

   ```
   [
       {
           "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"
           }
       }
   ]
   ```

   成功すると、このコマンドは以下を返します。

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

# スキャンしたリソースから CloudFormation スタックを作成する
<a name="iac-generator-create-stack-from-scanned-resources"></a>

テンプレートを作成したら、スタックを作成してスキャンされたリソースをインポートする前に、生成されたテンプレートを Infrastructure Composer でプレビューできます。これは、リソースとその関係を含む完全なアプリケーションアーキテクチャを視覚化するのに役立ちます。Infrastructure Composer の詳細については、「[Infrastructure Composer を使用してテンプレートを視覚的に作成](infrastructure-composer-for-cloudformation.md)」を参照してください。

**スタックを作成してスキャンしたリソースをインポートする**

1. CloudFormation コンソールの [IaC ジェネレーターページ](https://console.aws.amazon.com/cloudformation/home?#iac-generator)を開きます。

1. 画面上部にあるナビゲーションバーで、テンプレートの AWS リージョンを選択します。

1. **[テンプレート]** タブを選択してから、詳細を表示するテンプレートの名前を選択します。

1. **[テンプレート]** セクションの上部にある **[テンプレートの定義]** タブでは、希望に応じてテンプレートを YAML 構文から JSON 構文に切り替えることができます。

1. テンプレートの詳細を確認して、すべてが正しく設定されていることを確認します。テンプレートを簡単に確認して理解できるようにするには、Infrastructure Composer を使用して、テンプレートに記述されているインフラストラクチャのデフォルトのコードビューからグラフィカルビューに切り替えることができます。ビューを切り替えるには、**[テンプレート]** で、**[テンプレート]** の代わりに **[キャンバス]** を選択します。

    **キャンバスのアクション** 
   + テンプレート内の特定のリソースの詳細に焦点を当てるには、カードをダブルクリックして **[リソースプロパティ]** パネルを表示します。
   + キャンバス上のカードを視覚的に並び替えて整理するには、キャンバスの左上から **[調整]** を選択します。
   + キャンバスを拡大/縮小するには、キャンバスの右下にあるズームコントロールを使用します。

1. コンソールで特定のリソースを表示するには、**[テンプレートリソース]** タブを選択してから、確認したいリソースの物理 ID を選択します。選択すると、その特定のリソースのコンソールに移動します。**[テンプレートリソース]** タブからは、テンプレート定義でのリソースの追加、削除、再同期を実行することもできます。

1. **[テンプレートの定義]** タブでは、書き込み専用プロパティが含まれるリソースに関する警告を IaC ジェネレーターが発行する場合があります。警告を確認したら、生成されたテンプレートをダウンロードし、必要な変更を加えることができます。詳細については、「[書き込み専用プロパティを解決する](generate-IaC-write-only-properties.md)」を参照してください。

1. テンプレートの定義に問題がなければ、**[テンプレートの定義]** タブで **[スタックにインポート]** を選択してから、**[次へ]** を選択します。

1. **[スタックの詳細を指定]** ページの **[スタックを指定]** パネルで、スタックの名前を入力し、**[次へ]** を選択します。

1. スタックのパラメータを確認して入力します。[**次へ**] を選択します。

1. **[変更を確認]** ページでオプションを確認し、**[次へ]** をクリックします。

1. **[確認してインポート]** ページで詳細を確認し、**[リソースをインポート]** をクリックします。

# 書き込み専用プロパティを解決する
<a name="generate-IaC-write-only-properties"></a>

CloudFormation IaC ジェネレーターを使用すると、まだ CloudFormation で管理されていないアカウントにプロビジョニングされたリソースを使ってテンプレートを生成することができます。ただし、特定のリソースプロパティは書き込み専用として指定されます。つまり、データベースパスワードなどは、CloudFormation では書き込みはできますが、読み取りはできません。

既存のリソースから CloudFormation テンプレートを生成する場合、書き込み専用プロパティには課題があります。ほとんどの場合、CloudFormation はこれらのプロパティを生成されたテンプレートのパラメータに変換します。これにより、インポートオペレーション中にこのプロパティをパラメータ値として入力することが可能になります。ただし、この変換が不可能なシナリオがあり、CloudFormation はこれらのケースを別の方法で処理します。

## 相互に排他的なプロパティ
<a name="write-only-mutually-exclusive-properties"></a>

相互に排他的なプロパティのセットが複数あり、そのうちの一部が書き込み専用である場合。これらの場合、IaC ジェネレーターは、作成時にリソースに適用されたのはどのプロパティのセットであるかを特定することはできません。例えば、以下のプロパティセットのいずれか 1 つを使うと、[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) のコードを指定できます。
+ `Code/S3Bucket`、`Code/S3Key`、オプションで `Code/S3ObjectVersion`
+ `Code/ImageUri`
+ `Code/ZipFile`

これらのプロパティはすべて書き込み専用です。IaC ジェネレーターは、排他的なプロパティセットのうち 1 つを選択し、それを生成されたテンプレートに追加します。それぞれの書き込み専用プロパティにパラメータが追加されます。パラメータ名には `OneOf` が含まれ、パラメータの説明には、対応するプロパティは他の排他的なプロパティに置き換えることが可能であることが示されています。IaC ジェネレーターは、含まれているプロパティに `MUTUALLY_EXCLUSIVE_PROPERTIES` の警告タイプを設定します。

## 相互に排他的なタイプ
<a name="write-only-mutually-exclusive-types"></a>

いくつかの場合、書き込み専用プロパティは、複数あるデータタイプに設定できます。例えば、[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) の `Body` プロパティは、`object` か `string` にすることができます。この場合、IaC ジェネレーターは `string` のタイプを使用して生成されたテンプレートにプロパティを含め、`MUTUALLY_EXCLUSIVE_TYPES` の警告タイプを設定します。

## Array のプロパティ
<a name="write-only-array-properties"></a>

書き込み専用プロパティのタイプが `array` の場合、パラメータはスカラー値にしかならないため、IaC ジェネレーターは生成されたテンプレートに含めることができません。この場合、プロパティはテンプレートから省略され、警告タイプ `UNSUPPORTED_PROPERTIES` が設定されます。

## オプションプロパティ
<a name="write-only-optional-properties"></a>

オプションの書き込み専用プロパティの場合、IaC ジェネレーターは、リソースの設定時にプロパティが使用されたかどうかを検出することはできません。この場合、プロパティは生成されたテンプレートから省略され、警告タイプ `UNSUPPORTED_PROPERTIES` が設定されます。

## 警告と次のステップ
<a name="write-only-properties-warnings-and-next-steps"></a>

どのプロパティが書き込み専用であるかを判断するには、IaC ジェネレーターコンソールが返した警告を確認する必要があります。[AWS リソースとプロパティタイプのリファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html)は、プロパティが書き込み専用かどうか、または複数のタイプをサポートしているかどうかを示しません。

代替手段として、リソースプロバイダースキーマからどのプロパティが書き込み専用かを確認することもできます。リソースプロバイダースキーマをダウンロードするには、「[CloudFormation リソースプロバイダースキーマ](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/resource-type-schemas.html)」を参照してください。

**書き込み専用プロパティの問題を解決する**

1. CloudFormation コンソールの [IaC ジェネレーターページ](https://console.aws.amazon.com/cloudformation/home?#iac-generator)を開きます。

1. 画面上部にあるナビゲーションバーで、テンプレートの AWS リージョンを選択します。

1. **[テンプレート]** タブを選択してから、作成したテンプレートの名前を選択します。

1. 生成されたテンプレートに書き込み専用プロパティを持つリソースが含まれる場合は、IaC ジェネレーターのコンソールの **[テンプレートの定義]** タブに、問題のタイプの概要を伴う警告が表示されます。例:  
![\[IaC ジェネレーターのコンソールに表示された、生成されたテンプレートの書き込み専用プロパティに関する警告\]](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/images/IaC-generator-write-only-property-warning.png)

1. 警告の詳細については、**[警告の詳細を表示]** を選択します。書き込み専用プロパティを持つリソースは、生成されたテンプレートとリソースタイプで使用される論理 ID によって特定されます。

   警告のリストを使用して、書き込み専用プロパティを持つリソースを特定し、各リソースを調べて、生成されたテンプレートに加えるべき変更 (もしある場合) を判断します。  
![\[IaC ジェネレーターのコンソールに表示された、生成されたテンプレートの書き込み専用プロパティに関する警告の詳細\]](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/images/IaC-generator-write-only-property-resource-warning.png)

1. 書き込み専用プロパティの問題を解決するためにテンプレートを更新する必要がある場合は、次の手順を実行します。

   1. **[ダウンロード]** を選択して、テンプレートのコピーをダウンロードします。

   1. テンプレートを編集します。

   1. 変更し終わったら、**[編集したテンプレートをインポート]** ボタンを選択してインポートプロセスを続行できます。

# AWS::ApiGateway::RestAPI リソースの書き込み専用プロパティの問題を解決する方法
<a name="generate-IaC-apigateway-restapi"></a>

このトピックでは、IaC ジェネレーターを使用するときの [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) リソースの書き込み専用プロパティの問題を解決する方法について説明します。

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

生成されたテンプレートに `AWS::ApiGateway::RestApi` リソースが含まれている場合、`Body`、`BodyS3Location`、`CloneFrom` プロパティが `UNSUPPORTED_PROPERTIES` として認識されたことを示す警告が表示されます。これは、これらが任意の書き込み専用プロパティであるためです。IaC ジェネレーターは、これらのプロパティがこのリソースに適用されているかどうかを認識しません。したがって、生成されたテンプレートではこれらのプロパティは省略されます。

## 解決策
<a name="apigateway-restapi-write-only-properties-resolution"></a>

REST API の `Body` プロパティを設定するには、生成されたテンプレートを更新します。

1. 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 アクションを使用して API をダウンロードします。例えば、[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 コマンドを使用します。詳細については、「API Gateway デベロッパーガイド」の「[API Gateway から REST API をエクスポートする](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-export-api.html)」を参照してください。

1. `GetExport` API アクションのレスポンスから `Body` プロパティを取得します。これを Amazon S3 バケットにアップロードします。

1. 生成されたテンプレートをダウンロードします。

1. このテンプレートに `BodyS3Location/Bucket` と `BodyS3Location/Key` のプロパティを追加し、`Body` が保存されているバケット名とキーを指定します。

1. 生成されたテンプレートを IaC ジェネレーターのコンソールで開き、**[編集したテンプレートをインポート]** をクリックします。

# AWS::Lambda::Function リソースの書き込み専用プロパティの問題を解決する方法
<a name="generate-IaC-lambda-function"></a>

このトピックでは、IaC ジェネレーターを使用するときの [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) リソースの書き込み専用プロパティの問題を解決する方法について説明します。

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

`AWS::Lambda::Function` リソースには、Lambda コードを指定するための相互に排他的なプロパティのセットが 3 つあります。
+ `Code/S3Bucket` と `Code/S3Key` のプロパティ、およびオプションで `Code/S3ObjectVersion` のプロパティです。
+ `Code/ImageUri` プロパティ
+ `Code/ZipFile` プロパティ

特定の `AWS::Lambda::Function` リソースに使用できるのは、これらのセットの 1 つだけです。

IaC ジェネレーターは、リソースの作成または更新に排他的な書き込み専用プロパティのどのセットが使用されたのかを特定することはできません。そのため、これには、生成されたテンプレートの最初のプロパティのセットのみが含まれます。`Code/ImageUri` プロパティと `Code/ZipFile` プロパティは省略されます。

さらに、IaC ジェネレーターは次の警告を発行します。
+ **`MUTUALLY_EXCLUSIVE_PROPERTIES`** – `Code/S3Bucket` および `Code/S3Key` が相互に排他的なプロパティとして識別されることを警告します。
+ **`UNSUPPORTED_PROPERTIES`** – `Code/S3ObjectVersion` プロパティがサポートされていないことを警告します。

生成されたテンプレートに `AWS::Lambda::Function` リソースを含めるには、正しいコードプロパティでテンプレートをダウンロードして更新する必要があります。

## 解決策
<a name="lambda-function-mutually-exclusive-properties-resolution"></a>

**Lambda コードを Amazon S3 バケットに保存し、`S3ObjectVersion` プロパティを使用しない場合**、生成されたテンプレートを修正せずにそのままインポートすることができます。IaC ジェネレーターは、インポートオペレーション中に、テンプレートのパラメータとして Amazon S3 バケットとキーを要求します。

****Lambda コードを Amazon ECR リポジトリとして保存する場合は**、以下の手順に従ってテンプレートを更新します。**

1. 生成されたテンプレートをダウンロードします。

1. 生成されたテンプレートから、`Code/S3Bucket` および `Code/S3Key` プロパティのプロパティと対応するパラメータを削除します。

1. 生成されたテンプレートで削除したプロパティを `Code/ImageUri` プロパティに置き換え、Amazon ECR リポジトリの URL を指定します。

1. 生成されたテンプレートを IaC ジェネレーターのコンソールで開き、**[編集したテンプレートをインポート]** をクリックします。

****Lambda コードを zip ファイルとして保存する場合は**、以下の手順に従ってテンプレートを更新します。**

1. 生成されたテンプレートをダウンロードします。

1. 生成されたテンプレートから、`Code/S3Bucket` および `Code/S3Key` プロパティのプロパティと対応するパラメータを削除します。

1. 生成されたテンプレートの削除されたプロパティを `Code/ZipFile` プロパティに置き換えます。

1. 生成されたテンプレートを IaC ジェネレーターのコンソールで開き、**[編集したテンプレートをインポート]** をクリックします。

****Lambda コードのコピーがない場合は**、以下の手順に従ってテンプレートを更新します。**

1. 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 アクションを使用します ([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 コマンドを使用するなど)。

1. レスポンスの `RepositoryType` パラメータは、コードが Amazon S3 バケットにある場合は `S3` 、コードが Amazon ECR リポジトリにある場合は `ECR` です。

1. レスポンスの `Location` パラメータには、デプロイパッケージを 10 分間ダウンロードするときに使用できる、署名付き URL が含まれています。コードをダウンロードします。

1. このコードを Amazon S3 バケットにファイルをアップロードします。

1. 生成されたテンプレートを使ってインポートオペレーションを実行し、パラメータ値としてバケット名とキーを指定します。

# 動的参照を使用して他のサービスに格納されている値を取得する
<a name="dynamic-references"></a>

動的参照には、他のサービスに格納および管理されている外部値を指定し、Infrastructure as Code (IaC) テンプレートから機密情報を切り離すことができる便利な方法があります。CloudFormation は、スタックオペレーションおよび変更セットオペレーション中に、必要に応じて指定された参照の値を取得します。

動的参照を使用すると、次のことができます。
+ **SecureString を使用する** – 機密データの場合、保管中のデータが暗号化されるように、常に AWS Systems Manager Parameter Store または AWS Secrets Manager のシークレットで SecureString パラメータを使用します。
+ **アクセスを制限する** – Parameter Store パラメータまたは Secrets Manager シークレットへのアクセスを、認可されたプリンシパルとロールのみに制限します。
+ **認証情報をローテーションする** – Parameter Store または Secrets Manager に保存されている機密データを定期的にローテーションして、高いレベルのセキュリティを維持します。
+ **ローテーションを自動化する** – Secrets Manager の自動ローテーション機能を活用して、機密データを定期的に更新し、アプリケーションや環境で分散します。

## 一般的な考慮事項
<a name="dynamic-references-considerations"></a>

CloudFormation テンプレートで動的参照を指定する前に考慮すべき一般的な考慮事項を次に示します。
+ リソースのプライマリ識別子の一部であるリソースプロパティに、動的参照や機密データを含めないでください。CloudFormation は、プライマリリソース識別子で実際のプレーンテキスト値を使用する場合がありますが、これはセキュリティリスクとなる可能性があります。このリソース ID は、派生した出力または送信先に表示されます。

  リソースタイプのプライマリ識別子を構成するリソースプロパティを確認するには、「[AWS リソースおよびプロパティタイプのリファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html)」でそのリソースのリソースリファレンスドキュメントを参照してください。**[Return values]** (戻り値) セクションの `Ref` 関数の戻り値は、リソースタイプのプライマリ識別子を構成するリソースプロパティを表します。
+ スタックテンプレートには最大 60 個の動的な参照を含めることができます。
+ 変換 (`AWS::Include` や `AWS::Serverless` など) を使用している場合、CloudFormation は変換を適用する前に動的参照を解決しません。代わりに、動的参照のリテラル文字列を変換に渡し、テンプレートを使用して変更セットを実行する際に参照を解決します。
+ カスタムリソース内の安全な値 (Parameter Store や Secrets Manager に保存されている値など) に動的参照を使用することはできません。
+ また、動的参照は `AWS::CloudFormation::Init` メタデータと Amazon EC2 `UserData` プロパティでもサポートされていません。
+ バックスラッシュ (\$1) で終わる動的参照を作成しないでください。CloudFormation はこれらの参照を解決できず、スタックオペレーションが失敗します。

次のトピックでは、動的参照の使用に関する情報と他の考慮事項について説明します。

**Topics**
+ [一般的な考慮事項](#dynamic-references-considerations)
+ [Systems Manager Parameter Store からプレーンテキスト値を取得する](dynamic-references-ssm.md)
+ [Systems Manager Parameter Store から SecureString 値を取得する](dynamic-references-ssm-secure-strings.md)
+ [Secrets Manager からシークレットまたはシークレット値を取得する](dynamic-references-secretsmanager.md)

# Systems Manager Parameter Store からプレーンテキスト値を取得する
<a name="dynamic-references-ssm"></a>

CloudFormation テンプレートを作成する際には、Parameter Store に保存されているプレーンテキスト値を使用することをお勧めします。パラメータストアは AWS Systems Manager の一機能です。Parameter Store の概要については、「*AWS Systems Manager ユーザーガイド*」の「[AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)」を参照してください。

テンプレート内で Parameter Store のプレーンテキスト値を使用するには、`ssm` 動的リファレンスを使用します。この参照では、Parameter Store のタイプ `String` または `StringList` のパラメータの値にアクセスできます。

スタック操作で使用する `ssm` 動的参照のバージョンを確認するには、スタック操作の変更セットを作成します。次に、**[テンプレート]** タブで処理済みテンプレートをレビューします。詳細については、「[CloudFormation スタックの変更セットを作成する](using-cfn-updating-stacks-changesets-create.md)」を参照してください。

`ssm` 動的参照を使用する場合、留意すべき重要な点がいくつかあります。
+ CloudFormation は、動的参照でのドリフト検出をサポートしていません。パラメータのバージョンを指定していない `ssm` 動的参照の場合、Systems Manager でパラメータのバージョンを更新する際は、最新バージョンのパラメータに変更するために、`ssm` 動的参照を含むすべてのスタックでスタックの更新オペレーションも実施することをお勧めします。
+ CloudFormation テンプレートの `Parameters` セクションで `ssm` 動的参照を使用するには、バージョン番号を含める必要があります。CloudFormation では、このセクションのバージョン番号なしで Parameter Store 値を参照することはできません。あるいは、テンプレートで Systems Manager パラメータタイプとしてパラメータを定義することもできます。これを行う際には、Systems Manager パラメータキーを、パラメータのデフォルト値として指定できます。その後、バージョン番号を指定しなくても、CloudFormation は Parameter Store から最新バージョンのパラメータ値を取得します。これにより、テンプレートをよりシンプルかつ簡単にメンテナンスできます。詳細については、「[CloudFormation が提供するパラメータタイプを使用して、実行時に既存のリソースを指定する](cloudformation-supplied-parameter-types.md)」を参照してください。
+ カスタムリソースの場合、CloudFormation はリクエストをカスタムリソースに送信する前に `ssm` の動的参照を解決します。
+ CloudFormation は、別の AWS アカウント から共有されたパラメータを参照する際の動的参照の使用をサポートしません。
+ CloudFormation は、動的参照での Systems Manager パラメータラベルの使用をサポートしません。

## アクセス許可
<a name="dynamic-references-ssm-permissions"></a>

Systems Manager パラメータストアに保存されているパラメータを指定するには、指定されたパラメータに対して [https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html) を呼び出すためのアクセス許可が必要です。特定の Systems Manager パラメータへのアクセスを提供する IAM ポリシーを作成する方法については、「AWS Systems Manager ユーザーガイド」の「[IAM ポリシーを使用して Systems Manager パラメータへのアクセスを制限する](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-access.html)」を参照してください。

## リファレンスパターン
<a name="dynamic-references-ssm-pattern"></a>

CloudFormation テンプレートで Systems Manager Parameter Store に保存されているプレーンテキスト値を参照するには、次の `ssm` 参照パターンを使用します。

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

参照は、parameter-name と version について、以下の正規表現パターンに従う必要があります。

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

`parameter-name`  
 パラメータストア内のパラメータの名前。パラメータ名では大文字と小文字が区別されます  
必須。

`version`  
使用するパラメータのバージョンを指定する整数。正確なバージョンを指定しない場合、CloudFormation は、スタックを作成または更新するたびに最新バージョンのパラメータを使用します。詳細については、「*AWS Systems Manager ユーザーガイド*」の「[パラメータバージョンの使用](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-versions.html)」を参照してください。  
オプション。

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

**Topics**
+ [パブリック AMI ID パラメータ](#dynamic-references-ssm-public-ami-example)
+ [カスタム AMI ID パラメータ](#dynamic-references-ssm-custom-ami-example)

### パブリック AMI ID パラメータ
<a name="dynamic-references-ssm-public-ami-example"></a>

次の例では、パブリック AMI パラメータを参照する EC2 インスタンスを作成します。動的リファレンスは、パブリックパラメータから最新の Amazon Linux 2023 AMI ID を取得します。パブリックパラメータの詳細については、「*AWS Systems Manager ユーザーガイド*」の「[Parameter Store でのパブリックパラメータの検出](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html)」を参照してください。

#### 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
```

### カスタム AMI ID パラメータ
<a name="dynamic-references-ssm-custom-ami-example"></a>

次の例は、Parameter Store に保存されているカスタム AMI ID を参照する EC2 起動テンプレートを作成します。動的参照は、起動テンプレートからインスタンスが起動されると `golden-ami` パラメータの *`2`* から AMI ID を取得します。

#### 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
```

# Systems Manager Parameter Store から SecureString 値を取得する
<a name="dynamic-references-ssm-secure-strings"></a>

CloudFormation では、機密データを「SecureString」として AWS Systems Manager Parameter Store に保存することで、パスワードやライセンスキーなどの機密データをテンプレートで直接公開することなく使用できます。Parameter Store の概要については、「*AWS Systems Manager ユーザーガイド*」の「[AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)」を参照してください。

テンプレートで Parameter Store の Secure String を使用するには、`ssm-secure` 動的参照を使用します。CloudFormation が実際の SecureString 値を保存することはありません。代わりに、SecureString のプレーンテキストパラメータ名を含むリテラルな動的参照のみを保存します。

スタックの作成時または更新時に、CloudFormation は、実際の値を公開することなく、必要に応じて SecureString 値にアクセスします。SecureString は、`ssm-secure` の動的参照パターンをサポートするリソースプロパティのためにのみ使用できます。詳細については、「[Secure String のための動的なパラメータパターンをサポートするリソース](#template-parameters-dynamic-patterns-resources)」を参照してください。

CloudFormation は、どの API コールでも SecureString の実際のパラメータ値を返しません。リテラル動的参照のみを返します。変更セットを使用して変更を比較する場合、CloudFormation は、リテラルの動的参照文字列のみを比較します。実際の SecureString の値を解決して比較することはありません。

`ssm-secure` 動的参照を使用する場合、留意すべき重要な点がいくつかあります。
+ CloudFormation は、他の AWS アカウント から Parameter Store 値にアクセスできません。
+ CloudFormation は、動的参照での Systems Manager パラメータラベルまたはパブリックパラメータの使用をサポートしません。
+ `cn-north-1` および `cn-northwest-1` リージョンでは、SecureString は Systems Manager によってサポートされていません。
+ `ssm-secure` などの安全な値の動的参照は、現在カスタムリソースではサポートされていません。
+ CloudFormation がスタックの更新をロールバックする必要があり、以前に指定したバージョンの SecureString パラメータが利用できなくなっている場合、ロールバックオペレーションは失敗します。このような場合、次の 2 つのオプションがあります。
  + リソースをスキップするには `CONTINUE_UPDATE_ROLLBACK` を使用してください。
  + Systems Manager パラメータストアで Secure String パラメータを再作成し、パラメータのバージョンがテンプレートで使用されているバージョンに達するまでそれを更新します。その後、リソースをスキップせずに `CONTINUE_UPDATE_ROLLBACK` を使用します。

## Secure String のための動的なパラメータパターンをサポートするリソース
<a name="template-parameters-dynamic-patterns-resources"></a>

`ssm-secure` の動的参照パターンをサポートするリソースには、以下のものがあります。


| リソース | プロパティタイプ | プロパティ | 
| --- | --- | --- | 
| [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) | [ソース](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` | 

## リファレンスパターン
<a name="dynamic-references-ssm-secure-pattern"></a>

CloudFormation テンプレートで Systems Manager Parameter Store の Secure String 値を参照するには、次の `ssm-secure` 参照パターンを使用します。

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

参照は、parameter-name と version について、以下の正規表現パターンに従う必要があります。

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

`parameter-name`  
 パラメータストア内のパラメータの名前。パラメータ名では大文字と小文字が区別されます  
必須。

`version`  
使用するパラメータのバージョンを指定する整数。正確なバージョンを指定しない場合、CloudFormation は、スタックを作成または更新するたびに最新バージョンのパラメータを使用します。詳細については、「*AWS Systems Manager ユーザーガイド*」の「[パラメータバージョンの使用](https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-versions.html)」を参照してください。  
オプション。

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

次の例では、`ssm-secure` の動的参照を使用して、IAM ユーザーのパスワードを Parameter Store に格納されている SecureString に設定します。指定されているとおり、CloudFormation はスタック操作および変更セット操作に `IAMUserPassword` パラメータのバージョン *`10`* を使用します。

### 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}}'
```

# Secrets Manager からシークレットまたはシークレット値を取得する
<a name="dynamic-references-secretsmanager"></a>

Secrets Manager は、データベース認証情報、パスワード、サードパーティー API キーなどのシークレットを安全に保存および管理できるようにするサービスです。Secrets Manager を使用すると、これらのシークレットへのアクセスを一元的に保存および制御できるため、コード内のハードコードされた認証情報 (パスワードを含む) を Secrets Manager への API 呼び出しに置き換えて、プログラムでシークレットを取得できます。詳細については、「*AWS Secrets Manager ユーザーガイド*」の「[What is AWS Secrets Manager?](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)」を参照してください。

CloudFormation テンプレート内の Secrets Manager に保存されているシークレット全体またはシークレット値全体を使用するには、`secretsmanager` 動的参照を使用します。

## ベストプラクティス
<a name="dynamic-references-secretsmanager-best-practices"></a>

CloudFormation テンプレートで Secrets Manager の動的参照を使用する場合は、次のベストプラクティスに従ってください。
+ **CloudFormation テンプレートにバージョンレス参照を使用する** – Secrets Manager に認証情報を保存し、適切なシークレットローテーションワークフローをサポートするために `version-stage` または `version-id` パラメータを指定せずに動的参照を使用します。
+ **自動ローテーションの活用** – Secrets Manager の自動ローテーション機能を使用して、認証情報管理のためのバージョンレスの動的参照を行います。これにより、テンプレートを変更することなく、認証情報が定期的に更新されます。詳細については、「[AWS Secrets Manager シークレットのローテーション](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)」を参照してください。
+ **バージョン付き参照の使用は控えめにする** – テストやロールバックなどの特定のシナリオでは、明示的な `version-stage` または `version-id` パラメータのみを指定します。

## 考慮事項
<a name="dynamic-references-secretsmanager-considerations"></a>

`secretsmanager` 動的参照を使用する場合は、次のような重要な考慮事項に留意する必要があります。
+ CloudFormation は、以前のデプロイで使用されたシークレットのバージョンを追跡しません。動的な参照を実装する前に、シークレット管理戦略を慎重に計画してください。可能な場合はバージョンレス参照を使用して、自動シークレットローテーションを活用します。バージョンがない動的参照からバージョン付きの動的参照に移行する場合など、動的参照設定に変更を加えるときは、リソースの更新をモニタリングして検証します。
+ Secrets Manager のシークレット値のみを更新しても、CloudFormation は自動的に新しい値を取得しません。CloudFormation は、リソースの作成時または動的参照を含むリソースを変更する更新時にのみシークレット値を取得します。

  例えば、テンプレートに、`MasterPassword` プロパティが Secrets Manager 動的参照に設定されている [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) リソースが含まれているとします。このテンプレートからスタックを作成したら、Secrets Manager でシークレットの値を更新します。ただし、`MasterPassword` プロパティは古いパスワード値を保持します。

  新しいシークレット値を適用するには、CloudFormation テンプレートで `AWS::RDS::DBInstance` リソースを変更し、スタックの更新を実行する必要があります。

  今後この手動プロセスを回避するには、Secrets Manager を使用してシークレットを自動的にローテーションすることを検討してください。
+ `secretsmanager` などの安全な値の動的参照は、現在カスタムリソースではサポートされていません。
+ `secretsmanager` の動的な参照は、すべてのリソースプロパティで使用できます。`secretsmanager` の動的な参照を使用することは、Secrets Manager ログも CloudFormation ログも解決済みのシークレットの値を保持してはならないことを示します。ただし、シークレット値は、それが使用されているリソースを持つサービスに表示されることがあります。シークレットデータが漏れるのを防ぐために、使用方法を確認します。

## アクセス許可
<a name="dynamic-references-secretsmanager-permissions"></a>

Secrets Manager に保存されているシークレットを指定するには、シークレットに対して [https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html) を呼び出すためのアクセス許可が必要です。

## リファレンスパターン
<a name="dynamic-references-secretsmanager-pattern"></a>

CloudFormation テンプレートで Secrets Manager シークレットを参照するには、次の `secretsmanager` 参照パターンを使用します。

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

`secret-id`  
シークレット名またはシークレット ARN。  
AWS アカウントのシークレットにアクセスするには、シークレット名を指定するだけです。別の AWS アカウントのシークレットにアクセスするには、そのシークレットの完全な ARN を指定します。  
必須。

`secret-string`  
`SecretString` はサポートされる唯一の値です。デフォルトは `SecretString` です。

`json-key`  
値を取得するペアのキー名を指定します。`json-key` を指定しない場合、CloudFormation はシークレットテキスト全体を取得します。  
このセグメントにはコロン文字 (`:`) を含めることはできません。

`version-stage`  
使用するシークレットのバージョンのステージングラベル。シークレットマネージャーは、ステージングラベルがローテーション処理中にさまざまなバージョンを追跡するために使用されます。`version-stage` を使用する場合は、`version-id` を指定することはできません。`version-stage` または `version-id`、を指定しない場合、デフォルトでは `AWSCURRENT` というラベルの付いたバージョンが取得されます。  
このセグメントにはコロン文字 (`:`) を含めることはできません。

`version-id`  
使用したいシークレットのバージョンの固有識別子を指定します。`version-id` を指定した場合は、`version-stage` を指定しないでください。`version-stage` または `version-id` を指定しない場合、次にデフォルトでは `AWSCURRENT` というバージョンが取得されます。  
このセグメントにはコロン文字 (`:`) を含めることはできません。

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

**Topics**
+ [シークレットからユーザー名とパスワードの値を取得する](#dynamic-references-secretsmanager-examples-user-name-and-password)
+ [SecretString 全体を取得する](#dynamic-references-secretsmanager-examples-entire-secretstring)
+ [シークレットの特定のバージョンから値を取得する](#dynamic-references-secretsmanager-examples-specific-version)
+ [別の AWS アカウントからシークレットを取得する](#dynamic-references-secretsmanager-examples-secrets-from-another-account)

### シークレットからユーザー名とパスワードの値を取得する
<a name="dynamic-references-secretsmanager-examples-user-name-and-password"></a>

次の [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) の例では、`MySecret` に保存されているユーザー名とパスワードの値を取得します。この例では、バージョンレスの動的参照に推奨されるパターンを示します。このパターンは、`AWSCURRENT` バージョンを自動的に使用し、テンプレートの変更を必要とせずに Secrets Manager のローテーションワークフローをサポートします。

#### 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}}'
```

### SecretString 全体を取得する
<a name="dynamic-references-secretsmanager-examples-entire-secretstring"></a>

次の動的リファレンスは、 `MySecret` の `SecretString` を取得します。

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

または:

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

### シークレットの特定のバージョンから値を取得する
<a name="dynamic-references-secretsmanager-examples-specific-version"></a>

次の動的リファレンスは、 `MySecret` の `AWSPREVIOUS` バージョンの `password` 値を取得します。

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

### 別の AWS アカウントからシークレットを取得する
<a name="dynamic-references-secretsmanager-examples-secrets-from-another-account"></a>

次の動的リファレンスは、別の AWS アカウントにある `MySecret` の `SecretString` を取得します。別の AWS アカウントのシークレットにアクセスするには、完全なシークレット ARN を指定する必要があります。

```
{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret}}
```

次の動的リファレンスは、別の AWS アカウントにある `MySecret` の `password` 値を取得します。別の AWS アカウントのシークレットにアクセスするには、完全なシークレット ARN を指定する必要があります。

```
{{resolve:secretsmanager:arn:aws:secretsmanager:us-west-2:123456789012:secret:MySecret:SecretString:password}}
```

# 擬似パラメータを使用して AWS 値を取得する
<a name="pseudo-parameter-reference"></a>

擬似パラメータは、アカウント ID、リージョン名、スタックの詳細など、デプロイや環境間で変更される可能性のある重要な AWS 環境情報へのアクセスを提供する組み込み変数です。

ハードコードされた値の代わりに擬似パラメータを使用すると、テンプレートの移植性が向上し、さまざまな AWS アカウント やリージョン間での再利用が容易になります。

## 構文
<a name="pseudo-parameter-syntax"></a>

組み込み関数 `Ref` または `Fn::Sub` を使用して、擬似パラメータを参照できます。

### 参照番号
<a name="pseudo-parameter-ref-syntax"></a>

`Ref` 組み込み関数は、次の一般的な構文を使用します。詳細については、「[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>

`Fn::Sub` 組み込み関数は、擬似パラメータの周りに `${}` 構文を含む別の形式を使用します。詳細については、「[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}'
```

## 使用可能な擬似パラメータ
<a name="available-pseudo-parameters"></a>

### `AWS::AccountId`
<a name="cfn-pseudo-param-accountid"></a>

`123456789012` など、スタックが作成されているアカウントの AWS アカウント ID を返します。

この擬似パラメータは、アカウント固有の ARN を含む IAM ロール、ポリシー、およびその他のリソースポリシーを定義するときに一般的に使用されます。

### `AWS::NotificationARNs`
<a name="cfn-pseudo-param-notificationarns"></a>

スタックイベント通知を受信する Amazon SNS トピックの Amazon リソースネーム (ARN) のリストを返します。これらの ARN は、スタックの作成または更新時に、AWS CLI の `--notification-arns` オプションまたはコンソールを使用して指定できます。

単一の値を返す他の擬似パラメータとは異なり、`AWS::NotificationARNs` は ARN のリストを返します。リスト内の特定の ARN にアクセスするには、`Fn::Select` 組み込み関数を使用します。詳細については、「[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>

`Fn::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-if)」を参照してください。

この擬似パラメータは、特定の条件下でのみ含めるべき条件付きリソースプロパティを作成する場合に特に便利です。

### `AWS::Partition`
<a name="cfn-pseudo-param-partition"></a>

リソースがあるパーティションを返します。標準 AWS リージョン の場合、パーティションは `aws` です。他のパーティションのリソースの場合、パーティションは `aws-`*partitionname* です。たとえば、中国 (北京および寧夏) リージョンにあるリソースのパーティションは `aws-cn` で、AWS GovCloud (米国西部) リージョンにあるリソースのパーティションは `aws-us-gov` です。

パーティションは、リソースの ARN の一部を形成します。`AWS::Partition` を使用することで、テンプレートがさまざまな AWS パーティション間で正しく動作します。

### `AWS::Region`
<a name="cfn-pseudo-param-region"></a>

`us-west-2` など、包括的なリソースが作成されているリージョンを表す文字列を返します。

これは、テンプレートが変更なしでさまざまな AWS リージョン に適応できるため、最も一般的に使用される擬似パラメータの 1 つです。

### `AWS::StackId`
<a name="cfn-pseudo-param-stackid"></a>

スタックの ID (ARN) を返します (例: `arn:aws:cloudformation:us-west-2:123456789012:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123`)。

### `AWS::StackName`
<a name="cfn-pseudo-param-stackname"></a>

スタックの名前を返します (例: `teststack`)。

スタック名は、一般的に、特定のスタックに属するものとして簡単に識別できる一意のリソース名を作成するために使用されます。

### `AWS::URLSuffix`
<a name="cfn-pseudo-param-urlsuffix"></a>

スタックがデプロイされている AWS リージョン の AWS ドメインのサフィックスを返します。サフィックスは通常 `amazonaws.com` ですが、中国 (北京) リージョンの場合、サフィックスは `amazonaws.com.cn` です。

このパラメータは、AWS サービスエンドポイントの URL を作成するときに特に便利です。

## 例
<a name="pseudo-parameter-examples"></a>

**Topics**
+ [基本的な使用法](#pseudo-parameter-basic-example)
+ [AWS::NotificationARNsの使用](#pseudo-parameter-notification-example)
+ [AWS::NoValue を使用した条件付きプロパティ](#pseudo-parameter-novalue-example)

### 基本的な使用法
<a name="pseudo-parameter-basic-example"></a>

次の例では、Amazon SNS トピックと、そのトピックに通知を送信する CloudWatch アラームの 2 つのリソースを作成します。これらは `AWS::StackName`、`AWS::Region`、および `AWS::AccountId` を使用して、スタック名、現在の AWS リージョン、およびアカウント ID をリソース名、説明、および ARN に動的に挿入します。

#### 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}
```

### AWS::NotificationARNsの使用
<a name="pseudo-parameter-notification-example"></a>

次の例では、インスタンス起動イベントと起動エラーの通知を送信するように Auto Scaling グループを設定します。この設定では、`AWS::NotificationARNs` 擬似パラメータを使用します。これは、スタックの作成時に指定された Amazon SNS トピック ARN のリストを提供します。`Fn::Select` 関数はそのリストから最初の ARN を選択します。

#### 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
```

### AWS::NoValue を使用した条件付きプロパティ
<a name="pseudo-parameter-novalue-example"></a>

次の例では、スナップショット ID が指定されている場合にのみスナップショットを使用する Amazon RDS DB インスタンスを作成します。`UseDBSnapshot` 条件が true に評価された場合は、CloudFormation は `DBSnapshotIdentifier` プロパティに `DBSnapshotName` パラメータ値を使用します。条件が false に評価された場合は、CloudFormation は `DBSnapshotIdentifier` プロパティを削除します。

#### 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
```

# デプロイされた CloudFormation スタックからエクスポートされた出力を取得する
<a name="using-cfn-stack-exports"></a>

同じ AWS アカウントおよびリージョン内に複数のスタックがあるときは、スタック間での情報の共有が役に立つ場合があります。これは、あるスタックが別のスタックによって作成されたリソースを使用する必要があるときに便利です。

例えば、ウェブサーバーのためにサブネットやセキュリティグループなどのネットワークリソースを作成するスタックがあるとします。情報が共有されていると、実際のウェブサーバーを作成する他のスタックが、最初のスタックによって作成されたネットワークリソースを使用できます。リソースの ID をスタックのテンプレートにハードコード化する、または、ID を入力パラメータとして渡す必要はありません。

スタック間で情報を共有するには、1 つのスタックからの出力値をエクスポートし、それらを別のスタックにインポートします。処理の流れ

1. 最初のスタックのテンプレート (ネットワークスタックなど) で、`Outputs` セクションの `Export` フィールドを使用して、エクスポートする特定の値を定義します。詳細については、「[CloudFormation テンプレートの Outputs 構文](outputs-section-structure.md)」を参照してください。

1. そのスタックを作成または更新すると、CloudFormation が出力値をエクスポートして、同じ AWS アカウントおよびリージョン内にある他のスタックがそれらを利用できるようにします。

1. 他のスタックのテンプレートで [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) 関数を使用して、最初のスタックからエクスポートされた値をインポートします。

1. 2 番目のスタック (ウェブサーバースタックなど) を作成または更新すると、CloudFormation が最初のスタックからエクスポートされた値を自動的に取得して、それらを使用します。

チュートリアル、およびサンプルテンプレートについては、[別の CloudFormation スタックのリソース出力を参照する](walkthrough-crossstackref.md) を参照してください。

## スタック出力値のエクスポートとネストされたスタックの使用との比較
<a name="output-vs-nested"></a>

ネストされたスタックとは、別のスタック内で `AWS::CloudFormation::Stack` リソースを使用して作成するスタックです。ネストされたスタックにより、1 つのスタックからすべてのリソースをデプロイし、管理します。ネストされたスタックグループからの出力をグループ内の別のスタックへの入力として使用できます。これは値のエクスポートとは異なります。

情報共有をネストされたスタックグループ内に隔離する場合は、ネストされたスタックを使用することを推奨します。ネストされたスタックのグループ内に限らず、他のスタックと情報を共有するには、値をエクスポートします。たとえば、サブネットのあると 1 つのスタックを作成し、ID をエクスポートできます。他のスタックは、そのサブネットの ID をインポートすることで、そのサブネットを使用できます。各スタックは独自のサブネットを作成する必要はありません。スタックがサブネット ID をインポートする限り、それを変更または削除することはできません。

ネストされたスタックの詳細については、「[ネストされたスタックを使用してテンプレートを再利用可能な部分に分割する](using-cfn-nested-stacks.md)」を参照してください。

## 考慮事項
<a name="using-cfn-stack-exports-considerations"></a>

クロススタック参照には以下の制限があります。
+ AWS アカウント ごとに、`Export` 名がリージョン内で一意である必要があります。
+ リージョン間でクロススタック参照は作成できません。組み込み関数 `Fn::ImportValue` を使用すると、同じリージョン内にエクスポートされた値のみをインポートできます。
+ 出力の場合、`Export` の `Name` プロパティの値は、リソースに依存する `Ref` または `GetAtt` の関数を使用できません。

  同様に、`ImportValue` 関数にリソースに依存する `Ref` または `GetAtt` 関数を含めることはできません。
+ 別のスタックが出力値をインポート後、出力値をエクスポートしているスタックを削除したり、エクスポートされた出力値を変更することはできません。エクスポートしているスタックを削除したり出力値を変更する前に、インポートをすべて削除する必要があります。

## エクスポートされた出力値のリスト
<a name="using-cfn-stack-exports-listing"></a>

スタックからエクスポートされた出力値を表示する必要がある場合は、次のいずれかの方法を使用します。

**エクスポートされた出力値 (コンソール) をリスト表示するには**

1. [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) で CloudFormation コンソール を開きます。

1. 画面上部にあるナビゲーションバーで、AWS リージョン を選択します。

1. 左側のナビゲーションペインで、**[エクスポート]** を選択します。

**エクスポートされた出力値 (AWS CLI) をリスト表示するには**  
次の [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-exports.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-exports.html) コマンドを使用します。*us-east-1* を、ご利用の AWS リージョン に置き換えてください。

```
aws cloudformation list-exports --region us-east-1
```

以下は出力の例です。

```
{
    "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 は、現在のリージョンのエクスポートされた出力の名前と値、およびエクスポート元のスタックを表示します。エクスポートされた出力値を別のスタックのテンプレートで使用するために、エクスポート名と `Fn::ImportValue` 関数を使用してその値を参照できます。

## エクスポートされた出力値をインポートするスタックのリスト
<a name="using-cfn-stack-imports"></a>

エクスポートされた出力値を削除または変更するには、まずどのスタックがそれらをインポートしようとしているのかを確認する必要があります。

エクスポートされた出力値をインポートするスタックを表示するには、次のいずれかの方法を使用します。

**エクスポートされた出力値をインポートするスタックをリストするには (コンソール)**

1. [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) で CloudFormation コンソール を開きます。

1. 左側のナビゲーションペインで、**[エクスポート]** を選択します。

1. 特定のエクスポート値をインポートするスタックを確認するには、そのエクスポート値の **[Export Name]** (エクスポート名) を選択します。CloudFormation により、エクスポートの詳細ページが表示され、値をインポートしているすべてのスタックがリスト表示されます。

**エクスポートされた出力値をインポートするスタックをリストするには (AWS CLI)**  
[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* を AWS リージョン に、`private-vpc-vpcid` をエクスポートされた出力値の名前に置き換えます。

```
aws cloudformation list-imports --region us-east-1 \
    --export-name private-vpc-vpcid
```

CloudFormation から、値をインポートするスタックのリストが返されます。

```
{
    "Imports": [
        "my-app-stack"
    ]
}
```

エクスポートされた特定の値をインポートするスタックがわかったら、それらのスタックを変更して、出力値を参照する `Fn::ImportValue` 関数を削除する必要があります。エクスポートされた出力値を削除または編集する前に、エクスポートされた出力値を参照するインポートをすべて削除する必要があります。

# CloudFormation が提供するパラメータタイプを使用して、実行時に既存のリソースを指定する
<a name="cloudformation-supplied-parameter-types"></a>

テンプレートを作成するとき、CloudFormation が提供する特殊なパラメータタイプを使用して、既存の AWS リソースまたは Systems Manager パラメータの識別子の入力をユーザーに求めるパラメータを作成できます。

**Topics**
+ [概要:](#cloudformation-supplied-parameter-types-overview)
+ [例](#cloudformation-supplied-parameter-types-example)
+ [考慮事項](#cloudformation-supplied-parameter-types-considerations)
+ [サポートされている AWS 固有のパラメータタイプ](#aws-specific-parameter-types-supported)
+ [サポートされている Systems Manager パラメータタイプ](#systems-manager-parameter-types-supported)
+ [サポートされていない Systems Manager パラメータタイプ](#systems-manager-parameter-types-unsupported)

## 概要:
<a name="cloudformation-supplied-parameter-types-overview"></a>

CloudFormation では、スタックの作成または更新中に入力値を指定して、パラメータを使用してスタックをカスタマイズできます。この機能は、テンプレートをさまざまなシナリオで再利用する柔軟性を実現します。

パラメータは、CloudFormation テンプレートの `Parameters` セクションで定義されます。各パラメータには名前とタイプがあり、デフォルト値や許可された値などの追加設定を持つことができます。詳細については、「[CloudFormation テンプレートの Parameters 構文](parameters-section-structure.md)」を参照してください。

パラメータタイプは、パラメータが受け入れることができる入力値のタイプを決定します。例えば、`Number` は数値のみを受け入れ、`String` はテキスト入力を受け入れます。

CloudFormation には、テンプレートで既存の AWS リソースおよび Systems Manager パラメータを参照するために使用できる追加のパラメータタイプがいくつか用意されています。

これらのパラメータタイプは、次の 2 つのカテゴリに分類されます。
+ **AWS 固有のパラメータタイプ** – CloudFormation は、スタックを作成または更新するときに無効な値をキャッチできるようにする一連のパラメータタイプを提供します。これらのパラメータタイプを使用すると、テンプレートを使用するすべてのユーザーは、スタックを作成する AWS アカウント およびリージョンから有効な値を指定する必要があります。

  AWS マネジメントコンソール を使用する場合、CloudFormation はアカウントおよびリージョンから既存の値の事前入力されたリストを提供します。そのため、ユーザーは特定の名前や ID を記憶して正確に入力する必要がありません。代わりに、ドロップダウンリストから値の選択のみを行います。場合によっては、ID、名前、`Name` タグ値で値を検索することもできます。
+ **Systems Manager パラメータタイプ** - CloudFormation は、Systems Manager Parameter Store の既存パラメータに対応するパラメータタイプも提供します。これらのパラメータタイプを使用すると、テンプレートを使用するすべてのユーザーは、Systems Manager パラメータタイプの値として Parameter Store キーを指定する必要があり、CloudFormation はスタックで使用する最新の値を Parameter Store から取得します。新しい Amazon マシンイメージ (AMI) ID など、新しいプロパティ値を持つアプリケーションを頻繁に更新する必要があるときには便利です。パラメータストアについては、「[Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)」を参照してください。

`Parameters` セクションで定義したら、`Ref` 関数を使用して CloudFormation テンプレート全体のパラメータ値を参照することができます。

## 例
<a name="cloudformation-supplied-parameter-types-example"></a>

次の例では、次のパラメータタイプを使用するテンプレートが示されています。
+ `AWS::EC2::VPC::Id`
+ `AWS::EC2::Subnet::Id`
+ `AWS::EC2::KeyPair::KeyName`
+ `AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>`

このテンプレートでスタックを作成するには、アカウントから既存の VPC ID、サブネット ID、キーペア名を指定する必要があります。目的の AMI ID を参照する既存の Parameter Store キーを指定するか、`/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2` のデフォルト値を維持することもできます。このパブリックパラメータは、最新の Amazon Linux 2 AMI のリージョン AMI ID 用エイリアスです。パブリックパラメータの詳細については、「AWS Systems Manager ユーザーガイド」の「[Parameter Store でパブリックパラメータの検索](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html)」を参照してください。

### 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 コマンド
<a name="cloudformation-supplied-parameter-types-cli-command"></a>

次の「[https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html)」コマンドは、テンプレート例に基づいてスタックを作成します。

```
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"
```

`List<AWS::EC2::Subnet::Id>` などの文字列のリストを受け入れるパラメータタイプを使用するには、次の例で示されるように、`ParameterValue` 内のカンマを二重バックスラッシュでエスケープする必要があります。

```
--parameters ParameterKey="SubnetIDs",ParameterValue="subnet-5ea0c127\\,subnet-6194ea3b\\,subnet-c87f2be0"
```

## 考慮事項
<a name="cloudformation-supplied-parameter-types-considerations"></a>

動的参照を使用して、サードパーティーの認証情報などの機密性の高い設定定義へのアクセスを制限することを強くお勧めします。詳細については、「[動的参照を使用して他のサービスに格納されている値を取得する](dynamic-references.md)」を参照してください。

テンプレートユーザーに異なる AWS アカウント から値を指定できるようにする場合、AWS 固有のパラメータタイプを使用しないでください。代わりに、`String` または `CommaDelimitedList` タイプのパラメータを定義します。

Systems Manager パラメータタイプには、いくつかの点に注意する必要があります。
+ パラメータの解決された値はコンソールでスタックの **[パラメータ]** タブで確認するか、「[https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html)」または「[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)」を実行することによって確認できます。これらの値はスタックが作成または更新される時に設定されるため、Parameter Store の最新の値とは異なる場合があることに注意してください。
+ スタックの更新には、**[既存の値の使用]** オプション (または `UsePreviousValue` を true に設定) を使用すると、同じ Parameter Store キーを使用し続けること (値ではなく) を意味します。CloudFormation は常に最新の値を取得します。
+ 許可された値やその他の制約を指定する場合、CloudFormation は指定したパラメータキーに対して検証しますが、その値に対しては検証しません。値の検証は Parameter Store 自体で行う必要があります。
+ スタックを作成または更新して変更セットを作成すると、CloudFormation はオペレーションの実行時点で Parameter Store に存在する値を使用します。指定されたパラメータが、呼び出し元の AWS アカウントの下のパラメータストアに存在しない場合、CloudFormation は検証エラーを返します。
+ 変更セットを実行すると、CloudFormation は変更セットで指定されている値を使用します。これらの値は、変更セットの作成時と実行時の間にパラメータストアで変化する可能性があるため、変更セットを実行する前に確認してください。
+ パラメータストアのパラメータが同じ AWS アカウントに保存されている場合は、そのパラメータ名を指定する必要があります。パラメータストアのパラメータが別の AWS アカウントによって共有されている場合は、完全パラメータ ARN を指定する必要があります。

## サポートされている AWS 固有のパラメータタイプ
<a name="aws-specific-parameter-types-supported"></a>

CloudFormation では次の AWS 固有のタイプをサポートしています。

`AWS::EC2::AvailabilityZone::Name`  
アベイラビリティーゾーン (`us-west-2a` など)。

`AWS::EC2::Image::Id`  
Amazon EC2 イメージ ID (`ami-0ff8a91507f77f867` など)。CloudFormation コンソールには、このパラメータタイプの値のドロップダウンリストが表示されないことに注意してください。

`AWS::EC2::Instance::Id`  
Amazon EC2 インスタンス ID (`i-1e731a32` など)。

`AWS::EC2::KeyPair::KeyName`  
Amazon EC2 のキーペア名。

`AWS::EC2::SecurityGroup::GroupName`  
デフォルトの VPC セキュリティグループ名 (`my-sg-abc` など)。

`AWS::EC2::SecurityGroup::Id`  
セキュリティグループ ID (`sg-a123fd85` など)。

`AWS::EC2::Subnet::Id`  
サブネット ID (`subnet-123a351e` など)。

`AWS::EC2::Volume::Id`  
Amazon EBS ボリューム ID (`vol-3cdd3f56` など)。

`AWS::EC2::VPC::Id`  
VPC ID (`vpc-a123baa3` など)。

`AWS::Route53::HostedZone::Id`  
Amazon Route 53 ホストゾーン ID (`Z23YXV4OVPL04A` など)。

`List<AWS::EC2::AvailabilityZone::Name>`  
リージョンのアベイラビリティーゾーンの配列 (`us-west-2a, us-west-2b` など)。

`List<AWS::EC2::Image::Id>`  
Amazon EC2 イメージ ID の配列 (`ami-0ff8a91507f77f867, ami-0a584ac55a7631c0c` など)。CloudFormation コンソールには、このパラメータタイプの値のドロップダウンリストが表示されないことに注意してください。

`List<AWS::EC2::Instance::Id>`  
Amazon EC2 インスタンス ID の配列 (`i-1e731a32, i-1e731a34` など)。

`List<AWS::EC2::SecurityGroup::GroupName>`  
デフォルトの VPC セキュリティグループ名の配列 (`my-sg-abc, my-sg-def` など)。

`List<AWS::EC2::SecurityGroup::Id>`  
セキュリティグループ ID の配列 (`sg-a123fd85, sg-b456fd85` など)。

`List<AWS::EC2::Subnet::Id>`  
サブネット ID の配列 (`subnet-123a351e, subnet-456b351e` など)。

`List<AWS::EC2::Volume::Id>`  
Amazon EBS ボリューム ID の配列 (`vol-3cdd3f56, vol-4cdd3f56` など)。

`List<AWS::EC2::VPC::Id>`  
VPC ID の配列 (`vpc-a123baa3, vpc-b456baa3` など)。

`List<AWS::Route53::HostedZone::Id>`  
Amazon Route 53 ホストゾーン ID の配列 (`Z23YXV4OVPL04A, Z23YXV4OVPL04B` など)。

## サポートされている Systems Manager パラメータタイプ
<a name="systems-manager-parameter-types-supported"></a>

CloudFormation では、次の Systems Manager パラメータタイプをサポートしています。

`AWS::SSM::Parameter::Name`  
Systems Manager パラメーターキーの名前。このパラメータタイプは、必要なパラメータが存在することを確認する場合にのみ使用します。CloudFormation は、パラメータに関連付けられている実際の値を取得しません。

`AWS::SSM::Parameter::Value<String>`  
値が文字列の Systems Manager パラメーター。これは、パラメーターストア内の `String` パラメータータイプに対応します。

`AWS::SSM::Parameter::Value<List<String>>`、または `AWS::SSM::Parameter::Value<CommaDelimitedList>`  
値が文字列のリストである Systems Manager パラメーター。これは、パラメーターストア内の `StringList` パラメータータイプに対応します。

`AWS::SSM::Parameter::Value<AWS-specific parameter type>`  
値が AWS 固有のパラメータタイプである Systems Manager パラメータ。  
たとえば、次の例は `AWS::EC2::KeyPair::KeyName` タイプを指定します。  
+ `AWS::SSM::Parameter::Value<AWS::EC2::KeyPair::KeyName>`

`AWS::SSM::Parameter::Value<List<AWS-specific parameter type>>`  
値が AWS 固有のパラメータタイプのリストである Systems Manager パラメータ。  
たとえば、次の例は `AWS::EC2::KeyPair::KeyName` タイプのリストを指定します。  
+ `AWS::SSM::Parameter::Value<List<AWS::EC2::KeyPair::KeyName>>`

## サポートされていない Systems Manager パラメータタイプ
<a name="systems-manager-parameter-types-unsupported"></a>

CloudFormation では、次の Systems Manager パラメータタイプをサポートしていません。
+ Systems Manager パラメータタイプのリストの例: `List<AWS::SSM::Parameter::Value<String>>`

また、CloudFormation では、テンプレートパラメータを `SecureString` Systems Manager パラメータタイプとして定義できません。ただし、リソースによってはパラメータ*値*として Secure String を指定できます。詳細については、「[動的参照を使用して他のサービスに格納されている値を取得する](dynamic-references.md)」を参照してください。

# CloudFormation のチュートリアル
<a name="walkthroughs"></a>

このドキュメントでは、スタックデプロイの実践的な練習を提供するように設計されたチュートリアルのコレクションを提供します。
+ [別の CloudFormation スタックのリソース出力を参照する](walkthrough-crossstackref.md) – ある CloudFormation スタックの出力を別のスタック内で参照する方法について説明します。1 つのスタックにすべてのリソースを含めるのではなく、必要な AWS リソースをいくつかのスタックに分けて作成して、モジュール性と再利用性を高めたテンプレートを作成できます。
+ [Amazon EC2 にアプリケーションをデプロイする](deploying.applications.md) - CloudFormation を使用して、Amazon EC2 インスタンスにアプリケーションを自動的にインストールし、設定して起動する方法について説明します。これにより、インスタンスに直接接続することなく、簡単にデプロイを複製し、既存のインストールを更新できます。
+ [CloudFormation のスタックを更新する](updating.stacks.walkthrough.md) – 実行中のスタックを CloudFormation を使って更新するシンプルな進行過程について説明します。
+ [スケールおよび負荷分散されたアプリケーションを作成する](walkthrough-autoscaling.md) – CloudFormation を使用して、スケーラブルで負荷分散対応のアプリケーションを作成する方法について説明します。具体的には、Auto Scaling グループ、ロードバランサー、その他の関連するリソースを作成して、アプリケーションがトラフィック負荷の変動に対応し、高可用性を維持できるようにする方法を取り上げます。
+ [別の AWS アカウントで VPC とピア接続する](peer-with-vpc-in-another-account.md) – 異なる AWS アカウントで 2 つの VPC 間に仮想プライベートクラウド (VPC) ピアリング接続を確立するプロセスについて説明します。VPC 間のトラフィックをルーティングして、同じネットワークの一部であるかのようにリソースにアクセスできるようにする場合には、VPC ピアリングが便利です。
+ [CloudFormation を使用して CodeDeploy を通じて ECS ブルー/グリーンデプロイを実行する](blue-green.md) – CloudFormation を使用して Amazon ECS で AWS CodeDeploy ブルー/グリーンデプロイを実行する方法について説明します。ブルー/グリーンデプロイは、最小限のダウンタイムでアプリケーションまたはサービスを更新する方法です。

# 別の CloudFormation スタックのリソース出力を参照する
<a name="walkthrough-crossstackref"></a>

このチュートリアルでは、ある CloudFormation スタックの出力を別のスタック内で参照して、モジュール性と再利用性を高めたテンプレートを作成する方法について説明します。

1 つのスタックにすべてのリソースを含めるのではなく、必要な AWS リソースをいくつかのスタックに分けて作成します。その後、他のスタックから必要なリソース出力を参照できます。クロススタックの参照を出力に制限することにより、他のスタックから参照されるスタックの部分を制御します。

たとえば、VPC のあるネットワークスタック、セキュリティグループ、パブリックウェブアプリケーションのサブネット、別個のパブリックウェブアプリケーションスタックがあるとします。ウェブアプリケーションで、ネットワークスタックのセキュリティグループとサブネットが使用されるようにするには、ウェブアプリケーションスタックがネットワークからのリソース出力を参照できるようにクロススタック参照を作成する必要があります。クロススタック参照を使用すると、ウェブアプリケーションスタックの所有者がネットワーキングのルールや資産を作成または維持する必要がなくなります。

クロススタックの参照を作成するには、`Export` 出力フィールドを使用してエクスポートのリソース出力の値を設定します。次に、値を`Fn::ImportValue` 組み込み関数を使用して値をインポートします。詳細については、「[デプロイされた CloudFormation スタックからエクスポートされた出力を取得する](using-cfn-stack-exports.md)」を参照してください。

**注記**  
CloudFormation は無料サービスです。ただし、スタックに追加する AWS リソースにはそれぞれ現在の料金が課金されます。AWS の料金の詳細については、[各製品の詳細ページ](https://aws.amazon.com/)を参照してください。

**Topics**
+ [サンプルテンプレートを使用してネットワークスタックを作成する](#walkthrough-crossstackref-create-vpc-stack)
+ [サンプルテンプレートを使用してウェブアプリケーションスタックを作成する](#walkthrough-crossstackref-create-ec2-stack)
+ [スタックが設計どおりに機能することを検証する](#walkthrough-crossstackref-verify)
+ [AMI マッピングエラーのトラブルシューティング](#walkthrough-crossstackref-troubleshooting-ami)
+ [リソースのクリーンアップ](#walkthrough-crossstackref-clean-up)

## サンプルテンプレートを使用してネットワークスタックを作成する
<a name="walkthrough-crossstackref-create-vpc-stack"></a>

このチュートリアルを開始する前に、IAM アクセス権限があり、Amazon VPC、Amazon EC2、CloudFormation のいずれのサービスも使用できることを確認してください。

ネットワークスタックは、ウェブアプリケーションスタックで使用する VPC、セキュリティグループ、サブネットで構成されます。これらのリソースに加えて、パブリックアクセスを可能にするインターネットゲートウェイとルーティングテーブルも、ネットワークスタックによって作成されます。

ウェブアプリケーションスタックの作成前に、このスタックを作成する必要があります。先にウェブアプリケーションスタックを作成した場合は、使用できるセキュリティグループやサブネットがない状態になります。

スタックテンプレートは、次の URL から入手できます: [https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleNetworkCrossStack.template](https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleNetworkCrossStack.template)。スタックによって作成されるリソースを表示するには、リンクを選択します。これにより、テンプレートが開きます。`Outputs` セクションでは、サンプルのテンプレートがエクスポートするネットワーキングリソースを表示できます。他のスタックからネットワーキングリソースをエクスポートした場合、エクスポートされたリソース名には、スタック名がプレフィックスとして付けられます。ユーザーがネットワーキングリソースをインポートするときは、リソースをどのスタックからインポートするかを指定できます。

**ネットワークスタックを作成するには**

1. AWS マネジメントコンソール にサインインし、CloudFormation コンソール ([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)) を開きます。

1. **[スタック]** ページでは、右上の **[スタックの作成]** を選択してから、**[新しいリソースを使用 (標準)]** を選択します。

1. **[テンプレートの準備完了]** を選択し、**[テンプレートを指定]** セクションで **[Amazon S3 URL]** を選択します。

1. **Amazon S3 URL **の場合は、次の URL を貼り付けます: **https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleNetworkCrossStack.template**。

1. [**次へ**] を選択します。

1. [**スタックの名前**] に **SampleNetworkCrossStack** を入力し、[**次へ**] を選択します。
**注記**  
このスタックの名前をメモしておきます。ウェブアプリケーションスタックを起動するときにこのスタック名が必要になります。

1. [**次へ**] を選択します。このチュートリアルでは、タグの追加も詳細設定の指定も不要です。

1. スタック名とテンプレート URL が正しいことを確認し、[**スタックの作成**] を選択します。

   CloudFormation によってスタックが作成されるまでに数分かかることもあります。ウェブアプリケーションスタックの作成に進む前に、すべてのリソースが正しく作成されるまで待ちます。

1. 進捗状況を監視するには、スタックイベントを確認します。詳細については、「[スタックの進行状況を監視する](monitor-stack-progress.md)」を参照してください。

## サンプルテンプレートを使用してウェブアプリケーションスタックを作成する
<a name="walkthrough-crossstackref-create-ec2-stack"></a>

ウェブアプリケーションスタックによって、ネットワークスタックのセキュリティグループとサブネットを使用する EC2 インスタンスが作成されます。

このスタックは、ネットワークスタックと同じ AWS リージョン に作成する必要があります。

スタックテンプレートは、次の URL から入手できます: [https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template](https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template)。スタックによって作成されるリソースを表示するには、リンクを選択します。これにより、テンプレートが開きます。`Resources` セクションで、EC2 インスタンスのプロパティを参照してください。`Fn::ImportValue` 関数を使用することで、別のスタックからどのようにネットワーキングリソースがインポートされたかを確認できます。

**ウェブアプリケーションスタックを作成するには**

1. **[スタック]** ページでは、右上の **[スタックの作成]** を選択してから、**[新しいリソースを使用 (標準)]** を選択します。

1. **[テンプレートの準備完了]** を選択し、**[テンプレートを指定]** セクションで **[Amazon S3 URL]** を選択します。

1. **Amazon S3 URL **の場合は、次の URL を貼り付けます: **https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template**。

1. [**次へ**] を選択します。

1. [**スタックの名前**] に **SampleWebAppCrossStack** を入力します。[**パラメータ**] セクションで、[**NetworkStackName**] パラメータのデフォルト値を使用し、[**次へ**] を選択します。

   サンプルテンプレートでは、パラメータ値を使用してどのスタックから値をインポートするかを指定しています。

1. [**次へ**] を選択します。このチュートリアルでは、タグの追加も詳細設定の指定も不要です。

1. スタック名とテンプレート URL が正しいことを確認し、[**スタックの作成**] を選択します。

   CloudFormation によってスタックが作成されるまでに数分かかることもあります。

## スタックが設計どおりに機能することを検証する
<a name="walkthrough-crossstackref-verify"></a>

スタックの作成後、そのリソースを表示し、インスタンス ID をメモしておきます。スタックリソースの表示の詳細については、「[CloudFormation コンソールからスタック情報を表示する](cfn-console-view-stack-data-resources.md)」を参照してください。

インスタンスのセキュリティグループとサブネットを確認するには、[Amazon EC2 コンソール](https://console.aws.amazon.com/ec2/)でインスタンスのプロパティを確認します。インスタンスが `SampleNetworkCrossStack` スタックからセキュリティグループとサブネットを使用しているなら、クロススタックの参照が正常に作成されています。

コンソールを使用してスタック出力と例のウェブサイト URL を表示し、てウェブアプリケーションが実行中であることを確認します。詳細については、「[CloudFormation コンソールからスタック情報を表示する](cfn-console-view-stack-data-resources.md)」を参照してください。

## AMI マッピングエラーのトラブルシューティング
<a name="walkthrough-crossstackref-troubleshooting-ami"></a>

エラー `Template error: Unable to get mapping for AWSRegionArch2AMI::[region]::HVM64` が表示された場合、テンプレートには AWS リージョン の AMI マッピングが含まれていません。マッピングを更新する代わりに、Systems Manager の公開パラメータを使用して最新の AMI を動的に参照することをお勧めします。

1. `SampleWebAppCrossStack` テンプレートを [https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template](https://s3.amazonaws.com/cloudformation-examples/user-guide/cross-stack/SampleWebAppCrossStack.template) からローカルマシンにダウンロードします。

1. `AWSRegionArch2AMI` マッピングセクション全体を削除します。

1. 次の Systems Manager パラメータを追加します。

   ```
   "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. 既存の `ImageId` 参照を置き換えます。

   ```
   "ImageId": { "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" } , "HVM64" ] }, 
   ```

   次と置き換えます。

   ```
   "ImageId": { "Ref": "LatestAmiId" },
   ```

   このパラメータは、スタックをデプロイするリージョンの最新の Amazon Linux 2 AMI に自動的に解決されます。

   他の Linux ディストリビューションの場合は、適切なパラメータパスを使用します。詳細については、「*AWS Systems Manager ユーザーガイド*」の「[Parameter Store でのパブリックパラメータの検出](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html)」を参照してください。

1. 変更したテンプレートをアカウントの S3 バケットにアップロードします。

   ```
   aws s3 cp SampleWebAppCrossStack.template s3://amzn-s3-demo-bucket/
   ```

1. スタックを作成するときは、サンプル URL の代わりに S3 テンプレート URL を指定します。

## リソースのクリーンアップ
<a name="walkthrough-crossstackref-clean-up"></a>

不要なサービスに対して課金されないように、スタックを削除します。

**スタックを削除するには**

1. CloudFormation コンソールで、`SampleWebAppCrossStack` スタックを選択します。

1. [**アクション**] を選択してから、[**スタックの削除**] を選択します。

1. 確認メッセージで、[**削除**] を選択します。

1. このスタックの削除後、`SampleNetworkCrossStack` スタックに対して同じ手順を繰り返します。
**注記**  
CloudFormation によって `SampleWebAppCrossStack` スタックが完全に削除されるまで待ちます。EC2 インスタンスが VPC でまだ実行中であれば、CloudFormation は `SampleNetworkCrossStack` スタックの VPC を削除しません。

# Amazon EC2 にアプリケーションをデプロイする
<a name="deploying.applications"></a>

CloudFormation を使用して、Amazon EC2 インスタンスにアプリケーションを自動的にインストールし、設定および起動することができます。これにより、インスタンスへ直接接続することなく、簡単にデプロイを複製し、既存のインストールを更新できるので、多くの時間と労力を節約することができます。

CloudFormation には、`cloud-init` に基づく一連のヘルパースクリプト (`cfn-init`、`cfn-signal`、`cfn-get-metadata`、および `cfn-hup`) が含まれています。同じテンプレートに存在する Amazon EC2 インスタンスにアプリケーションをインストールし、設定および更新するには、CloudFormation テンプレートからこれらのヘルパースクリプトを呼び出します 詳細については、「*CloudFormation テンプレートリファレンスガイド*」の「[CloudFormation ヘルパースクリプトリファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html)」を参照してください。

[入門チュートリアル](gettingstarted.walkthrough.md)では、基本的な bash スクリプトで `UserData` を使用してシンプルなウェブサーバーを作成しました。これは簡単な「Hello World」ページでは機能しますが、実際のアプリケーションでは次のようなより高度な設定が必要になることが多くあります。
+ 正しい順序でインストールされた複数のソフトウェアパッケージ。
+ 特定のコンテンツで作成された複雑な設定ファイル。
+ 自動的に開始し、実行するよう設定されたサービス。
+ セットアッププロセスでのエラー処理と検証。

CloudFormation のヘルパースクリプトは、`UserData` の基本的な bash スクリプトより堅牢かつメンテナンスしやすい方法で EC2 インスタンスを設定できます。`cfn-init` ヘルパースクリプトは、テンプレートのメタデータから設定データを読み取り、インスタンスに体系的に適用します。

このチュートリアルでは、`cfn-init` ヘルパースクリプトを使用してブートストラッププロセスをモニタリングする方法を学習します。

**注記**  
CloudFormation は無料で使用できますが、作成した Amazon EC2 リソースに対しては課金されます。ただし、AWS を初めて使用する場合は、 [無料利用枠](https://aws.amazon.com/free/)を利用して、この学習プロセス中のコストを最小に抑えるか無料にできます。

**Topics**
+ [前提条件](#bootstrapping-tutorial-prerequisites)
+ [ブートストラップの概念について](#bootstrapping-tutorial-understand-concepts)
+ [シンプルなブートストラップの例から始める](#bootstrapping-tutorial-simple-example)
+ [ファイルとコマンドの追加](#bootstrapping-tutorial-add-complexity)
+ [ネットワークセキュリティの強化](#bootstrapping-tutorial-security-group)
+ [完全なブートストラップテンプレート](#bootstrapping-tutorial-complete-template)
+ [コンソールを使用してスタックを作成する](#bootstrapping-tutorial-create-stack)
+ [ブートストラッププロセスをモニタリングする](#bootstrapping-tutorial-validate-bootstrap)
+ [ブートストラップされたウェブサーバーをテストする](#bootstrapping-tutorial-test-web-server)
+ [ブートストラップ問題のトラブルシューティング](#bootstrapping-tutorial-troubleshooting)
+ [リソースをクリーンアップする](#bootstrapping-tutorial-clean-up)
+ [次のステップ](#bootstrapping-tutorial-next-steps)

## 前提条件
<a name="bootstrapping-tutorial-prerequisites"></a>
+ [最初のスタックの作成](gettingstarted.walkthrough.md) チュートリアルを完了しているか、CloudFormation の基本と同等の経験を有している必要があります。
+ Amazon EC2 および CloudFormation を使用するアクセス許可を持つ IAM ユーザーまたはロール、または管理ユーザーアクセスで AWS アカウント にアクセスできる必要があります。
+ インターネットにアクセスできる Virtual Private Cloud (VPC) が必要です。このチュートリアルテンプレートには、新しい AWS アカウント に自動的に付属するデフォルトの VPC が必要です。デフォルトの VPC がない場合、またはデフォルトの VPC が削除された場合は、[最初のスタックの作成](gettingstarted.walkthrough.md) チュートリアルのトラブルシューティングセクションで代替ソリューションを参照してください。

## ブートストラップの概念について
<a name="bootstrapping-tutorial-understand-concepts"></a>

テンプレートを作成する前に、ブートストラップを機能させる主要な概念について理解しておきましょう。

### `cfn-init` ヘルパースクリプト
<a name="bootstrapping-tutorial-cfn-init-overview"></a>

CloudFormation には、Amazon EC2 インスタンスでソフトウェアをインストールしたりサービスを開始したりするために使用できる Python ヘルパースクリプトが用意されています。`cfn-init` スクリプトはテンプレートからリソースメタデータを読み取り、設定をインスタンスに適用します。

このプロセスは次のように機能します。

1. 設定は、EC2 リソースの「`Metadata`」セクションで定義します。

1. `cfn-init` を `UserData` スクリプトから呼び出します。

1. `cfn-init` でメタデータを読み取り、設定を適用します。

1. インスタンスが仕様に従って設定されます。

### メタデータ構造
<a name="bootstrapping-tutorial-metadata-structure"></a>

設定は EC2 インスタンス内の特定の構造で定義されます。

```
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
```

`cfn-init` スクリプトは、パッケージ、グループ、ユーザー、ソース、ファイル、コマンド、そしてサービスという特定の順序でこれらのセクションを処理します。

## シンプルなブートストラップの例から始める
<a name="bootstrapping-tutorial-simple-example"></a>

まず、Apache をインストールして起動する最小限のブートストラップの例から始めましょう。

```
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}
```

この簡単な例で、主要な概念について説明します。
+ 「`packages`」セクションでは、yum を使用して `httpd` パッケージをインストールします。これは、Amazon Linux および yum を使用する他の Linux ディストリビューションで機能します。
+ 「`services`」セクションでは、`httpd` が自動的に開始および実行されます。
+ `UserData` で最新のブートストラップツールをインストールし、`cfn-init` を呼び出します。

## ファイルとコマンドの追加
<a name="bootstrapping-tutorial-add-complexity"></a>

次に、EC2 インスタンスの `/var/log` ディレクトリにカスタムウェブページとログファイルを追加して、例を強化しましょう。

### ファイルを作成する
<a name="bootstrapping-tutorial-files-section"></a>

「`files`」セクションでは、特定のコンテンツを含むファイルをインスタンスに作成できます。垂直パイプ (`|`) を使用すると、テキストのリテラルブロック (HTML コード) をファイルの内容 (`/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>
```

### コマンドの実行
<a name="bootstrapping-tutorial-commands-section"></a>

「`commands`」セクションでは、ブートストラッププロセス中にシェルコマンドを実行できます。このコマンドによって、EC2 インスタンスの `/var/log/welcome.txt` にログファイルが作成されます。これを表示するには、SSH アクセスに使用する Amazon EC2 キーペアと、インスタンスへの SSH に使用できる IP アドレス範囲が必要です (ここでは説明しません)。

```
commands:
  createWelcomeLog:
    command: "echo 'cfn-init ran successfully!' > /var/log/welcome.txt"
```

## ネットワークセキュリティの強化
<a name="bootstrapping-tutorial-security-group"></a>

ウェブサーバーを設定するため、ウェブトラフィック (HTTP) が EC2 インスタンスに到達できるようにする必要があります。これを行うには、IP アドレスからのポート 80 で受信トラフィックを許可するセキュリティグループを作成します。また、EC2 インスタンスでは、パッケージの更新をインストールするなどの用途でインターネットにトラフィックを送信する必要があります。デフォルトで、セキュリティグループはすべてのアウトバウンドトラフィックを許可します。次に、`SecurityGroupIds` プロパティを使用して、このセキュリティグループを EC2 インスタンスに関連付けます。

```
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
```

## 完全なブートストラップテンプレート
<a name="bootstrapping-tutorial-complete-template"></a>

次に、すべての要素をまとめてみましょう。ここで説明したすべての概念を組み合わせた、完全なテンプレートを以下に示します。

```
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
```

## コンソールを使用してスタックを作成する
<a name="bootstrapping-tutorial-create-stack"></a>

次の手順では、ファイルからサンプルスタックテンプレートをアップロードします。ローカルマシンでテキストエディタを開き、テンプレートを追加します。次に、`samplelinux2stack.template` という名前でファイルを保存します。

**スタックテンプレートを起動するには**

1. AWS マネジメントコンソール にサインインし、CloudFormation コンソール ([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)) を開きます。

1. **[スタックの作成]** を選択し、**[新しいリソースの使用 (標準)]** を選択します。

1. **[テンプレートを指定]** で、**[テンプレートファイルをアップロード]**、**[ファイルを選択]** を選択して `samplelinux2stack.template` ファイルをアップロードします。

1. [**次へ**] を選択します。

1. 「**スタックの詳細を指定する**」ページで、スタック名に「**BootstrapTutorialStack**」と入力します。

1. **[パラメータ]** で、次の操作を行います。
   + **LatestAmiId**: デフォルト値のままにします。
   + **InstanceType**: EC2 インスタンスタイプとして **t2.micro** または **t3.micro** を選択します。
   + **MyIP**: パブリック IP アドレスを `/32` サフィックスを使用して入力します。

1. **[次へ]** を 2 回選択し、次に **[送信]** を選択してスタックを作成します。

## ブートストラッププロセスをモニタリングする
<a name="bootstrapping-tutorial-validate-bootstrap"></a>

追加のソフトウェアがインストールおよび設定されているため、ブートストラッププロセスは単純な EC2 の起動よりも時間がかかります。

**ブートストラップの進行状況をモニタリングするには**

1. CloudFormation コンソールでスタックを選択し、**[イベント]** タブを開きます。

1. `WebServer CREATE_IN_PROGRESS` イベントをモニタリングします。ブートストラッププロセスは、インスタンスの起動後に開始されます。

1. このプロセスには、通常数分かかります。完了時に「`WebServer CREATE_COMPLETE`」と表示されます。

ブートストラッププロセス中の状況を確認したい場合は、インスタンスログをチェックできます。

**ブートストラップログを表示するには (オプション)**

1. [EC2 コンソール](https://console.aws.amazon.com/ec2/)を開いてインスタンスを確認します。

1. インスタンスを選択してから、**[アクション]**、**[モニタリングとトラブルシューティング]**、**[システムログの取得]** を選択し、ブートストラップの進捗状況を確認します。

1. ログがすぐに表示されない場合は、待機してからページを更新してください。

## ブートストラップされたウェブサーバーをテストする
<a name="bootstrapping-tutorial-test-web-server"></a>

スタックに「`CREATE_COMPLETE`」と表示されたら、ウェブサーバーをテストします。

**ウェブサーバーをテストするには**

1. CloudFormation コンソールで、スタックの **[出力]** タブに移動します。

1. **WebsiteURL** 値をクリックし、新しいタブでウェブサーバーを開きます。

1. カスタムウェブページに「`Congratulations, you have successfully launched the AWS CloudFormation sample`」というメッセージが表示されます。

**注記**  
ページがすぐにロードされない場合は、1 分待ってからもう一度試してください。スタックに「`CREATE_COMPLETE`」と表示された後に、ブートストラッププロセスが完了する場合があります。

## ブートストラップ問題のトラブルシューティング
<a name="bootstrapping-tutorial-troubleshooting"></a>

ブートストラッププロセスが失敗した場合、またはウェブサーバーが動作しない場合の一般的な問題と解決策を以下に示します。

### 一般的な問題
<a name="bootstrapping-tutorial-common-issues"></a>
+ **スタックを作成できない** – **[イベント]** タブで特定のエラーメッセージを確認します。
+ **ウェブサーバーにアクセスできない** – `MyIP` パラメータで IP アドレスが正しいことを確認します。末尾に必ず `/32` を含めてください。
+ **ブートストラッププロセスが失敗する** – インスタンスは起動しても `cfn-init` で失敗する場合があります。「モニタリング」セクションの説明に従って、システムログを確認します。

## リソースをクリーンアップする
<a name="bootstrapping-tutorial-clean-up"></a>

継続的な課金を回避するには、スタックとそのリソースを削除してクリーンアップできます。

**スタックとそのリソースを削除するには**

1. [ クラウドフォーメーション コンソール](https://console.aws.amazon.com/cloudformation/)を開きます。

1. **[スタック]** ページで、作成したスタックの名前の横にあるオプション [**BootstrapTutorialStack**] を選択し、続いて **[削除]**を選択します。

1. 確認を求めるメッセージが表示されたら、[削除] を選択してください。****

1. **[イベント]** タブでスタック削除プロセスの進行状況をモニタリングします。**BootstrapTutorialStack** のステータスが `DELETE_IN_PROGRESS` に変わります。CloudFormation がスタックの削除を完了すると、リストからスタックが削除されます。

## 次のステップ
<a name="bootstrapping-tutorial-next-steps"></a>

お疲れ様でした。CloudFormation で EC2 インスタンスをブートストラップする方法を学習しました。これで、以下のことが理解できました。
+ `cfn-init` ヘルパースクリプトの使用方法
+ ブートストラップのメタデータを構築する方法
+ パッケージのインストール、ファイルの作成、コマンドの実行、サービスの管理方法
+ ブートストラップの問題をモニタリングする方法

学習を継続するには: 
+ 実行されているスタックを更新し、`cfn-hup` ヘルパースクリプトを使用する方法について説明します。詳細については、「[CloudFormation のスタックを更新する](updating.stacks.walkthrough.md)」を参照してください。
+ Windows スタックをブートストラップする方法について学習します。詳細については、「[Windows ベースの CloudFormation スタックのブートストラップ](cfn-windows-stacks-bootstrapping.md)」を参照してください。
+ 複数の設定セットを使用して、より複雑なブートストラップシナリオを調べます。詳細については、「*CloudFormation テンプレートリファレンスガイド*」の「[cfn-init](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-init.html)」および「[AWS::CloudFormation::Init](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-init.html)」を参照してください。
+ ブートストラップ完了ステータスを報告するための、`cfn-signal` について学習します。詳細については、「*CloudFormation テンプレートリファレンスガイド*」の「[cfn-signal](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-signal.html)」を参照してください。

# CloudFormation のスタックを更新する
<a name="updating.stacks.walkthrough"></a>

**注記**  
このチュートリアルは、[Amazon EC2 にアプリケーションをデプロイする](deploying.applications.md) チュートリアルでの概念に基づいています。そのチュートリアルを完了していない場合は、まず CloudFormation による EC2 ブートストラップを理解することをお勧めします。

このトピックでは、実行中のスタックの更新のシンプルな進行過程を示します。以下の手順について説明します。

1. **初期スタックを作成する** — 基本の Amazon Linux 2 AMI を使用してスタックを作成し、CloudFormation ヘルパースクリプトを使用して Apache Web Server とシンプルな PHP アプリケーションをインストールします。

1. **アプリケーションを更新する** - アプリケーション内のファイルのいずれかを更新し、CloudFormation を使用してソフトウェアをデプロイします。

1. **キーペアを追加する** - インスタンスに Amazon EC2 キーペアを追加し、セキュリティグループを更新して、インスタンスへの SSH アクセスを可能にします。

1. **インスタンスタイプを追加する** - 基盤となる Amazon EC2 インスタンスのインスタンスタイプを変更します。

1. **AMI を更新する** - スタック内の Amazon EC2 インスタンスの Amazon マシンイメージ (AMI) を変更します。

**注記**  
CloudFormation は無料で使用できますが、作成した Amazon EC2 リソースに対しては課金されます。ただし、AWS を初めて使用する場合は、 [無料利用枠](https://aws.amazon.com/free/)を利用して、この学習プロセス中のコストを最小に抑えるか無料にできます。

**Topics**
+ [ステップ 1: 初期スタックを作成する](#update-stack-initial-stack)
+ [ステップ 2: アプリケーションを更新する](#update-stack-update-application)
+ [ステップ 3: キーペアを使用して SSH アクセスを追加する](#update-stack-add-key-pair)
+ [ステップ 4: インスタンスタイプを更新する](#update-stack-update-instance-type)
+ [ステップ 5: AMI を更新する](#update-stack-update-ami)
+ [アベイラビリティーと影響に関する検討事項](#update.walkthrough.impact)
+ [関連リソース](#update.walkthrough.related)

## ステップ 1: 初期スタックを作成する
<a name="update-stack-initial-stack"></a>

まず、このトピック全体で使用するスタックを作成することから開始します。Apache Web Server でホストされ Amazon Linux 2 AMI 上で実行される単一のインスタンス PHP ウェブアプリケーションを起動する単純なテンプレートが用意されています。

Apache Web Server、PHP、および単純な PHP アプリケーションはすべて、Amazon Linux 2 AMI にデフォルトでインストールされている CloudFormation ヘルパースクリプトによってインストールされます。以下のテンプレートスニペットには、インストールするパッケージとファイルを記述するメタデータが表示されています。この場合は、Amazon Linux 2 AMI の Yum リポジトリからの Apache Web Server と PHP 実行環境です。またこのスニペットには、Apache Web Server の実行を確認する `Services` セクションが含まれています。

```
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
```

アプリケーション自体は「Hello World」サンプルであり、その全体がテンプレート内で定義されています。実際のアプリケーションでは、ファイルは Amazon S3、GitHub、その他のリポジトリに格納され、テンプレートから参照されます。CloudFormation はパッケージ (RPM や RubyGems など) をダウンロードし、個別のファイルを参照して `.zip` や `.tar` ファイルを解凍することで、Amazon EC2 インスタンス上にアプリケーションの中間生成物を作成することができます。

テンプレートは `cfn-hup` デーモンを有効化して構成し、Amazon EC2 インスタンスのメタデータ内で定義された構成への変更をリッスンします。`cfn-hup` デーモンを使用することで、Apache や PHP のバージョンなどのアプリケーションソフトウェアを更新したり、または CloudFormation から PHP アプリケーションファイル自体を更新したりできます。テンプレート内の同じ Amazon EC2 リソースからの次のスニペットは、2 分ごとに `cfn-init` を呼び出してメタデータに更新を通知および適用するように `cfn-hup` を設定するために必要な部分を示しています。それ以外の場合、`cfn-init` は起動時に 1 回だけ実行されます。

```
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
```

スタックを完了するには、Amazon EC2 インスタンス定義の `Properties` セクションで、`UserData` プロパティに、パッケージとファイルをインストールするために `cfn-init` を呼び出す `cloud-init` スクリプトが含まれています。詳細については、「*CloudFormation テンプレートリファレンスガイド*」の「[CloudFormation ヘルパースクリプトリファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html)」を参照してください。テンプレートは Amazon EC2 セキュリティグループも作成します。

```
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
```

**このテンプレートからスタックを起動するには**

1. テンプレートをコピーし、システム上にローカルにテキストファイルとして保存します。このファイルは後続の手順で必要となるため、保存場所をメモしておいてください。

1. AWS マネジメントコンソール にサインインし、CloudFormation コンソール ([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)) を開きます。

1. **[スタックを作成する]** を選択し、[新しいリソースの使用 (標準)] を選択します。

1. **[既存のテンプレートを選択する]** を選択します。

1. **[テンプレートを指定する]** で、**[テンプレートファイルをアップロードする]** を選択し、最初のステップで作成したファイルを参照し、**[次へ]** を選択します。

1. **[スタックの詳細を指定する]** ページで、[スタック名] として **UpdateTutorial** を入力します。

1. **[パラメータ]** で、すべてのパラメータを同じに保ち、**[次へ]** を 2 回選択します。

1. **[確認して作成]** 画面で、**[送信]** を選択します。

スタックのステータスが `CREATE_COMPLETE` に変更された後、**[出力]** タブにウェブサイトの URL が表示されます。`WebsiteURL` 出力の値を選択した場合、新しい PHP アプリケーションが実行されていることを確認できます。

## ステップ 2: アプリケーションを更新する
<a name="update-stack-update-application"></a>

スタックをデプロイしたので、今度はアプリケーションを更新してみましょう。アプリケーションによって出力されるテキストに簡単な変更を加えます。以下のテンプレートスニペットに示したように、index.php ファイルに echo コマンドを追加します。

```
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
```

テキストエディタを使用して、ローカルに保存したテンプレートファイルを手動で編集します。

次に、スタックを更新します。

**更新されたテンプレートでスタックを更新するには**

1. CloudFormation コンソールで、**UpdateTutorial** スタックを選択します。

1. **[更新]、[直接更新を実行]** を選択します。

1. **[既存のテンプレートを置き換える]** を選択します。

1. **[テンプレートを指定する]** で、**[テンプレートファイルをアップロードする]** を選択し、変更したテンプレートをアップロードしてから、**[次へ]** を選択します。

1. **[スタックの詳細を指定する]** ページで、すべてのパラメータを同じに保持し、**[次へ]** を選択します。

1. **[確認]** ページで変更内容を確認します。**[変更]**で、CloudFormation が `WebServerInstance` リソースを更新することがわかります。

1. [**Submit**] を選択してください。

スタックの状態が `UPDATE_COMPLETE` になったら、`WebsiteURL` の出力値を再度選択して、アプリケーションに対する変更が反映されていることを確認できます。`cfn-hup` デーモンが 2 分間隔で実行されます。そのため、スタックが更新されてからアプリケーションが変更されるまでに最大 2 分程度かかる場合があります。

更新された一連のリソースを確認するには、CloudFormation コンソールを使用します。[**イベント**] タブでスタックイベントに注目してください。この場合は、Amazon EC2 インスタンスのメタデータ `WebServerInstance` が更新されます。また CloudFormation によって他のリソース (`WebServerSecurityGroup`) も再評価され、ほかに変更がないことが確認されます。他のスタックリソースは変更されませんでした。CloudFormation によって更新されるスタック内のリソースは、そのスタックに対する変更の影響を受けるリソースだけです。そうした変更には、プロパティやメタデータの変更など直接的なものもあれば、`Ref`、`GetAtt` など、組み込みテンプレート関数を介したデータフローや依存関係に起因するものもあります。詳細については、「[組み込み関数リファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html)」を参照してください。

このシンプルな更新は、プロセスを示しています。ただし、Amazon EC2 インスタンスにデプロイするファイルやパッケージに対し、さらに複雑な変更を行うこともできます。たとえば、インスタンスに MySQL を追加しなければならなくなったとします。MySQL の PHP サポートも必要です。そのための作業は単に、追加サービスと併せて、必要なパッケージとファイルを構成に追加するだけです。そのうえでスタックを更新して変更をデプロイすることになります。

```
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
```

CloudFormation のメタデータを更新して、アプリケーションで使用するパッケージを新しいバージョンに更新できます。これまでの例では、各パッケージのバージョンプロパティが空になっています。この場合、`cfn-init` によって最新バージョンのパッケージがインストールされます。

```
packages:
  yum:
    httpd: []
    php: []
```

必要であれば、パッケージのバージョン文字列を指定することもできます。以降のスタック更新要求でバージョン文字列を変更した場合、その新しいバージョンのパッケージがデプロイされます。以下に示したのは、RubyGems パッケージのバージョン番号を使用した例です。バージョニングをサポートするパッケージはすべて、特定のバージョンを持つことができます。

```
packages:
  rubygems:
    mysql: []
    rubygems-update:
      - "1.6.2"
    rake:
      - "0.8.7"
    rails:
      - "2.3.11"
```

## ステップ 3: キーペアを使用して SSH アクセスを追加する
<a name="update-stack-add-key-pair"></a>

テンプレートのリソースを更新して、テンプレート内で元々指定されていなかったプロパティを追加することもできます。これについて学ぶため、Amazon EC2 キーペアを既存の EC2 インスタンスに追加し、Amazon EC2 セキュリティグループでポート 22 を開きます。これにより、Secure Shell (SSH) を使用してインスタンスにアクセスできるようになります。

**既存の Amazon EC2 インスタンスに SSH アクセスを追加するには**

1. 既存の Amazon EC2 キーペアおよび SSH ロケーションの名前を渡すため、テンプレートに 2 つのパラメーターを追加します。

   ```
   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. Amazon EC2 インスタンスに `KeyName` プロパティを追加します。

   ```
   WebServerInstance:
     Type: AWS::EC2::Instance
     Properties:
       ImageId: !Ref LatestAmiId
       InstanceType: !Ref InstanceType
       KeyName: !Ref KeyName
       SecurityGroupIds:
         - !Ref WebServerSecurityGroup
   ```

1. Amazon EC2 セキュリティグループの Ingress ルールに、ポート 22 と SSH ロケーションを追加します。

   ```
   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. 「[ステップ 2: アプリケーションを更新する](#update-stack-update-application)」で説明されているのと同じステップを使用してスタックを更新します。

## ステップ 4: インスタンスタイプを更新する
<a name="update-stack-update-instance-type"></a>

次に、インスタンスタイプを変更して、基盤となるインフラストラクチャを更新する方法を示しましょう。

ここまでで構築したスタックは、t3.micro Amazon EC2 インスタンスを使用します。例として、新しく作成したウェブサイトに、t3.micro インスタンスで処理できる以上のトラフィックが発生しているとします。このため、m5.large Amazon EC2 インスタンスタイプに移行する必要が生じました。インスタンスタイプのアーキテクチャーが変わると、異なる AMI でインスタンスが作成される必要があります。ただし、t3.micro と m5.large の両方は同じ CPU アーキテクチャを使用し、Amazon Linux 2 (x86\$164) AMI を実行します。詳細については、*Amazon EC2 ユーザーガイド*の[インスタンスタイプ変更の互換性](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/resize-limitations.html)を参照してください。

前のステップで編集したテンプレートを使用して、インスタンスタイプを変更しましょう。`InstanceType` はテンプレートへの入力パラメータであるため、テンプレートを変更する必要はありません。**[スタックの詳細を指定する]** ページでパラメータの値を変更できます。

**スタックを新しいパラメータ値で更新するには**

1. CloudFormation コンソールで、**UpdateTutorial** スタックを選択します。

1. **[更新]、[直接更新を実行]** を選択します。

1. **[既存のテンプレート使用する]** を選択し、**[次へ]** を選択します。

1. **[スタックの詳細を指定する]** ページで、**InstanceType** テキストボックスの値を `t3.micro` から `m5.large` に変更します。次に、**[次へ]** を 2 回選択します。

1. **[確認]** ページで変更内容を確認します。**[変更]**で、CloudFormation が `WebServerInstance` リソースを更新することがわかります。

1. [**Submit**] を選択してください。

インスタンスを起動および停止することで、EBS-backed Amazon EC2 インスタンスのインスタンスタイプを動的に変更できます。CloudFormation は、インスタンスタイプを更新してインスタンスを再起動することで変更を最適化しようとします。そのため、インスタンス ID は変更されません。ただしインスタンスが再開されると、インスタンスのパブリック IP アドレスは変更されます。変更後に Elastic IP アドレスが正しくバインドされるよう、CloudFormation は Elastic IP アドレスも更新します。CloudFormation コンソールの **[イベント]** タブで変更を見ることができます。

AWS マネジメントコンソール からインスタンスタイプを調べるには、Amazon EC2 コンソールを開き、インスタンスを探します。

## ステップ 5: AMI を更新する
<a name="update-stack-update-ami"></a>

次に、Amazon Linux の次世代である Amazon Linux 2023 を使用するようにスタックを更新しましょう。

AMI の更新は、インスタンスの置き換えを必要とする大幅な変更です。単純にインスタンスの開始と停止によって AMI を変更することはできません。このような変更は、CloudFormation によって不変のリソースプロパティに対する変更とみなされます。不変のプロパティに変更を加える場合、CloudFormation は、代替リソース (このケースでは、新しい AMI を実行する新しい Amazon EC2 インスタンス) を起動する必要があります。

Amazon Linux 2023 を使用するために、スタックテンプレートを更新する方法を見てみましょう。主な変更には、AMI パラメータの更新と、`yum` から `dnf` パッケージマネージャーへの変更が含まれます。

```
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
```

「[ステップ 2: アプリケーションを更新する](#update-stack-update-application)」で説明されているのと同じステップを使用してスタックを更新します。

新しいインスタンスが実行状態になった後、CloudFormation は、スタック内の他のリソースが新しいリソースを指し示すように更新します。新しいリソースがすべて作成されると、古いリソースは削除されます。このプロセスを `UPDATE_CLEANUP` といいます。更新後、スタック内のインスタンスの ID とアプリケーション URL が変わっています。**[イベント]** テーブル内のイベントには、「Requested update has a change to an immutable property and hence creating a new physical resource」という説明が表示され、リソースが置き換えられたことがわかります。

別の方法として: 更新対象の AMI に組み込むアプリケーションコードを記述した場合、同じスタック更新メカニズムを使用して AMI を更新し、新しいアプリケーションをロードすることができます。

**カスタムアプリケーションコードを使用して AMI を更新するには**

1. アプリケーションまたはオペレーティング システムの変更を含んだ新しい AMI を作成します。詳細については、「*Amazon EC2 ユーザーガイド*」の「[Amazon EBS-backed AMI の作成](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html)」を参照してください。

1. テンプレートに新しい AMI ID を追加します。

1. 「[ステップ 2: アプリケーションを更新する](#update-stack-update-application)」で説明されているのと同じステップを使用してスタックを更新します。

スタックが更新されると、AMI ID が変更されたことを CloudFormation が検出し、先ほどと同じようにスタックの更新を開始します。

## アベイラビリティーと影響に関する検討事項
<a name="update.walkthrough.impact"></a>

プロパティによって、スタック内のリソースに異なる影響が及ぼされます。CloudFormation を使用してあらゆるプロパティを更新できますが、変更を加える前に、以下の点について検討する必要があります。

1. アップデートによって、リソース自体にどのような影響が与えられるか。たとえば、アラームのしきい値を変更すると、アップデート中にアラームが非アクティブになります。前述の通り、インスタンスタイプを変更するには、インスタンスをいったん停止して再開する必要があります。CloudFormation は、基盤となるリソースの更新または変更アクションを使用して、リソースを変更します。アップデートの影響を理解するには、特定のリソースのドキュメントを参照してください。

1. 変更は可変か不変か。Amazon EC2 インスタンスでの AMI の変更など、リソースプロパティへの変更のタイプによっては、基盤となるサービスにサポートされていない場合があります。可変の変更の場合、CloudFormation は、基盤となるリソースの Update または Modify タイプの API を使用します。不変のプロパティの変更の場合、CloudFormation は、アップデートされたプロパティを使用して新しいリソースを作成し、古いリソースを削除する前にそれらをスタックにリンクします。CloudFormation はスタックリソースのダウンタイムを削減しようとしますが、リソースは複数のステップが必要な処理であり、ある程度の時間がかかります。スタックの再構成中、アプリケーションは完全には機能しません。たとえば、要求への応答や、データベースへのアクセスができない可能性があります。

## 関連リソース
<a name="update.walkthrough.related"></a>

CloudFormation を使用してアプリケーションを開始する方法と、Puppet や Opscode Chef のようなその他の構成やデプロイメントサービスと統合する方法については、以下のホワイトペーパーをご参照ください。
+ [CloudFormation によるアプリケーションのブートストラップ](https://s3.amazonaws.com/cloudformation-examples/BoostrappingApplicationsWithAWSCloudFormation.pdf)
+ [CloudFormation と Opscode Chef の統合](https://s3.amazonaws.com/cloudformation-examples/IntegratingAWSCloudFormationWithOpscodeChef.pdf)
+ [CloudFormation と Puppet の統合](https://s3.amazonaws.com/cloudformation-examples/IntegratingAWSCloudFormationWithPuppet.pdf)

# スケールおよび負荷分散されたアプリケーションを作成する
<a name="walkthrough-autoscaling"></a>

このチュートリアルでは、スケールおよび負荷分散されたアプリケーションの設定に役立つスタックを作成します。チュートリアルでは、スタックの作成に使用するサンプルテンプレートを提供します。このサンプルテンプレートは、Auto Scaling グループ、Application Load Balancer、ロードバランサーと Auto Scaling グループへのトラフィックを制御するセキュリティグループ、およびスケーリングアクティビティに関する通知を発行する Amazon SNS 通知設定をプロビジョニングします。

このテンプレートは、1 つ以上の Amazon EC2 インスタンスと Application Load Balancer を作成します。このテンプレートからスタックを作成した場合、AWS リソースに対する料金が発生します。

## フルスタックテンプレート
<a name="example-templates-autoscaling-full-stack-template"></a>

テンプレートから始めましょう。

**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"
        }
      }
    }
  }
}
```

## テンプレートのチュートリアル
<a name="example-templates-autoscaling-description"></a>

このテンプレートの最初の部分では、`Parameters` を指定します。CloudFormation がスタックを正常にプロビジョニングするには、各パラメーターに実行時に値を割り当てる必要があります。テンプレートで後で指定されるリソースは、これらの値を参照し、データを使用します。
+ `InstanceType`: Amazon EC2 Auto Scaling がプロビジョニングする EC2 インスタンスのタイプ。指定しない場合は、デフォルトの `t3.micro` が使用されます。
+ `KeyName`: インスタンスへの SSH アクセスを許可する既存の EC2 キーペア。
+ `LatestAmiId`: インスタンスの Amazon マシンイメージ (AMI)。指定しない場合、インスタンスは、AWS によって維持される AWS Systems Manager パブリックパラメータを使用して、Amazon Linux 2 AMI で起動されます。詳細については、「AWS Systems Manager ユーザーガイド」の「[パブリックパラメータの検索](https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-finding-public-parameters.html)」を参照してください。
+ `OperatorEmail`: スケーリングアクティビティの通知を送信するメールアドレス。
+ `SSHLocation`: インスタンスへの SSH 接続に使用できる IP アドレス範囲。
+ `Subnets`: 少なくとも 2 つのパブリックサブネットが異なるアベイラビリティーゾーンに存在している。
+ `VPC`: パブリックサブネット内のリソースがインターネットに接続できるようにするアカウント内の仮想プライベートクラウド (VPC)。
**注記**  
デフォルトの VPC とデフォルトのサブネットを使用して、インスタンスがインターネットにアクセスできるようにすることができます。後者の場合は、VPC に、作業中のリージョンの各アベイラビリティーゾーンにマッピングされたサブネットがあることを確認してください。ロードバランサーを作成するには、2 つ以上のパブリックサブネットが必要です。

このテンプレートの次の部分では、`Resources` を指定します。このセクションでは、スタックリソースとそのプロパティを指定します。

[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)リソース `ELBSecurityGroup` 
+ `SecurityGroupIngress` には、ポート 80 上のすべての IP アドレス ("CidrIp" : "0.0.0.0/0") からのアクセスを許可する TCP イングレスルールが含まれています。

[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)リソース `EC2SecurityGroup` 
+ `SecurityGroupIngress` には、1) `SSHLocation` 入力パラメータ用に指定した IP アドレス範囲からの SSH アクセス (ポート 22) を許可する TCP イングレスルール、および 2) ロードバランサーのセキュリティグループを指定することによってロードバランサーからのアクセスを許可する TCP イングレスルールという 2 つのイングレスルールが含まれています。[GetAtt](resources-section-structure.md#resource-properties-getatt) 関数は、論理名 `ELBSecurityGroup` を持つセキュリティグループの ID を取得するために使用されます。

[AWS::ElasticLoadBalancingV2::TargetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html) リソース `EC2TargetGroup`
+ `Port`、`Protocol`、および `HealthCheckProtocol` は、`ApplicationLoadBalancer` がトラフィックをルーティングし、Elastic Load Balancing が EC2 インスタンスのヘルスをチェックするために使用する EC2 インスタンスのポート (80) とプロトコル (HTTP) を指定します。
+ `HealthCheckIntervalSeconds` は、EC2 インスタンスのヘルスチェックの間隔が 30 秒であることを指定します。`HealthCheckTimeoutSeconds` は、ヘルスチェックターゲットからのレスポンスを Elastic Load Balancing が待機する時間です (この例では 15 秒)。タイムアウトの時間が経過すると、Elastic Load Balancing は、EC2 インスタンスのヘルスチェックを異常としてマークします。EC2 インスタンスが 3 回連続してヘルスチェックに失敗すると (`UnhealthyThresholdCount`)、Elastic Load Balancing は、そのインスタンスが 5 回連続してヘルスチェックに合格するまで (`HealthyThresholdCount`)、その EC2 インスタンスへのトラフィックのルーティングを停止します。その時点で、Elastic Load Balancing は、そのインスタンスが正常であるとみなし、そのインスタンスへのトラフィックのルーティングを再開します。
+ `TargetGroupAttributes` は、ターゲットグループの登録解除の遅延の値を 20 秒に更新します。デフォルトでは、Elastic Load Balancing は登録解除プロセスを完了するまで 300 秒間待機します。

[AWS::ElasticLoadBalancingV2::Listener](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html) リソース `ALBListener`
+ `DefaultActions` は、ロードバランサーがリッスンするポート、ロードバランサーがリクエストを転送するターゲットグループ、およびリクエストのルーティングに使用されるプロトコルを指定します。

[AWS::ElasticLoadBalancingV2::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html) リソース `ApplicationLoadBalancer`
+ `Subnets` は、`Subnets` 入力パラメータの値を、ロードバランサーノードが作成されるパブリックサブネットのリストとして受け取ります。
+ `SecurityGroup` は、ロードバランサーノードが着信トラフィックを制御するための仮想ファイアウォールとして機能するセキュリティグループの ID を取得します。[GetAtt](resources-section-structure.md#resource-properties-getatt) 関数は、論理名 `ELBSecurityGroup` を持つセキュリティグループの ID を取得するために使用されます。

[AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html) リソース `LaunchTemplate`
+ `ImageId` は、使用する AMI として `LatestAmiId` 入力パラメータの値を受け取ります。
+ `KeyName` は、使用する EC2 キーペアとして `KeyName` 入力パラメータの値を受け取ります。
+ `SecurityGroupIds` は、EC2 インスタンスが着信トラフィックを制御するための仮想ファイアウォールとして機能する、論理名 `EC2SecurityGroup` を持つセキュリティグループの ID を取得します。
+ `UserData` は、インスタンスが稼働を開始した後に実行される設定スクリプトです。この例では、スクリプトは Apache をインストールし、index.html ファイルを作成します。

[AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html) リソース `NotificationTopic`
+ `Subscription` は、スケーリングアクティビティがある場合、`OperatorEmail` 入力パラメータの値を通知の受信者のメールアドレスとして受け取ります。

[AWS::AutoScaling::AutoScalingGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html) resource `WebServerGroup`
+ `MinSize` および `MaxSize` には、Auto Scaling グループでの EC2 インスタンスの最小数と最大数を設定します。
+ `TargetGroupARNs` は、論理名 `EC2TargetGroup` を持つターゲットグループの ARN を取得します。この Auto Scaling グループがスケールすると、このターゲットグループに対するインスタンスの登録および登録解除が自動的に行われます。
+ `VPCZoneIdentifier` は、`Subnets` 入力パラメータの値を、EC2 インスタンスを作成できるパブリックサブネットのリストとして受け取ります。

## ステップ 1: スタックを起動する
<a name="example-templates-autoscaling-launch-stack"></a>

スタックを起動する前に、Amazon EC2、Amazon EC2 Auto Scaling、AWS Systems Manager、Elastic Load Balancing、Amazon SNS、および CloudFormation のすべてのサービスを使用するための AWS Identity and Access Management (IAM) 許可があることを確認してください。

次の手順では、ファイルからサンプルスタックテンプレートをアップロードします。ローカルマシンでテキストエディタを開き、いずれかのテンプレートを追加します。次に、`sampleloadbalancedappstack.template` という名前でファイルを保存します。

**スタックテンプレートを起動するには**

1. AWS マネジメントコンソール にサインインし、CloudFormation コンソール ([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)) を開きます。

1. **[スタックの作成]** を選択し、**[新しいリソースの使用 (標準)]** を選択します。

1. **[テンプレートを指定]** で、**[テンプレートファイルをアップロード]**、**[ファイルを選択]** を選択して `sampleloadbalancedappstack.template` ファイルをアップロードします。

1. [**次へ**] を選択します。

1. **[スタックの詳細を指定]** ページで、スタック名 (例: **SampleLoadBalancedAppStack**) を入力します。

1. **[パラメータ]** で、スタックのパラメータを確認し、**[OperatorEmail]**、**[SSHLocation]**、**[KeyName]**、**[VPC]**、**[Subnets]** など、デフォルト値がないすべてのパラメータの値を指定します。

1. **[次へ]** を 2 回選択します。

1. **[レビュー]** ページで、設定を確認します。

1. [**Submit**] を選択してください。

   スタックのステータスは、CloudFormation コンソールの **[ステータス]** 列で確認できます。CloudFormation がスタックを正常に作成すると、**[CREATE\$1COMPLETE]** ステータスが表示されます。
**注記**  
スタックを作成した後、メールアドレスで通知の受信を開始するには、サブスクリプションを確認する必要があります。詳細については、「Amazon EC2 Auto Scaling ユーザーガイド」の「[Auto Scaling グループのスケール時に Amazon SNS 通知を受け取る](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-sns-notifications.html)」を参照してください。

## ステップ 2: サンプルリソースをクリーンアップする
<a name="example-templates-autoscaling-clean-up"></a>

未使用のサンプルリソースについて課金されないようにするには、スタックを削除します。

**スタックを削除するには**

1. CloudFormation コンソールで、**[SampleLoadBalancedAppStack]** スタックを選択します。

1. **[削除]** を選択します。

1. 確認メッセージで、**[スタックを削除]** を選択します。

   **[SampleLoadBalancedAppStack]** のステータスが **[DELETE\$1IN\$1PROGRESS]** に変わります。CloudFormation がスタックの削除を完了すると、リストからスタックが削除されます。

このチュートリアルのサンプルテンプレートを使用して、独自のスタックテンプレートを構築します。詳細については、「*Amazon EC2 Auto Scaling ユーザーガイド*」の「[チュートリアル: スケーリングとロードバランシングを使用するアプリケーションを設定する](https://docs.aws.amazon.com/autoscaling/ec2/userguide/tutorial-ec2-auto-scaling-load-balancer.html)」を参照してください。

# 別の AWS アカウントで VPC とピア接続する
<a name="peer-with-vpc-in-another-account"></a>

[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) を使用して、別の AWS アカウントの仮想プライベートクラウド (VPC) とピア接続できます。これにより、2 つの VPC 間でトラフィックをルーティングできるネットワーク接続が作成され、同じネットワーク内に存在しているかのように通信できます。VPC ピア接続により、データアクセスとデータ転送が容易になります。

VPC ピアリング接続を確立するには、単一の CloudFormation スタック内で別々に AWS アカウント を　2 つ認可する必要があります。

VPC ピアリングとその制限については、「[Amazon VPC ピアリングガイド](https://docs.aws.amazon.com/vpc/latest/peering/)」を参照してください。

## 前提条件
<a name="peer-with-vpc-in-another-account-prerequisites"></a>

1. ピアリング接続には、ピア VPC ID、ピア AWS アカウント ID、および[クロスアカウントアクセス](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html)が必要です。
**注記**  
このチュートリアルでは、2 つのアカウントについて説明します。1 つめは、クロスアカウントのピア接続を許可するアカウント (*アクセプタアカウント*) です。2 つめは、ピア接続をリクエストするアカウント (*リクエスタアカウント*) です。

1. VPC ピア接続を受け入れるには、クロスアカウントアクセスロールを自分で引き受ける必要があります。リソースは、同じアカウントで VPC ピア接続リソースと同じように動作します。IAM 管理者がクロスアカウントロールの継承を許可する方法については、「*IAM ユーザーガイド*」の「[ロールを切り替えるアクセス許可をユーザーに付与する](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_permissions-to-switch.html)」を参照してください。

## ステップ 1: VPC とクロスアカウントロールの作成
<a name="step-1-create-vpc-and-cross-account-role"></a>

このステップでは、*アクセプタアカウント*に VPC とロールを作成します。

**VPC とクロスアカウントアクセスロールを作成するには**

1. AWS マネジメントコンソール にサインインし、CloudFormation コンソール ([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)) を開きます。

1. **[スタック]** ページでは、右上の **[スタックの作成]** を選択してから、**[新しいリソースを使用 (標準)]** を選択します。

1. **[前提条件 - テンプレートの準備]** で、**[既存のテンプレートを選択]** を選択し、**テンプレートファイルをアップロードし**、**ファイルを選択します**。

1. ローカルマシンでテキストエディタを開き、次のいずれかのテンプレートを追加します。ファイルを保存し、コンソールに戻って、テンプレートファイルとして選択します。  
**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. [**次へ**] を選択します。

1. スタックに名前 (**VPC-owner** など) を付け、**PeerRequesterAccountId** フィールドに*リクエスタアカウント*の AWS アカウント ID を入力します。

1. デフォルトを受け入れて [**次へ**] を選択します。

1. **[CloudFormation によって IAM リソースが作成される場合があることを承認します]** を選択し、**[スタックを作成]** を選択します。

## ステップ 2: `AWS::EC2::VPCPeeringConnection` を含むテンプレートを作成する
<a name="step-2-create-template-for-vpc-peering-connection-owner"></a>

VPC とクロスアカウントロールが作成できたので、別の AWS アカウント (*リクエスタアカウント*) を使用して VPC とピア接続できます。

**[AWS::EC2::VPCPeeringConnection](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpcpeeringconnection.html) リソースを含むテンプレートを作成するには**

1. CloudFormation コンソールのホームページに戻ります。

1. **[スタック]** ページでは、右上の **[スタックの作成]** を選択してから、**[新しいリソースを使用 (標準)]** を選択します。

1. **[前提条件 - テンプレートの準備]** で、**[既存のテンプレートを選択]** を選択し、**テンプレートファイルをアップロードし**、**ファイルを選択します**。

1. ローカルマシンでテキストエディタを開き、次のいずれかのテンプレートを追加します。ファイルを保存し、コンソールに戻って、テンプレートファイルとして選択します。  
**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. [**次へ**] を選択します。

1. スタックに名前 (**VPC-peering-connection** など) を付けます。

1. デフォルトを受け入れて [**次へ**] を選択します。

1. **[CloudFormation によって IAM リソースが作成される場合があることを承認します]** を選択し、**[スタックを作成]** を選択します。

## 制限がより厳格なポリシーでテンプレートを作成する
<a name="create-template-with-highly-restrictive-policy"></a>

別の AWS アカウント を使用した VPC ピア接続で、制限の厳しいポリシーを作成できます。

次の例では、VPC ピアの所有者のテンプレート (上記のステップ 1 で作成した*アクセプタアカウント*) を変更し、より制限を厳しくする方法を示しています。

**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
```

VPC にアクセスするには、上記のステップ 2 と同じリクエスタテンプレートを使用できます。

詳細については、「*Amazon VPC ピアリングガイド*」の「[VPC ピアリングの Identity and Access Management](https://docs.aws.amazon.com/vpc/latest/peering/security-iam.html)」を参照してください。

# CloudFormation を使用して CodeDeploy を通じて ECS ブルー/グリーンデプロイを実行する
<a name="blue-green"></a>

Amazon Elastic Container Service (Amazon ECS) で実行されているアプリケーションを更新するために、CodeDeploy ブルー/グリーンデプロイ戦略を使用できます。この戦略は、アプリケーションバージョンの変更による中断を最小限に抑えるのに役立ちます。

ブルー/グリーンデプロイでは、現在のライブ環境 (*ブルー*) とともに、新しいアプリケーション環境 (*グリーン*) を作成します。これにより、ライブトラフィックをブルー環境からグリーン環境にルーティングする前に、グリーン環境をモニタリングおよびテストできます。グリーン環境がライブトラフィックを処理するようになったら、ブルー環境を安全に終了できます。

CloudFormation を利用して ECS 上で CodeDeploy ブルー/グリーンデプロイを実行するには、スタックテンプレートに次の情報を含めます。
+ `AWS::CodeDeploy::BlueGreen` フックを説明する `Hooks` セクション。
+  `AWS::CodeDeployBlueGreen` 変換を指定する `Transform` セクション。

次のトピックでは、ECS でのブルー/グリーンデプロイのために CloudFormation テンプレートを設定する方法について説明します。

**Topics**
+ [ブルー/グリーンデプロイについて](about-blue-green-deployments.md)
+ [CloudFormation を使用して ECS ブルー/グリーンデプロイメントを管理する際の考慮事項](blue-green-considerations.md)
+ [`AWS::CodeDeploy::BlueGreen` フック構文](blue-green-hook-syntax.md)
+ [ブルー/グリーンデプロイテンプレートの例](blue-green-template-example.md)

# ブルー/グリーンデプロイについて
<a name="about-blue-green-deployments"></a>

このトピックでは、CloudFormation でブルー/グリーンデプロイを実行する方法の概要を説明します。また、ブルー/グリーンデプロイ用の CloudFormation テンプレートを準備する方法についても説明します。

**Topics**
+ [仕組み](#blue-green-how-it-works)
+ [グリーンデプロイを開始するリソースの更新](#blue-green-resources)
+ [テンプレートの準備](#blue-green-setup)
+ [ブルー/グリーンデプロイのモデリング](#blue-green-required)
+ [変更セット](#blue-green-changesets)
+ [スタックイベントのモニタリング](#blue-green-events)
+ [IAM アクセス許可](#blue-green-iam)

## 仕組み
<a name="blue-green-how-it-works"></a>

CloudFormation で CodeDeploy を通じて ECS ブルー/グリーンデプロイを実行する場合は、まず、使用するトラフィックルーティングとスタビライズ設定を指定するなど、ブルーとグリーンの両方のアプリケーション環境のリソースを定義するスタックテンプレートを作成します。次に、そのテンプレートからスタックを作成します。これにより、ブルー (現在の) アプリケーションが生成されます。CloudFormation は、スタックの作成時にのみブルーリソースを作成します。グリーンデプロイのリソースは、必要になるまで作成されません。

その後、将来のスタックの更新で、ブルーのアプリケーションでタスク定義またはタスクセットリソースを更新した場合、CloudFormation は次のことを行います。
+ 必要なグリーンアプリケーション環境リソースをすべて生成する
+ 指定されたトラフィックルーティングパラメータに基づいてトラフィックをシフトする
+ 青色のリソースを削除する

グリーンデプロイが成功してファイナライズされる前の任意の時点でエラーが発生した場合、CloudFormation は、グリーンデプロイ全体が開始される前の状態にスタックをロールバックします。

## グリーンデプロイを開始するリソースの更新
<a name="blue-green-resources"></a>

特定の ECS リソースの特定のプロパティを更新するスタック更新を実行すると、CloudFormation はグリーンデプロイプロセスを開始します。このプロセスを開始するリソースは次のとおりです。
+ [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) 

ただし、これらのリソースの更新に置換を必要とするプロパティの変更が含まれていない場合、グリーンデプロイは開始されません。詳細については、「[スタックリソースの更新動作を理解する](using-cfn-updating-stacks-update-behaviors.md)」を参照してください。

同じスタック更新オペレーションで、上記のリソースに対する更新と他のリソースに対する更新を組み合わせることはできないことに注意することが重要です。リストされているリソースと、同じスタック内の他のリソースの両方を更新する必要がある場合は、次の 2 つのオプションがあります。
+ 2 つの別々のスタック更新オペレーションを実行します: 1 つは上記のリソースに対する更新のみを含み、もう 1 つは他のすべてのリソースに対する変更を含む別のスタック更新。
+ テンプレートから `Transform` および `Hooks` セクションを削除し、スタックの更新を実行します。この場合、CloudFormation はグリーンデプロイを実行しません。

## ECS ブルー/グリーンデプロイを実行するためのテンプレートの準備
<a name="blue-green-setup"></a>

スタックでブルー/グリーンデプロイメントを有効にするには、スタックの更新を実行する前に、以下のセクションをスタックテンプレートに含めます。
+ `AWS::CodeDeployBlueGreen` 変換への参照をテンプレートに追加します。

  ```
  "Transform": [
    "AWS::CodeDeployBlueGreen"
  ],
  ```
+ `AWS::CodeDeploy::BlueGreen` フックを呼び出し、デプロイのプロパティを指定する `Hooks` セクションを追加します。詳細については、「[`AWS::CodeDeploy::BlueGreen` フック構文](blue-green-hook-syntax.md)」を参照してください。
+ `Resources` セクションで、デプロイのブルーとグリーンのリソースを定義します。

これらのセクションは、最初にテンプレートを作成するときに (つまり、スタック自体を作成する前に) 追加することも、スタック更新を実行する前に既存のテンプレートに追加することもできます。新しいスタックにブルー/グリーンデプロイを指定した場合、CloudFormation はスタック作成時にブルーリソースのみを作成します。グリーンデプロイ用のリソースは、スタックの更新中に必要になるまで作成されません。

## CloudFormation リソースを使用したブルー/グリーンデプロイのモデリング
<a name="blue-green-required"></a>

ECS で CodeDeploy ブルー/グリーンデプロイを実行するには、CloudFormation テンプレートに、Amazon ECS サービスやロードバランサーなど、デプロイをモデル化するリソースを含める必要があります。これらのリソースが表す内容の詳細については、「AWS CodeDeploy ユーザーガイド」の「[Amazon ECS デプロイを開始する前に](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-steps-ecs.html#deployment-steps-prerequisites-ecs)」を参照してください。


| 要件 | リソース | 必須/オプション | 置き換えられた場合、ブルー/グリーンデプロイを開始しますか? | 
| --- | --- | --- | --- | 
| Amazon ECS クラスター | [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) | オプション。デフォルトのクラスターを使用できます。 | いいえ | 
| Amazon ECS サービス | [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) | 必須。 | いいえ | 
| アプリケーションまたは 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) | 必須。 | いいえ | 
| 本稼働リスナー | [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) | 必須。 | いいえ | 
| テストリスナー  | [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) | オプション。 | いいえ | 
| 2 つのターゲットグループ | [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) | 必須。 | いいえ | 
| Amazon ECS タスク定義  | [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) | 必須。 | はい | 
| Amazon ECS アプリケーション用のコンテナ | [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) | 必須。 | いいえ | 
| 置き換えタスクセット用のポート | [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) | 必須。 | いいえ | 

## 変更セット
<a name="blue-green-changesets"></a>

グリーンデプロイを開始するスタックの更新を実行する前に、変更セットを作成することを強くお勧めします。これにより、スタックの更新を実行する前にスタックに加えられる実際の変更を確認できます。リソースの変更は、スタックの更新中に実行される順序で表示されない場合があることに注意してください。詳細については、「[変更セットを使用して CloudFormation スタックを更新する](using-cfn-updating-stacks-changesets.md)」を参照してください。

## スタックイベントのモニタリング
<a name="blue-green-events"></a>

ECS デプロイの各ステップで生成されるスタックイベントは、**[Stack]** (スタック) ページの **[Events]** (イベント) タブで、AWS CLI を使用して確認できます。詳細については、「[スタックの進行状況を監視する](monitor-stack-progress.md)」を参照してください。

## ブルー/グリーンデプロイ用の IAM 許可
<a name="blue-green-iam"></a>

CloudFormation がブルー/グリーンデプロイを正常に実行するには、次の CodeDeploy アクセス権限が必要です。
+ `codedeploy:Get*`
+ `codedeploy:CreateCloudFormationDeployment`

詳細については、「*サービス認可リファレンス*」の「[CodeDeploy のアクション、リソース、および条件キー](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awscodedeploy.html)」を参照してください。

# CloudFormation を使用して ECS ブルー/グリーンデプロイメントを管理する際の考慮事項
<a name="blue-green-considerations"></a>

CloudFormation を使用して CodeDeploy を通じて ECS ブルー/グリーンデプロイを実行するプロセスは、CodeDeploy のみを使用する標準の ECS デプロイとは異なります。これらの違いの詳細については、「*AWS CodeDeploy ユーザーガイド*」の「[CodeDeploy および CloudFormation を通じた Amazon ECS ブルー/グリーンデプロイの違い](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployments-create-ecs-cfn.html#differences-ecs-bg-cfn)」を参照してください。

CloudFormation を使用してブルー/グリーンデプロイを管理する場合、留意すべきいくつかの制限と考慮事項があります。
+ 特定のリソースに対する更新のみがグリーンデプロイを開始します。詳細については、「[グリーンデプロイを開始するリソースの更新](about-blue-green-deployments.md#blue-green-resources)」を参照してください。
+ グリーンデプロイを開始するリソースへの更新と他のリソースへの更新を同じスタック更新に含めることはできません。詳細については、「[グリーンデプロイを開始するリソースの更新](about-blue-green-deployments.md#blue-green-resources)」を参照してください。
+ デプロイターゲットとして指定できる ECS サービスは、1 つだけです。
+ CloudFormation によって難読化された値を持つパラメータは、グリーンデプロイ時に CodeDeploy によって更新できず、エラーやスタックの更新に失敗します。具体的には次のとおりです。
  + `NoEcho` 属性で定義されたパラメータ。
  + 動的な参照を使用して外部サービスから値を取得するパラメータ。動的参照の詳細については、[動的参照を使用して他のサービスに格納されている値を取得する](dynamic-references.md) を参照してください。
+ まだ進行中のグリーンデプロイをキャンセルするには、CodeDeploy または ECS ではなく、CloudFormation でスタックの更新をキャンセルします。詳細については、「[スタック更新をキャンセルする](using-cfn-stack-update-cancel.md)」を参照してください。更新が完了した後にキャンセルすることはできません。ただし、以前の設定を使用してスタックを再度更新することはできます。
+ 次の CloudFormation の機能は現在、ECS ブルー/グリーンデプロイを定義するテンプレートではサポートされていません。
  + 他のスタックから値をインポートするための[出力](outputs-section-structure.md)の宣言または [Fn::ImportValue](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-importvalue.html) の使用。
  + リソースのインポート。リソースのインポートにの詳細については、「[AWS リソースを CloudFormation スタックにインポートする](import-resources.md)」を参照してください。
  + ネストされたスタックリソースを含むテンプレートで `AWS::CodeDeploy::BlueGreen` フックを使用します。ネストされたスタックの詳細については、「[ネストされたスタックを使用してテンプレートを再利用可能な部分に分割する](using-cfn-nested-stacks.md)」を参照してください。
  + ネストされたスタックでの `AWS::CodeDeploy::BlueGreen` フックの使用。

# `AWS::CodeDeploy::BlueGreen` フック構文
<a name="blue-green-hook-syntax"></a>

次の構文は、ECS ブルー/グリーンデプロイの `AWS::CodeDeploy::BlueGreen` フックの構造を示しています。

## 構文
<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)"
              ]
            }
          }
        }
      ]
    }
  }
}
```

## プロパティ
<a name="cfn-blue-green-hook-properties"></a>

論理 ID (論理名とも呼ばれます)  
テンプレートの `Hooks` セクションで宣言されたフックの論理 ID。論理 ID は英数字（A-Za-z0-9）とし、テンプレート内で一意である必要があります。  
*必須:* はい    
`Type`  
フックのタイプ。`AWS::CodeDeploy::BlueGreen`  
*必須:* はい  
`Properties`  
フックのプロパティ。  
*必須:* はい    
`TrafficRoutingConfig`  
トラフィックルーティングの構成値。  
*必須:* いいえ  
デフォルトの構成は、時間ベースの canary トラフィックシフトで、15% のステップ率と 5 分間のベイク時間があります。    
`Type`  
デプロイ構成で使用されるトラフィックシフトのタイプ。  
有効値: AllAtOnce \$1 TimeBasedCanary \$1 TimeBasedLinear  
*必須:* はい    
`TimeBasedCanary`  
デプロイの 1 つのバージョンから別のバージョンにトラフィックを 2 つずつシフトする構成を指定します。  
必須: 条件付き: `TimeBasedCanary` をトラフィックルーティングタイプとして指定する場合、`TimeBasedCanary` パラメータを含める必要があります。    
`StepPercentage`  
`TimeBasedCanary` デプロイの最初の増分でシフトするトラフィックの割合。ステップの割合は 14% 以上である必要があります。  
*必須:* いいえ  
`BakeTimeMins`  
`TimeBasedCanary` デプロイの 1 番目と 2 番目のトラフィックシフトの間の分数。  
*必須:* いいえ  
`TimeBasedLinear`  
1 つのデプロイバージョンから別のデプロイバージョンにトラフィックを同じ増分で、各増分間隔を分単位でシフトする構成を指定します。  
必須: 条件付き: `TimeBasedLinear` をトラフィックルーティングタイプとして指定する場合、`TimeBasedLinear` パラメータを含める必要があります。    
`StepPercentage`  
`TimeBasedLinear` デプロイの各増分開始時にシフトされるトラフィックの割合。ステップの割合は 14% 以上である必要があります。  
*必須:* いいえ  
`BakeTimeMins`  
`TimeBasedLinear` デプロイの各増分トラフィックシフト間隔 (分)。  
*必須:* いいえ  
`AdditionalOptions`  
ブルー/グリーンデプロイの追加オプション。  
*必須:* いいえ    
`TerminationWaitTimeInMinutes`  
ブルーリソースを終了するまでの待機時間を分単位で指定します。  
*必須:* いいえ  
`LifecycleEventHooks`  
ライフサイクルイベントフックを使用して、CodeDeploy がデプロイを検証するために呼び出すことができる Lambda 関数を指定します。デプロイライフサイクルイベントに対して、同じ関数または別の関数を使用することもできます。検証テストが完了すると、Lambda `AfterAllowTraffic` 関数は CodeDeploy を呼び戻し、`Succeeded` または `Failed` の結果を配信します。詳細については、「AWS CodeDeploy ユーザーガイド」の「[AppSpec の『フック』セクション](https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html)」を参照してください。  
*必須:* いいえ    
`BeforeInstall`  
置き換えタスクセットが作成される前にタスクを実行するために使用する関数。  
*必須:* いいえ  
`AfterInstall`  
置き換えタスクセットが作成され、ターゲットグループの 1 つがそれに関連付けられた後、タスクを実行するために使用する関数。  
*必須:* いいえ  
`AfterAllowTestTraffic`  
テストリスナーが置き換えタスクセットにトラフィックを提供した後、タスクを実行するために使用する関数。  
*必須:* いいえ  
`BeforeAllowTraffic`  
2 番目のターゲットグループが置き換えタスクセットに関連付けられた後、トラフィックが置き換えタスクセットに移行される前に、タスクを実行するために使用する関数。  
*必須:* いいえ  
`AfterAllowTraffic`  
2 番目のターゲットグループが置き換えタスクセットにトラフィックを提供した後、タスクを実行するために使用する関数。  
*必須:* いいえ  
`ServiceRole`  
ブルー/グリーンデプロイの実行に使用する CloudFormation の実行ロール。必要なアクセス許可のリストについては、「[ブルー/グリーンデプロイ用の IAM 許可](about-blue-green-deployments.md#blue-green-iam)」を参照してください。  
*必須:* いいえ  
`Applications`  
Amazon ECS アプリケーションのプロパティを指定します。  
*必須:* はい    
`Target`  
  
*必須:* はい    
`Type`  
リソースのタイプ。  
*必須:* はい  
`LogicalID`  
リソースの論理 ID。  
*必須:* はい  
`ECSAttributes`  
Amazon ECS アプリケーションデプロイのさまざまな要件を表すリソース。  
*必須:* はい    
`TaskDefinitions`  
Amazon ECS アプリケーションを含む Docker コンテナを実行するための [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) リソースの論理 ID。  
*必須:* はい  
`TaskSets`  
アプリケーションのタスクセットとして使用する [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) リソースの論理 ID。  
*必須:* はい  
`TrafficRouting`  
トラフィックルーティングに使用するリソースを指定します。  
*必須:* はい    
`ProdTrafficRoute`  
ターゲットグループにトラフィックを指示するためのロードバランサーにより使用されるリスナー。  
*必須:* はい    
`Type`  
リソースのタイプ。`AWS::ElasticLoadBalancingV2::Listener`  
*必須:* はい  
`LogicalID`  
 リソースの論理的な ID。  
*必須:* はい  
`TestTrafficRoute`  
ターゲットグループにトラフィックを指示するためのロードバランサーにより使用されるリスナー。  
*必須:* はい    
`Type`  
リソースのタイプ。`AWS::ElasticLoadBalancingV2::Listener`  
*必須:* はい  
`LogicalID`  
 リソースの論理的な ID。  
*必須:* いいえ  
`TargetGroups`  
登録されたターゲットにトラフィックをルーティングするためのターゲットグループとして使用するリソースの論理 ID。  
*必須:* はい

# ブルー/グリーンデプロイテンプレートの例
<a name="blue-green-template-example"></a>

次のサンプルテンプレートは、ECS 上に CodeDeploy ブルー/グリーンデプロイを設定し、トラフィックルーティングの進行状況をステップごとに 15 % に、各ステップ間の安定化期間を 5 分に設定します。

テンプレートを使用してスタックを作成すると、デプロイの初期構成がプロビジョニングされます。その後、リソースの置き換えを必要とする `BlueTaskSet` リソースのプロパティに変更を加えた場合、CloudFormation はスタック更新の一環としてグリーンのデプロイを開始します。

## 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 テンプレートスニペット
<a name="template-snippets"></a>

このセクションでは、CloudFormation テンプレートの各種構成要素の宣言方法を示した多数のサンプルシナリオを紹介しています。カスタムテンプレートのセクションを独自に作成する際の参考にしてください。

**Topics**
+ [一般的なテンプレートスニペット](quickref-general.md)
+ [Auto Scaling CloudFormation テンプレートスニペット](quickref-autoscaling.md)
+ [AWS 請求コンソールのテンプレートスニペット](quickref-billingconductor.md)
+ [CloudFormation テンプレートスニペット](quickref-cloudformation.md)
+ [Amazon CloudFront テンプレートスニペット](quickref-cloudfront.md)
+ [Amazon CloudWatch テンプレートスニペット](quickref-cloudwatch.md)
+ [Amazon CloudWatch Logs テンプレートスニペット](quickref-cloudwatchlogs.md)
+ [Amazon DynamoDB テンプレートスニペット](quickref-dynamodb.md)
+ [Amazon EC2 CloudFormation テンプレートスニペット](quickref-ec2.md)
+ [Amazon Elastic Container Service サンプルテンプレート](quickref-ecs.md)
+ [Amazon Elastic File System サンプルテンプレート](quickref-efs.md)
+ [Elastic Beanstalk テンプレートスニペット](quickref-elasticbeanstalk.md)
+ [Elastic Load Balancing テンプレートスニペット](quickref-elb.md)
+ [AWS Identity and Access Management テンプレートスニペット](quickref-iam.md)
+ [AWS Lambda テンプレート](quickref-lambda.md)
+ [Amazon Redshift テンプレートスニペット](quickref-redshift.md)
+ [Amazon RDS テンプレートスニペット](quickref-rds.md)
+ [Route 53 テンプレートスニペット](quickref-route53.md)
+ [Amazon S3 テンプレートスニペット](quickref-s3.md)
+ [Amazon SNS テンプレートスニペット](quickref-sns.md)
+ [Amazon SQS テンプレートスニペット](scenario-sqs-queue.md)
+ [Amazon Timestream テンプレートスニペット](scenario-timestream-queue.md)

# 一般的なテンプレートスニペット
<a name="quickref-general"></a>

次の例では、AWS サービスに固有ではない異なる CloudFormation テンプレートの特徴を示しています。

**Topics**
+ [Base64 エンコードされた UserData プロパティ](#scenario-userdata-base64)
+ [AccessKey および SecretKey で Base64 エンコードされた UserData プロパティ](#scenario-userdata-base64-with-keys)
+ [Parameters セクション (リテラル文字列パラメータが 1 つ存在)](#scenario-one-string-parameter)
+ [Parameters セクション (正規表現制約を設定した文字列パラメータが存在)](#scenario-constraint-string-parameter)
+ [Parameters セクション (MinValue および MaxValue 制約を設定した数値パラメータが存在)](#scenario-one-number-min-parameter)
+ [Parameters セクション (AllowedValues 制約を設定した数値パラメータが存在)](#scenario-one-number-parameter)
+ [Parameters セクション (1 つのリテラル CommaDelimitedList パラメータが存在)](#scenario-one-list-parameter)
+ [Parameters セクション (擬似パラメータに基づくパラメータ値が存在)](#scenario-one-pseudo-parameter)
+ [Mapping セクション (3 つのマッピングが存在)](#scenario-mapping-with-four-maps)
+ [リテラル文字列を使用した Description](#scenario-description-from-literal-string)
+ [Outputs セクション (リテラル文字列の出力が 1 つ存在)](#scenario-output-with-literal-string)
+ [Outputs セクション (リソースリファレンスが 1 つ、擬似リファレンス出力が 1 つ存在)](#scenario-output-with-ref-and-pseudo-ref)
+ [Outputs セクション (関数、リテラル文字列、リファレンス、擬似パラメータによる出力)](#scenario-output-with-complex-spec)
+ [テンプレート形式バージョン](#scenario-format-version)
+ [AWS Tags プロパティ](#scenario-format-aws-tag)

## Base64 エンコードされた UserData プロパティ
<a name="scenario-userdata-base64"></a>

この例では、`Fn::Base64` 関数と `Fn::Join` 関数を使用して `UserData` プロパティを作成しています。`MyValue` と `MyName` のリファレンスはパラメータです。これらのパラメータは、テンプレートの `Parameters` セクションで定義されている必要があります。それらとは別に、リテラル文字列の `Hello World` も、`UserData` の一部として渡しています。

### 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
```

## AccessKey および SecretKey で Base64 エンコードされた UserData プロパティ
<a name="scenario-userdata-base64-with-keys"></a>

この例では、`Fn::Base64` 関数と `Fn::Join` 関数を使用して `UserData` プロパティを作成しています。このプロパティには、`AccessKey` と `SecretKey` の情報が含まれています。`AccessKey` と `SecretKey` のリファレンスはパラメーターです。これらのパラメーターは、テンプレートの Parameters セクションで定義されている必要があります。

### 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 セクション (リテラル文字列パラメータが 1 つ存在)
<a name="scenario-one-string-parameter"></a>

次の例は、`String` 型パラメーターが 1 つだけ宣言された有効な Parameters セクションの宣言を表しています。

### 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 セクション (正規表現制約を設定した文字列パラメータが存在)
<a name="scenario-constraint-string-parameter"></a>

次の例は、`String` 型パラメーターが 1 つだけ宣言された有効な Parameters セクションの宣言を表しています。`AdminUserAccount` パラメータのデフォルトは `admin` です。このパラメータの値は、長さが 1～16 で、かつアルファベット文字と数字で構成されている必要があります。また、先頭の文字はアルファベット文字である必要があります。

### 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 セクション (MinValue および MaxValue 制約を設定した数値パラメータが存在)
<a name="scenario-one-number-min-parameter"></a>

次の例は、`Number` 型パラメーターが 1 つだけ宣言された有効な Parameters セクションの宣言を表しています。`WebServerPort` パラメータはデフォルト値が 80 で、最小値が 1、最大値が 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
```

## Parameters セクション (AllowedValues 制約を設定した数値パラメータが存在)
<a name="scenario-one-number-parameter"></a>

次の例は、`Number` 型パラメーターが 1 つだけ宣言された有効な Parameters セクションの宣言を表しています。`WebServerPort` パラメータは、デフォルト値が 80 で、許容される値は 80 と 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 セクション (1 つのリテラル CommaDelimitedList パラメータが存在)
<a name="scenario-one-list-parameter"></a>

次の例は、`CommaDelimitedList` タイプパラメータが 1 つだけ宣言された有効な `Parameters` セクションの宣言を表しています。`NoEcho` プロパティは `TRUE` に設定されます。この場合、その値は **describe-stacks** 出力でアスタリスク (\$1\$1\$1\$1\$1) によってマスクされます。ただし、以下に指定した場所に保存されている情報は除きます。

**重要**  
`NoEcho` 属性を使用しても、以下に保存されている情報はマスクされません。  
`Metadata` テンプレートセクション。CloudFormation は、`Metadata` セクションに含める情報の変換、変更、または編集を行いません。詳細については、「[メタデータ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html)」を参照してください。
`Outputs` テンプレートセクション。詳細については、「[出力](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html)」を参照してください。
リソース定義の `Metadata` 属性。詳細については、「[`Metadata` 属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html)」を参照してください。
パスワードやシークレットなどの機密情報を含めるには、これらのメカニズムを使用しないことを強くお勧めします。

**重要**  
機密情報は、CloudFormation テンプレートに直接埋め込むのではなく、スタックテンプレートの動的パラメータを使用して CloudFormation の外部 (AWS Systems Manager パラメータストアや AWS Secrets Manager など) に保存して管理した上で 参照することをお勧めします。  
詳細については、「[テンプレートに認証情報を埋め込まない](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 セクション (擬似パラメータに基づくパラメータ値が存在)
<a name="scenario-one-pseudo-parameter"></a>

次の例は、擬似パラメーター `AWS::StackName` および `AWS::Region` を使用する EC2 ユーザーデータのコマンドです。疑似 Parameters の詳細については、「[擬似パラメータを使用して AWS 値を取得する](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}
```

## Mapping セクション (3 つのマッピングが存在)
<a name="scenario-mapping-with-four-maps"></a>

次の例は、3 つのマッピングを含んだ有効な `Mapping` セクションの宣言を表しています。このマップは、`Stop`、`SlowDown`、`Go` の各マッピングキーと比較され、対応する `RGBColor` 属性に割り当てられた RGB 値を返します。

### 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
<a name="scenario-description-from-literal-string"></a>

次の例は、リテラル文字列を値に使用した有効な `Description` セクションの宣言を表しています。このスニペットは、テンプレート、パラメーター、リソース、プロパティ、出力に使用できます。

### 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 セクション (リテラル文字列の出力が 1 つ存在)
<a name="scenario-output-with-literal-string"></a>

この例では、リテラル文字列によって出力の割り当てを行っています。

### 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 セクション (リソースリファレンスが 1 つ、擬似リファレンス出力が 1 つ存在)
<a name="scenario-output-with-ref-and-pseudo-ref"></a>

この例は、出力の割り当てが 2 つ存在する `Outputs` セクションを示します。1 つはリソースに、もう 1 つは擬似リファレンスに基づいて出力を割り当てています。

### 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 セクション (関数、リテラル文字列、リファレンス、擬似パラメータによる出力)
<a name="scenario-output-with-complex-spec"></a>

この例は、出力の割り当てが 1 つ存在する Outputs セクションを示します。Join 関数を使用し、パーセント記号を区切り文字に使用して値を連結しています。

### 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' ]]
```

## テンプレート形式バージョン
<a name="scenario-format-version"></a>

次のスニペットは、有効な `AWSTemplateFormatVersion` セクションの宣言を表しています。

### 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 プロパティ
<a name="scenario-format-aws-tag"></a>

この例は、AWS `Tags` プロパティを示します。このプロパティは、リソースの Properties セクションに指定します。作成されたリソースは、宣言したタグでタグ付けされます。

### 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"
```

# Auto Scaling CloudFormation テンプレートスニペット
<a name="quickref-autoscaling"></a>

Amazon EC2 Auto Scaling を使用すると、スケーリングポリシーまたはスケジュールされたスケーリングを使用して、Amazon EC2 インスタンスを自動的にスケールすることができます。Auto Scaling グループは、スケーリングポリシー、スケジュールされたアクション、ヘルスチェック、ライフサイクルフック、ロードバランシングなど、スケーリングとフリートの自動管理機能が有効化された Amazon EC2 インスタンスの集合です。

アプリケーションの Auto Scaling では、スケーリングポリシーまたはスケジュールに基づくスケーリングを使用して、Amazon EC2 の対象外のさまざまなリソースを自動的にスケーリングできます。

CloudFormation テンプレートを使用すると、Auto Scaling グループ、スケーリングポリシー、スケジュールされたアクション、その他自動スケーリングのリソースをインフラストラクチャの一環として作成および設定することができます。テンプレートを使用すると、自動スケーリングリソースのデプロイを反復的にかつ一貫性のある方法で、簡単に管理し自動化することができます。

以下のテンプレートスニペットの例では、Amazon EC2 Auto Scaling と Application Auto Scaling の、CloudFormation リソースまたはコンポーネントについて説明しています。これらのスニペットはテンプレートに統合するように設計されており、単独で実行することを意図したものではありません。

**Topics**
+ [Amazon EC2 Auto Scaling リソースを設定する](quickref-ec2-auto-scaling.md)
+ [Application Auto Scaling リソースを設定する](quickref-application-auto-scaling.md)

# CloudFormation で Amazon EC2 Auto Scaling リソースを設定する
<a name="quickref-ec2-auto-scaling"></a>

以下の例では、Amazon EC2 Auto Scaling で使用するテンプレートに含めるさまざまなスニペットを示しています。

**Topics**
+ [単一インスタンスの Auto Scaling グループを作成する](#scenario-single-instance-as-group)
+ [ロードバランサーがアタッチされた Auto Scaling グループを作成する](#scenario-as-group)
+ [通知を使用する Auto Scaling グループを作成する](#scenario-as-notification)
+ [`CreationPolicy` と `UpdatePolicy` を使用する Auto Scaling グループを作成する](#scenario-as-updatepolicy)
+ [ステップスケーリングポリシーを作成する](#scenario-step-scaling-policy)
+ [混合インスタンスグループの例](#scenario-mixed-instances-group-template-examples)
+ [起動構成の例](#scenario-launch-config-template-examples)

## 単一インスタンスの Auto Scaling グループを作成する
<a name="scenario-single-instance-as-group"></a>

この例に示すのは、作業を進める際に役立つ、単一インスタンスに関連付けられた [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) リソースです。Auto Scaling グループの `VPCZoneIdentifier` プロパティは、3 つの異なるアベイラビリティーゾーンの既存のサブネットのリストを指定します。スタックを作成する前に、アカウントから該当するサブネット ID を指定する必要があります。`LaunchTemplate` プロパティは、テンプレートの他の場所で定義されている論理名 `myLaunchTemplate` の [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) リソースを参照します。

**注記**  
起動テンプレートの例については、Amazon EC2 スニペットの「[CloudFormation を使用して起動テンプレートを作成する](quickref-ec2-launch-templates.md)」、および「`AWS::EC2::LaunchTemplate` リソース」の「[Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html#aws-resource-ec2-launchtemplate--examples)」のセクションを参照してください。

### 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'
```

## ロードバランサーがアタッチされた Auto Scaling グループを作成する
<a name="scenario-as-group"></a>

この例に示すのは、複数のサーバー間で負荷を分散する [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) リソースです。また、同じテンプレートの他の場所で宣言された AWS リソースの論理名を指定します。

1. `VPCZoneIdentifier` プロパティは、Auto Scaling グループの EC2 インスタンスが作成される 2 つの [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) リソースの論理名を、次のように指定します: `myPublicSubnet1`、`myPublicSubnet2`

1. `LaunchTemplate` プロパティは、論理名が `myLaunchTemplate` である [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) リソースを指定します。

1. `TargetGroupARNs` プロパティは、トラフィックを Auto Scaling グループにルーティングするために使用される Application Load Balancer または Network Load Balancer のターゲットグループのリストを指定します。この例では、1 つのターゲットグループとして、論理名が `myTargetGroup` である [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) リソースを指定しています。

### 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
```

### 関連情報
<a name="scenario-as-group-see-also"></a>

Application Load Balancer の `ALBRequestCountPerTarget` 事前定義メトリクスに基づくターゲット追跡スケーリングポリシーを関連付けた Auto Scaling グループを作成する詳細な例については、「`AWS::AutoScaling::ScalingPolicy` リソース」の「[例](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-scalingpolicy.html#aws-resource-autoscaling-scalingpolicy--examples)」セクションを参照してください。

## 通知を使用する Auto Scaling グループを作成する
<a name="scenario-as-notification"></a>

リソースタイプのプライマリ ID は テンプレートにある必要があります。`NotificationConfigurations` プロパティは、CloudFormation からの通知の送信先となる SNS トピックと、CloudFormation が通知を送信するきっかけとなるイベントを指定します。`NotificationTypes` で指定したイベントが発生すると、CloudFormation から `TopicARN` で指定した SNS トピックに通知が送信されます。スタックを起動すると、CloudFormation は、同じテンプレート内で宣言された [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) リソース (`snsTopicForAutoScalingGroup`) を作成します。

Auto Scaling グループの `VPCZoneIdentifier` プロパティは、3 つの異なるアベイラビリティーゾーンの既存のサブネットのリストを指定します。スタックを作成する前に、アカウントから該当するサブネット ID を指定する必要があります。`LaunchTemplate` プロパティは、同じテンプレート内の別の場所で宣言された [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) リソースの論理名を参照します。

### 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
```

## `CreationPolicy` と `UpdatePolicy` を使用する Auto Scaling グループを作成する
<a name="scenario-as-updatepolicy"></a>

次の例では、[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) リソースに `CreationPolicy` と `UpdatePolicy` の属性を追加する方法を示しています。

サンプルの作成ポリシーは、グループの準備ができたときに CloudFormation が `Count` の数の成功シグナルを受信するまで、Auto Scaling グループが `CREATE_COMPLETE` のステータスに到達するのを防ぎます。Auto Scaling グループの準備ができたことを通知するために、起動テンプレートのユーザーデータ (図に示されていません) に追加された `cfn-signal` ヘルパースクリプトが、インスタンス上で実行されます。インスタンスが指定された `Timeout` 範囲内でシグナルを送信しない場合では、CloudFormation はインスタンスが作成されていないと想定し、リソースの作成は失敗し、CloudFormation はスタックをロールバックします。

サンプルの更新ポリシーでは、`AutoScalingRollingUpdate` プロパティを使用して、ローリング更新を実行するように CloudFormation に指示します。ローリング更新は、`MaxBatchSize` に基づいて小規模なバッチ (この例ではインスタンスごと) で Auto Scaling グループを変更し、`PauseTime` に基づいて更新のバッチ間の停止時間を変更します。`MinInstancesInService` 属性は、Auto Scaling が古いインスタンスを更新している間、CloudFormation グループ内で使用中となる必要があるインスタンスの最小数を指定します。

`WaitOnResourceSignals` 属性は `true` に設定しています。CloudFormation が更新を続行するには、指定された `PauseTime` 内に新しいインスタンスからシグナルを受け取る必要があります。スタックの更新の進行中、EC2 Auto Scaling プロセス `HealthCheck`、`ReplaceUnhealthy`、`AZRebalance`、`AlarmNotification`、`ScheduledActions` は一時停止されます。注: ローリング更新が適切に機能しなくなる可能性があるため、`Launch`、`Terminate`、または `AddToLoadBalancer` (Auto Scaling グループが Elastic Load Balancing で使用されている場合) タイプのプロセスを一時停止しないでください。

Auto Scaling グループの `VPCZoneIdentifier` プロパティは、3 つの異なるアベイラビリティーゾーンの既存のサブネットのリストを指定します。スタックを作成する前に、アカウントから該当するサブネット ID を指定する必要があります。`LaunchTemplate` プロパティは、同じテンプレート内の別の場所で宣言された [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) リソースの論理名を参照します。

`CreationPolicy` 属性および `UpdatePolicy` 属性の詳細については、「[リソース属性リファレンス](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'
```

## ステップスケーリングポリシーを作成する
<a name="scenario-step-scaling-policy"></a>

この例に示すのは、ステップスケーリングポリシーを使用して Auto Scaling グループをスケールアウトする [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) リソースです。`AdjustmentType` プロパティには、`ChangeInCapacity` が指定されています。この場合、`ScalingAdjustment` は、追加 (`ScalingAdjustment` が正数の場合) または削除 (負数の場合) するインスタンスの数を表します。この例では、`ScalingAdjustment` は 1 です。したがって、アラームのしきい値に対して違反があると、ポリシーが実行されて、グループ内の EC2 インスタンスの数が 1 つ増やされます。

[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` は、アラームが ALARM 状態 (`AlarmActions`) になったときに実行するアクションとして、スケーリングポリシー `ASGScalingPolicyHigh` を指定します。`Dimensions` プロパティは、同じテンプレート内の別の場所で宣言された [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) リソースの論理名を参照します。

### 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
```

### 関連情報
<a name="scenario-as-policy-see-also"></a>

スケーリングポリシーのテンプレート例については、「`AWS::AutoScaling::ScalingPolicy` リソース」の「[例](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-scalingpolicy.html#aws-resource-autoscaling-scalingpolicy--examples)」セクションを参照してください。

## 混合インスタンスグループの例
<a name="scenario-mixed-instances-group-template-examples"></a>

### 属性ベースのインスタンスタイプの選択を使用して Auto Scaling グループを作成する
<a name="scenario-mixed-instances-group-instance-requirements"></a>

この例に示すのは、属性ベースのインスタンスタイプを使って混合インスタンスグループを起動するための情報を含む、[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) リソースです。`VCpuCount` プロパティの最小値と最大値を、および `MemoryMiB` プロパティの最小値を指定します。Auto Scaling グループで使用されるインスタンスタイプはいずれも、必要なインスタンス属性と一致している必要があります。

Auto Scaling グループの `VPCZoneIdentifier` プロパティは、3 つの異なるアベイラビリティーゾーンの既存のサブネットのリストを指定します。スタックを作成する前に、アカウントから該当するサブネット ID を指定する必要があります。`LaunchTemplate` プロパティは、同じテンプレート内の別の場所で宣言された [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) リソースの論理名を参照します。

#### 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'
```

## 起動構成の例
<a name="scenario-launch-config-template-examples"></a>

### 「起動設定を作成する」
<a name="scenario-as-launch-config"></a>

この例に示すのは、`ImageId`、`InstanceType`、`SecurityGroups` プロパティの値を指定する、Auto Scaling グループの [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) リソースです。`SecurityGroups` プロパティは、テンプレート内の他の場所で指定されている [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) リソースの論理名と、`myExistingEC2SecurityGroup` という既存の EC2 セキュリティグループの両方を指定します。

#### 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
```

### 起動設定を使用して Auto Scaling グループを作成する
<a name="scenario-single-instance-as-group-launch-configuration"></a>

この例に示すのは、単一インスタンスに関連付けられた [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) リソースです。Auto Scaling グループの `VPCZoneIdentifier` プロパティは、3 つの異なるアベイラビリティーゾーンの既存のサブネットのリストを指定します。スタックを作成する前に、アカウントから該当するサブネット ID を指定する必要があります。`LaunchConfigurationName` プロパティは、論理名がテンプレート内で定義された `mySimpleConfig` である、[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) リソースを参照します。

#### 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'
```

# CloudFormation で Application Auto Scaling リソースを設定する
<a name="quickref-application-auto-scaling"></a>

このセクションでは、さまざまな AWS リソースのアプリケーションの Auto Scaling スケーリングポリシーとスケジュールに基づくアクションに関する CloudFormation テンプレートの例を示します。

**重要**  
アプリケーションの Auto Scaling スニペットがテンプレートに含まれている場合は、`DependsOn` 属性を使用して、テンプレートを通じて作成される特定のスケーラブルなリソースへの依存関係を宣言する必要がある場合があります。これにより、デフォルトの並列処理が上書きされ、指定した順序で CloudFormation がリソースを操作するようになります。この宣言がないと、リソースの設定が完了する前にスケーリングの構成が適用される場合があります。  
詳細については、「[DependsOn 属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-dependson.html)」を参照してください。

**Topics**
+ [AppStream フリートのスケーリングポリシーの作成](#w2aac11c41c15c19b9)
+ [Aurora DB クラスターのスケーリングポリシーを作成する](#w2aac11c41c15c19c11)
+ [DynamoDB テーブルのスケーリングポリシーを作成する](#w2aac11c41c15c19c13)
+ [Amazon ECS サービスのスケーリングポリシーを作成する (メトリクスス: 平均 CPU とメモリ)](#w2aac11c41c15c19c15)
+ [Amazon ECS サービスのスケーリングポリシーを作成する (メトリクス: ターゲットあたりの平均リクエスト数)](#w2aac11c41c15c19c17)
+ [Lambda 関数の cron 式を使用した、計画されたアクションを作成する](#w2aac11c41c15c19c19)
+ [スポットフリートの `at` 式を使用して、計画されたアクションを作成する](#w2aac11c41c15c19c21)

## AppStream フリートのスケーリングポリシーの作成
<a name="w2aac11c41c15c19b9"></a>

このスニペットでは、ポリシーを作成し、[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) リソースを使用して [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) リソースにそのポリシーを適用しています。[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) リソースは、このポリシーが適用されるスケーラブルターゲットを宣言します。Application Auto Scaling は、フリートインスタンスの数を最低 1 つ個のインスタンス、最大 20 個のインスタンスに拡張できます。このポリシーでは、フリートの平均容量使用率を 75% に保ち、スケールアウトとスケールインのクールダウン期間は 300 秒 (5 分) です。

`Fn::Join` と `Rev` の組み込み関数を使用して、同じテンプレートで指定された `AWS::AppStream::Fleet` リソースの、論理名を使用して `ResourceId` プロパティを作成します。詳細については、「[組み込み関数リファレンス](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
```

## Aurora DB クラスターのスケーリングポリシーを作成する
<a name="w2aac11c41c15c19c11"></a>

このスニペットでは、[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) リソースを登録します。[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) リソースは、DB クラスターが、1～8 個の Aurora レプリカを持つように動的にスケールされることを示します。また、ターゲット追跡スケーリングポリシーを、[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) リソースを使用してクラスターに適用します。

この構成では、`RDSReaderAverageCPUUtilization` 事前定義メトリクスを使用して、Aurora DB クラスターのすべての Aurora レプリカでの平均 CPU 使用率 40% に基づいて Aurora DB クラスターが調整されます。この構成では、10 分間のスケールインのクールダウン期間と 5 分間のスケールアウトのクールダウン期間が提供されます。

この例では、`Fn::Sub` 組み込み関数を使用して、同じテンプレートで指定されている `AWS::RDS::DBCluster` リソースの論理名で `ResourceId` プロパティを作成します。詳細については、「[組み込み関数リファレンス](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
```

## DynamoDB テーブルのスケーリングポリシーを作成する
<a name="w2aac11c41c15c19c13"></a>

このスニペットでは、`TargetTrackingScaling` ポリシータイプを使ってポリシーを作成し、それを [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) リソースを使用して [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) リソースに適用しています。[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) リソースは、このポリシーが適用されるスケーラブルなターゲットとして、書き込みキャパシティーユニット (最大 5、最小 15) を宣言しています。スケーリングポリシーは、`DynamoDBWriteCapacityUtilization` 事前定義メトリクスに基づいて、ターゲット使用率を 50% に維持するように、テーブルの書き込み容量のスループットをスケーリングします。

`Fn::Join` と `Ref` の組み込み関数を使用して、同じテンプレートで指定された `AWS::DynamoDB::Table` リソースの、論理名を使用して `ResourceId` プロパティを作成します。詳細については、「[組み込み関数リファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html)」を参照してください。

**注記**  
DynamoDB リソースの CloudFormation テンプレートを作成する方法の詳細については、AWS データベースブログの「[CloudFormation を使用して Amazon DynamoDB テーブルとインデックスの自動スケーリングを設定する方法](https://aws.amazon.com/blogs/database/how-to-use-aws-cloudformation-to-configure-auto-scaling-for-amazon-dynamodb-tables-and-indexes/)」を参照してください。

### 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
```

## Amazon ECS サービスのスケーリングポリシーを作成する (メトリクスス: 平均 CPU とメモリ)
<a name="w2aac11c41c15c19c15"></a>

このスニペットでは、ポリシーを作成し、[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) リソースを使用して [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) リソースにそのポリシーを適用しています。[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) リソースは、このポリシーが適用されるスケーラブルターゲットを宣言します。Application Auto Scaling は、最小 1 タスク、最大 6 タスクのスケーリングが可能です。

また、`TargetTrackingScaling` ポリシータイプの 2 つのスケーリングポリシーを作成します。これらのポリシーは、サービスの平均 CPU およびメモリ使用量に基づいて ECS サービスをスケールするために使用されます。`Fn::Join` と `Ref` の組み込み関数を使用して、同じテンプレートで指定された [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`) および `AWS::ECS::Service` (`myService`) リソースの論理名を使用して `ResourceId` プロパティを作成します。詳細については、「[組み込み関数リファレンス](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
```

## Amazon ECS サービスのスケーリングポリシーを作成する (メトリクス: ターゲットあたりの平均リクエスト数)
<a name="w2aac11c41c15c19c17"></a>

以下の例では、`ALBRequestCountPerTarget` 事前定義メトリクスを使用するターゲット追跡スケーリングポリシーを ECS サービスに適用します。このポリシーは、ターゲットあたり (1 分あたり) のリクエストカウントがターゲット値を超えた場合に ECS サービスに容量を追加するために使用されます。`DisableScaleIn` の値が `true` に設定されているため、ターゲット追跡ポリシーはスケーラブルなターゲットから容量を削除しません。

`Fn::Join` と `Fn::GetAtt` の組み込み関数を使用して、同じテンプレートで指定された [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`) および [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`) リソースの論理名を使用して `ResourceLabel` プロパティを作成します。詳細については、「[組み込み関数リファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html)」を参照してください。

スケーラブルなターゲットの `MaxCapacity` および `MinCapacity` プロパティ、スケーリングポリシーの `TargetValue` プロパティは、スタックの作成または更新時にテンプレートに渡すパラメータ値を参照します。

### 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
```

## Lambda 関数の cron 式を使用した、計画されたアクションを作成する
<a name="w2aac11c41c15c19c19"></a>

このスニペットでは、[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) リソースを使用して、`BLUE` という名前の関数エイリアス ([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)) のプロビジョニングされた同時実行を登録しています。また、Cron 式を使用して、定期的なスケジュールでスケジュールされたアクションを作成します。定期スケジュールのタイムゾーンは UTC です。

`RoleARN` プロパティで `Fn::Join` と `Ref` の組み込み関数を使用し、サービスリンクロールの ARN を指定します。`Fn::Sub` の組み込み関数を使用して、同じテンプレートで指定された [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) または [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) リソースの論理名を使用して `ResourceId` プロパティを作成します。詳細については、「[組み込み関数リファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html)」を参照してください。

**注記**  
非公開バージョン (`$LATEST`) を参照するエイリアスに、プロビジョニングされた同時実行を割り当てることもできません。  
Lambda リソースの CloudFormation テンプレートを作成する方法の詳細については、AWS コンピューティングブログのブログ記事「[繰り返し発生するピーク使用量のために AWS Lambda プロビジョニングされた同時実行をスケジュールする](https://aws.amazon.com/blogs/compute/scheduling-aws-lambda-provisioned-concurrency-for-recurring-peak-usage/)」を参照してください。

### 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'
```

## スポットフリートの `at` 式を使用して、計画されたアクションを作成する
<a name="w2aac11c41c15c19c21"></a>

このスニペットでは、[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) リソースを使用して、[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) リソースに対して 1 回だけ実行される 2 つの計画されたアクションを作成しています。1 回限りのスケジュールされた各アクションのタイムゾーンは UTC です。

`Fn::Join` と `Ref` の組み込み関数を使用して、同じテンプレートで指定された `AWS::EC2::SpotFleet` リソースの論理名を使用して `ResourceId` プロパティを作成します。詳細については、「[組み込み関数リファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html)」を参照してください。

**注記**  
スポットフリートリクエストには、タイプが `maintain` のリクエストが必要です。自動スケーリングは 1 回限りのリクエストまたはスポットブロックではサポートされません。

### 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 請求コンソールのテンプレートスニペット
<a name="quickref-billingconductor"></a>

この例では、10% のグローバルマークアップ価格設定ルールを持つ価格プランを 1 つ作成します。この料金プランは請求グループに添付されています。請求グループには、請求グループの合計費用に加えて 10 USD の請求と 10% の請求を適用する 2 つのカスタム明細項目もあります。

## 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 テンプレートスニペット
<a name="quickref-cloudformation"></a>

**Topics**
+ [ネストされたスタック](#w2aac11c41c23b5)
+ [待機条件](#w2aac11c41c23b7)

## ネストされたスタック
<a name="w2aac11c41c23b5"></a>

### テンプレートにおけるスタックのネスト
<a name="scenario-stack"></a>

このサンプルテンプレートには、`myStack` というスタックリソースがネストされています。CloudFormation でテンプレートからスタックを作成するときに、`myStack` が作成され、そのテンプレートは `TemplateURL` プロパティで指定されます。出力値 `StackRef` は `myStack` のスタック ID を、`OutputFromNestedStack` は `myStack` リソース内からの出力値 `BucketName` を返します。`Outputs.nestedstackoutputname` 形式は、ネストされたスタックからの出力値を指定する目的で予約されており、上位のテンプレート内の任意の場所で使用できます。

詳細については、「[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
```

### テンプレートでの入力パラメータによるスタックのネスト
<a name="scenario-stack-parameters"></a>

このサンプルテンプレートには、入力パラメーターを指定するスタックリソースが存在します。CloudFormation は、このテンプレートからスタックを作成する際、`Parameters` プロパティ内で宣言されている値ペアを、`myStackWithParams` スタックの作成用テンプレートの入力パラメータとして使用します。この例では、`InstanceType` パラメーターと `KeyName` パラメーターを指定しています。

詳細については、「[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
```

## 待機条件
<a name="w2aac11c41c23b7"></a>

### Amazon EC2 インスタンスでの待機条件の使用
<a name="scenario-waitcondition"></a>

**重要**  
Amazon EC2 および Auto Scaling リソースについては、待機条件ではなく CreationPolicy 属性を使用することをお勧めします。CreationPolicy 属性をこれらのリソースに追加し、インスタンス作成プロセスが正常に完了したときにシグナルを送信するために cfn-signal ヘルパースクリプトを使用します。

作成ポリシーを使用できない場合は、待機条件を伴う Amazon EC2 インスタンスを宣言する次のテンプレート例を参照してください。待機条件 `myWaitCondition` では、`myWaitConditionHandle` を伝達手段に用いると共に、Amazon EC2 インスタンスリソースが作成された後で待機条件をトリガーする指定を `DependsOn` 属性で行っています。また、`Timeout` プロパティを使用して、待機条件の持続時間を 4500 秒に設定しています。加えて、待機条件へのシグナルの働きをする署名付き URL を、`Ec2Instance` リソースの `UserData` プロパティで Amazon EC2 インスタンスに渡しています。Amazon EC2 インスタンスで動作するアプリケーションまたはスクリプトはこの署名付き URL を取得し、成功または失敗を待機条件に伝達するための手段とします。`cfn-signal` を使用するか、待機条件にシグナルを送信するアプリケーションまたはスクリプトは自分で作成する必要があります。待機条件シグナルから戻されたデータは、出力値である `ApplicationData` に格納されます。

詳細については、「[CloudFormation テンプレートで待機条件を作成する](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.
```

### cfn-signal ヘルパースクリプトを使用して待機条件を通知する
<a name="scenario-waitcondition-cfn-signal"></a>

この例は、成功を待機条件に伝達する `cfn-signal` コマンドラインを示します。EC2 インスタンスの `UserData` プロパティでコマンドラインを定義する必要があります。

#### 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}'
```

### Curl を使用した待機条件への伝達
<a name="scenario-waitcondition-curl"></a>

この例は、成功を待機条件に伝達する Curl コマンドラインを示します。

```
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"
```

ファイル /tmp/a には、次の JSON 構造が格納されます。

```
1. {
2.   "Status" : "SUCCESS",
3.   "Reason" : "Configuration Complete",
4.   "UniqueId" : "ID1234",
5.   "Data" : "Application has completed configuration."
6. }
```

この例も、同じ成功シグナルを送信する Curl コマンドラインですが、コマンドラインのパラメーターとして JSON を送信しています。

```
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"
```

# Amazon CloudFront テンプレートスニペット
<a name="quickref-cloudfront"></a>

CloudFormation の Amazon CloudFront に対して、テンプレートのサンプルスニペットを使用します。詳細については、「[Amazon CloudFront resource type reference](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/AWS_CloudFront.html)」を参照してください。

**Topics**
+ [Amazon S3 オリジンを使用した Amazon CloudFront Distribution リソース](#scenario-cloudfront-s3origin)
+ [カスタムオリジンを使用した Amazon CloudFront Distribution リソース](#scenario-cloudfront-customorigin)
+ [複数のオリジンをサポートする Amazon CloudFront ディストリビューション](#scenario-cloudfront-multiorigin)
+ [Lambda 関数をオリジンとする Amazon CloudFront ディストリビューション](#scenario-cloudfront-lambda-origin)
+ [関連情報](#w2aac11c41c27c15)

## Amazon S3 オリジンを使用した Amazon CloudFront Distribution リソース
<a name="scenario-cloudfront-s3origin"></a>

次のサンプルテンプレートは、[S3Origin](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-s3originconfig.html) とレガシーオリジンアクセスアイデンティティ (OAI) を使用する Amazon CloudFront [ディストリビューション](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudfront-distribution.html)を示しています。代わりにオリジンアクセスコントロール (OAC) を使用する方法については、「*Amazon CloudFront デベロッパーガイド*」の「[Restricting access to an Amazon Simple Storage Service origin](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html)」を参照してください。

### 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'
```

## カスタムオリジンを使用した Amazon CloudFront Distribution リソース
<a name="scenario-cloudfront-customorigin"></a>

次のテンプレートの例では、[CustomOrigin](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-customoriginconfig.html) を使用した Amazon CloudFront [[Distribution]](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudfront-distribution.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'
```

## 複数のオリジンをサポートする Amazon CloudFront ディストリビューション
<a name="scenario-cloudfront-multiorigin"></a>

次のテンプレート例では、複数のオリジンをサポートする CloudFront [ディストリビューション](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudfront-distribution.html)を宣言する方法を示します。[DistributionConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-distributionconfig.html) では、オリジンのリストが指定され、[DefaultCacheBehavior](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-cloudfront-distribution-defaultcachebehavior.html) が設定されます。

### 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'
```

## Lambda 関数をオリジンとする Amazon CloudFront ディストリビューション
<a name="scenario-cloudfront-lambda-origin"></a>

次の例では、指定された Lambda 関数 URL (パラメータとして提供) をフロントとする CloudFront ディストリビューションを作成し、HTTPS のみのアクセス、キャッシュ、圧縮、およびグローバル配信を有効にします。Lambda URL をカスタム HTTPS オリジンとして設定し、標準の AWS キャッシュポリシーを適用します。このディストリビューションは、HTTP/2 および IPv6 サポートによりパフォーマンスが最適化されており、CloudFront ドメイン名を出力します。これにより、ユーザーは安全な CDN ベースのエンドポイントを介して Lambda 関数にアクセスできます。詳細については、AWS ブログの「[Using Amazon CloudFront with AWS Lambda as origin to accelerate your web applications](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}/
```

## 関連情報
<a name="w2aac11c41c27c15"></a>

Route 53 レコードにカスタムエイリアスを追加して CloudFront ディストリビューションにわかりやすい名前を付ける例については、「[CloudFront ディストリビューションのエイリアスリソースレコードセット](quickref-route53.md#scenario-user-friendly-url-for-cloudfront-distribution)」を参照してください。

# Amazon CloudWatch テンプレートスニペット
<a name="quickref-cloudwatch"></a>

これらのサンプルテンプレートスニペットをは、CloudFormation で Amazon CloudWatch リソースの説明を記述するのに役立ちます。詳細については、[Amazon CloudWatch リソースタイプリファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/AWS_CloudWatch.html)を参照してください。

**Topics**
+ [請求アラーム](#cloudwatch-sample-billing-alarm)
+ [CPU 使用率アラーム](#cloudwatch-sample-cpu-utilization-alarm)
+ [Amazon Elastic Compute Cloud インスタンスの復元](#cloudwatch-sample-recover-instance)
+ [基本ダッシュボードを作成する](#cloudwatch-sample-dashboard-basic)
+ [サイドバイサイドウィジェットでダッシュボードを作成する](#cloudwatch-sample-dashboard-sidebyside)

## 請求アラーム
<a name="cloudwatch-sample-billing-alarm"></a>

次のサンプルでは、Amazon CloudWatch は AWS アカウントに対する課金がアラームしきい値を超えた場合に E メール通知を送信します。使用量の通知を受け取るには、請求アラートを有効にします。詳細については、「Amazon CloudWatch ユーザーガイド」の「[AWS の推測料金をモニタリングする請求アラームの作成](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 使用率アラーム
<a name="cloudwatch-sample-cpu-utilization-alarm"></a>

次のサンプルスニペットでは、Amazon EC2 インスタンスの平均 CPU 使用率が 3 つの評価期間にわたって 60 秒間以上 90% を超えたときに通知を送信するアラームを作成します。

### 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"
```

## Amazon Elastic Compute Cloud インスタンスの復元
<a name="cloudwatch-sample-recover-instance"></a>

次の CloudWatch アラームは、15 分間連続してステータスチェックに失敗した場合、EC2 インスタンスを復元します。アラームアクションの詳細については、「Amazon CloudWatch ユーザーガイド」の「[EC2 インスタンスを停止、終了、再起動、または復旧するアラームを作成する](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/UsingAlarmActions.html)」を参照してください。

### 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
```

## 基本ダッシュボードを作成する
<a name="cloudwatch-sample-dashboard-basic"></a>

次の例では、CPU 使用率を表示する 1 つのメトリクスウィジェットとメッセージを表示する 1 つのテキストウィジェットからなる単純な CloudWatch ダッシュボードを作成します。

### 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"}}]}'
```

## サイドバイサイドウィジェットでダッシュボードを作成する
<a name="cloudwatch-sample-dashboard-sidebyside"></a>

次の例では、2 つのメトリクスウィジェットを並べて表示するダッシュボードを作成します。

### 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 テンプレートスニペット
<a name="quickref-cloudwatchlogs"></a>

Amazon CloudWatch Logs は、Amazon EC2 インスタンスまたはそのほかのリソースから、システム、アプリケーション、およびカスタムログファイルを監視できます。CloudFormation を使用してロググループおよびメトリクスフィルタをプロビジョニングし、管理できます。Amazon CloudWatch Logs の詳細については、「[Amazon CloudWatch Logs ユーザーガイド](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)」を参照してください。

**Topics**
+ [Linux インスタンスから CloudWatch Logs へのログの送信](#quickref-cloudwatchlogs-example1)
+ [Windows インスタンスから CloudWatch Logs へのログの送信](#quickref-cloudwatchlogs-example2)
+ [関連情報](#w2aac11c41c35c11)

## Linux インスタンスから CloudWatch Logs へのログの送信
<a name="quickref-cloudwatchlogs-example1"></a>

次のテンプレートは、CloudWatch Logs 統合を使用して Amazon Linux 2023 でウェブサーバーを設定する方法を示しています。テンプレートは、次のタスクを実行します。
+ Apache と PHP をインストールします。
+ Apache アクセスログを CloudWatch Logs に転送するように CloudWatch エージェントを設定します。
+ CloudWatch エージェントが CloudWatch Logs にログデータを送信できるようにする IAM ロールを設定します。
+ カスタムアラームと通知を作成して、404 エラーまたは高帯域幅の使用状況をモニタリングします。

ウェブサーバーからのログイベントは、CloudWatch アラームのメトリクスデータを提供します。2 つのメトリクスフィルタで、ログ情報を CloudWatch メトリクスに変換する方法を記述します。404 メトリクスは 404 の発生数をカウントします。サイズメトリクスはリクエストのサイズを追跡します。2 分間で 3 つ以上の 404 が発生した場合、または平均リクエストサイズが 3500 KB を超える状態が 10 分を超える場合は、2 つの CloudWatch アラームが通知を送信します。

### 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
```

## Windows インスタンスから CloudWatch Logs へのログの送信
<a name="quickref-cloudwatchlogs-example2"></a>

次のテンプレートは、Windows 2012 R2 インスタンス用に CloudWatch Logs を設定します。

Windows の CloudWatch Logs エージェント (Windows 2012 R2 および Windows 2016 AMI の SSM エージェント) は、起動後にのみログを送信するため、起動前に生成されたログは送信されません。この問題を対処するため、テンプレートは次のようにして、ログが書き込まれる前にエージェントを確実に起動します。
+ cfn-init `config` の最初の `configSets` 項目としてエージェントのセットアップを行います。
+ `waitAfterCompletion` を使用して、コマンドがエージェントを起動した後で一時停止を挿入します。

### 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
```

## 関連情報
<a name="w2aac11c41c35c11"></a>

CloudWatch Logs リソースの詳細については、「[AWS::Logs::LogGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-logs-loggroup.html)」または「[AWS::Logs::MetricFilter](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-logs-metricfilter.html)」を参照してください。

# Amazon DynamoDB テンプレートスニペット
<a name="quickref-dynamodb"></a>

**Topics**
+ [Amazon DynamoDB テーブルを含む アプリケーションの Auto Scaling](#quickref-dynamodb-application-autoscaling)
+ [関連情報](#w2aac11c41c39b7)

## Amazon DynamoDB テーブルを含む アプリケーションの Auto Scaling
<a name="quickref-dynamodb-application-autoscaling"></a>

この例では、`AWS::DynamoDB::Table` リソースの Application Auto Scaling をセットアップします。このテンプレートでは、テーブル向けに `TargetTrackingScaling` スループットをスケールアップする `WriteCapacityUnits` スケーリングポリシーを定義します。

### 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
```

## 関連情報
<a name="w2aac11c41c39b7"></a>

詳細については、AWS データベースログのブログ投稿「[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/)」を参照してください。

DynamoDB リソースの詳細については、「[AWS::DynamoDB::Table](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-dynamodb-table.html)」を参照してください。

# Amazon EC2 CloudFormation テンプレートスニペット
<a name="quickref-ec2"></a>

Amazon EC2 は、AWS クラウド内でスケーラブルなコンピューティング性能を提供します。Amazon EC2 を使用すると、必要な数 (またはそれ以下) の仮想サーバーの起動、セキュリティおよびネットワーキングの構成、ストレージの管理ができます。インスタンスと呼ばれるこれらの仮想サーバーは、さまざまなオペレーティングシステムやアプリケーションを実行でき、特定の要件に合わせてカスタマイズできます。Amazon EC2 は、需要の変化や使用量の急増に対応して簡単にスケールアップやスケールダウンができます。

CloudFormation テンプレートを使用して、Amazon EC2 インスタンスをインフラストラクチャの一部として定義およびプロビジョニングできます。テンプレートを使用すると、Amazon EC2 リソースのデプロイを繰り返し可能で一貫性のある方法で簡単に管理および自動化できます。

以下のサンプルテンプレートスニペットでは、Amazon EC2 の CloudFormation リソースまたはコンポーネントについて説明しています。これらのスニペットはテンプレートに統合するように設計されており、単独で実行することを意図したものではありません。

**Topics**
+ [EC2 インスタンスの設定](quickref-ec2-instance-config.md)
+ [Create launch templates](quickref-ec2-launch-templates.md)
+ [セキュリティグループの管理](quickref-ec2-sg.md)
+ [Elastic IP の割り当て](quickref-ec2-elastic-ip.md)
+ [VPC リソースを設定する](quickref-ec2-vpc.md)

# CloudFormation で Amazon EC2 インスタンスを設定する
<a name="quickref-ec2-instance-config"></a>

以下のスニペットは、CloudFormation を使用して Amazon EC2 インスタンスを設定する方法を示しています。

**Topics**
+ [Amazon EC2 の全般設定](#quickref-ec2-instance-config-general)
+ [インスタンスのブロックデバイスマッピングの指定](#scenario-ec2-bdm)

## Amazon EC2 の全般設定
<a name="quickref-ec2-instance-config-general"></a>

以下のスニペットは、CloudFormation を使用した Amazon EC2 インスタンスの全般設定を示しています。

**Topics**
+ [指定されたアベイラビリティーゾーンに Amazon EC2 インスタンスを作成する](#scenario-ec2-instance)
+ [EBS ボリュームとユーザーデータを使用した Amazon EC2 インスタンスの設定](#scenario-ec2-instance-with-vol-and-tags)
+ [Amazon EC2 インスタンスを起動するためのユーザーデータに DynamoDB テーブル名を定義する](#scenario-ec2-with-sdb-domain)
+ [`DeletionPolicy` を使用した Amazon EBS ボリュームの作成](#scenario-ec2-volume)

### 指定されたアベイラビリティーゾーンに Amazon EC2 インスタンスを作成する
<a name="scenario-ec2-instance"></a>

次のスニペットは、[AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) リソースを使用した Amazon EC2 インスタンスを作成しています。アベイラビリティーゾーンのコードは、リージョンコードとそれに続く文字識別子です。インスタンスは 1 つのアベイラビリティーゾーンで起動できます。

#### 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
```

### EBS ボリュームとユーザーデータを使用した Amazon EC2 インスタンスの設定
<a name="scenario-ec2-instance-with-vol-and-tags"></a>

次のスニペットは、タグ、EBS ボリューム、およびユーザーデータを使用して Amazon EC2 インスタンスを作成します。[AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) リソースを使用します。同じテンプレートで [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) リソース、[AWS::SNS::Topic](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-sns-topic.html) リソース、[AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) リソースをに定義する必要があります。テンプレートの `Parameters` セクションに `KeyName` を定義する必要があります。

タグを使用すると、AWS リソースを目的、所有者、環境など好みに基づいて分類できます。ユーザーデータにより、起動時にカスタムスクリプトやデータをインスタンスにプロビジョニングできます。このデータにより、タスクの自動化、ソフトウェア設定、パッケージのインストール、および初期化中のインスタンスでのその他のアクションが容易になります。

リソースのタグ付けの詳細については、『Amazon EC2 ユーザーガイド』の「[Amazon EC2 リソースのタグ付け](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html)」を参照してください。

ユーザーデータの詳細については、『Amazon EC2 ユーザーガイド』の「[インスタンスメタデータを使用して EC2 インスタンスを管理する](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)」を参照してください。

#### 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
```

### Amazon EC2 インスタンスを起動するためのユーザーデータに DynamoDB テーブル名を定義する
<a name="scenario-ec2-with-sdb-domain"></a>

次のスニペットは Amazon EC2 インスタンスを作成し、起動時にインスタンスに渡すユーザーデータに DynamoDB テーブル名を定義します。[AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) リソースを使用します。起動時に EC2 インスタンスを渡すパラメータまたは動的値をユーザーデータで定義できます。

ユーザーデータの詳細については、『Amazon EC2 ユーザーガイド』の「[インスタンスメタデータを使用して EC2 インスタンスを管理する](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)」を参照してください。

#### 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
```

### `DeletionPolicy` を使用した Amazon EBS ボリュームの作成
<a name="scenario-ec2-volume"></a>

以下のスニペットは、Amazon EC2 [AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) リソースを使用して Amazon EBS ボリュームを作成します。`Size` または `SnapshotID` プロパティを使用してボリュームを定義できますが、両方を使用することはできません。スタックが削除されたときにボリュームのスナップショットを作成するように `DeletionPolicy` 属性が設定されます。

`DeletionPolicy` 属性の詳細については、「[DeletionPolicy 属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html)」を参照してください。

Amazon EBS ボリュームの作成の詳細については、「[Amazon EBS ボリュームの作成](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-creating-volume.html)」を参照してください。

#### JSON
<a name="quickref-ec2-example-13.json"></a>

このスニペットは、指定された**サイズ**の Amazon EBS ボリュームを作成します。サイズは 10 に設定されていますが、必要に応じて調整できます。[AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) リソースでは、サイズまたはスナップショット ID のいずれかを指定できますが、両方は指定できません。

```
 1. "MyEBSVolume": {
 2.     "Type": "AWS::EC2::Volume",
 3.     "Properties": {
 4.         "Size": "10",
 5.         "AvailabilityZone": {
 6.             "Ref": "AvailabilityZone"
 7.         }
 8.     },
 9.     "DeletionPolicy": "Snapshot"
10. }
```

このスニペットは、指定された**スナップショット ID** を使用した Amazon EBS ボリュームの作成です。[AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) リソースでは、サイズまたはスナップショット ID のいずれかを指定できますが、両方は指定できません。

```
 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>

このスニペットは、指定された**サイズ**の Amazon EBS ボリュームを作成します。サイズは 10 に設定されていますが、必要に応じて調整できます。[AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) リソースでは、サイズまたはスナップショット ID のいずれかを指定できますが、両方は指定できません。

```
1. MyEBSVolume:
2.   Type: AWS::EC2::Volume
3.   Properties:
4.     Size: 10
5.     AvailabilityZone:
6.       Ref: AvailabilityZone
7.   DeletionPolicy: Snapshot
```

このスニペットは、指定された**スナップショット ID** を使用した Amazon EBS ボリュームの作成です。[AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) リソースでは、サイズまたはスナップショット ID のいずれかを指定できますが、両方は指定できません。

```
1. MyEBSVolume:
2.   Type: AWS::EC2::Volume
3.   Properties:
4.     SnapshotId: snap-1234567890abcdef0
5.     AvailabilityZone:
6.       Ref: AvailabilityZone
7.   DeletionPolicy: Snapshot
```

## インスタンスのブロックデバイスマッピングの指定
<a name="scenario-ec2-bdm"></a>

ブロックデバイスマッピングでは、インスタンスにアタッチする、インスタンスストアボリュームと EBS ボリュームを含むブロックデバイスを定義します。ブロックデバイスマッピングは、AMI 作成時に、AMI から起動されるすべてのインスタンスによって使用されるように指定できます。また、インスタンスの起動時にブロックデバイスマッピングを指定することもできます。起動したインスタンスの AMI ですでに指定されているマッピングがこのマッピングによって上書きされるようにします。

以下のテンプレートスニペットを使用して、[AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) リソースの `BlockDeviceMappings` プロパティを使用して EBS またはインスタンスストアボリュームのブロックデバイスマッピングを指定できます。

ブロックデバイスマッピングに関する詳細については、『Amazon EC2 ユーザーガイド』の「[Amazon EC2 インスタンスでのボリュームのブロックデバイスマッピング](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html)」を参照してください。

**Topics**
+ [2 つの EBS ボリュームのブロックデバイスマッピングを指定します。](#w2aac11c41c43c13b9c11)
+ [インスタンスストアボリュームのブロックデバイスマッピングの指定](#w2aac11c41c43c13b9c13)

### 2 つの EBS ボリュームのブロックデバイスマッピングを指定します。
<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
```

### インスタンスストアボリュームのブロックデバイスマッピングの指定
<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
```

# CloudFormation を使用して起動テンプレートを作成する
<a name="quickref-ec2-launch-templates"></a>

このセクションでは、CloudFormation を使用して Amazon EC2 起動テンプレートを作成する方法を例を挙げて説明します。起動テンプレートを使用すると、AWS 内で Amazon EC2 インスタンスを設定してプロビジョニングするためのテンプレートを作成することができます。起動テンプレートを使用すると起動パラメータを保存することができるため、インスタンスを起動するたびに起動パラメータ指定する必要がなくなります。その他の例については、`AWS::EC2::LaunchTemplate` リソースの「[Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html#aws-resource-ec2-launchtemplate--examples)」のセクションを参照してください。

起動テンプレートの詳細については、『Amazon EC2 ユーザーガイド』の「[Amazon EC2 起動テンプレートにインスタンス起動パラメータを保存する](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html)」を参照してください。

Auto Scaling グループで使用する起動テンプレートの作成方法については、『Amazon EC2 Auto Scaling ユーザーガイド』の「[Auto Scaling 起動テンプレート](https://docs.aws.amazon.com/autoscaling/ec2/userguide/launch-templates.html)」を参照してください。

**Topics**
+ [セキュリティグループ、タグ、ユーザーデータ、IAM ロールを指定する起動テンプレートを作成する](#scenario-as-launch-template)

## セキュリティグループ、タグ、ユーザーデータ、IAM ロールを指定する起動テンプレートを作成する
<a name="scenario-as-launch-template"></a>

このスニペットには、インスタンスを起動する設定情報が含まれる [AWS::EC2::LaunchTemplate](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-launchtemplate.html) リソースが記されています。`ImageId`、`InstanceType`、`SecurityGroups`、`UserData`、および `TagSpecifications` プロパティの値を指定します。`SecurityGroups` プロパティは、既存の EC2 セキュリティグループと新しいセキュリティグループを指定します。`Ref` 関数は、スタックテンプレートの他の場所で宣言されている [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) リソース `myNewEC2SecurityGroup` の ID を取得します。

起動テンプレートにはカスタムユーザーデータのセクションが含まれています。このセクションでは、インスタンスの起動時に実行される構成タスクとスクリプトを渡すことができます。この例では、ユーザーデータは AWS Systems Manager Agent をインストールし、エージェントを起動します。

起動テンプレートには、インスタンスで実行中のアプリケーションが、ユーザーの代わりにアクションを実行できるようにする IAM ロールも含まれています。この例では、起動テンプレートの [AWS::IAM::Role](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-role.html) リソースを示しており、`IamInstanceProfile` プロパティを使用して IAM ロールを指定します。`Ref` 関数は、[AWS::IAM::InstanceProfile](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-iam-instanceprofile.html) リソース `myInstanceProfile` の名前を取得します。IAM ロールのアクセス許可を設定するには、`ManagedPolicyArns` プロパティの値を指定します。

### 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
```

# CloudFormation でセキュリティグループを管理する
<a name="quickref-ec2-sg"></a>

以下のスニペットは、CloudFormation を使用してセキュリティグループと Amazon EC2 インスタンスを管理し、AWS リソースへのアクセスを制御する方法を示しています。

**Topics**
+ [Amazon EC2 インスタンスをセキュリティグループと関連付けるには](#quickref-ec2-instances-associate-security-group)
+ [進入ルールを持つセキュリティグループの作成](#quickref-ec2-instances-ingress)
+ [セキュリティグループの進入ルールを使用して Elastic Load Balancer を作成する](#scenario-ec2-security-group-elbingress)

## Amazon EC2 インスタンスをセキュリティグループと関連付けるには
<a name="quickref-ec2-instances-associate-security-group"></a>

次のスニペットは、CloudFormation を使用して Amazon EC2 インスタンスをデフォルトの Amazon VPC セキュリティグループに関連付ける方法を示します。

**Topics**
+ [Amazon EC2 インスタンスをデフォルトの VPC セキュリティグループと関連付けるには](#using-cfn-getatt-default-values)
+ [ボリュームとセキュリティグループをアタッチした Amazon EC2 インスタンスを作成する](#scenario-ec2-volumeattachment)

### Amazon EC2 インスタンスをデフォルトの VPC セキュリティグループと関連付けるには
<a name="using-cfn-getatt-default-values"></a>

次のスニペットは、Amazon VPC、VPC 内のサブネット、Amazon EC2 インスタンスを作成します。VPC は [AWS::EC2::VPC](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpc.html) リソースを使用して作成されます。VPC の IP アドレス範囲は、大きい方のテンプレートで定義され、`MyVPCCIDRRange` パラメータによって参照されます。

サブネットは [AWS::EC2:: Subnet](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-subnet.html) リソースを使用します。サブネットは、`MyVPC` として参照される VPC に関連付けられています。

EC2 インスタンスは、[AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) リソースを使用して VPC とサブネット内で起動されます。このリソースは、インスタンスの起動に使用する Amazon マシンイメージ (AMI)、インスタンスが実行されるサブネット、インスタンスに関連付けるセキュリティグループを指定します。`ImageId` は Systems Manager パラメータを使用して、最新の Amazon Linux 2 AMI を動的に取得します。

セキュリティグループ ID は、`MyVPC` リソースからデフォルトのセキュリティグループを取得する `Fn::GetAtt` 関数を使用して取得されます。

インスタンスはスニペットで定義された `MySubnet` リソース内に配置されます。

CloudFormation を使用して VPC を作成すると、AWS はデフォルトのセキュリティグループを含むデフォルトリソースを VPC 内に自動的に作成します。ただし、CloudFormation テンプレート内で VPC を定義すると、テンプレートを作成するときにこれらのデフォルトリソースの ID にアクセスできない場合があります。テンプレートで指定されているデフォルトリソースにアクセスして使用するには、`Fn::GetAtt` などの組み込み関数を使用できます。この関数を使用すると、CloudFormation によって自動的に作成されたデフォルトリソースを使用できます。

#### 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
```

### ボリュームとセキュリティグループをアタッチした Amazon EC2 インスタンスを作成する
<a name="scenario-ec2-volumeattachment"></a>

次のスニペットは、指定した AMI から起動する [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) リソースを使用する Amazon EC2 インスタンスを作成します。インスタンスは、[AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) リソースを使用して、指定された IP アドレスからポート 22 で受信する SSH トラフィックを許可するセキュリティグループに関連付けられています。[AWS::EC2::Volume](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-volume.html) リソースを使用して 100 GB の Amazon EBS ボリュームを作成します。ボリュームは、`GetAtt` 関数で指定されたインスタンスと同じアベイラビリティーゾーンに作成され、`/dev/sdh` デバイスのインスタンスにマウントされます。

Amazon EBS ボリュームの作成の詳細については、「[Amazon EBS ボリュームの作成](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
```

## 進入ルールを持つセキュリティグループの作成
<a name="quickref-ec2-instances-ingress"></a>

以下のサンプルスニペットは、CloudFormation を使用して特定の進入ルールでセキュリティグループを設定する方法を示しています。

**Topics**
+ [SSH と HTTP アクセスの進入ルールを使用してセキュリティグループを作成します。](#scenario-ec2-security-group-rule)
+ [指定された CIDR 範囲からの HTTP と SSH アクセスの進入ルールを使用してセキュリティグループを作成します。](#scenario-ec2-security-group-two-ports)
+ [進入ルールを使用して相互参照セキュリティグループを作成する](#scenario-ec2-security-group-ingress)

### SSH と HTTP アクセスの進入ルールを使用してセキュリティグループを作成します。
<a name="scenario-ec2-security-group-rule"></a>

このスニペットは、2 つのセキュリティグループ進入ルールが記述された [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) リソースを示します。最初の進入ルールは、アカウント番号 `1111-2222-3333` を持つ AWS アカウントが所有する、`MyAdminSecurityGroup` という名前の既存のセキュリティグループからの SSH (ポート 22) アクセスを許可します。2 番目の進入ルールは、同じテンプレートで作成された、`MySecurityGroupCreatedInCFN` という名前の別のセキュリティグループからの HTTP (ポート 80) アクセスを許可します。`Ref` 関数は、同じテンプレートで作成されたセキュリティグループの論理名を参照するために使用されます。

最初の進入ルールでは、`SourceSecurityGroupName` と `SourceSecurityGroupOwnerId` プロパティの両方に値を追加する必要があります。2 番目の進入ルールでは、`MySecurityGroupCreatedInCFNTemplate` は同じテンプレートで作成された別のセキュリティグループを参照します。論理名が、大きい方のテンプレートで指定するセキュリティグループリソースの実際の論理名 `MySecurityGroupCreatedInCFNTemplate` と一致することを確認してください。

セキュリティグループの詳細については、「[Amazon EC2 ユーザーガイド](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html)」の「*Amazon EC2 インスタンス用の Amazon EC2 セキュリティグループ*」を参照してください。

#### 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
```

### 指定された CIDR 範囲からの HTTP と SSH アクセスの進入ルールを使用してセキュリティグループを作成します。
<a name="scenario-ec2-security-group-two-ports"></a>

次のスニペットは、2 つのインバウンドルールを持つ Amazon EC2 インスタンスのセキュリティグループを作成します。インバウンドルールは、指定された CIDR 範囲からの指定ポートへの受信 TCP トラフィックを許可します。[AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) リソースは、ルールの指定に使用されます。各ルールのプロトコルを指定する必要があります。TCP の場合は、ポートまたはポート範囲も指定する必要があります。ソースセキュリティグループまたは CIDR 範囲のいずれも指定しない場合、スタックは正常に起動しますが、ルールはセキュリティグループに適用されません。

セキュリティグループの詳細については、「[Amazon EC2 ユーザーガイド](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-security-groups.html)」の「*Amazon EC2 インスタンス用の Amazon EC2 セキュリティグループ*」を参照してください。

#### 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
```

### 進入ルールを使用して相互参照セキュリティグループを作成する
<a name="scenario-ec2-security-group-ingress"></a>

次のスニペットは、[AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) リソースを使用して、`SGroup1` と `SGroup2` の 2 つの Amazon EC2 セキュリティグループを作成します。2 つのセキュリティグループ間の通信を許可する進入ルールは、[AWS::EC2::SecurityGroupIngress](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroupingress.html) リソースを使用して作成されます。`SGroup1Ingress` は、送信元セキュリティグループ `SGroup2` からポート 80 で受信 TCP トラフィックを許可する `SGroup1` の進入ルールを確立します。`SGroup2Ingress` は、送信元セキュリティグループ `SGroup1` からのポート 80 への着信 TCP トラフィックを許可する `SGroup2` の進入ルールを確立します。

#### 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
```

## セキュリティグループの進入ルールを使用して Elastic Load Balancer を作成する
<a name="scenario-ec2-security-group-elbingress"></a>

次のテンプレートは、指定されたアベイラビリティゾーンに [AWS::ElasticLoadBalancing::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancing-loadbalancer.html) リソースを作成します。[AWS::ElasticLoadBalancing::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancing-loadbalancer.html) リソースは、ポート 80 で HTTP トラフィックを受信し、同じくポート 80 のインスタンスにリクエストを転送するように設定されています。Elastic Load Balancer は、インスタンス間で受信 HTTP トラフィックの負荷を分散します。

 さらに、このテンプレートは、ロードバランサーに関連付けられた [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html) リソースを生成します。このセキュリティグループは、ポート 80 での着信 TCP トラフィックを許可する、`ELB ingress group` という 1 つの進入ルールを使用して作成されます。この進入ルールのソースは、ロードバランサーリソースから属性を取得する `Fn::GetAtt` 関数を使用して定義されます。`SourceSecurityGroupOwnerId` は `Fn::GetAtt` を使用してロードバランサーのソースセキュリティグループの `OwnerAlias` を取得します。`SourceSecurityGroupName` は `Fn::Getatt` を使用して ELB のソースセキュリティグループの `GroupName` を取得します。

この設定により、ELB とインスタンス間の安全な通信が保証されます。

ロードバランシングの詳細については、「[Elastic Load Balancing ユーザーガイド](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
```

# Elastic IP アドレスを CloudFormation と割り当ておよび関連付けする
<a name="quickref-ec2-elastic-ip"></a>

以下のテンプレートスニペットは、Amazon EC2 の Elastic IP アドレス (EIP) に関連する例です。これらの例ではインスタンスの EIP の割り当て、関連付け、管理について説明します。

**Topics**
+ [Elastic IP アドレスを割り当て Amazon EC2 インスタンスに関連付ける](#scenario-ec2-eip)
+ [IP アドレスを指定して、Elastic IP アドレスを Amazon EC2 インスタンスに関連付ける](#scenario-ec2-eip-association)
+ [IP アドレスの割り当て ID を指定して、Elastic IP アドレスを Amazon EC2 インスタンスに関連付ける](#scenario-ec2-eip-association-vpc)

## Elastic IP アドレスを割り当て Amazon EC2 インスタンスに関連付ける
<a name="scenario-ec2-eip"></a>

次のスニペットでは、[AWS::EC2::EIP](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eip.html) リソースを使用して Amazon EC2 Elastic IP (EIP) アドレスを Amazon EC2 インスタンスに関連付けます。EIP アドレスは、AWS が所有するアドレスプールから、または [Bring Your Own IP (BYOIP)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html) により AWS リソースで使用するために AWS に持ち込んだパブリック IPv4 アドレス範囲から作成されたアドレスプールから、割り当てることができます。この例では、EIP は AWS が所有するアドレスプールから割り当てられます。

Elastic IP アドレスの詳細については、Amazon EC2 ユーザーガイドの「[Elastic IP アドレス](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html)」を参照してください。

### 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
```

## IP アドレスを指定して、Elastic IP アドレスを Amazon EC2 インスタンスに関連付ける
<a name="scenario-ec2-eip-association"></a>

次のスニペットでは、[AWS::EC2::EIPAssociation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eipassociation.html) リソースを使用して既存の Amazon EC2 Elastic IP アドレスを EC2 インスタンスに関連付けます。アカウントで使用するためには、まず Elastic IP アドレスを割り当てます。Elastic IP アドレスは、1 つのインスタンスに関連付けられます。

### 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
```

## IP アドレスの割り当て ID を指定して、Elastic IP アドレスを Amazon EC2 インスタンスに関連付ける
<a name="scenario-ec2-eip-association-vpc"></a>

次のスニペットでは、[AWS::EC2::EIPAssociation](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-eipassociation.html) リソースを使用して割り当て ID を使用し、既存の Elastic IP アドレスを Amazon EC2 インスタンスに関連付けます。Elastic IP アドレスが割り当てられると、割り当て ID が Elastic IP アドレスに付与されれます。

### 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
```

# CloudFormation を使用して Amazon VPC リソースを設定する
<a name="quickref-ec2-vpc"></a>

このセクションでは、CloudFormation を使用してAmazon VPC リソースを設定するための例について説明します。VPC を使用すると、AWS 内に仮想ネットワークを作成できます。以下のスニペットでは、ネットワーク要件に合わせて VPC のさまざまな要素を設定する方法を示しています。

**Topics**
+ [VPC で IPv6 Egress-Only インターネットアクセスを有効にする](#quickref-ec2-route-egressonlyinternetgateway)
+ [Elastic Network Interface (ENI) のテンプレートスニペット](#cfn-template-snippets-eni)

## VPC で IPv6 Egress-Only インターネットアクセスを有効にする
<a name="quickref-ec2-route-egressonlyinternetgateway"></a>

Egress-Only インターネットゲートウェイを使用すると、VPC 内のインスタンスがインターネットにアクセスできるようになり、インターネット上のリソースがインスタンスと通信できなくなります。次のスニペットは、VPC 内からの IPv6 出力専用インターネットアクセスを有効にします。[AWS::EC2::VPC](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-vpc.html) リソースを使用する IPv4 アドレス範囲 `10.0.0/16` で VPC を作成します。ルートテーブルは [AWS::EC2::RouteTable](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-routetable.html) リソースを使用してこの VPC リソースに関連付けられます。ルートテーブルは VPC 内のインスタンスのルートを管理します。[AWS::EC2::EgressOnlyInternetGateway](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-egressonlyinternetgateway.html) は、Egress-Only インターネットゲートウェイを作成するために使用されます。これにより、VPC内のインスタンスからのアウトバウンドトラフィックの IPv6 通信が可能になり、インバウンドトラフィックは防止されます。[AWS::EC2::Route](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-route.html) リソースを指定して、すべてのアウトバウンド IPv6 トラフィック (`::/0`) を Egress-Only インターネットゲートウェイに転送する IPv6 ルートをルートテーブルに作成します。

Egress-Only インターネットゲートウェイの詳細については、『Amazon VPC ユーザーガイド』の「[エグレス専用インターネットゲートウェイを使用してアウトバウンド IPv6 トラフィックを有効にする](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 Interface (ENI) のテンプレートスニペット
<a name="cfn-template-snippets-eni"></a>

### Elastic Network Interface (ENI) がアタッチされた Amazon EC2 インスタンスを作成する
<a name="cfn-template-snippets-eni-template"></a>

次のスニペット例では、[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) リソースを使用して Amazon EC2 インスタンスを指定された Amazon VPC とサブネットに作成します。2 つの Elastic Network Interface (ENI) をインスタンスにアタッチし、アタッチされた ENI を通じて Elastic IP アドレスをインスタンスに関連付け、SSH と HTTP アクセス用のセキュリティグループを設定します。ユーザーデータは、インスタンスの作成時に起動設定の一部としてインスタンスに提供されます。ユーザーデータには、確実にインスタンスに渡されるように、`base64` フォーマットにエンコードされたスクリプトが含まれています。インスタンスが起動すると、ブートストラッププロセスの一環としてスクリプトが自動的に実行されます。`ec2-net-utils` をインストールし、ネットワークインターフェースを設定し、HTTP サービスを開始します。

選択したリージョンに基づいて適切な Amazon マシンイメージ (AMI) を決定するために、スニペットは `RegionMap` マッピング内の値を検索する `Fn::FindInMap` 関数を使用します。このマッピングは大きい方のテンプレートで定義する必要があります。2 つのネットワークインターフェイスは [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) リソースを使用して作成されます。Elastic IP アドレスは、`vpc` ドメインに割り当てられた [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) リソースを使用して指定されます。これらの Elastic IP アドレスは、[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) リソースを使用してネットワークインターフェイスに関連付けられます。

`Outputs` セクションでは、スタックが作成された後にアクセスする値またはリソースを定義します。次のスニペットで定義されている出力は `InstancePublicIp` で、スタックによって作成された EC2 インスタンスのパブリック IP アドレスを表すものです。この出力は、CloudFormation コンソールの **[出力]** タブまたは [describe-stacks](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html) コマンドを使用して取得できます。

Elastic Network Interface の詳細については、「[Elastic Network Interface](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 サンプルテンプレート
<a name="quickref-ecs"></a>

Amazon Elastic Container Service (Amazon ECS) は、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスのクラスターで Docker コンテナを簡単に実行、停止、管理できるようにするコンテナ管理サービスです。

## AL2023 Amazon ECS-Optimized-AMI を使用してクラスターを作成する
<a name="create-cluster-al2023"></a>

キャパシティープロバイダーを使用して Amazon EC2 で AL2023 インスタンスを起動するクラスターを定義します。

**重要**  
最新の AMI ID については、「Amazon Elastic Container Service デベロッパーガイド」の「[Amazon ECS-optimized AMI](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html)」(Amazon ECS に最適化された AMI) を参照してください。

### 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
```

## サービスをデプロイします。
<a name="create-service"></a>

次のテンプレートは、キャパシティープロバイダーを使用して AL2023 キャパシティーの実行をリクエストするサービスを定義しています。コンテナは、オンラインになると AL2023 インスタンスで起動します。

### 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 サンプルテンプレート
<a name="quickref-efs"></a>

Amazon Elastic File System (Amazon EFS) は、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスのファイルストレージサービスです。Amazon EFS を使用すると、ファイルの追加および削除に合わせてストレージ容量が自動的に拡大/縮小するため、アプリケーションには必要なときにストレージが提供されます。

以下のサンプルテンプレートは、Amazon EFS ファイルシステムに関連付けられる EC2 インスタンス (Auto Scaling グループ内) をデプロイします。ファイルシステムにインスタンスを関連付けるために、インスタンスは cfn-init ヘルパースクリプトを実行します。これにより、`nfs-utils` yum パッケージがダウンロードおよびインストールされて、新しいディレクトリが作成され、ファイルシステムの DNS 名を使用してそのディレクトリにファイルシステムがマウントされます。ファイルシステムの DNS 名は、Amazon EC2 インスタンスのアベイラビリティーゾーンでマウントターゲットの IP アドレスに解決されます。DNS 名構造については、「Amazon Elastic File System ユーザーガイド」の「[Mounting File Systems](https://docs.aws.amazon.com/efs/latest/ug/mounting-fs.html)」(ファイルシステムのマウント) を参照してください。

Network File System (NFS) のアクティビティを測定するために、テンプレートにはカスタムの Amazon CloudWatch メトリクスが含まれています。このテンプレートでは、VPC、サブネット、およびセキュリティグループも作成します。インスタンスとファイルシステムとの通信を許可するには、VPC で DNS が有効になっていて、マウントターゲットと EC2 インスタンスはサブネットに指定された同じアベイラビリティーゾーン (AZ) にある必要があります。

マウントターゲットのセキュリティグループは TCP ポート 2049 へのネットワーク接続を有効にします。これは、NFSv4 クライアントがファイルシステムをマウントするために必要です。EC2 インスタンスとマウントターゲット向けのセキュリティグループの詳細については、「[Amazon Elastic File System User Guide](https://docs.aws.amazon.com/efs/latest/ug/)」(Amazon Elastic File System ユーザーガイド) の「[Security](https://docs.aws.amazon.com/efs/latest/ug/security-considerations.html)」(セキュリティ) を参照してください。

**注記**  
置き換えの原因となる更新をマウントターゲットに対して行った場合は、関連するファイルシステムを使用するインスタンスまたはアプリケーションが中断される可能性があります。このため、コミットされていない書き込みが失われることがあります。中断を回避するには、希望する容量をゼロに設定することで、マウントターゲットの更新時にインスタンスを停止します。これにより、マウントターゲットを削除する前に、インスタンスがファイルシステムをアンマウントできるようになります。マウントの更新が完了したら、希望する容量を設定して後続の更新のインスタンスを開始します。

## 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 テンプレートスニペット
<a name="quickref-elasticbeanstalk"></a>

Elastic Beanstalk を使用すると、アプリケーションを実行しているインフラストラクチャについて心配することなく、AWS でアプリケーションのデプロイと管理を簡単に行うことができます。次のサンプルテンプレートは、CloudFormation テンプレート内で Elastic Beanstalk リソースを記述するのに役立ちます。

## Elastic Beanstalk のサンプル PHP
<a name="quickref-elasticbeanstalk-sampleenv"></a>

次のサンプルテンプレートは、Amazon S3 バケットに保存されているサンプル PHP ウェブアプリケーションをデプロイします。この環境は、最低 2 つ、最大 6 つの Amazon EC2 インスタンスを持つ負荷分散型自動スケーリング環境でもあります。これはレガシー起動設定を使用する Elastic Beanstalk 環境を示します。代わりに起動テンプレートを使用する方法については、「AWS Elastic Beanstalk デベロッパーガイド」の「[起動テンプレート](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-autoscaling-launch-templates.html)」を参照してください。**

`solution-stack` をソリューションスタック名 (プラットフォームバージョン) に置き換えます。使用可能なソリューションスタックのリストについては、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 テンプレートスニペット
<a name="quickref-elb"></a>

Application Load Balancer、Network Load Balancer、または Gateway Load Balancer を作成するには、`AWS::ElasticLoadBalancingV2` で始まる V2 リソースタイプを使用します。Classic Load Balancer を作成するには、`AWS::ElasticLoadBalancing` で始まるリソースタイプを使用します。

**Topics**
+ [ELBv2 リソース](#scenario-elbv2-load-balancer)
+ [Classic Load Balancer リソース](#scenario-elb-load-balancer)

## ELBv2 リソース
<a name="scenario-elbv2-load-balancer"></a>

この例では、HTTP リスナーと、トラフィックをターゲットグループに転送するデフォルトのアクションを使用して Application Load Balancer を定義します。ロードバランサーはデフォルトのヘルスチェック設定を使用します。ターゲットグループには 2 つの登録済み EC2 インスタンスがあります。

------
#### [ 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 リソース
<a name="scenario-elb-load-balancer"></a>

この例では、HTTP リスナーを持ち、登録済み EC2 インスタンスを持たない Classic Load Balancer を定義します。ロードバランサーはデフォルトのヘルスチェック設定を使用します。

------
#### [ 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"
        } ]
    }
}
```

------

この例では、HTTP リスナー、2 つの登録済み EC2 インスタンス、カスタムヘルスチェック設定を使用して Classic Load Balancer を定義します。

------
#### [ 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 テンプレートスニペット
<a name="quickref-iam"></a>

このセクションでは、AWS Identity and Access Management のテンプレートスニペットを紹介しています。

**Topics**
+ [IAM ユーザーリソースの宣言](#scenario-iam-user)
+ [IAM アクセスキーリソースの宣言](#scenario-iam-accesskey)
+ [IAM グループ リソースの宣言](#scenario-iam-group)
+ [グループへのユーザーの追加](#scenario-iam-addusertogroup)
+ [IAM ポリシーの宣言](#scenario-iam-policy)
+ [Amazon S3 バケットポリシーの宣言](#scenario-bucket-policy)
+ [Amazon SNS トピックポリシーの宣言](#scenario-sns-policy)
+ [Amazon SQS ポリシーの宣言](#scenario-sqs-policy)
+ [IAM ロールのテンプレートの例](#scenarios-iamroles)

**重要**  
IAM リソースを含んだテンプレートを使ってスタックを作成または更新する際は、IAM の機能の使用に同意する必要があります。詳細については、「[CloudFormation テンプレートでの IAM リソースの承認](control-access-with-iam.md#using-iam-capabilities)」を参照してください。

## IAM ユーザーリソースの宣言
<a name="scenario-iam-user"></a>

このスニペットは、IAM ユーザーを作成するための [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) リソースの宣言を示しています。ユーザーの宣言には、パス (`"/"`) と、パスワード (`myP@ssW0rd`) のあるログインプロファイルとを使用しています。

`giveaccesstoqueueonly` という名前のポリシードキュメントは、Amazon SQS キューリソース `myqueue` に対するすべての Amazon SQS アクションの実行権限をユーザーに付与するとともに、他のすべての Amazon SQS キューリソースに対するアクセスを拒否します。`Fn::GetAtt` 関数は、[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` の Arn 属性を取得します。

`giveaccesstotopiconly` という名前のポリシードキュメントをユーザーに追加し、Amazon SNS トピックリソース `mytopic` に対するすべての Amazon SNS アクションの実行権限をユーザーに付与するとともに、他のすべての Amazon SNS リソースへのアクセスを拒否します。`Ref` 関数は [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) リソース `mytopic` の ARN を取得します。

### 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
```

## IAM アクセスキーリソースの宣言
<a name="scenario-iam-accesskey"></a>

### 
<a name="quickref-iam-access-key"></a>

このスニペットは、[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) リソースを示します。`myaccesskey` リソースは、アクセスキーを作成し、テンプレートに [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) リソースとして宣言されている IAM ユーザーにそれを割り当てます。

#### 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>

`AWS::IAM::AccessKey` リソースのシークレットキーは、`Fn::GetAtt` 関数を使用して取得できます。シークレットキーを取得する 1 つの方法は、それを `Output` 値に追加することです。`Ref` 関数を使用してアクセスキーを取得することができます。次の `Output` 値の宣言は、`myaccesskey` のアクセスキーとシークレットキーを取得します。

#### 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>

AWS のアクセスキーとシークレットキーを、テンプレートに定義されている Amazon EC2 インスタンスまたは Auto Scaling グループに渡すこともできます。次の [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) 宣言では、`UserData` プロパティを使用して、`myaccesskey` リソースのアクセスキーとシークレットキーを渡しています。

#### 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}"
```

## IAM グループ リソースの宣言
<a name="scenario-iam-group"></a>

このスニペットは、[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) リソースを示します。このグループにはパス (`"/myapplication/"`) があります。`myapppolicy` という名前のポリシードキュメントがグループに追加され、グループのユーザーが Amazon SQS キューリソース myqueue に対してすべての Amazon SQS アクションを実行し、`myqueue` を除く他のすべての Amazon SQS リソースへのアクセスを拒否できるようになります。

IAM では、リソースにポリシーを割り当てる際、リソースの Amazon リソースネーム (ARN) が必要となります。このスニペットで、`Fn::GetAtt` 関数は [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) リソースキューの ARN を取得しています。

### 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
```

## グループへのユーザーの追加
<a name="scenario-iam-addusertogroup"></a>

グループには、[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) リソースでユーザーを追加します。次のスニペットで、`addUserToGroup` リソースは、`myexistinggroup2` という名前の既存のグループに対し、既存のユーザー `existinguser1` と、テンプレートに [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) リソースとして宣言されているユーザー `myuser` を追加しています。

### 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
```

## IAM ポリシーの宣言
<a name="scenario-iam-policy"></a>

このスニペットでは、ポリシーを作成し、`mypolicy` という名前の [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` リソースには、ARN `PolicyDocument` で表される S3 バケット内のオブジェクトに対し、`GetObject`、`PutObject`、`PutObjectAcl` の各アクションを許可する `arn:aws:s3:::myAWSBucket` プロパティが存在します。`mypolicy` リソースのポリシーの適用先は、`myexistinggroup1` という名前の既存のグループと、テンプレート内で [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) リソースとして宣言されているグループ `mygroup` です。この例では、`Groups` プロパティを使用してグループにポリシーを適用する方法を示していますが、`Users` プロパティを使用して、ポリシードキュメントを一連のユーザーに追加することもできます。

### 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
```

## Amazon S3 バケットポリシーの宣言
<a name="scenario-bucket-policy"></a>

このスニペットでは、ポリシーを作成し、[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) リソースを使用して Amazon S3 バケットにそのポリシーを適用しています。このポリシーの適用先となる S3 バケットのすべてのオブジェクトに対する `GetObject` アクションを `user1` IAM ユーザーに許可するポリシードキュメントが `mybucketpolicy` リソースで宣言されています。このスニペットでは、`Fn::GetAtt` リソースの ARN を `user1` 関数で取得しています。`mybucketpolicy` リソースは、`AWS::S3::BucketPolicy` リソース mybucket にポリシーを適用します。リソースのバケット名は、`Ref``mybucket` 関数で取得しています。

### 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
```

## Amazon SNS トピックポリシーの宣言
<a name="scenario-sns-policy"></a>

このスニペットでは、ポリシーを作成し、[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) リソースを使用して Amazon SNS トピックにそのポリシーを適用しています。`mysnspolicy` リソースに含まれている `PolicyDocument` プロパティでは、[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) リソース `myuser` に対して `Publish` アクションを [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) リソース `mytopic` で実行することを許可します。スニペットでは、`Fn::GetAtt` 関数で `myuser` リソースの ARN を取得し、`Ref` 関数で `mytopic` リソースの ARN を取得します。

### 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
```

## Amazon SQS ポリシーの宣言
<a name="scenario-sqs-policy"></a>

このスニペットでは、ポリシーを作成し、[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) リソースを使用して Amazon SQS キューにそのポリシーを適用しています。`PolicyDocument` プロパティは、既存のキュー (URL で指定) および [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 に対する `SendMessage` アクションを既存のユーザー `myapp` (ARN で指定) に許可します。リソースの URL は [Ref](resources-section-structure.md#resource-properties-ref) 関数で取得しています。`myqueue`

### 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
```

## IAM ロールのテンプレートの例
<a name="scenarios-iamroles"></a>

このセクションでは、CloudFormation テンプレートで EC2 インスタンスの IAM ロールを使用する例を紹介しています。

詳細については、[Amazon EC2 ユーザーガイド](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html) の「*Amazon EC2 の IAM ロール*」を参照してください。

### IAM ロールと EC2
<a name="scenario-iamrole-ec2"></a>

この例では、インスタンスプロファイルは EC2 インスタンスの `IamInstanceProfile` プロパティによって参照されます。インスタンスポリシーとロールポリシーのどちらも、[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 ロールと Auto Scaling グループ
<a name="scenario-iamrole-asg"></a>

この例では、インスタンスプロファイルは、Amazon EC2 Auto Scaling の起動構成の `IamInstanceProfile` プロパティによって参照されます。

#### 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 テンプレート
<a name="quickref-lambda"></a>

以下のテンプレートは、AWS Lambda (Lambda) 関数とカスタムのリソースを使用して、既存のセキュリティグループのリストに新しいセキュリティグループを追加します。この関数は、新規および既存のセキュリティグループが両方含まれるリストを作成できるように、セキュリティグループのリストを動的に構築する場合に便利です。たとえば、パラメーター値として既存のセキュリティグループのリストを渡し、新しい値をリストに追加して、すべての値を EC2 インスタンスに関連付けることができます。Lambda 関数のリソース タイプの詳細については、「[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)」を参照してください。

次の例に示した CloudFormation は、`AllSecurityGroups` カスタムリソースを作成するときに、まず `AppendItemToListFunction` Lambda 関数を呼び出しています。次にその関数に、既存のセキュリティグループと新しいセキュリティグループ (`NewSecurityGroup`) のリストを渡します。関数は、新しいセキュリティグループをリストに追加し、最新のリストを返します。CloudFormation は、最新のリストを使用して、すべてのセキュリティグループを `MyEC2Instance` リソースに関連付けます。

## 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 テンプレートスニペット
<a name="quickref-redshift"></a>

Amazon Redshift は、クラウド内でのフルマネージド型、ペタバイトスケールのデータウェアハウスサービスです。CloudFormation を使用して、Amazon Redshift クラスターをプロビジョニングおよび管理できます。

## Amazon Redshift クラスター
<a name="quickref-redshift-samplecluster"></a>

以下のサンプルテンプレートは、スタックの作成時に指定されたパラメーター値に従って Amazon Redshift クラスターを作成するものです。Amazon Redshift クラスターに関連付けられたクラスターパラメーターグループによって、ユーザーアクティビティログを記録することができます。また、このテンプレートは、テンプレートに定義されている Amazon VPC 内で Amazon Redshift クラスターを起動します。インターネットから Amazon Redshift クラスターにアクセスできるように、VPC にはインターネットゲートウェイが追加されています。ただし、クラスターとインターネットゲートウェイ間の通信も有効にする必要があります。これは、ルートテーブルエントリで行っています。

**注記**  
テンプレートには、`IsMultiNodeCluster` 条件が追加されており、`NumberOfNodes` パラメーターの値が `ClusterType` に設定されたときにだけ `multi-node` パラメーターが宣言されます。

この例では、`MysqlRootPassword` プロパティを `NoEcho` に設定して `true` パラメータを定義しています。`NoEcho` 属性を `true` に設定すると、CloudFormation は、スタックまたはスタックイベントを記述するすべての呼び出しに対して、アスタリスク (\$1\$1\$1\$1\$1) としてマスクされたパラメータ値を返します。ただし、以下に指定された場所に保存されている情報は除きます。

**重要**  
`NoEcho` 属性を使用しても、以下に保存されている情報はマスクされません。  
`Metadata` テンプレートセクション。CloudFormation は、`Metadata` セクションに含める情報の変換、変更、または編集を行いません。詳細については、「[メタデータ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html)」を参照してください。
`Outputs` テンプレートセクション。詳細については、「[出力](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html)」を参照してください。
リソース定義の `Metadata` 属性。詳細については、「[`Metadata` 属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html)」を参照してください。
パスワードやシークレットなどの機密情報を含めるには、これらのメカニズムを使用しないことを強くお勧めします。

**重要**  
機密情報は、CloudFormation テンプレートに直接埋め込むのではなく、スタックテンプレートの動的パラメータを使用して CloudFormation の外部 (AWS Systems Manager パラメータストアや AWS Secrets Manager など) に保存して管理した上で 参照することをお勧めします。  
詳細については、「[テンプレートに認証情報を埋め込まない](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
```

## 関連情報
<a name="w2aac11c41c72b7"></a>

[AWS::Redshift::Cluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-redshift-cluster.html)

# Amazon RDS テンプレートスニペット
<a name="quickref-rds"></a>

**Topics**
+ [Amazon RDS DB Instance リソース](#scenario-rds-instance)
+ [Amazon RDS Oracle Database DB Instance リソース](#scenario-rds-oracleinstance)
+ [CIDR 範囲の Amazon RDS DBSecurityGroup リソース](#scenario-rds-security-group-cidr)
+ [Amazon EC2 セキュリティグループを使用した Amazon RDS DBSecurityGroup](#scenario-rds-security-group-ec2)
+ [複数の VPC セキュリティグループ](#scenario-multiple-vpc-security-groups)
+ [VPC セキュリティグループの Amazon RDS データベースインスタンス](#w2aac11c41c76c15)

## Amazon RDS DB Instance リソース
<a name="scenario-rds-instance"></a>

この例では、マネージドマスターユーザーパスワードを持つ Amazon RDS DB Instance のリソースを示しています。詳細については、Amazon RDS ユーザー ガイドの「[AWS Secrets Manager を使用したパスワード管理](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html)」と Aurora ユーザー ガイドの「[AWS Secrets Manager を使用したパスワード管理](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-secrets-manager.html)」を参照してください。`EngineVersion` プロパティ (オプション) が指定されていないため、この DB インスタンスにはデフォルトのエンジンバージョンが使用されます。デフォルトのエンジンバージョンおよびその他のデフォルト設定の詳細については、「[CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html)」を参照してください。`DBSecurityGroups` プロパティでは、`MyDbSecurityByEC2SecurityGroup` と MyDbSecurityByCIDRIPGroup という `AWS::RDS::DBSecurityGroup` リソースを指定して、これらのリソースへのネットワーク進入を許可しています。詳細については、「[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)」を参照してください。また、この DB インスタンスリソースでは、`DeletionPolicy` 属性が `Snapshot` に設定されています。`DeletionPolicy` が `Snapshot` に設定されている場合、スタックが削除されると、CloudFormation は DB インスタンスのスナップショットを作成します。

### 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 Database DB Instance リソース
<a name="scenario-rds-oracleinstance"></a>

この例では、マネージドマスターユーザーパスワードを使用して Oracle データベース (DB) インスタンスリソースを作成します。詳細については、Amazon RDS ユーザー ガイドの「[AWS Secrets Manager を使用したパスワード管理](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html)」を参照してください。この例では、`Engine` を bring-your-own-license のライセンスモデルを持つ `oracle-ee` として指定しています。Oracle Database DB Instance の設定の詳細については、「[CreateDBInstance](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html)」を参照してください。MyDbSecurityByEC2SecurityGroup および MyDbSecurityByCIDRIPGroup という名前の `AWS::RDS::DBSecurityGroup` リソースに対し、DBSecurityGroups プロパティでネットワーク進入許可を与えています。詳細については、「[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)」を参照してください。また、この DB インスタンスリソースでは、`DeletionPolicy` 属性が `Snapshot` に設定されています。`DeletionPolicy` が `Snapshot` に設定されている場合、スタックが削除されると、CloudFormation は DB インスタンスのスナップショットを作成します。

### 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
```

## CIDR 範囲の Amazon RDS DBSecurityGroup リソース
<a name="scenario-rds-security-group-cidr"></a>

この例では、`ddd.ddd.ddd.ddd/dd` 形式で指定された CIDR 範囲に対して Amazon RDS `DBSecurityGroup` リソースへの進入を許可しています。詳細については、「[AWS::RDS::DBSecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroup.html)」と「[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 EC2 セキュリティグループを使用した Amazon RDS DBSecurityGroup
<a name="scenario-rds-security-group-ec2"></a>

この例では、`MyEc2SecurityGroup` で参照される Amazon EC2 セキュリティグループに対して [AWS::RDS::DBSecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroup.html) リソースへの進入を許可しています。

そのために、EC2 セキュリティグループを定義し、次に `Ref` 組み込み関数を使用して `DBSecurityGroup` 内の EC2 セキュリティグループを参照しています。

### 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>

この例は、以下の完全なサンプルから抽出したものです。[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
```

## 複数の VPC セキュリティグループ
<a name="scenario-multiple-vpc-security-groups"></a>

この例では、「[AWS::RDS::DBSecurityGroupIngress](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroup.html)」で複数の Amazon EC2 VPC セキュリティグループに対する進入認可を持つ「[AWS::RDS::DBSecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbsecuritygroupingress.html)」リソースが示されています。

### 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'
```

## VPC セキュリティグループの Amazon RDS データベースインスタンス
<a name="w2aac11c41c76c15"></a>

この例は、Amazon EC2 VPC セキュリティグループに関連付けられた Amazon RDS データベースインスタンスを示しています。

### 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 テンプレートスニペット
<a name="quickref-route53"></a>

**Topics**
+ [ホストゾーンの名前または ID を使用した Amazon Route 53 リソースレコードセット](#scenario-route53-recordset-by-host)
+ [RecordSetGroup を使用した加重リソースレコードセットの設定](#scenario-recordsetgroup-weighted)
+ [RecordSetGroup を使用したエイリアスリソースレコードセットの設定](#scenario-recordsetgroup-zoneapex)
+ [CloudFront ディストリビューションのエイリアスリソースレコードセット](#scenario-user-friendly-url-for-cloudfront-distribution)

## ホストゾーンの名前または ID を使用した Amazon Route 53 リソースレコードセット
<a name="scenario-route53-recordset-by-host"></a>

Amazon Route 53 リソースレコードセットを作成する際は、その追加先となるホストゾーンを指定する必要があります。CloudFormation では、2 つの方法でホストゾーンを指定できます。
+ `HostedZoneId` プロパティを使用して、ホストゾーンを明示的に指定できます。
+ `HostedZoneName` プロパティを使用して、CloudFormation にホストゾーンを検索させることができます。`HostedZoneName` プロパティを使用して同じ名前のホストゾーンが複数見つかった場合、CloudFormation はスタックを作成しません。

### HostedZoneId を使用したリソースレコードセットの追加
<a name="scenario-recordset-using-id"></a>

この例では、ドメイン名が `SPF` の `mysite.example.com` レコードを保存し、`HostedZoneId` プロパティを使用してホストゾーンを指定する、Amazon Route 53 リソースレコードセットを追加しています。

#### 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"'
```

### HostedZoneName を使用したリソースレコードセットの追加
<a name="scenario-recordset-using-name"></a>

この例では、`HostedZoneName` プロパティを使用してホストゾーンを指定するドメイン名「mysite.example.com」の Amazon Route 53 リソースレコードセットを追加します。

#### 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
```

## RecordSetGroup を使用した加重リソースレコードセットの設定
<a name="scenario-recordsetgroup-weighted"></a>

この例では、[AWS::Route53::RecordSetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-route53-recordsetgroup.html) を使用して、「example.com」の 2 つの CNAME レコードを設定します。ホストゾーン `RecordSets` プロパティは、"mysite.example.com" という DNS 名の CNAME レコードセットを保持します。各レコードセットには、識別子 (`SetIdentifier`) と重み (`Weight`) が含まれます。リソースにルーティングされるインターネットトラフィックの割合は、次の計算に基づきます。
+ `Frontend One`: `140/(140+60)` = `140/200` = 70%
+ `Frontend Two`: `60/(140+60)` = `60/200` = 30%

加重リソースレコードセットの詳細については、「Amazon Route 53 デベロッパーガイド」の「[Weighted routing](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-weighted.html)」(加重ルーティング) を参照してください。

### 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
```

## RecordSetGroup を使用したエイリアスリソースレコードセットの設定
<a name="scenario-recordsetgroup-zoneapex"></a>

次の例では、[AWS::Route53::RecordSetGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-route53-recordsetgroup.html) を使用して、ELB バージョン 1 (Classic) ロードバランサーとバージョン 2 (Application または Network) lロードバランサーにトラフィックをルーティングする `example.com` という名前のエイリアスリソースレコードセットを設定します。[AliasTarget](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-route53-recordset-aliastarget.html) プロパティは、`GetAtt` 組み込み関数を使用して、`myELB` `LoadBalancer` のホストゾーン ID と DNS 名を指定します。`GetAtt` は、トラフィックをバージョン 1 かバージョン 2 のどちらのロードバランサーにルーティングするかに応じて、`myELB` リソースのさまざまなプロパティを取得します。
+ バージョン 1 ロードバランサー: `CanonicalHostedZoneNameID` および `DNSName`
+ バージョン 2 ロードバランサー: `CanonicalHostedZoneID` および `DNSName`

エイリアスリソースレコードセットの詳細については、「*Route 53 デベロッパーガイド*」の「[Choosing between alias and non-alias records](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-choosing-alias-non-alias.html)」(エイリアスレコードと非エイリアスレコードの選択) を参照してください。

### バージョン 1 ロードバランサーの JSON
<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.     }
```

### バージョン 1 ロードバランサーの YAML
<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'
```

### バージョン 2 ロードバランサーの JSON
<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.     }
```

### バージョン 2 ロードバランサーの YAML
<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'
```

## CloudFront ディストリビューションのエイリアスリソースレコードセット
<a name="scenario-user-friendly-url-for-cloudfront-distribution"></a>

次の例では、エイリアス A レコードを作成して、カスタムドメイン名を既存の CloudFront ディストリビューションにポイントします。`myHostedZoneID` は、同じテンプレート内の実際の `AWS::Route53::HostedZone` リソースへの参照またはパラメータのいずれかであると想定されます。`myCloudFrontDistribution` は、同じテンプレート内の `AWS::CloudFront::Distribution` リソースを参照します。エイリアスレコードは、標準の CloudFront ホストゾーン ID (`Z2FDTNDATAQYW2`) を使用し、`Fn::GetAtt` を使用してディストリビューションのドメイン名を自動的に解決します。この設定により、IP アドレスを必要とせずに、ウェブトラフィックをカスタムドメインから CloudFront ディストリビューションにルーティングできます。

**注記**  
エイリアスリソースレコードセットを作成する場合は、`HostedZoneId` プロパティに `Z2FDTNDATAQYW2` を指定する必要があります。CloudFront 用のエイリアスリソースレコードセットは、プライベートホストゾーンでは作成できません。

### 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 テンプレートスニペット
<a name="quickref-s3"></a>

これらの Amazon S3 サンプルテンプレートを使用すると、CloudFormation で Amazon S3 バケットを記述するのに役立ちます。その他の例については、`AWS::S3::Bucket` リソースの「[Examples](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html#aws-resource-s3-bucket--examples)」のセクションを参照してください。

**Topics**
+ [デフォルトでの Amazon S3 バケットの作成](#scenario-s3-bucket)
+ [ウェブサイトホスティングの Amazon S3 バケット (`DeletionPolicy`を持つもの) を作成](#scenario-s3-bucket-website)
+ [カスタムドメインを使用した静的ウェブサイトの作成](#scenario-s3-bucket-website-customdomain)

## デフォルトでの Amazon S3 バケットの作成
<a name="scenario-s3-bucket"></a>

次の例では、[AWS::S3::Bucket](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html) を使用してデフォルト設定でバケットを作成します。

### 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
```

## ウェブサイトホスティングの Amazon S3 バケット (`DeletionPolicy`を持つもの) を作成
<a name="scenario-s3-bucket-website"></a>

この例では、バケットをウェブサイトとして作成し、ブロックパブリックアクセスを無効にします (ウェブサイトのホスティングのために設定されたバケットにはパブリック読み取り許可が必要です)。その後、パブリックバケットポリシーがバケットに追加されます。このバケットリソースは、`DeletionPolicy` 属性が `Retain` に設定されているため、CloudFormation がスタックを削除する際、このバケットは削除されません。`Output` セクションは `Fn::GetAtt` を使用して `S3Bucket` リソースの `WebsiteURL` 属性と `DomainName` 属性を取得します。

**注記**  
次の例では、アカウントレベルで `BlockPublicPolicy` および `RestrictPublicBuckets` ブロックパブリックアクセス設定が無効になっていることを前提としています。

### 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
```

## カスタムドメインを使用した静的ウェブサイトの作成
<a name="scenario-s3-bucket-website-customdomain"></a>

登録済みのドメインで Route 53 を使用できます。次のサンプルでは、ドメイン用に Route 53 に既にホストゾーンを作成していると仮定しています。例では、ウェブサイトホスティング用の 2 個のバケットを作成します。ルートバケットはコンテンツをホストし、もう 1 つのバケットが `www.domainname.com` リクエストをルートバケットにリダイレクトします。レコードセットはドメイン名を Amazon S3 エンドポイントにマッピングします。

上記の例で示しているように、バケットポリシーを追加する必要があります。

カスタムドメインの使用に関する詳細については、「*Amazon Simple Storage Service ユーザーガイド*」の「[チュートリアル: Route 53 に登録されたカスタムドメインを使用した静的ウェブサイトの設定](https://docs.aws.amazon.com/AmazonS3/latest/userguide/website-hosting-custom-domain-walkthrough.html)」を参照してください。

**注記**  
次の例では、アカウントレベルで `BlockPublicPolicy` および `RestrictPublicBuckets` ブロックパブリックアクセス設定が無効になっていることを前提としています。

### 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 テンプレートスニペット
<a name="quickref-sns"></a>

この例は、Amazon SNS トピックリソースを示します。有効なメールアドレスが必要です。

## 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 テンプレートスニペット
<a name="scenario-sqs-queue"></a>

この例は、Amazon SQS キューを示します。

## 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 テンプレートスニペット
<a name="scenario-timestream-queue"></a>

Amazon Timestream for InfluxDB を使用すると、アプリケーションデベロッパーや DevOps チームは、オープンソース API を使用して、フルマネージド InfluxDB データベースを AWSで簡単に実行し、リアルタイムの時系列アプリケーションを実行できます。要求の厳しい時系列ワークロードを処理する InfluxDB データベースをすばやく作成できます。いくつかの簡単な API コールを使用すると自動化されたソフトウェア パッチ適用、バックアップ、リカバリを使用して、AWS の InfluxDB データベースをセットアップ、移行、運用、スケーリングできます。これらのサンプルは、GitHub の [awslabs/amazon-timestream-tools/tree/mainline/integrations/cloudformation/timestream-influxdb](https://github.com/awslabs/amazon-timestream-tools/tree/mainline/integrations/cloudformation/timestream-influxdb) でも入手できます。

**Topics**
+ [デフォルト値を使用した最小限のサンプル](#scenario-timestream-influxdb-example-1)
+ [パラメータを使用したより完全な例](#scenario-timestream-influxdb-example-2)

これらの CloudFormation テンプレートは、Amazon Timestream for InfluxDB インスタンスを正常に作成、接続、モニタリングするために必要な以下のリソースを作成します。

**Amazon VPC**
+ `VPC`
+ 1 つ以上の`Subnet`
+ `InternetGateway`
+ `RouteTable`
+ `SecurityGroup`

**Amazon S3**
+ `Bucket`

**Amazon Timestream**
+ `InfluxDBInstance`

## デフォルト値を使用した最小限のサンプル
<a name="scenario-timestream-influxdb-example-1"></a>

この例では、可能であればデフォルト値を使用して、マルチ AZ およびパブリックにアクセス可能なインスタンスをデプロイします。

### 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"]]
```

## パラメータを使用したより完全な例
<a name="scenario-timestream-influxdb-example-2"></a>

このサンプルテンプレートは、指定されたパラメータに基づいてネットワークリソースを動的に変更します。パラメータには、 `PubliclyAccessible` と `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"]]
```

# CloudFormation を使用して Windows ベースのスタックをデプロイする
<a name="cfn-windows-stacks"></a>

このページでは、Windows ベースのデプロイで一般的に使用される CloudFormation リソースの技術リファレンスドキュメントへのリンクを提供します。

CloudFormation は、Infrastructure as Code (IaC) を介して Microsoft Windows スタックをデプロイおよび管理するためのサポートを提供します。CloudFormation を使用すると、Windows ベースの EC2 インスタンス、Amazon RDS 上の SQL Server、および Directory Service を通じた Microsoft Active Directory を自動プロビジョニングできます。

AWS は、Windows プラットフォーム向けに設計された事前構成済みの Amazon マシンイメージ（AMI）を提供しており、Amazon EC2 上でアプリケーションを迅速にデプロイできます。これらの AMI には、Microsoft のデフォルト設定と AWS 固有のカスタマイズが含まれます。CloudFormation では、他の Windows Server と同様に、適切な AMI を選択し、インスタンスを起動してリモートデスクトップ接続を使用してアクセスできます。AMI には、EC2Launch (バージョンは Windows Server のエディションによって異なります)、AWS Systems Manager、CloudFormation、AWS Tools for PowerShell に加えて、ネットワーク、ストレージ、グラフィックス用の各種ドライバーなど、AWS サービスとの互換性と最適なパフォーマンスを確保するために必要なソフトウェアコンポーネントが含まれています。詳細については、「[AWS Windows AMI リファレンス](https://docs.aws.amazon.com/ec2/latest/windows-ami-reference/windows-amis.html)」を参照してください。

CloudFormation は、EC2 インスタンスの初回起動時に PowerShell またはバッチコマンドを実行できる `UserData` スクリプトなどのソフトウェア設定ツールもサポートしています。また、ヘルパースクリプト (`cfn-init`、`cfn-signal`、`cfn-get-metadata`、`cfn-hup`) を提供し、Windows インスタンスのパッケージ、ファイル、サービスを管理するための `AWS::CloudFormation::Init` メタデータをサポートします。

エンタープライズ環境の場合、CloudFormation はドメイン結合、EC2 ライセンスモデルによる Windows ライセンス管理、AWS Secrets Manager による安全な認証情報処理を可能にします。CloudFormation は、バージョン管理されたテンプレートと反復可能なデプロイと組み合わせることで、組織が複数の AWS リージョン およびアカウントにわたって一貫性があり、安全で、スケーラブルな Windows 環境を維持するのに役立ちます。

Windows ベースのデプロイで一般的に使用される CloudFormation リソースの詳細については、以下の技術リファレンストピックを参照してください。


| リソースタイプ | 説明 | 
| --- | --- | 
|  [AWS::EC2::Instance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html)  |  Windows EC2 インスタンスを起動するためのリソースタイプ。  | 
|  [AWS::EC2::SecurityGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-securitygroup.html)  |  Windows ワークロードのファイアウォールルールを定義するためのリソースタイプ。  | 
|  [AWS::AutoScaling::AutoScalingGroup](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)  |  Windows EC2 インスタンスをスケーリングするためのリソースタイプ。  | 
|  [AWS::DirectoryService::MicrosoftAD](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-directoryservice-microsoftad.html)  |  Microsoft Active Directory をデプロイするためのリソースタイプ。  | 
|  [AWS::FSx::FileSystem](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-fsx-filesystem.html)  |  FSx for Windows File Server をデプロイするためのリソースタイプ。  | 
|  [AWS::RDS::DBInstance](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html)  |  Amazon RDS の SQL Server をプロビジョニングするためのリソースタイプ。  | 
|  [AWS::CloudFormation::Init](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-init.html)  |  インスタンスを設定するために EC2 メタデータ内で使用されます。 詳細については、「[Windows ベースの CloudFormation スタックのブートストラップ](cfn-windows-stacks-bootstrapping.md)」を参照してください。  | 
|  [AWS::SecretsManager::Secret](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-secretsmanager-secret.html)  |  認証情報と Windows のパスワードを安全に管理するためのリソースタイプ。  | 
|  [AWS::SSM::Parameter](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ssm-parameter.html)  |  設定値を安全に保存するためのリソースタイプ。  | 
|  [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)  |  EC2 インスタンスで実行されるアプリケーションにアクセス許可を付与するためのリソースタイプ。  | 

# Windows ベースの CloudFormation スタックのブートストラップ
<a name="cfn-windows-stacks-bootstrapping"></a>

このトピックでは、Windows スタックをブートストラップする方法と、スタック作成時の問題をトラブルシューティングする方法について説明します。

**Topics**
+ [EC2 インスタンスのユーザーデータ](#cfn-windows-bootstrapping-user-data)
+ [CloudFormation ヘルパースクリプト](#cfn-windows-bootstrapping-helper-scripts)
+ [Windows スタックのブートストラップの例](#cfn-windows-bootstrapping-example)
+ [Windows ファイルパスのバックスラッシュをエスケープする](#cfn-windows-stacks-escape-backslashes)
+ [Windows のサービスを管理する](#cfn-windows-stacks-manage-windows-services)
+ [スタック作成の問題のトラブルシューティング](#cfn-windows-stacks-troubleshooting)

## EC2 インスタンスのユーザーデータ
<a name="cfn-windows-bootstrapping-user-data"></a>

ユーザーデータは、起動時にスクリプトまたは設定情報を EC2 インスタンスに渡すことができる Amazon EC2 機能です。

Windows EC2 インスタンスの場合:
+ バッチスクリプト (`<script>` タグを使用) または PowerShell スクリプト (`<powershell>` タグを使用) を使用できます。
+ スクリプトの実行は EC2Launch によって処理されます。

**重要**  
CloudFormation で使用する独自の Windows AMI を作成する場合は、EC2Launch v2 が正しく設定されていることを確認してください。スタック作成時に Windows インスタンスを適切に初期化および設定するには、CloudFormation のブートストラップツールに EC2Launch v2 が必要です。詳細については、『Amazon EC2 ユーザーガイド』の「[EC2 Windows インスタンスの起動時に EC2Launch v2 エージェントを使用してタスクを実行する](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2launch-v2.html)」を参照してください。  
AWS Windows AMI の詳細については、「[AWSWindows AMI リファレンス](https://docs.aws.amazon.com/ec2/latest/windows-ami-reference/windows-amis.html)」を参照してください。

## CloudFormation ヘルパースクリプト
<a name="cfn-windows-bootstrapping-helper-scripts"></a>

ヘルパースクリプトは、ブートストラッププロセス中にインスタンスを設定するためのユーティリティです。Amazon EC2 ユーザーデータで使用され、強力な設定オプションを提供します。

CloudFormation には、スタックの一部として作成する Amazon EC2 インスタンスでソフトウェアをインストールしたりサービスを開始したりするために使用できる、次の Python ヘルパースクリプトが用意されています。
+  `cfn-init` – リソースメタデータの取得と解釈、パッケージのインストール、ファイルの作成、およびサービスの開始で使用します。
+  `cfn-signal` – `CreationPolicy` でシグナルを送信するために使用し、前提となるリソースやアプリケーションの準備ができたときに、スタックの他のリソースを同期できるようにします。
+  `cfn-get-metadata` – 特定のキーへのリソースまたはパスのメタデータを取得するために使用します。
+  `cfn-hup` – メタデータへの更新を確認し、変更が検出されたときにカスタムフックを実行するために使用します。

テンプレートからスクリプトを直接呼び出します。スクリプトは、同じテンプレートで定義されているリソースメタデータと組み合わされて機能します。スクリプトは Amazon EC2 インスタンスでスタック作成プロセス中に実行されます。

詳細については、「*CloudFormation テンプレートリファレンスガイド*」の「[CloudFormation ヘルパースクリプトリファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/cfn-helper-scripts-reference.html)」を参照してください。

## Windows スタックのブートストラップの例
<a name="cfn-windows-bootstrapping-example"></a>

次のアクションを実行する Windows Server テンプレートのサンプルスニペットを見てみましょう。
+ `TestInstance` という名前の EC2 インスタンスを Windows Server 2022 AMI から起動します。
+ `cfn-init` が動作していることを確認するためのシンプルなテストファイルを作成します。
+ `cfn-hup` を継続的な設定管理のために設定します。
+ `CreationPolicy` を使用して、インスタンスが正常に完了したというシグナルを送信するようにします。

`cfn-init` のヘルパースクリプトを使用して、テンプレートの `AWS::CloudFormation::Init` リソースの情報に基づいて、これらの各アクションを実行します。

`AWS::CloudFormation::Init` セクションは `TestInstance` と呼ばれ、次の宣言で始まります。

```
TestInstance:
  Type: AWS::EC2::Instance
  Metadata:
    AWS::CloudFormation::Init:
      configSets:
        default:
          - create_files
          - start_services
```

この後、`AWS::CloudFormation::Init` の `files` セクションが宣言されます。

```
      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}
```

3 つのファイルがここで作成され、サーバーインスタンスの `C:\cfn` ディレクトリに配置されます。
+ `test.txt` は、`cfn-init` が正しく動作していることを検証するシンプルなテストファイルであり、動的コンテンツを含むファイルを作成できます。
+ `cfn-hup.conf` は、`cfn-hup` 用の設定ファイルで、チェック間隔は 2 分間です。
+ `cfn-auto-reloader.conf`、`AWS::CloudFormation::Init` のメタデータが変更されるときに `cfn-hup` が更新 (`cfn-init` の呼び出し) を開始するために使用するフックの設定ファイル。

次に、Windows サービスを設定する `start_services` セクションです。

```
      start_services:
        services:
          windows:
            cfn-hup:
              enabled: true
              ensureRunning: true
              files:
                - c:\cfn\cfn-hup.conf
                - c:\cfn\hooks.d\cfn-auto-reloader.conf
```

このセクションでは、`cfn-hup` サービスが開始され、設定ファイルが変更されると自動的に再起動します。サービスは CloudFormation メタデータの変更をモニタリングし、更新が検出されると `cfn-init` を再実行します。

次は `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>
```

このセクションでは、`UserData` プロパティに、PowerShell が実行する EC2Launch が含まれています。この部分は `<powershell>` タグで囲まれています。スクリプトは `default` configSet を使用して `cfn-init` を実行し、`cfn-signal` を使用して終了コードを CloudFormation に報告します。`CreationPolicy` は、スタックの作成が完了と見なされる前にインスタンスが適切に設定されていることを確認するために使用されます。

`ImageId` プロパティは、Systems Manager パラメータストアのパブリックパラメータを使用して、最新の Windows Server 2022 AMI ID を自動的に取得します。このアプローチにより、リージョン固有の AMI マッピングが不要になり、常に最新の AMI を取得できます。Systems Manager パラメータを AMI ID に使用することは、最新の AMI リファレンスを維持するためのベストプラクティスです。インスタンスに接続する場合は、`SecurityGroupIds` プロパティが RDP アクセスを許可するセキュリティグループを参照していることを確認してください。

`CreationPolicy` はリソースプロパティの一部として宣言され、タイムアウト期間を指定します。インスタンス設定が完了すると、ユーザーデータ内の `cfn-signal` コマンドがシグナルを送信します。

```
TestInstance:
  Type: AWS::EC2::Instance
  CreationPolicy:
    ResourceSignal:
      Timeout: PT20M
  Properties:
    # ... other properties ...
```

ブートストラッピングプロセスは最小限で、ファイルの作成とサービスの開始のみを行うため、`CreationPolicy` はタイムアウトするまで 20 分 (PT20M) 待機します。タイムアウトは ISO 8601 期間形式を使用して指定します。Windows インスタンスの起動には通常 Linux インスタンスよりも時間がかかるため、徹底的にテストしてニーズに最適なタイムアウト値を判断してください。

すべて問題がなければ、`CreationPolicy` は正常に完了し、パブリック IP アドレスを使用して Windows Server インスタンスにアクセスできます。スタックの作成が完了すると、インスタンス ID と IP アドレスが 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
```

RDP 経由でインスタンスに接続し、ファイル `C:\cfn\test.txt` が存在し、予想されるコンテンツが含まれていることを確認することで、ブートストラッピングが正しく機能したことを手動で確認することもできます。Windows インスタンスへの接続の詳細については、「*Amazon EC2 ユーザーガイド*」の「[Connect to your Windows instance using RDP](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connecting_to_windows_instance.html)」を参照してください。

## Windows ファイルパスのバックスラッシュをエスケープする
<a name="cfn-windows-stacks-escape-backslashes"></a>

CloudFormation テンプレートで Windows パスを参照するときは、使用しているテンプレート形式に従ってバックスラッシュ (`\`) を適切にエスケープするようにしてください。
+ JSON テンプレートでは、JSON はバックスラッシュをエスケープ文字として扱うため、Windows ファイルパスにダブルバックスラッシュを使用する必要があります。最初のバックスラッシュは 2 番目のバックスラッシュをエスケープするため、単一のリテラルバックスラッシュとして解釈されます。

  ```
  "commands" : {
    "1-extract" : {
      "command" : "C:\\SharePoint\\SharePointFoundation2010.exe /extract:C:\\SharePoint\\SPF2010 /quiet /log:C:\\SharePoint\\SharePointFoundation2010-extract.log"
    }
  }
  ```
+ YAML テンプレートの場合、通常、1 つのバックスラッシュで十分です。

  ```
  commands:
    1-extract:
      command: C:\SharePoint\SharePointFoundation2010.exe /extract:C:\SharePoint\SPF2010 /quiet /log:C:\SharePoint\SharePointFoundation2010-extract.log
  ```

## Windows のサービスを管理する
<a name="cfn-windows-stacks-manage-windows-services"></a>

Linux サービスと同じように Windows サービスを管理しますが、`sysvinit` の代わりに、`windows` キーを使用します。次の例では、`cfn-hup` サービスを開始し、それを Automatic に設定します。`c:\cfn\cfn-hup.conf` または `c:\cfn\hooks.d\cfn-auto-reloader.conf` 設定ファイルを `cfn-init` が変更する場合は、サービスを再起動します。

```
        services:
          windows:
            cfn-hup:
              enabled: true
              ensureRunning: true
              files:
                - c:\cfn\cfn-hup.conf
                - c:\cfn\hooks.d\cfn-auto-reloader.conf
```

サービスを参照する名前 (表示名ではない) を使用して、同じ方法で他の Windows サービスを管理できます。

## スタック作成の問題のトラブルシューティング
<a name="cfn-windows-stacks-troubleshooting"></a>

スタックの作成に失敗する場合、デフォルトでは失敗時にロールバックが実行されます。不必要な課金を避けられるため、通常はこのデフォルト設定が適切ですが、スタック作成が失敗する原因をデバッグすることは難しくなります。

CloudFormation コンソールでスタックを作成または更新するときにこの動作をオフにするには、**[スタックの失敗オプション]** で **[正常にプロビジョニングされたリソースの保持]** オプションを選択します。詳細については、「[リソースのプロビジョニング時における失敗への対応方法を選択する](stack-failure-options.md)」を参照してください。これにより、インスタンスにログインし、ログファイルを確認できるようになり、スタートアップスクリプト実行時に発生した問題を特定できます。

調査対象の重要なログは次のとおりです。
+ `%ProgramData%\Amazon\EC2Launch\log\agent.log` にある EC2 構成ログ
+ `C:\cfn\log\cfn-init.log` の **cfn-init** ログ (特定の障害ポイントの終了コードとエラーメッセージを確認する)

その他のログについては、「Amazon EC2 ユーザーガイド」の次のトピックを参照してください。
+ [EC2Launch ディレクトリ構造](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2config-service.html#UsingConfigXML_WinAMI)
+ [EC2Launch v2 ディレクトリ構造](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2launch-v2.html#ec2launch-v2-directory)

ブートストラッピングの問題のトラブルシューティングの詳細については、「[Windows インスタンスがある CloudFormation スタックでブートストラップしないヘルパースクリプトをトラブルシューティングするにはどうすればよいですか?](https://repost.aws/knowledge-center/cloudformation-helper-scripts-windows)」を参照してください。

# CloudFormation が提供するリソースタイプの使用によるテンプレートの機能の拡張
<a name="cloudformation-supplied-resource-types"></a>

CloudFormation はスタックテンプレートで使用できるいくつかのリソースタイプを提供し、シンプルなスタックテンプレートを超えて機能を拡張できます。

これらのリソースタイプには以下が含まれます。


| リソースタイプ | 説明 | ドキュメント | 
| --- | --- | --- | 
|  カスタムリソース  |  この `AWS::CloudFormation::CustomResource` リソースタイプは、特定のプロビジョニングタスクを実行するカスタムリソースを作成したり、CloudFormation リソースタイプとして利用することができないリソースを含めたりすることを可能にします。  |  [カスタムリソース](template-custom-resources.md) | 
|  マクロ  |  この `AWS::CloudFormation::Macro` リソースタイプは、CloudFormation テンプレートでカスタム処理を実行できる再利用可能なコードを定義します。マクロは、スタックの作成中または更新中にテンプレートを変更する、追加のリソースを生成する、またはその他のカスタムオペレーションを実行することができます。  | [マクロのテンプレート](template-macros.md) | 
|  ネストされたスタック  |  この `AWS::CloudFormation::Stack` リソースタイプは、よりモジュール化された再利用可能なスタックアーキテクチャのために、CloudFormation テンプレート内でネストされたスタックを作成できるようにします。  | [ネストされたスタック](using-cfn-nested-stacks.md) | 
|  StackSet  |  この ‭`AWS::CloudFormation::StackSet`‬ リソースタイプは、CloudFormation StackSet を作成または更新します。StackSet は、複数の AWS アカウント およびリージョン全体にデプロイできる、スタック用のコンテナです。  | [StackSets を使用したスタックの管理](what-is-cfnstacksets.md) | 
|  待機条件  |  この `AWS::CloudFormation::WaitCondition` リソースタイプは、特定の条件 (長時間実行されるプロセスの正常な完了、または外部リソースの可用性など) が満たされるまで、スタックの作成または更新を一時停止します。  | [待機条件](using-cfn-waitcondition.md) | 
|  待機条件ハンドル  |  この `AWS::CloudFormation::WaitConditionHandle` リソースタイプは、`AWS::CloudFormation::WaitCondition` リソースタイプとともに動作します。特定の条件が満たされたことを示すシグナルを送信するために使用される署名付き URL を提供します。これらのシグナルにより、スタックの作成または更新プロセスを続行できます。  | [待機条件](using-cfn-waitcondition.md) | 

# カスタムリソースを使用してカスタムプロビジョニングロジックを作成する
<a name="template-custom-resources"></a>

カスタムリソースを使用すると、CloudFormation テンプレートにカスタムプロビジョニングロジックを記述し、スタックを作成、更新 (カスタムリソースを変更した場合)、または削除するたびに CloudFormation にそのロジックを実行させることができます。これは、プロビジョニング要件に、CloudFormation の組み込みリソースタイプでは表現できない複雑なロジックやワークフローが含まれる場合に役立ちます。

例えば、CloudFormation のリソースタイプとして使用できないリソースを含める必要があるとします。それらのリソースは、カスタム リソースを使用して含めることができます。この方法により、すべての関連リソースを 1 つのスタックで管理できます。

CloudFormation テンプレートでカスタムリソースを定義するには、`AWS::CloudFormation::CustomResource` または `Custom::MyCustomResourceTypeName` リソースタイプを使用します。カスタムリソースにはサービストークンを示す 1 つのプロパティが必要です。このプロパティは、CloudFormation がリクエストを送信する宛先 (Amazon SNS トピックまたは Lambda 関数など) を指定します。

次のトピックでは、カスタムリソースの使用方法について説明します。

**Topics**
+ [カスタムリソースのしくみ](#how-custom-resources-work)
+ [応答タイムアウト](#response-timeout)
+ [CloudFormation カスタムリソースのリクエストおよびレスポンスのリファレンス](crpg-ref.md)
+ [Amazon SNS を利用するカスタムリソース](template-custom-resources-sns.md)
+ [Lambda を使用するカスタムリソース](template-custom-resources-lambda.md)

**注記**  
CloudFormation レジストリとカスタムリソースには、それぞれ独自の利点があります。カスタムリソースには次の利点があります。  
リソースを登録する必要はありません。
リソース全体を登録せずにテンプレートの一部として含めることができます。
`Create`、`Update`、および `Delete` 操作をサポート
レジストリベースのリソースが提供する利点は次のとおりです。  
サードパーティー製アプリケーションリソースのモデリング、プロビジョニング、および管理をサポート
`Create`、`Read`、`Update`、`Delete`、および `List` (`CRUDL`) 操作をサポート
プライベートおよびサードパーティーのリソースタイプでドリフト検出をサポート
カスタムリソースとは異なり、レジストリベースのリソースは、`CRUDL` 操作を実行するために Amazon SNS トピックや Lambda 関数を関連付ける必要がありません。詳細については、「[CloudFormation レジストリによる拡張機能の管理](registry.md)」を参照してください。

## カスタムリソースのしくみ
<a name="how-custom-resources-work"></a>

新しいカスタムリソースを設定する一般的なプロセスには、次の手順が含まれます。これらの手順には、カスタムリソースを所有する*カスタムリソースプロバイダー*と、カスタムリソースタイプを含むテンプレートを作成する*テンプレート開発者*の 2 つの役割が必要です。これは同じユーザーでもかまいませんが、そうでない場合は、カスタムリソースプロバイダーがテンプレート開発者と連携する必要があります。

1. カスタムリソースプロバイダーは、CloudFormation からのリクエストを処理し、カスタムリソースに対してアクションを実行する方法を決定するロジックを書き込みます。

1. カスタムリソースプロバイダーは、CloudFormation がリクエストを送信できる Amazon SNS トピックまたは Lambda 関数を作成します。Amazon SNS トピックまたは Lambda 関数は、スタックを作成するリージョンと同じリージョンに存在する必要があります。

1. カスタムリソースプロバイダーは、Amazon SNS トピック ARN または Lambda 関数 ARN をテンプレート開発者に提供します。

1. テンプレート開発者は、CloudFormation テンプレートでカスタムリソースを定義します。これには、サービストークンと入力データパラメータが含まれます。サービストークンや入力データの構造は custom resource provider によって定義されます。サービストークンは Amazon SNS トピック ARN または Lambda 関数 ARN を指定し、常に必須ですが、入力データはカスタムリソースに応じてオプションです。

テンプレートを使用してカスタムリソースを作成、更新、削除するたびに、CloudFormation は指定されたサービス トークンにリクエストを送信し、スタック操作を続行する前に、応答を待機します。

テンプレートからスタックを作成するためのフローを以下に示します。

1. CloudFormation は、指定されたサービストークンにリクエストを送信します。このリクエストには、リクエストタイプおよびカスタムリソースが応答を送信する宛先の Amazon S3 バケットの署名付き URL などの情報が含まれています。リクエストに含まれている情報の詳細については、「[CloudFormation カスタムリソースのリクエストおよびレスポンスのリファレンス](crpg-ref.md)」を参照してください。

   以下のサンプルデータは、CloudFormation が `Create` リクエストに含める内容を示しています。　この例では、`ResourceProperties` は CloudFormation が Lambda 関数へ送信するカスタムペイロードの作成を許可します。

   ```
   {
      "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. custom resource provider は CloudFormation のリクエストを処理し、`SUCCESS` または `FAILED` の応答を署名付き URL に返します。custom resource provider は、応答を JSON 形式のファイルで提供し、それを署名付き S3 URL にアップロードします。詳細については、「*Amazon Simple Storage Service ユーザーガイド*」の「[署名付き URL を使用したオブジェクトのアップロード](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html)」を参照してください。

   その応答について、custom resource provider には template developer がアクセスできる名前と値のペアも含まれている場合があります。たとえば、応答には要求が成功した場合は出力データ、要求が失敗した場合はエラーメッセージが含まれることがあります。応答の詳細については、「[CloudFormation カスタムリソースのリクエストおよびレスポンスのリファレンス](crpg-ref.md)」を参照してください。
**重要**  
名前と値のペアに機密情報が含まれている場合は、`NoEcho` フィールドを使用して、カスタムリソースの出力をマスクします。それ以外の場合は、プロパティ値 (`DescribeStackEvents` など) を表示する API を通じて値が表示されます。  
`NoEcho` を使用して機密情報をマスクする方法、および動的なパラメータを使用してシークレットを管理する方法の詳細については、「[テンプレートに認証情報を埋め込まない](security-best-practices.md#creds)」ベストプラクティスを参照してください。

   custom resource provider には要求をリッスンして応答する責任があります。例えば、Amazon SNS 通知の場合、custom resource provider は特定のトピック ARN に送信される通知をリッスンして応答する必要があります。CloudFormation は、事前署名済みの URL の場所で応答を待機してリッスンします。

   次のサンプルデータは、カスタムリソースの応答に含まれる可能性がある情報を示します。

   ```
   {
      "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. `SUCCESS` 応答を取得した後、CloudFormation はスタックオペレーションを続けます。`FAILED` 応答が返されるか、応答が返されない場合、操作は失敗します。カスタムリソースからの出力データは署名付き URL の場所に保存されます。テンプレートデベロッパーは [Fn::GetAtt](resources-section-structure.md#resource-properties-getatt) 関数を使用してそのデータを取得できます。

**注記**  
AWS PrivateLink を使用する場合は、VPC のカスタムリソースには CloudFormation 固有の S3 バケットへのアクセスが必要です。カスタムリソースは、署名付き Amazon S3 URL に応答を送信する必要があります。Amazon S3 に応答を送信できない場合、CloudFormation は応答を受信せず、スタックオペレーションは失敗となります。詳細については、「[インターフェイスエンドポイントを使用した CloudFormation へのアクセス (AWS PrivateLink)](vpc-interface-endpoints.md)」を参照してください。

## 応答タイムアウト
<a name="response-timeout"></a>

カスタムリソースのデフォルトのタイムアウトは 3600 秒 (1 時間) です。この間に応答が受信されない場合、スタック操作は失敗します。

タイムアウト値は、カスタムリソースからの応答にかかると予想される時間に基づいて調整できます。例えば、5 分以内に応答することが予想される Lambda 関数を呼び出すカスタムリソースをプロビジョニングする場合、 `ServiceTimeout` プロパティを指定してスタックテンプレートで 5 分のタイムアウトを設定できます。詳細については、「[CloudFormation カスタムリソースのリクエストおよびレスポンスのリファレンス](crpg-ref.md)」を参照してください。これにより、Lambda 関数にエラーが発生してスタックが停止した場合、CloudFormation は 1 時間待機するのではなく 5 分後にスタック操作を失敗させます。

ただし、タイムアウト値を低く設定しすぎないように注意してください。予期しないタイムアウトを回避するには、カスタムリソースに必要なアクションを実行して応答を返すのに十分な時間があることを確認してください。

# CloudFormation カスタムリソースのリクエストおよびレスポンスのリファレンス
<a name="crpg-ref"></a>

CloudFormation は、カスタムリソースプロバイダーと通信するリクエスト/レスポンスプロトコルを使用してカスタムリソースを管理します。各リクエストにはリクエストタイプ (`Create`、`Update`、または `Delete`) が含まれ、次の高レベルのワークフローに従います。

1. テンプレート開発者は、テンプレート内の `ServiceToken` と `ServiceTimeout` を使用してカスタムリソースを定義し、スタックオペレーションを開始します。

1. CloudFormation は、JSON リクエストを SNS または Lambda を介してカスタムリソースプロバイダーに送信します。

1. カスタムリソースプロバイダーはリクエストを処理し、タイムアウト期間が終了する前に JSON レスポンスを署名付き Amazon S3 バケット URL に返します。

1. CloudFormation はレスポンスを読み取り、スタックオペレーションを続行します。タイムアウト時間が終了する前に応答を受信しない場合、リクエストは不成功と見なされ、スタック操作は失敗します。

詳細については、「[カスタムリソースのしくみ](template-custom-resources.md#how-custom-resources-work)」を参照してください。

このセクションでは、各リクエストタイプの構造、パラメータ、および予想されるレスポンスについて説明します。

**注記**  
レスポンス本文の合計サイズは 4,096 バイトを超えることはできません。

## テンプレートのセットアップ
<a name="crpg-ref-template-setup"></a>

テンプレートでカスタムリソースを定義する場合、テンプレート開発者は次のプロパティで [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) を使用します。

`ServiceToken`  
スタックと同じリージョンからの Amazon SNS トピック ARN または Lambda 関数 ARN。  
*必須:* はい  
*タイプ*: 文字列

`ServiceTimeout`  
カスタムリソースオペレーションがタイムアウトするまでの最大時間 (秒単位)。1～3600 の範囲の値にする必要があります。デフォルト: 3600 秒 (1 時間)。  
*必須:* いいえ  
*タイプ*: 文字列

追加のリソースプロパティがサポートされています。リソースプロパティは、リクエストに `ResourceProperties` として含まれます。カスタムリソースプロバイダーは、有効なプロパティとそれらの許容値を決定する必要があります。

## オブジェクトをリクエストする
<a name="crpg-ref-requesttypes"></a>

------
#### [ Create ]

テンプレート開発者がカスタムリソースを含むスタックを作成すると、CloudFormation は `RequestType` を `Create` に設定してリクエストを送信します。

作成リクエストには、以下のフィールドが含まれています。

`RequestType`  
`Create`.  
*必須:* はい  
*タイプ*: 文字列

`RequestId`  
リクエストの一意の ID。  
`StackId` と `RequestId` を組み合わせると、特定のカスタムリソースに対するリクエストを一意に識別するために使用できる値が形成されます。  
*必須:* はい  
*タイプ*: 文字列

`StackId`  
カスタムリソースを含むスタックを識別する Amazon リソースネーム (ARN)。  
`StackId` と `RequestId` を組み合わせると、特定のカスタムリソースに対するリクエストを一意に識別するために使用できる値が形成されます。  
*必須:* はい  
*タイプ*: 文字列

`ResponseURL`  
応答 URL は、カスタムリソースプロバイダーから CloudFormation への応答を受信する署名済み S3 バケットを識別します。  
*必須:* はい  
*タイプ*: 文字列

`ResourceType`  
CloudFormation テンプレート内のカスタムリソースに対し、テンプレートのデベロッパーが選択したリソースタイプ。カスタムリソースタイプの名前は、60 文字までの長さで指定できます。また、英数字や記号 `_@-` を含めることができます。  
*必須:* はい  
*タイプ*: 文字列

`LogicalResourceId`  
CloudFormation テンプレートで開発者が選択したカスタムリソースの名前 (論理 ID)。  
*必須:* はい  
*タイプ*: 文字列

`ResourceProperties`  
このフィールドにはテンプレート開発者によって送信された `Properties` オブジェクトの内容が含まれます。その内容は、custom resource provider によって定義されます。  
*必須:* いいえ  
*タイプ*: JSON オブジェクト

*例*

```
{
   "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 ]

テンプレート開発者がテンプレート内のカスタムリソースのプロパティを変更し、スタックを更新すると、CloudFormation は `RequestType` を `Update` に設定して custom resource provider にリクエストを送信します。カスタムリソースコードは、リクエスト タイプが `Update` のときにプロパティが変更されたことを認識しているため、リソースの変更を検出する必要がないということを、これは意味します。

更新リクエストには、以下のフィールドが含まれています。

`RequestType`  
`Update`.  
*必須:* はい  
*タイプ*: 文字列

`RequestId`  
リクエストの一意の ID。  
`StackId` と `RequestId` を組み合わせると、特定のカスタムリソースに対するリクエストを一意に識別するために使用できる値が形成されます。  
*必須:* はい  
*タイプ*: 文字列

`StackId`  
カスタムリソースを含むスタックを識別する Amazon リソースネーム (ARN)。  
`StackId` と `RequestId` を組み合わせると、特定のカスタムリソースに対するリクエストを一意に識別するために使用できる値が形成されます。  
*必須:* はい  
*タイプ*: 文字列

`ResponseURL`  
応答 URL は、カスタムリソースプロバイダーから CloudFormation への応答を受信する署名済み S3 バケットを識別します。  
*必須:* はい  
*タイプ*: 文字列

`ResourceType`  
CloudFormation テンプレート内のカスタムリソースに対し、テンプレートのデベロッパーが選択したリソースタイプ。カスタムリソースタイプの名前は、60 文字までの長さで指定できます。また、英数字や記号 `_@-` を含めることができます。更新時にタイプを変更することはできません。  
*必須:* はい  
*タイプ*: 文字列

`LogicalResourceId`  
CloudFormation テンプレートで開発者が選択したカスタムリソースの名前 (論理 ID)。  
*必須:* はい  
*タイプ*: 文字列

`PhysicalResourceId`  
カスタムリソースプロバイダーによって定義された、プロバイダーで一意となる物理 ID。  
*必須:* はい  
*タイプ*: 文字列

`ResourceProperties`  
このフィールドにはテンプレート開発者によって送信された `Properties` オブジェクトの内容が含まれます。その内容は、custom resource provider によって定義されます。  
*必須:* いいえ  
*タイプ*: JSON オブジェクト

`OldResourceProperties`  
`Update` リクエストにのみ使用されます。CloudFormation テンプレート内のテンプレートデベロッパーによって以前に宣言されたリソースプロパティ値。  
*必須:* はい  
*タイプ*: JSON オブジェクト

*例*

```
{
   "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 ]

テンプレート開発者がスタックを削除するか、テンプレートからカスタムリソースを削除してからスタックを更新すると、CloudFormation は `RequestType` を `Delete` に設定してリクエストを送信します。

削除リクエストには、以下のフィールドが含まれています。

`RequestType`  
`Delete`.  
*必須:* はい  
*タイプ*: 文字列

`RequestId`  
リクエストの一意の ID。  
*必須:* はい  
*タイプ*: 文字列

`StackId`  
カスタムリソースを含むスタックを識別する Amazon リソースネーム (ARN)。  
*必須:* はい  
*タイプ*: 文字列

`ResponseURL`  
応答 URL は、カスタムリソースプロバイダーから CloudFormation への応答を受信する署名済み S3 バケットを識別します。  
*必須:* はい  
*タイプ*: 文字列

`ResourceType`  
CloudFormation テンプレート内のカスタムリソースに対し、テンプレートのデベロッパーが選択したリソースタイプ。カスタムリソースタイプの名前は、60 文字までの長さで指定できます。また、英数字や記号 `_@-` を含めることができます。  
*必須:* はい  
*タイプ*: 文字列

`LogicalResourceId`  
CloudFormation テンプレートで開発者が選択したカスタムリソースの名前 (論理 ID)。  
*必須:* はい  
*タイプ*: 文字列

`PhysicalResourceId`  
カスタムリソースプロバイダーによって定義された、プロバイダーで一意となる物理 ID。  
*必須:* はい  
*タイプ*: 文字列

`ResourceProperties`  
このフィールドにはテンプレート開発者によって送信された `Properties` オブジェクトの内容が含まれます。その内容は、custom resource provider によって定義されます。  
*必須:* いいえ  
*タイプ*: JSON オブジェクト

*例*

```
{
   "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" }
   }
}
```

------

## レスポンスオブジェクト
<a name="crpg-ref-responses"></a>

カスタムリソースプロバイダーは、レスポンスをすべてのリクエストタイプの署名付き URL に送信します。カスタムリソースプロバイダーがレスポンスを送信しない場合、CloudFormation はオペレーションがタイムアウトするまで待機します。

レスポンスは、次のフィールドを持つ JSON オブジェクトである必要があります。

`Status`  
`SUCCESS` または `FAILED` である必要があります。  
*必須:* はい  
*タイプ*: 文字列

`RequestId`  
リクエストの一意の ID。リクエストに表示されるように、この値を正確にコピーします。  
*必須:* はい  
*タイプ*: 文字列

`StackId`  
カスタムリソースを含むスタックを識別する Amazon リソースネーム (ARN)。リクエストに表示されるように、この値を正確にコピーします。  
*必須:* はい  
*タイプ*: 文字列

`LogicalResourceId`  
CloudFormation テンプレートで開発者が選択したカスタムリソースの名前 (論理 ID)。リクエストに表示されるように、この値を正確にコピーします。  
*必須:* はい  
*タイプ*: 文字列

`PhysicalResourceId`  
この値は、カスタムリソースベンダーに固有の識別子である必要があり、サイズは最大 1 KB までです。値は空でない文字列でなければならず、同じリソースに対するすべての応答で同一である必要があります。  
カスタムリソースを更新する場合、`PhysicalResourceId` に返される値は更新動作を決定します。値が同じままの場合、CloudFormation はこれを通常の更新と見なします。値が変わっている場合には、CloudFormation は新しい方が更新用のものであると解釈し、古いリソースに削除リクエストを送信します。詳細については、「[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)」を参照してください。  
*必須:* はい  
*タイプ*: 文字列

`Reason`  
失敗応答の理由を説明します。  
`Status` が `FAILED` の場合は必須です。それ以外の場合はオプションです。  
*必須*: 条件に応じて異なります  
*タイプ*: 文字列

`NoEcho`  
`Fn::GetAtt` 関数を使用して取得したときに、カスタムリソースの出力をマスクするかどうかを示します。`true` に設定すると、*テンプレートの `Metadata` セクションに保存されているものを除き*、すべての戻り値はアスタリスク (\$1\$1\$1\$1\$1) でマスクされます。CloudFormation は、`Metadata` セクションに含める情報の変換、変更、または編集を行いません。デフォルト値は `false` です。  
`NoEcho` を使用して機密情報をマスクする方法、および動的なパラメータを使用してシークレットを管理する方法の詳細については、「[テンプレートに認証情報を埋め込まない](security-best-practices.md#creds)」ベストプラクティスを参照してください。  
`Create` および `Update` レスポンスでのみ使用できます。`Delete` レスポンスではサポートされていません。  
*必須:* いいえ  
型: ブール

`Data`  
レスポンスで送信するカスタムリソースプロバイダー定義の名前と値のペア。ここで提供されている値には、`Fn::GetAtt` を使用してテンプレートの名前でアクセスできます。  
`Create` および `Update` レスポンスでのみ使用できます。`Delete` レスポンスではサポートされていません。  
名前と値のペアに機密情報が含まれている場合は、`NoEcho` フィールドを使用して、カスタムリソースの出力をマスクします。それ以外の場合は、プロパティ値 (`DescribeStackEvents` など) を表示する API を通じて値が表示されます。
*必須:* いいえ  
*タイプ*: JSON オブジェクト

### 成功したレスポンスの例
<a name="crpg-ref-success-response-examples"></a>

#### `Create` と `Update` レスポンス
<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` 応答
<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"
}
```

### 失敗したレスポンスの例
<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 を利用するカスタムリソース
<a name="template-custom-resources-sns"></a>

次のトピックでは、CloudFormation がリクエストを送信する Amazon SNS トピックを指定するサービストークンを使用してカスタムリソースを設定する方法を示します。また、カスタムリソーススタックの作成、更新、削除の結果として送受信されるイベントとメッセージのシーケンスについても学習します。

カスタムリソースと Amazon SNS を使用すると、新しいリソースのスタックへの追加、スタックへの動的データの挿入などのシナリオが可能になります。例えば、スタックを作成する際に、CloudFormation は、Amazon EC2 インスタンスで実行しているアプリケーションによってモニタリングされるトピックに `Create` リクエストを送信できます。Amazon SNS 通知は、許可リストされた Elastic IP アドレスのプールの取得など、追加のプロビジョニングタスクを実行するようにアプリケーションをトリガーします。完了すると、アプリケーションは、CloudFormation にスタックオペレーションの続行を通知する応答 (および該当する場合は出力データ) を送信します。

カスタムリソースのターゲットとして Amazon SNS トピックを指定すると、CloudFormation はカスタムリソースに関連するスタックオペレーション中に指定された SNS トピックにメッセージを送信します。これらのメッセージを処理して必要なアクションを実行するには、サポートされているエンドポイントが SNS トピックをサブスクライブするようにする必要があります。

カスタムリソースとその仕組みの概要については、「[カスタムリソースのしくみ](template-custom-resources.md#how-custom-resources-work)」を参照してください。Amazon SNS とその仕組みの詳細については、「[Amazon Simple Notification Service デベロッパーガイド](https://docs.aws.amazon.com/sns/latest/dg/)」を参照してください。

## Amazon SNS を利用してカスタムリソースを作成する
<a name="walkthrough-custom-resources-sns-adding-nonaws-resource"></a>

**Topics**
+ [ステップ 1: スタックの作成](#crpg-walkthrough-stack-creation)
+ [ステップ 2: スタックの更新](#crpg-walkthrough-stack-updates)
+ [ステップ 3: スタックの削除](#crpg-walkthrough-stack-deletion)

### ステップ 1: スタックの作成
<a name="crpg-walkthrough-stack-creation"></a>

1. <a name="crpg-walkthrough-stack-creation-customer-template"></a>テンプレートデベロッパーは、カスタムリソースを含む CloudFormation スタックを作成します。

   以下のテンプレート例では、論理 ID `MySeleniumTest` を持つカスタムリソースにカスタムリソースタイプ名 `Custom::SeleniumTester` を使用します。カスタムリソースタイプの名前は、英数字で 60 文字までの長さにする必要があります。

   カスタムリソースのタイプとともに、カスタムリソースプロバイダーによって定義された情報として、サービストークン、オプションのプロバイダー固有のプロパティ、オプションの [Fn::GetAtt](resources-section-structure.md#resource-properties-getatt) 属性が宣言されています。これらのプロパティと属性を使用して、template developer から custom resource provider へ、または custom resource provider から template developer へ情報を受け渡しすることができます。サービストークンは、リソースプロバイダーが設定した Amazon SNS トピックを指定します。

   ```
   {
      "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"] }
         }
      }
   }
   ```
**注記**  
`Fn::GetAtt` を使用してアクセスしたデータの名前と値は、プロバイダーから CloudFormation への応答中にカスタムリソースプロバイダーから返されます。custom resource provider がサードパーティーである場合、template developer は、それらの戻り値の名前を custom resource provider から入手する必要があります。

1. <a name="crpg-walkthrough-stack-creation-provider-request"></a>CloudFormation が、スタックに関する情報、スタックテンプレートからのカスタムリソースプロパティ、および応答のための S3 URL が含まれた `"RequestType" : "Create"` を使用して、リソースプロバイダーに Amazon SNS 通知を送信します。

   通知を送信する際に使用する SNS トピックは、テンプレートの `ServiceToken` プロパティに埋め込まれます。値をハードコーディングすることを避けるために、テンプレート開発者はテンプレートパラメータを使用します。スタックの起動時に値を入力することができます。

   次の例は、カスタムリソースの `Create` リクエストを示します。`Custom::SeleniumTester` を `LogicalResourceId` として作成されたカスタムリソースタイプの名前 (`MySeleniumTester`) が含まれています。

   ```
   {
      "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" ]
      }
   }
   ```

   `Create` リクエストのリクエストオブジェクトの詳細については、[リクエストおよびレスポンスのリファレンス](crpg-ref.md) トピックを参照してください。

1. <a name="crpg-walkthrough-stack-creation-provider-response"></a>custom resource provider は、template developer から送信されたデータを処理し、`Create` リクエストが成功したかどうかを判断します。リソースプロバイダーは、CloudFormation から送信された S3 URL を使用して、`SUCCESS` または `FAILED` の応答を送信します。

   CloudFormation に返される応答フィールドは、応答のタイプによって異なります。特定のリクエストタイプの応答フィールドの詳細については、[リクエストおよびレスポンスのリファレンス](crpg-ref.md) セクションのそのリクエストタイプのドキュメントを参照してください。

   custom resource provider は、作成リクエストまたは更新リクエストへの応答として、レスポンスの `Data` フィールドでデータ要素を返すことができます。これらは名前/値ペアであり、*名前*は、スタックテンプレートのカスタムリソースで使用されている `Fn::GetAtt` 属性に対応します。*値*は、テンプレート開発者が、リソースから属性名を使って `Fn::GetAtt` を呼び出したときに返されるデータです。

   次に、カスタムリソースのレスポンスの例を示します。

   ```
   {
      "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"
      }
   }
   ```

   `Create` リクエストの応答オブジェクトの詳細については、[リクエストおよびレスポンスのリファレンス](crpg-ref.md) トピックを参照してください。

   `StackId`、`RequestId`、および `LogicalResourceId` フィールドはリクエストからそのままコピーする必要があります。

1. <a name="crpg-walkthrough-stack-creation-stack-status"></a> CloudFormation は、スタックのステータスを `CREATE_COMPLETE` または `CREATE_FAILED` として宣言します。スタックが正常に作成された場合、テンプレート開発者は、作成したカスタムリソースの出力値に [Fn::GetAtt](resources-section-structure.md#resource-properties-getatt) でアクセスすることで使用できます。

   たとえば、先ほど例示したカスタムリソーステンプレートでは、`Fn::GetAtt` を使用してリソースの出力をスタック出力にコピーしています。

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

### ステップ 2: スタックの更新
<a name="crpg-walkthrough-stack-updates"></a>

既存のスタックを更新するには、以下の例に示すように、スタック内のリソースのプロパティの更新を指定するテンプレートを送信する必要があります。CloudFormation は、テンプレートで指定された変更があるリソースのみを更新します。詳細については、「[スタックリソースの更新動作を理解する](using-cfn-updating-stacks-update-behaviors.md)」を参照してください。

カスタムリソースの更新には、基になる物理リソースの置き換えが伴うことがあります。CloudFormation テンプレートでカスタムリソースを更新すると、CloudFormation が、そのカスタムリソースに更新リクエストを送信します。カスタムリソースを置き換えることが必要になった場合には、新しいカスタムリソースから新しい物理 ID を含むレスポンスを送信する必要があります。CloudFormation は、そのレスポンスを受け取ると、古いカスタムリソースと新しいカスタムリソースの `PhysicalResourceId` を比較します。この 2 つが異なる場合には、CloudFormation は置き換えが必要な更新と認識し、古いリソースに削除リクエストを送信します (「[ステップ 3: スタックの削除](#crpg-walkthrough-stack-deletion)」を参照)。

**注記**  
カスタムリソースに変更を行なわない場合、CloudFormation はスタック更新中にリクエストを送信しません。

1. <a name="crpg-walkthrough-stack-updates-customer-template"></a>template developerが、カスタムリソースを含んだスタックの更新を開始します。更新時、template developerは、新しいプロパティをスタックテンプレートで指定できます。

   カスタムリソースタイプを使用したスタックテンプレートに対する `Update` の例を以下に示します。

   ```
   {
      "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 が、`"RequestType" : "Update"` を使用して Amazon SNS 通知をリソースプロバイダーに送信します。これには `Create` コールに類似する情報が含まれていますが、`OldResourceProperties` フィールドに古いリソースプロパティが含まれており、ResourceProperties に更新されたリソースプロパティ (存在する場合) が含まれている点が異なります。

   次は、`Update` リクエストの例です。

   ```
   {
      "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" ]
      }
   }
   ```

   `Update` リクエストのリクエストオブジェクトの詳細については、[リクエストおよびレスポンスのリファレンス](crpg-ref.md) トピックを参照してください。

1. <a name="crpg-walkthrough-stack-updates-provider-response"></a>CloudFormation から送信されたデータをカスタムリソースプロバイダーが処理します。カスタムリソースは更新を実行し、`SUCCESS` または `FAILED` のいずれかの応答を S3 URL に送信します。その後、CloudFormation は古いカスタムリソースと新しいカスタムリソースの `PhysicalResourceIDs` を比較します。この 2 つが異なる場合には、CloudFormation は置き換えが必要な更新と認識し、古いリソースに削除リクエストを送信します。以下に示したのは、`Update` リクエストに対するcustom resource providerのレスポンスの例です。

   ```
   {
      "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"
   }
   ```

   `Update` リクエストのレスポンスオブジェクトの詳細については、[リクエストおよびレスポンスのリファレンス](crpg-ref.md)「」トピックを参照してください。

   `StackId`、`RequestId`、および `LogicalResourceId` フィールドはリクエストからそのままコピーする必要があります。

1. <a name="crpg-walkthrough-stack-updates-stack-status"></a>CloudFormation は、スタックのステータスを `UPDATE_COMPLETE` または `UPDATE_FAILED` として宣言します。更新に失敗すると、スタックはロールバックされます。スタックが正常に更新された場合、template developer は、作成したカスタムリソースの新しい出力値に `Fn::GetAtt` でアクセスすることができます。

### ステップ 3: スタックの削除
<a name="crpg-walkthrough-stack-deletion"></a>

1. <a name="crpg-walkthrough-stack-deletion-customer-template"></a>テンプレートデベロッパーは、カスタムリソースを含むスタックを削除します。CloudFormation は、スタックテンプレートで指定されている現在のプロパティを SNS トピックとともに取得し、カスタムリソースプロバイダーに対してリクエストを実行する準備をします。

1. <a name="crpg-walkthrough-stack-deletion-provider-request"></a>CloudFormation が、スタックに関する現在の情報、スタックテンプレートからのカスタムリソースプロパティ、および応答のための S3 URL が含まれた `"RequestType" : "Delete"` を使用して、リソースプロバイダーに Amazon SNS 通知を送信します。

   スタックを削除したり、カスタムリソースの削除や置き換えを伴う更新を行ったりした場合は必ず、CloudFormation によって、新旧のカスタムリソース間で `PhysicalResourceId` が比較されます。この 2 つが異なる場合には、CloudFormation は置き換えが必要な更新と認識し、古いリソース (`OldPhysicalResource`) の削除リクエストを送信します (以下の `Delete` リクエストの例を参照)。

   ```
   {
      "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" ]
      }
   }
   ```

   `Delete` リクエストのリクエストオブジェクトの詳細については、[リクエストおよびレスポンスのリファレンス](crpg-ref.md) トピックを参照してください。

   ユーザー定義の名前が指定されている場合、`DescribeStackResource`、`DescribeStackResources`、`ListStackResources` で表示できます。

1. <a name="crpg-walkthrough-stack-deletion-provider-response"></a>カスタムリソースプロバイダーは、CloudFormation から送信されたデータを処理し、`Delete` リクエストが成功したかどうかを判断します。リソースプロバイダーは、CloudFormation から送信された S3 URL を使用して、`SUCCESS` または `FAILED` の応答を送信します。カスタムリソースを持つスタックを正常に削除するには、削除リクエストに対して custom resource provider が適切に応答する必要があります。

   以下に示したのは、`Delete` リクエストに対する custom resource provider のレスポンスの例です。

   ```
   {
      "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"
   }
   ```

   `Delete` リクエストのレスポンスオブジェクトの詳細については、[リクエストおよびレスポンスのリファレンス](crpg-ref.md)「」トピックを参照してください。

   `StackId`、`RequestId`、および `LogicalResourceId` フィールドはリクエストからそのままコピーする必要があります。

1. <a name="crpg-walkthrough-stack-updates-stack-status-delete"></a>CloudFormation は、スタックのステータスを `DELETE_COMPLETE` または `DELETE_FAILED` として宣言します。

# Lambda を使用するカスタムリソース
<a name="template-custom-resources-lambda"></a>

Lambda 関数とカスタム リソースを関連付けた場合、この関数はカスタムリソースが作成、更新、または削除されるたびに呼び出されます。CloudFormation は Lambda API を呼び出して関数を呼び出し、すべてのリクエストデータ (リクエストタイプやリソースプロパティなど) を関数に渡します。Lambda 関数と CloudFormation との組み合わせによる機能性およびカスタマイズ性を活用して、スタック作成中の AMI ID の動的な検索やユーティリティ関数 (文字列反転関数など) の使用などの広範なシナリオを実現できます。

カスタムリソースとその仕組みの概要については、「[カスタムリソースのしくみ](template-custom-resources.md#how-custom-resources-work)」を参照してください。

**Topics**
+ [チュートリアル: Lambda-backed カスタムリソースを使用した遅延メカニズムの作成](walkthrough-lambda-backed-custom-resources.md)
+ [`cfn-response` モジュール](cfn-lambda-function-code-cfnresponsemodule.md)

# チュートリアル: Lambda-backed カスタムリソースを使用した遅延メカニズムの作成
<a name="walkthrough-lambda-backed-custom-resources"></a>

このチュートリアルでは、サンプルの CloudFormation テンプレートを使用して Lambda-backed カスタムリソースを設定および起動する方法を示します。このテンプレートは、指定した時間だけスタックのデプロイを一時停止する遅延メカニズムを作成します。これは、依存リソースが作成される前にリソースが安定するのを待つ場合など、リソースのプロビジョニング中に意図的な遅延を発生させる必要がある場合に便利です。

**注記**  
以前は Lambda-backed カスタムリソースによる AMI ID の取得が推奨されていましたが、現在は AWS Systems Manager パラメータの使用を推奨しています。この方法により、テンプレートの再利用性が高まり簡単にメンテナンスできます。詳細については、「[Systems Manager Parameter Store からプレーンテキスト値を取得する](dynamic-references-ssm.md)」を参照してください。

**Topics**
+ [概要:](#walkthrough-lambda-backed-custom-resources-overview)
+ [サンプルテンプレート](#walkthrough-lambda-backed-custom-resources-sample-template)
+ [サンプルテンプレートのチュートリアル](#walkthrough-lambda-backed-custom-resources-sample-template-walkthrough)
+ [前提条件](#walkthrough-lambda-backed-custom-resources-prerequisites)
+ [スタックを起動する](#walkthrough-lambda-backed-custom-resources-createfunction-createstack)
+ [リソースのクリーンアップ](#walkthrough-lambda-backed-custom-resources-createfunction-cleanup)
+ [関連情報](#w2aac11c45b9c24b9c23)

## 概要:
<a name="walkthrough-lambda-backed-custom-resources-overview"></a>

このチュートリアルで使用するスタックテンプレートのサンプルは、Lambda-backed カスタムリソースを作成します。このカスタムリソースは、スタックの作成中に設定可能な遅延 (デフォルトでは 60 秒) を発生させます。遅延は、カスタムリソースのプロパティが変更された場合にのみ、スタックの更新中に発生します。

このテンプレートでは以下のリソースが提供されます。
+ カスタムリソース
+ Lambda 関数
+ Lambda が CloudWatch にログを書き込めるようにする IAM ロール。

また、次の 2 つの出力も定義します。
+ 関数が実際に待機した時間。
+ Lambda 関数の実行ごとに生成される一意の識別子。



**注記**  
CloudFormation は無料のサービスですが、Lambda は関数のリクエスト数とコードの実行時間に基づいて課金します。Lambda の料金の詳細については、「[AWS Lambda の料金](https://aws.amazon.com/lambda/pricing/)」を参照してください。

## サンプルテンプレート
<a name="walkthrough-lambda-backed-custom-resources-sample-template"></a>

遅延メカニズムを含む Lambda-backed カスタムリソースのサンプルテンプレートは、以下のとおりです。

### 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
```

## サンプルテンプレートのチュートリアル
<a name="walkthrough-lambda-backed-custom-resources-sample-template-walkthrough"></a>

次のスニペットでは、Lambda 関数がどのようにカスタムリソースに関連付けられているのか、およびその出力を理解できるように、サンプルテンプレートの要素を抜粋して解説します。

[AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html) リソース `CFNWaiter`  
`AWS::Lambda::Function` リソースは、関数のソースコード、ハンドラー名、ランタイム環境、実行ロールの Amazon リソースネーム (ARN) を指定します。  
`Handler` プロパティは Python ソースコードを使用するため、`index.handler` に設定されます。インライン関数のソースコードを使用する場合の受け入れ済みのハンドラー識別子の詳細については、「[AWS::Lambda::Function Code](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html#cfn-lambda-function-code-zipfile)」を参照してください。  
ソースファイルは Python コードであるため、`Runtime` は `python3.9` として指定されます。  
`Timeout` は 900 秒に設定されます。  
`Role` プロパティは `Fn::GetAtt` 関数を使用して、テンプレートの `AWS::IAM::Role` リソースで宣言された `LambdaExecutionRole` 実行ロールの ARN を取得します。  
`Code` プロパティは、関数コードを、Python 関数を使用してインラインで定義します。サンプルテンプレートの Python 関数は、以下を実行します。  
+ UUID を使用して一意の ID を作成する
+ リクエストが作成または更新されたかどうかをチェックする
+ `Create` または `Update` のリクエスト中に、`ServiceTimeout` に指定された時間だけスリープ状態にする
+ 待機時間と一意の ID を返す

### 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) リソース `LambdaExecutionRole`  
`AWS::IAM:Role` リソースは Lambda 関数の実行ロールを作成します。これには、Lambda にその使用を許可するロール割り当てポリシーが含まれます。また、CloudWatch Logs へのアクセスを許可するポリシーも含まれます。

### 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) リソース `CFNWaiterCustomResource`  
カスタムリソースは、`!GetAtt CFNWaiter.Arn` を使用して、ARN を持つ Lambda 関数にリンクします。`ServiceTimeout` で設定されているように、作成および更新オペレーションに 60 秒の待機時間を実装します。リソースは、プロパティが変更された場合にのみ、更新オペレーションのために呼び出されます。

### 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`  
このテンプレートの `Outputs` は `TimeWaited`と `WaiterId` です。`TimeWaited` 値は、`Fn::GetAtt` 関数を使用して、ウェーターリソースが実際に待機した時間を指定します。`WaiterId` は `Fn::GetAtt` 関数を使用して、生成され実行に関連付けられた一意の ID を提示します。

### 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
...
```

## 前提条件
<a name="walkthrough-lambda-backed-custom-resources-prerequisites"></a>

Lambda や CloudFormation など、対応するサービスをすべて使用するには、IAM アクセス許可が必要です。

## スタックを起動する
<a name="walkthrough-lambda-backed-custom-resources-createfunction-createstack"></a>

**スタックを作成するには**

1. [サンプルテンプレート](#walkthrough-lambda-backed-custom-resources-sample-template) セクションから希望するテンプレート (YAML または JSON) を見つけ、`samplelambdabackedcustomresource.template` という名前を付けてお使いのマシンに保存します。

1. クラウドフォーメーション コンソール の[https://console.aws.amazon.com/cloudformation/](https://console.aws.amazon.com/cloudformation/) 開きます：

1. **[スタック]** ページでは、右上の **[スタックの作成]** を選択してから、**[新しいリソースを使用 (標準)]** を選択します。

1. **[前提条件 - テンプレートの準備]** で、**[既存のテンプレートを選択]** を選択します。

1. **[テンプレートの指定]** で **[テンプレートファイルのアップロード]** を選択し、**[ファイルの選択]** を選択します。

1. 前に保存した `samplelambdabackedcustomresource.template` テンプレートファイルを選択します。

1. [**次へ**] を選択します。

1. **[スタック名]** に **SampleCustomResourceStack** と入力し、**[次へ]** を選択します。

1. このチュートリアルでは、タグの追加も詳細設定の指定も不要です。[**次へ**] を選択します。

1. スタックの名前が正しいことを確認し、**[作成]** を選択します。

CloudFormation によってスタックが作成されるまでに数分かかることもあります。進捗状況を監視するには、スタックイベントを確認します。詳細については、「[CloudFormation コンソールからスタック情報を表示する](cfn-console-view-stack-data-resources.md)」を参照してください。

スタックを正常に作成できた場合は、スタック内のすべてのリソース (Lambda 関数、カスタムリソースなど) も作成されています。Lambda 関数とカスタムリソースを正常に使用できました。

Lambda 関数からエラーが返される場合は、CloudWatch Logs [コンソール](https://console.aws.amazon.com/cloudwatch/home#logs:)で関数のログを確認します。ログストリームの名前は、カスタムリソースの物理 ID です。これは、スタックのリソースを表示して確認できます。詳細については、「[Amazon CloudWatch ユーザーガイド](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#ViewingLogData)」の「*Logs に送信された CloudWatch ログデータを表示する*」を参照してください。

## リソースのクリーンアップ
<a name="walkthrough-lambda-backed-custom-resources-createfunction-cleanup"></a>

不要なリソースに対して課金されないよう、作成したすべてのスタックリソースをクリーンアップするために、スタックを削除します。

**スタックを削除するには**

1. CloudFormation コンソールから、**SampleCustomResourceStack** スタックを選択します。

1. [**アクション**] を選択し、[**スタックの削除**] を選択します。

1. 確認メッセージで、[**はい、削除する**] を選択します。

作成したすべてのリソースが削除されます。

Lambda-backed カスタムリソースの作成方法と使用方法について理解できたので、今度はこのチュートリアルで紹介したサンプルテンプレートとコードを使用して他のスタックや関数を作成し、実際に使ってみましょう。

## 関連情報
<a name="w2aac11c45b9c24b9c23"></a>
+ [CloudFormation カスタムリソースリファレンス](crpg-ref.md)
+ [AWS::CloudFormation::CustomResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-customresource.html)

# `cfn-response` モジュール
<a name="cfn-lambda-function-code-cfnresponsemodule"></a>

CloudFormation テンプレートでは、Lambda 関数をカスタムリソースのターゲットとして指定できます。`ZipFile` プロパティを使用して[関数の](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-function.html)ソースコードを指定すると、`cfn-response` モジュールをロードして、Lambda 関数からの応答をカスタムリソースに送信できます。`cfn-response` モジュールは、Lambda 関数を呼び出したカスタムリソースへの応答の送信を簡素化するライブラリです。このモジュールには `send` メソッドが含まれています。このメソッドは、Amazon S3 の署名付き URL (`ResponseURL`) を経由して、カスタムリソースに[応答オブジェクト](crpg-ref.md#crpg-ref-responses)を送信します。

`cfn-response` モジュールは、`ZipFile` プロパティを使用してソースコードを作成した場合にのみ使用できます。Amazon S3 バケットに保存されたソースコードには使用できません。バケットのコードでは、独自の関数を作成してレスポンスを送信する必要があります。

**注記**  
`send` メソッドを実行した後、Lambda 関数は終了するため、メソッドの後の記述は無視されます。

## `cfn-response` モジュールの読み込み
<a name="cfn-lambda-function-code-cfnresponsemodule-loading"></a>

Node.js 関数の場合は、`require()` 関数を使用して `cfn-response` モジュールをロードします。たとえば、次のコードでは、`cfn-response` という名前で `response` オブジェクトを作成しています。

```
var response = require('cfn-response');
```

Python の場合は、次の例に示すように、`import` ステートメントを使用して `cfnresponse` モジュールをロードします。

**注記**  
この完全インポートステートメントを使用します。インポートステートメントの他の形式では、CloudFormation では応答モジュールが含まれません。

```
import cfnresponse
```

## `send` メソッドのパラメータ
<a name="cfn-lambda-function-code-cfnresponsemodule-send-parameters"></a>

`send` メソッドで次のパラメータを使用できます。

`event`  
[カスタムリソースのリクエスト](crpg-ref.md#crpg-ref-requesttypes)に含まれるフィールド。

`context`  
関数および任意のコールバックが実行完了したとき、または Lambda 実行環境内からの情報にアクセスするときに指定できる Lambda 関数固有のオブジェクト。詳細については、『AWS Lambda デベロッパーガイド』の「[Node.js による Lambda 関数のビルド](https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html)」を参照してください。

`responseStatus`  
関数が正常に完了したかどうか。このステータスを指定するには、`cfnresponse` モジュール定数を使用します。成功に実行した場合は `SUCCESS`、失敗した場合は `FAILED` を指定します。

`responseData`  
カスタムリソースの[応答オブジェクト](crpg-ref.md#crpg-ref-responses)の `Data` フィールド。データの内容は、名前と値のペアのリストです。

`physicalResourceId`  
オプション。関数を呼び出したカスタムリソースの一意の識別子。モジュールのデフォルトでは、Lambda 関数に関連付けられている Amazon CloudWatch Logs ログストリームの名前が使用されます。  
`PhysicalResourceId` に返された値は、カスタムリソース更新オペレーションを変更できます。返される値が同じであれば、通常の更新と見なされます。返された値が異なる場合には、CloudFormation は新しい方が更新用のものであると認識し、古いリソースに削除リクエストを送信します。詳細については、「[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`  
オプション。`Fn::GetAtt` 関数を使用してカスタムリソースの出力を取得したときに、それをマスクするかどうかを示します。`true` に設定すると、返される値はすべてアスタリスク (\$1\$1\$1\$1\$1) でマスクされます。ただし、以下に指定した場所に保存されている情報は除きます。デフォルトでは、この値は `false` です。  
`NoEcho` 属性を使用しても、以下に保存されている情報はマスクされません。  
+ `Metadata` テンプレートセクション。CloudFormation は、`Metadata` セクションに含める情報の変換、変更、または編集を行いません。詳細については、「[メタデータ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html)」を参照してください。
+ `Outputs` テンプレートセクション。詳細については、「[出力](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html)」を参照してください。
+ リソース定義の `Metadata` 属性。詳細については、「[`Metadata` 属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-metadata.html)」を参照してください。
パスワードやシークレットなどの機密情報を含めるには、これらのメカニズムを使用しないことを強くお勧めします。
機密情報をマスキングするために `NoEcho` を使用する方法の詳細については、[テンプレートに認証情報を埋め込まない](security-best-practices.md#creds) に関するベストプラクティスを参照してください。

## 例
<a name="cfn-lambda-function-code-cfnresponsemodule-examples"></a>

### Node.js
<a name="cfn-lambda-function-code-zipfile-examplenodejs"></a>

次の Node.js の例では、インラインの Lambda 関数で入力値を受け取り、その値に 5 を乗算しています。インライン関数は、パッケージを作成して Amazon S3 バケットにアップロードするのではなく、ソースコードをテンプレート内で直接指定できるため、小さな関数の場合は特に便利です。この関数では、`cfn-response` の `send` メソッドを使用して、呼び出たカスタムリソースに結果を返しています。

#### 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>

次の Python の例では、インラインの Lambda 関数で整数値を受け取り、その値に 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")
```

## モジュールのソースコード
<a name="cfn-lambda-function-code-cfnresponsemodule-source"></a>

**Topics**
+ [非同期 Node.js ソースコード](#cfn-lambda-function-code-cfnresponsemodule-source-nodejs-async)
+ [Node.js ソースコード](#cfn-lambda-function-code-cfnresponsemodule-source-nodejs)
+ [Python ソースコード](#cfn-lambda-function-code-cfnresponsemodule-source-python)

### 非同期 Node.js ソースコード
<a name="cfn-lambda-function-code-cfnresponsemodule-source-nodejs-async"></a>

ハンドラーが非同期である場合の Node.js 関数のレスポンスモジュールのソースコードは次のとおりです。これを確認してモジュールの動作を理解し、独自の応答関数の実装に役立ててください。

```
// 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 ソースコード
<a name="cfn-lambda-function-code-cfnresponsemodule-source-nodejs"></a>

ハンドラーが非同期でない場合の Node.js 関数のレスポンスモジュールのソースコードは次のとおりです。これを確認してモジュールの動作を理解し、独自の応答関数の実装に役立ててください。

```
// 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 ソースコード
<a name="cfn-lambda-function-code-cfnresponsemodule-source-python"></a>

Python 関数のレスポンスモジュールのソースコードは次のとおりです。

```
# 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)
```

# テンプレートマクロを使用して CloudFormation テンプレートでカスタム処理を実行する
<a name="template-macros"></a>

マクロを使用すると、検索して置換操作のような単純なアクションからテンプレート全体の広範な変換まで、テンプレートに対してカスタム処理を実行できるようになります。

幅広い可能性を把握するために、CloudFormation がホストするマクロである `AWS::Include` および `AWS::Serverless` トランスフォームを検討してください。
+ [AWS::Include 変換](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html)を使用すると、定型のテンプレートスニペットをテンプレートに挿入できます。
+ [AWS::Serverless 変換](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-serverless.html) は、AWS サーバーレスアプリケーションモデル (AWS SAM) 構文で記述されたテンプレート全体を受け取って、互換性のある CloudFormation テンプレートに変換および拡張します。サーバーレスアプリケーションおよび AWS SAM の詳細については、「[AWS Serverless Application Model デベロッパーガイド](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html)」を参照してください。

**Topics**
+ [料金](#template-macros-billing)
+ [マクロの例](#template-macros-examples-list)
+ [関連リソース](#template-macros-related-resources)
+ [CloudFormation マクロの概要](template-macros-overview.md)
+ [CloudFormation マクロ定義を作成する](template-macros-author.md)
+ [シンプルな文字列置換マクロの例](macros-example.md)
+ [処理されたテンプレートをトラブルシューティングする](template-macros-troubleshoot-processed-template.md)

## 料金
<a name="template-macros-billing"></a>

マクロが実行されると、その関数の実行に関連する料金が Lambda 関数の所有者に請求されます。

`AWS::Include` および `AWS::Serverless` トランスフォームは、CloudFormation がホストするマクロです。これらの使用料は発生しません。

## マクロの例
<a name="template-macros-examples-list"></a>

このセクションの例に加えて、ソースコードやテンプレートを含むサンプルマクロが [GitHub リポジトリ](https://github.com/aws-cloudformation/aws-cloudformation-templates/tree/main/CloudFormation/MacrosExamples)にあります。これらの例は、説明を目的として「現状のまま」提供されています。

## 関連リソース
<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 テンプレートの Transform セクション](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 変換](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-serverless.html)
+ [AWS::Include 変換](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html)

# CloudFormation マクロの概要
<a name="template-macros-overview"></a>

マクロを使用してテンプレートを処理するには、2 つの主要なステップがあります。マクロ自体を作成すること、そして次にマクロを使用してテンプレートに対して処理を実行することです。

マクロ定義を作成するには、以下を作成する必要があります:
+ テンプレート処理を実行するための Lambda 関数。この Lambda 関数は、スニペットまたはテンプレート全体、およびユーザーが定義した追加のパラメーターを受け入れます。処理されたテンプレートスニペットまたはテンプレート全体をレスポンスとして返します。
+ [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 テンプレート内から Lambda 関数を呼び出すことができます。このリソースは、このマクロを呼び出して Lambda 関数の ARN、およびデバッグを支援するための追加のオプションプロパティを指定します。このリソースをアカウント内に作成するには、`AWS::CloudFormation::Macro` リソースを記述したテンプレートを作成し、次にそのテンプレートからセルフマネージド型のアクセス許可を持つスタックまたはスタックセットを作成します。CloudFormationStackSets では現在、 マクロを参照するテンプレートから、サービスマネージド型アクセス許可を使用してスタックセットを作成または更新することができません。

マクロを使用するには、テンプレート内の次のマクロを参照してください。
+ テンプレートのセクション、つまりパートを処理するには、変換したいテンプレートのコンテンツを基準にして配置されている `Fn::Transform` 関数内のマクロを参照します。`Fn::Transform` を使うときは、必要とされる特定のパラメータを渡すこともできます。
+ テンプレート全体を処理するには、[Transform](transform-section-structure.md) セクションでマクロを参照してください。

次に、通常は変更セットを作成して実行します。(マクロを処理すると、気付かないうちに複数のリソースが追加されていることがあります。マクロに伴うすべての変更を確実に認識できるように、変更セットを使用することを強くお勧めします。) CloudFormation は、マクロリソースに指定された Lambda 関数に、指定されたテンプレートコンテンツとその他の指定されたパラメータを渡します。Lambda 関数は、スニペットまたはテンプレート全体で処理されたテンプレートコンテンツを返します。

テンプレート内のすべてのマクロが呼び出されたら、CloudFormation はテンプレートで処理したコンテンツを含めた変更セットを生成します。変更セットを確認したら、これを実行して変更を適用します。

![\[Fn::Transform 組み込み関数またはテンプレートの Transform セクションを使用して、処理されたテンプレートの内容を返すマクロの基盤となる Lambda 関数にテンプレートの内容と関連付けられたパラメーターを渡します。\]](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/images/template-macro-use.png)


## スタックを直接作成する方法
<a name="template-macros-change-sets"></a>

マクロを参照するテンプレートを使用してスタックを作成または更新するには、通常、変更セットを作成して実行します。変更セットは、処理されたテンプレートに基づいて CloudFormation が実行するアクションを記述します。マクロを処理すると、知らないうちに複数のリソースが追加される可能性があります。マクロに伴うすべての変更を確実に認識できるように、変更セットを使用することを強くお勧めします。変更セットを確認したら、これを実行して実際に変更を適用します。

マクロによってテンプレートに IAM リソースが追加されることがあります。これらのリソースの場合、[それぞれどのような機能を備えているかを確認](control-access-with-iam.md#using-iam-capabilities)する必要があります。CloudFormation は、テンプレートを処理しなければ、どのリソースが追加されるのかを認識することができません。そのため、参照されたマクロに IAM リソースが含まれている場合は、IAM の機能を把握したうえで変更セットを作成する必要があります。こうすることで、変更セットを実行するときに、CloudFormation が IAM リソースを作成するために必要な機能を準備できます。

変更セット内の提案された変更を最初に確認せずに、処理済みのテンプレートから直接スタックを作成または更新するには、`CreateStack` または `UpdateStack` リクエスト中に `CAPABILITY_AUTO_EXPAND` 機能を指定します。マクロが含まれているスタックテンプレートから直接スタックを作成するのは、どのような処理がマクロで実行されるかを把握している場合に限ります。スタックセットマクロで変更セットを使用することはできません。スタックセットを直接更新してください。

詳細については、「AWS CloudFormation API リファレンス」の「[https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html)」または「[https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStack.html)」を参照してください。

**重要**  
スタックセットテンプレートに 1 つ以上のマクロが参照されており、変更セットの結果を確認せずに、処理されたテンプレートから直接スタックセットを作成する必要があります。マクロを処理すると、知らないうちに複数のリソースが追加される可能性があります。マクロを参照するテンプレートから直接スタックを作成または更新する前に、どのような処理がマクロで実行されるかを確認してください。

マクロを参照するテンプレートからスタックを起動する際のステップ数を減らすには、`package` および `deploy` AWS CLI コマンドを使用できます。詳細については、「[AWS CLI を使用してローカルアーティファクトを S3 バケットにアップロードする](using-cfn-cli-package.md)」および「[変換が含まれるスタックを作成する](service_code_examples.md#deploy-sdk)」を参照してください。

## 考慮事項
<a name="template-macros-considerations"></a>

マクロを使用する場合は、次の注意事項と制限事項に留意してください。
+ マクロは Lambda を使用できる AWS リージョン でのみサポートされます。Lambda を使用できるリージョンのリストについては、「[AWS Lambda endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/lambda-service.html)」( エンドポイントとクォータ) を参照してください。
+ 処理されたテンプレートスニペットはすべて有効な JSON である必要があります。
+ 処理されたテンプレートのスニペットは、スタックの作成、スタックの更新、スタックセットの作成、またはスタックセットの更新オペレーションの検証チェックに合格する必要があります。
+ CloudFormation は、まずマクロを解決し、次にテンプレートを処理します。生成されるテンプレートは有効な JSON である必要があり、テンプレートサイズ制限を超えることはできません。
+ CloudFormation がテンプレート内のエレメントを処理する順序のため、マクロは CloudFormation に返される処理済みテンプレートコンテンツにモジュールを含めることはできません。詳細については、「[マクロ評価順](template-macros-author.md#template-macros-order)」を参照してください。
+ 更新ロールバック機能を使用する場合、CloudFormation は元のテンプレートのコピーを使用します。含まれるスニペットが変更されていても、元のテンプレートにロールバックされます。
+ マクロは再帰的に処理されないため、マクロをマクロ内に含めることはできません。
+ `Fn::ImportValue` 組み込み関数は、現在マクロではサポートされていません。
+ テンプレートに含まれている組み込み関数は、マクロの後で評価されます。したがって、マクロが返す処理済みテンプレートコンテンツに組み込み関数の呼び出しを含めることができ、それらは通常どおりに評価されます。
+ StackSets では現在、マクロを参照するテンプレートから、サービスマネージド型アクセス許可を使用してスタックセットを作成または更新することができません。

## マクロアカウントの範囲と許可
<a name="template-macros-permissions"></a>

マクロは、リソースとして作成されたアカウントでのみ使用できます。マクロ名は指定のアカウント内で一意である必要があります。ただし、基盤となる Lambda 関数でクロスアカウントアクセスを有効にし、その後複数のアカウントでその機能を参照するマクロ定義を作成することで、同じ機能を複数のアカウントで使用できるようにすることができます。以下の例では、3 つのアカウントにそれぞれ同じ Lambda 関数を指すマクロ定義が含まれています。

![\[Lambda 関数でクロスアカウントアクセスを許可することで、AWS はその関数を参照するマクロを複数のアカウントで作成することを可能にします。\]](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/images/template-macro-accounts.png)


マクロ定義を作成するには、ユーザーは指定されたアカウント内にスタックまたはスタックセットを作成するための許可を持っていなければなりません。

CloudFormation がテンプレートに含まれているマクロを正常に実行するには、ユーザーは基盤となる Lambda 関数に対する `Invoke` アクセス権限を持っている必要があります。アクセス権限がエスカレーションしないよう、マクロの実行中に CloudFormation はユーザーとして振る舞います。

詳細については、「*AWS Lambda デベロッパーガイド*]の「[Managing permissions in AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-permissions.html)」および[*サービス認可リファレンス*」の「[Actions, resources, and condition keys for AWS Lambda](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awslambda.html)」を参照してください。

# CloudFormation マクロ定義を作成する
<a name="template-macros-author"></a>

マクロ定義を作成すると、指定されたアカウントで基盤となる Lambda 関数が使用可能になり、CloudFormation はその関数を呼び出してテンプレートを処理します。

## イベントマッピング
<a name="template-macros-event-mapping"></a>

CloudFormation がマクロの Lambda 関数を呼び出すと、次の構造を使用して JSON 形式でリクエストを送信します:

```
{
    "region" : "us-east-1",
    "accountId" : "$ACCOUNT_ID",
    "fragment" : { ... },
    "transformId" : "$TRANSFORM_ID",
    "params" : { ... },
    "requestId" : "$REQUEST_ID",
    "templateParameterValues" : { ... }
}
```
+ `region`

  マクロが存在するリージョン。
+ `accountId`

  マクロが Lambda 関数を呼び出しているアカウントのアカウント ID。
+ `fragment`

  カスタム処理に使用可能なテンプレートコンテンツ (JSON 形式)。
  + `Transform` テンプレートセクションに含まれるマクロの場合は、`Transform` セクションを除くテンプレート全体になります。
  + `Fn::Transform` 組み込み関数呼び出しに含まれるマクロでは、`Fn::Transform` 関数を除く、テンプレート内の組み込み関数の場所に基づくすべての兄弟ノード (およびその子ノード) が含まれます。詳細については、「[マクロテンプレートスコープ](#template-macros-scope)」を参照してください。
+ `transformId`

  この関数を呼び出すマクロの名前
+ `params`

  `Fn::Transform` 関数呼び出しの場合、関数に指定されたパラメータ。CloudFormation は、事前に評価することなく、こうしたパラメータを関数に渡します。

  `Transform` テンプレートセクションに含まれるマクロの場合、このセクションは空です。
+ `requestId`

  この関数を呼び出すリクエストの ID です。
+ `templateParameterValues`

  テンプレートの [Parameters](parameters-section-structure.md) セクションに指定されたパラメータ。CloudFormation は、事前に評価してから、こうしたパラメータを関数に渡します。

## レスポンスの形式
<a name="template-macros-response-format"></a>

CloudFormation は、Lambda 関数が次の JSON 形式でレスポンスを返すと想定しています。

```
{
    "requestId" : "$REQUEST_ID",
    "status" : "$STATUS",
    "fragment" : { ... },
    "errorMessage": "optional error message for failures"
}
```
+ `requestId`

  この関数を呼び出すリクエストの ID です。関数を呼び出すときに CloudFormation から提供されたリクエスト ID と一致する必要があります。
+ `status`

  リクエストのステータスです (大文字小文字を区別しません)。`success` のように設定する必要があります。CloudFormation は、他のすべてのレスポンスを失敗として扱います。
+ `fragment`

  処理済みのテンプレートに含められる、CloudFormation が処理したテンプレートコンテンツ (兄弟など)。CloudFormation は、Lambda 関数に渡されるテンプレートコンテンツを Lambda レスポンスで受け取るテンプレートフラグメントに置き換えます。

  処理されたテンプレートのコンテンツは有効な JSON であり、処理されたテンプレートに含まれると有効なテンプレートになる必要があります。

  関数が実際に CloudFormation から渡されるテンプレートコンテンツを変更しないものの、処理済みのテンプレートにそのコンテンツを含める必要がある場合、関数はレスポンスとしてそのテンプレートコンテンツを CloudFormation に返す必要があります。
+ `errorMessage`

  変換が失敗した理由を説明するエラーメッセージ。CloudFormation は、スタックの **[Stack details]** (スタックの詳細) ページの **[Events]** (イベント) ペインに、このエラーメッセージを表示します。

  例えば、次のようになります。

  ```
  Error creating change set: Transform
                              AWS アカウント account
                              number::macro name failed with:
                              error message string.
  ```

## マクロ定義を作成する
<a name="create-a-macro-definition"></a>

**CloudFormation マクロ定義を作成するには**

1. テンプレートコンテンツの処理を処理する [Lambda 関数を構築](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)します。テンプレート全体までの、テンプレートの任意の部分を処理することができます。

1. `AWS::CloudFormation::Macro` リソースタイプを含む CloudFormation テンプレートを作成し、`Name` および `FunctionName` プロパティを指定します。`FunctionName` プロパティは、CloudFormation がマクロを実行するときに呼び出す Lambda 関数の ARN を含む必要があります。

1. (オプション) デバッグを支援するために、マクロの `AWS::CloudFormation::Macro` リソースタイプを作成する際に `LogGroupName` プロパティと `LogRoleArn` プロパティを指定することもできます。これらのプロパティを使用すると、マクロの基盤となる Lambda 関数を呼び出すときに CloudFormation がエラーログ情報を送信する CloudWatch Logs ロググループを指定でき、またそれらのログにログエントリを送信するときに CloudFormation が引き受けるロールを指定できます。

1. 使用するアカウントのマクロでテンプレートを使用して[スタックを作成](cfn-console-create-stack.md)します。あるいは、管理者アカウントのマクロでテンプレートを使用して[セルフマネージド許可を持つスタックセットを作成](stacksets-getting-started-create-self-managed.md)し、ターゲットアカウントにスタックインスタンスを作成します。

1. CloudFormation がマクロ定義を含むスタックを正常に作成したら、そのアカウント内でマクロを使用できるようになります。処理するテンプレートの内容に関連する適切な場所で、テンプレート内でマクロを参照して使用します。

## マクロテンプレートスコープ
<a name="template-macros-scope"></a>

テンプレートの `Transform` セクションで参照されているマクロは、そのテンプレートの内容全体を処理できます。

`Fn::Transform` 関数で参照されているマクロは、テンプレート内のその `Fn::Transform` 関数の兄弟要素 (子を含む) の内容を処理できます。

たとえば、以下のテンプレートサンプルでは、`AWS::Include` は、それ自身を含む `Fn::Transform` 関数の場所に基づいて、`MyBucket` プロパティを処理できます。`MyMacro` は、`Transform` セクションに含まれているため、テンプレート全体の内容を処理できます。

```
# 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
```

## マクロ評価順
<a name="template-macros-order"></a>

テンプレートによっては、CloudFormation がホストするトランスフォーム ([https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-include.html) や [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-serverless.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/transform-aws-serverless.html) など) をはじめ複数のマクロを参照できます。

マクロは、テンプレート内の位置に基づいて、最も深く外側にネストされているものから最も一般的なものまで順番に評価されます。テンプレート内の同じ場所にあるマクロは、リストされている順序に基づいて順番に評価されます。

`AWS::Include` や `AWS::Transform` などの変換は、アクションの順序と範囲の点で他のマクロと同じように扱われます。

例えば、以下のテンプレートサンプルでは、`PolicyAdder` マクロが最初に評価されます。テンプレート内で最も深くネストされているからです。次に、`AWS::Serverless` よりも先に `MyMacro` が評価されます。`Transform` セクションで `AWS::Serverless` より前に記述されているからです。

```
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
```

# シンプルな文字列置換マクロの例
<a name="macros-example"></a>

次の例では、マクロを使用するプロセスとして、テンプレートでのマクロの定義、マクロ用の Lambda 関数の作成、テンプレートでのマクロの使用について説明します。

この例では、処理されたテンプレートの指定されたターゲットコンテンツの代わりに指定された文字列を挿入する簡単なマクロを作成します。次に、それを使用して、処理されたテンプレート内の指定された場所に空白の `WaitHandleCondition` を挿入します。

## マクロの作成
<a name="macros-example-definiton"></a>

マクロを使用する前に、次の 2 つのことを完了する必要があります。目的のテンプレート処理を実行する Lambda 関数を作成してからマクロ定義を作成し、その Lambda 関数を CloudFormation で使用できるようにすることです。

次のサンプルテンプレートには、サンプルマクロの定義が含まれています。特定の AWS アカウント でマクロを利用できるようにするために、テンプレートからスタックを作成します。マクロ定義は、マクロ名、簡単な説明を指定し、このマクロがテンプレートで使用されたときに CloudFormation が呼び出す Lambda 関数の ARN を参照します。(エラーログ用の `LogGroupName` または `LogRoleARN` プロパティは含めていません。) 

この例では、このテンプレートから作成されたスタックの名前が `JavaMacroFunc` であるとします。マクロの `Name` プロパティはスタック名に設定されているので、結果として得られるマクロも `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'
```

## マクロの使用
<a name="macros-example-usage"></a>

マクロを使用するには、`Fn::Transform` 組み込み関数を使用してそれをテンプレートに含めます。

以下のテンプレートを使用してスタックを作成すると、CloudFormation はサンプルマクロを呼び出します。基盤となる Lambda 関数は、指定された文字列を別の指定された文字列で置き換えます。この場合、結果は空白になり `AWS::CloudFormation::WaitConditionHandle` が処理済みテンプレートに挿入されます。

```
Parameters:
  ExampleParameter:
    Type: String
    Default: 'SampleMacro'

Resources:
  2a:
    Fn::Transform:
      Name: "JavaMacroFunc"
      Parameters:
        replacement: 'AWS::CloudFormation::WaitConditionHandle'
        target: '$$REPLACEMENT$$'
    Type: '$$REPLACEMENT$$'
```
+ 呼び出すマクロは、前のマクロ定義の例の `JavaMacroFunc` として指定されています。
+ このマクロには、`target` と `replacement` の 2 つのパラメータが渡されます。これらは、ターゲット文字列とその目的の置換値を表します。
+ `Type` はマクロを参照する `Fn::Transform` 関数の兄弟であるため、マクロは `Type` ノードの内容を操作できます。
+ 結果の `AWS::CloudFormation::WaitConditionHandle` は `2a` という名前になります。
+ テンプレートには、テンプレートパラメータ `ExampleParameter` も含まれています。このパラメータには、マクロからもアクセスできます (ただし、この場合は使用しません)。

## Lambda 入力データ
<a name="macros-example-request"></a>

CloudFormation がスタックの作成中にサンプルのテンプレートを処理するときに、`JavaMacroFunc` マクロ定義で参照されている Lambda 関数に次のイベントマッピングを渡します。
+ `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` には、マクロが処理できるテンプレートフラグメントを表す JSON が含まれています。このフラグメントは `Fn::Transform` 関数呼び出しの兄弟で構成されていますが、関数呼び出しそのものではありません。また、`params` にはマクロパラメータを表す JSON が含まれています。この場合は、置き換えとターゲットです 同様に、`templateParameterValues` には、テンプレート全体として指定されたパラメータを表す JSON が含まれています。

## Lambda 関数コード
<a name="macros-example-function"></a>

以下は、`JavaMacroFunc` マクロの基礎となる Lambda 関数の実際のコードです。指定されたターゲット文字列を探しながら、応答に含まれるテンプレートフラグメント (文字列、リスト、マップ形式など) を繰り返し処理します。指定されたターゲット文字列が見つかった場合、Lambda 関数はターゲット文字列を指定された置換文字列で置き換えます。そうでない場合は、関数はテンプレートフラグメントを変更しないままにします。それから、関数は 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;
    }
}
```

## Lambda 関数レスポンス
<a name="macros-example-response"></a>

以下は、Lambda 関数が処理のために CloudFormation に返すマッピングです。
+ `requestId` : `5dba79b5-f117-4de0-9ce4-d40363bfb6ab`
+ `status` : `SUCCESS`
+ `fragment` :

  ```
  {
    "Type": "AWS::CloudFormation::WaitConditionHandle"
  }
  ```

`requestId` は CloudFormation から送信されたものと一致し、`status` 値 `SUCCESS` は Lambda 関数がリクエストに含まれるテンプレートフラグメントを正常に処理したことを示します。このレスポンスでは、`fragment` は元のテンプレートスニペットの代わりに処理されたテンプレートに挿入するコンテンツを表す JSON を含んでいます。

## 結果として得られる処理済みテンプレート
<a name="macros-example-processed"></a>

CloudFormation は、Lambda 関数から正常な応答を受け取ると、返されたテンプレートフラグメントを処理済みテンプレートに挿入します。

以下は、この例で処理されたテンプレートです。`JavaMacroFunc` マクロを参照した `Fn::Transform` 組み込み関数呼び出しは含まれなくなりました。Lambda 関数によって返されたテンプレートフラグメントは適切な場所に含まれ、その結果、`"Type": "$$REPLACEMENT$$"` は `"Type": "AWS::CloudFormation::WaitConditionHandle"` に置き換えられています。

```
{
    "Parameters": {
        "ExampleParameter": {
            "Default": "SampleMacro",
            "Type": "String"
        }
    },
    "Resources": {
        "2a": {
            "Type": "AWS::CloudFormation::WaitConditionHandle"
        }
    }
}
```

# 処理されたテンプレートをトラブルシューティングする
<a name="template-macros-troubleshoot-processed-template"></a>

マクロを使用する場合、処理されたテンプレートは CloudFormation コンソールにあります。

テンプレートのステージは、その処理ステータスを示します:
+ `Original`: ユーザーがスタックまたはスタックセットを作成または更新するために最初に送信したテンプレートです。
+ `Processed`: 参照されたマクロを処理した後にスタックまたはスタックセットを作成または更新するために CloudFormation が使用したテンプレートです。元のテンプレートが YAML としてフォーマットされていても、処理されたテンプレートは JSON としてフォーマットされます。

トラブルシューティングには、処理済みのテンプレートを使用します。テンプレートがマクロを参照していない場合は、オリジナルと処理済みのテンプレートは同一です。

詳細については、「[CloudFormation コンソールからスタック情報を表示する](cfn-console-view-stack-data-resources.md)」を参照してください。

AWS CLI を使用して処理されたテンプレートを取得するには、[get-template](service_code_examples.md#get-template-sdk) コマンドを使用します。

## サイズ制限
<a name="template-macros-size-limitation"></a>

処理されたスタックテンプレートの最大サイズは、`CreateStack`、`UpdateStack`、または `ValidateTemplate` リクエスト内に直接渡す場合は 51,200 バイトです。Amazon S3 テンプレート URL を使用して S3 オブジェクトとして渡す場合は 1 MB です。ただし、CloudFormation はテンプレート内のマクロを連続的に処理するため、処理中にテンプレートの一時的な状態が更新されます。このため、処理中のテンプレートのサイズは、完全に処理されたテンプレートの許容サイズを一時的に超える場合があります。CloudFormation は、これらのインプロセステンプレートにいくらかのバッファを許可します。ただし、テンプレートやマクロを設計する際は、処理済みのスタックテンプレートの最大許容サイズに留意してください。

テンプレートの処理中に CloudFormation から `Transformation data limit exceeded` エラーが返された場合は、CloudFormation で処理中に許容される最大テンプレートサイズを超えています。

この問題を解決するには、以下の対処を検討してください。
+ テンプレートを複数のテンプレートに再構成し、処理中のテンプレートが最大サイズを超えないようにします。例:
  + ネストされたスタックテンプレートを使用して、テンプレートの各パートをカプセル化します。詳細については、「[ネストされたスタックを使用してテンプレートを再利用可能な部分に分割する](using-cfn-nested-stacks.md)」を参照してください。
  + 複数のスタックを作成し、クロススタック参照を使用してスタック間で情報を交換します。詳細については、「[別の CloudFormation スタックのリソース出力を参照する](walkthrough-crossstackref.md)」を参照してください。
+ 特定のマクロから返されるテンプレートフラグメントのサイズを小さくします。CloudFormation はマクロから返されるフラグメントの内容には干渉しません。

# ネストされたスタックを使用してテンプレートを再利用可能な部分に分割する
<a name="using-cfn-nested-stacks"></a>

インフラストラクチャが拡張するにつれて、複数のテンプレートで同一のリソース構成を繰り返し作成する場合があります。このような重複を避けるために、共通の構成を専用のテンプレートに分離できます。次に、他のテンプレートで [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) リソースを使用してこれらの専用テンプレートを参照し、ネストされたスタックを作成できます。

たとえば、ほとんどのスタックに使用しているロードバランサー構成があると仮定します。テンプレートに同じ構成をコピーアンドペーストする代わりに、ロードバランサーを対象にした専用テンプレートを作成できます。次に、同じロードバランサー構成を必要とする他のテンプレート内からこのテンプレートを参照できます。

ネストされたスタックには他のネストされたスタックを含めることができるため、次の図に示すようにスタックの階層になっています。ルートスタックは、ネストされたすべてのスタックが最終的に属する最上位スタックです。ネストされたスタックにはそれぞれ、直接の親スタックが存在します。第 1 レベルのネストされたスタックの場合は、ルートスタックにも親スタックが存在します。
+ スタック A は、階層内のネストされたその他すべてのスタックのルートスタックを表します。
+ スタック B から見ると、スタック A は親スタックであると同時にルートスタックでもあります。
+ スタック D から見るとスタック C が親スタック、スタック C から見るとスタック B が親スタックです。

![\[別のスタックの一部として作成されているネストされたスタックには、直接の親スタックと最上位のルートスタックが存在します。\]](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/images/cfn-console-nested-stacks.png)


**Topics**
+ [テンプレート分割の前後の例](#create-nested-stack-template)
+ [ネストされたスタックのアーキテクチャの例](#nested-stack-examples)
+ [ネストされたスタックでのスタックオペレーションの実行](#perform-stack-operations-on-nested-stacks)
+ [関連情報](#nested-stacks-related-information)

## テンプレート分割の前後の例
<a name="create-nested-stack-template"></a>

この例では、単一の大規模な CloudFormation テンプレートを、ネストされたテンプレートを使用するより構造的で再利用可能な設計に再編成する方法を説明します。元の「ネスト前のスタック」テンプレートでは、1 つのファイルにすべてのリソースが定義されているのがわかります。このテンプレートは、リソースの数が増えるにつれて煩雑になり、管理しにくくなる可能性があります。「ネスト後のスタック」テンプレートは、リソースをより小規模な個別のテンプレートに分割しています。ネストされたスタックは、それぞれが関連するリソースの特定のセットを処理するため、構造全体がよりよく整理され、維持しやすくなります。


| スタックをネストする前 | スタックをネストした後 | 
| --- | --- | 
| <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> | 

## ネストされたスタックのアーキテクチャの例
<a name="nested-stack-examples"></a>

このセクションでは、ネストされたスタックを参照する最上位スタックで構成される、ネストされたスタックのアーキテクチャを示します。ネストされたスタックは、Node.js Lambda 関数をデプロイし、最上位スタックからパラメータ値を受け取り、出力値を返します。この出力値は最上位スタックを通じて公開されます。

**Topics**
+ [ステップ 1: ローカルシステムにネストされたスタック用のテンプレートを作成する](#create-a-nested-stack-template)
+ [ステップ 2: ローカルシステムで最上位スタックのテンプレートを作成する](#create-a-nested-stack-parent-template)
+ [ステップ 3: テンプレートをパッケージ化してデプロイする](#create-a-nested-stack-parent-template)

### ステップ 1: ローカルシステムにネストされたスタック用のテンプレートを作成する
<a name="create-a-nested-stack-template"></a>

次の例は、ネストされたスタックテンプレートの形式を示しています。

#### 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
```

### ステップ 2: ローカルシステムで最上位スタックのテンプレートを作成する
<a name="create-a-nested-stack-parent-template"></a>

次の例は、最上位スタックのテンプレートの形式と、前のステップで作成したスタックを参照する [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) リソースを示しています。

#### 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
```

### ステップ 3: テンプレートをパッケージ化してデプロイする
<a name="create-a-nested-stack-parent-template"></a>

**注記**  
ローカルでテンプレートを操作する際は、AWS CLI **package** コマンドを使用すると、デプロイの準備を行うのに役立ちます。このコマンドは、ローカルのアーティファクト (`TemplateURL` を含む) を自動的に Amazon S3 にアップロードし、これらの S3 の場所への更新された参照を含む新しいテンプレートファイルを生成します。詳細については、「[AWS CLI を使用してローカルアーティファクトを S3 バケットにアップロードする](using-cfn-cli-package.md)」を参照してください。

次に、[https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html) コマンドを使用して、ネストされたテンプレートを Amazon S3 バケットにアップロードできます。

```
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
```

このコマンドは、`--output-template-file` で指定されたパスで新しいテンプレートを生成します。次に示すように、`TemplateURL` 参照を Amazon S3 の場所に置き換えます。

**作成されるテンプレート**

```
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
```

**package** コマンドを実行したら、[https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/) コマンドを使用して処理されたテンプレートをデプロイできます。IAM リソースが含まれるネストされたスタックについては、`--capabilities` オプションを含めることによって IAM の機能に同意する必要があります。

```
aws cloudformation deploy \
  --template-file packaged-template.yaml \
  --stack-name stack-name \
  --capabilities CAPABILITY_NAMED_IAM
```

## ネストされたスタックでのスタックオペレーションの実行
<a name="perform-stack-operations-on-nested-stacks"></a>

ネストされたスタックを扱う場合は、操作時に注意が必要です。特定のスタックオペレーション (例: スタックの更新) では、ネストされたスタックから直接実行するのではなく、ルートスタックから起動する必要があります。ルートスタックを更新すると、テンプレートが変更されたネストされたスタックのみが更新されます。

さらに、ネストされたスタックがあると、ルートスタックでのオペレーションに影響する場合があります。たとえば、ネストされたスタックの 1 つが `UPDATE_ROLLBACK_IN_PROGRESS` 状態でスタックした場合、ルートスタックはそのネストされたスタックがロールバックを完了するまで待機してから続行します。更新オペレーションに進む前に、スタックの更新がロールバックされた場合にキャンセルする IAM アクセス権限があることを確認してください。詳細については、「[AWS Identity and Access Management で CloudFormation アクセスを制御する](control-access-with-iam.md)」を参照してください。

ルートスタックとネストされたスタックを検索するには、次の手順を実行します。

**ネストされたスタックのルートスタックを表示するには**

1. AWS マネジメントコンソール にサインインし、CloudFormation コンソール ([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)) を開きます。

1. **[スタック]** ページで、ルートスタックを表示するネストされたスタックの名前を選択します。

   ネストされたスタックについては、スタック名の上に **[NESTED]** と表示されます。

1. **[スタック情報]** タブの **[概要]** セクションで、**[ルートスタック]** としてリストされているスタック名を選択します。

**ルートスタックに属するネストされたスタックを表示するには**

1. ネストされたスタックを表示するルートスタックから、**[リソース]** タブを選択します。

1. **[タイプ]** 列で、**AWS::CloudFormation::Stack** タイプのリソースを探します。

## 関連情報
<a name="nested-stacks-related-information"></a>
+ [既存のスタックのネスト化](resource-import-nested-stacks.md)
+ [スタックリソースの更新動作を理解する](using-cfn-updating-stacks-update-behaviors.md)
+ [失敗した、ネストされたスタックの更新からのロールバックを続ける](using-cfn-updating-stacks-continueupdaterollback.md#nested-stacks)
+ [ネストされたスタックのロールバック失敗](troubleshooting.md#troubleshooting-errors-nested-stacks-are-stuck)

# CloudFormation テンプレートで待機条件を作成する
<a name="using-cfn-waitcondition"></a>

このトピックでは、テンプレートに待機条件を作成して、スタックリソースの作成を調整したり設定プロセスの進行状況を追跡する方法を説明します。たとえば、アプリケーション構成の一部が完了した後に別のリソースの作成を開始したり、インストールおよび構成プロセス中にシグナルを送信して進行状況を追跡できます。

CloudFormation が待機条件を含むスタックを作成する場合:
+ 他のリソースと同様に待機条件を作成し、待機条件のステータスを `CREATE_IN_PROGRESS` に設定します。
+ CloudFormation は、必要な数の成功シグナルを受信するか、待機条件のタイムアウト期間が経過するまで待機します。
+ タイムアウト期間が経過する前に必要な数の成功シグナルを受信した場合:
  + 待機条件のステータスが `CREATE_COMPLETE` に変わります
  + スタックの作成が続行されます
+ タイムアウト期間が経過するか、障害シグナルを受信した場合:
  + 待機条件のステータスが `CREATE_FAILED` に変わります
  + スタックのロールバック

**重要**  
Amazon EC2 および Auto Scaling リソースについては、待機条件ではなく CreationPolicy 属性を使用することをお勧めします。CreationPolicy 属性をこれらのリソースに追加し、インスタンス作成プロセスが正常に完了したときにシグナルを送信するために cfn-signal ヘルパースクリプトを使用します。  
詳細については、「[CreationPolicy 属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-creationpolicy.html)」を参照してください。

**注記**  
AWS PrivateLink を使用する場合、待機条件に応答する VPC のリソースには、CloudFormation 固有の Amazon Simple Storage Service (Amazon S3) バケットへのアクセス権が必要です。リソースは、署名付き Amazon S3 URL に応答する待機条件を送信する必要があります。Amazon S3 に応答を送信できない場合、CloudFormation は応答を受信せず、スタックオペレーションは失敗となります。詳細については、[インターフェイスエンドポイントを使用した CloudFormation へのアクセス (AWS PrivateLink)](vpc-interface-endpoints.md) および「[バケットポリシーを使用した VPC エンドポイントからのアクセスコントロール](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies-vpc-endpoint.html)」を参照してください。

**Topics**
+ [テンプレートでの待機条件の作成](#creating-wait-condition)
+ [待機条件シグナル構文](#wait-condition-signal-syntax)
+ [シグナルデータへのアクセス](#wait-condition-access-signal-data)

## テンプレートでの待機条件の作成
<a name="creating-wait-condition"></a>

**1. 待機条件ハンドル**  
まず、スタックのテンプレートで [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) リソースを定義します。このリソースは、シグナルの送信に必要な署名付き URL を生成します。これにより、AWS 認証情報を提供しなくてもシグナルを送信できるようになります。例えば、次のようになります。

```
Resources:
  MyWaitHandle:
    Type: AWS::CloudFormation::WaitConditionHandle
```

**2. 待機条件**  
次に、スタックのテンプレートで [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) リソースを定義します。`AWS::CloudFormation::WaitCondition` の基本的な構造は次のようになります: 

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

`AWS::CloudFormation::WaitCondition` リソースには、2 つの必須プロパティと 1 つのオプションプロパティがあります。
+ `Handle` (必須) - テンプレートで宣言された `WaitConditionHandle` の参照。
+ `Timeout` (必須) – CloudFormation が、必要な数のシグナルを受信するのを待機する秒数。`Timeout` は最小バインドプロパティです。これは、指定された時刻よりも早くタイムアウトが発生することはありませんが、その後すぐに発生する可能性があることを意味します。指定できる最大時間は 43,200 秒 (12 時間) です。
+ `Count` (オプション) — 待機条件のステータスを `CREATE_COMPLETE` に設定し、スタックの作成を再開する前に CloudFormation が受信する必要がある成功シグナルの数。指定がなければ、デフォルト値は 1 です。

通常、特定のリソースの作成直後に待機条件を開始する必要があります。そのためには、待機条件に `DependsOn` 属性を追加します。待機条件に `DependsOn` 属性を追加すると、CloudFormation は最初に `DependsOn` 属性にリソースを作成し、その後に待機条件を作成します。詳細については、「[DependsOn 属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-dependson.html)」を参照してください。

次の例は、以下を満たす待機条件を示しています: 
+ `MyEC2Instance` リソースが正常に作成された後に開始される
+ `MyWaitHandle` リソースを `WaitConditionHandle` として使用する
+ タイムアウトは 4,500 秒
+ デフォルト `Count` が 1 である (`Count` プロパティが指定されていないため)

```
  MyWaitCondition:
    Type: AWS::CloudFormation::WaitCondition
    DependsOn: MyEC2Instance
    Properties:
      Handle: !Ref MyWaitHandle
      Timeout: '4500'
```

**3. シグナルの送信**  
CloudFormation に成功または失敗を通知するには、通常、いくつかのコードまたはスクリプトを実行します。例えば、EC2 インスタンスで実行されているアプリケーションは、いくつかの追加の設定タスクを実行してから、完了を示すシグナルを CloudFormation に送信する場合があります。

シグナルは、待機条件ハンドルによって生成された署名付き URL に送信される必要があります。その署名済み URL を使用して、成功または失敗のシグナルを送信します。

**シグナルを送信するには**

1. テンプレート内の署名付き URL を取得するには、`Ref` 組み込み関数を、待機条件ハンドルの論理名とともに使用します。

   次の例に示すように、テンプレートは Amazon EC2 インスタンスを宣言し、Amazon EC2 `UserData` プロパティを使用して署名付き URL を Amazon EC2 インスタンスに渡すことができます。これにより、これらのインスタンスで実行されているスクリプトまたはアプリケーションは、成功または失敗のシグナルを 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" }
   ```

   この結果、次のような `UserData` 出力が得られます:

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

   注: AWS マネジメントコンソール およびコマンドラインツールでは、署名済み URL は待機条件ハンドルリソースの物理 ID として表示されます。

1. (オプション) スタックが待機条件に入るタイミングを検出するために、次のいずれかの方法を使用できます:
   + 通知を有効にしてスタックを作成した場合、CloudFormation はすべてのスタックイベントの通知を指定のトピックに発行します。ユーザーまたはアプリケーションがそのトピックにサブスクライブしている場合は、待機条件ハンドル作成イベントの通知を監視し、通知メッセージから署名済み URL を取得できます。
   + AWS マネジメントコンソール、AWS CLI、または SDK を使用してスタックのイベントをモニタリングすることもできます。

1. シグナルを送信するには、署名済み URL を使用して HTTP リクエストメッセージを送信します。リクエスト方法は `PUT` である必要があります。`Content-Type` ヘッダーは空の文字列であるか省略される必要があります。リクエストメッセージは、「[待機条件シグナル構文](#wait-condition-signal-syntax)」で指定されている形式の JSON 構造である必要があります。

   CloudFormation がスタックの作成を続行するようにするには、`Count` プロパティで指定された数の成功シグナルを送信する必要があります。`Count` が 1 より大きい場合、各シグナルの `UniqueId` 値は、特定の待機条件に送信されるすべてのシグナルにわたって一意である必要があります。`UniqueId` は任意の英数字の文字列です。

   `curl` コマンドは、シグナルを送信する方法の 1 つです。次の例は、待機条件に成功のシグナルを送信する `curl` コマンドラインを示しています。

   ```
   $ 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"
   ```

   ファイル *`/tmp/a`* には、次の JSON 構造が格納されます。

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

   この例は、同じ成功のシグナルを送信する `curl` コマンドラインを示していますが、コマンドラインのパラメータとして JSON 構造を送信している点が異なります。

   ```
   $ 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"
   ```

## 待機条件シグナル構文
<a name="wait-condition-signal-syntax"></a>

待機条件ハンドルによって生成された URL にシグナルを送信する場合は、次の JSON 形式を使用する必要があります。

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

### プロパティ
<a name="wait-condition-signal-properties"></a>

`Status` フィールドの値は次のいずれかである必要があります。
+ `SUCCESS`
+ `FAILURE`

`UniqueId` フィールドは CloudFormation に対するシグナルを識別します。待機条件の `Count` プロパティが 1 より大きい場合、`UniqueId` の値は特定の待機条件に送信されるすべてのシグナルにわたって一意でなければなりません。そうでない場合、CloudFormation は同じ `UniqueId` のシグナルを以前に送信されたものの再送信であるとみなして無視します。

`Data` フィールドには、シグナルとともに送り返す任意の情報を含めることができます。テンプレート内で [Fn::GetAtt](resources-section-structure.md#resource-properties-getatt) 関数を使用して `Data` の値にアクセスできます。

`Reason` フィールドは、内容に関して JSON コンプライアンス以外の制限がない文字列です。

## シグナルデータへのアクセス
<a name="wait-condition-access-signal-data"></a>

有効なシグナルによって送信されたデータにアクセスするために、CloudFormation テンプレートで待機条件の出力値を作成できます。例えば、次のようになります。

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

その後、[https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stacks.html) コマンドまたは CloudFormation コンソールの **[出力]** タブを使用してこのデータを表示できます。

`Fn::GetAtt` 関数は、JSON 構造内の名前と値のペアとして `UniqueId` と `Data` を返します。例：

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

# CloudFormation モジュールを使用してテンプレート全体に含めることができる再利用可能なリソース設定の作成
<a name="modules"></a>

*モジュール*は、スタックテンプレート全体に含めるリソース構成をパッケージ化する、透過的で管理しやすく、繰り返し可能な方法です。モジュールは、共通のサービス構成とベストプラクティスを、スタックテンプレートに含めるためのモジュール式のカスタマイズ可能なビルディングブロックとしてカプセル化できます。モジュールを使用すると、リソース実装の複雑さを深く理解することなく、ベストプラクティス、専門分野の知識、承認されたガイドライン (セキュリティ、コンプライアンス、ガバナンス、業界規制などの領域について) をテンプレートに含めることができます。

たとえば、ネットワークのドメイン専門家は、組み込みのセキュリティグループと、セキュリティガイドラインに準拠した入力/出力ルールを含むモジュールを作成できます。そうして、そのモジュールをテンプレートに含めることで、VPC、サブネット、セキュリティグループ、ゲートウェイがどのように機能するかを考えるのに時間を費やすことなく、セキュアなネットワーキングインフラストラクチャをスタックにプロビジョニングできます。また、モジュールはバージョン管理されているため、セキュリティガイドラインが時間の経過とともに変更された場合、モジュールの作成者はそれらの変更を組み込んだ新しいバージョンのモジュールを作成できます。

テンプレートでモジュールを使用することの特徴は次のとおりです。
+ **予測可能性** – モジュールは CloudFormation レジストリに登録されているスキーマに準拠する必要があります。そのため、テンプレートにモジュールを含めると解決できるリソースがわかります。
+ **再利用性** – 複数のテンプレートとアカウントで同じモジュールを使用できます。
+ **トレーサビリティ** – CloudFormation では、スタック内のどのリソースがモジュールからプロビジョニングされたかを把握できるため、リソース変更のソースを簡単に把握できます。
+ **管理機能** – モジュールを登録したら、バージョニング、アカウント、リージョンの可用性など、CloudFormation レジストリを使用してモジュールを管理できます。

モジュールには次のものを含めることができます。
+ モジュールからプロビジョニングされる 1 つ以上のリソース、および出力や条件などの関連データ。
+ 任意のモジュールパラメータ。モジュールが使用されるたびにカスタム値を指定できます。

モジュールの開発の詳細については、「*CloudFormation CLI ユーザーガイド*」の「[モジュールの開発](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/modules.html)」を参照してください。

**Topics**
+ [モジュールを使用するときの考慮事項](#module-considerations)
+ [モジュールのバージョニングの概要](module-versioning.md)
+ [CloudFormation プライベートレジストリのモジュールの使用](modules-using.md)
+ [パラメータを使用してモジュール値を指定する](module-using-params.md)
+ [CloudFormation テンプレートのリファレンスモジュールリソース](module-ref-resources.md)

## モジュールを使用するときの考慮事項
<a name="module-considerations"></a>
+ モジュールは追加料金なしで使用できます。スタック内でそれらのモジュールが解決したリソースに対してのみお支払いいただきます。
+ CloudFormation クォータ (スタックで許可されるリソースの最大数、テンプレート本文の最大サイズなど) は、テンプレートに含まれるリソースがモジュールから取得されているかどうかにかかわらず、処理されたテンプレートに適用されます。詳細については、「[CloudFormation クォータを理解する](cloudformation-limits.md)」を参照してください。
+ スタックレベルで指定するタグは、モジュールから派生した個々のリソースに割り当てられます。
+ モジュールレベルで指定されたヘルパースクリプトは、CloudFormation がテンプレートを処理するときに、モジュールに含まれる個々のリソースには伝達されません。
+ モジュールで指定された出力は、テンプレートレベルで出力に伝播されます。

  各出力には、モジュールで定義されたモジュールの論理名と出力名を連結した論理 ID が割り当てられます。詳細については、「[デプロイされた CloudFormation スタックからエクスポートされた出力を取得する](using-cfn-stack-exports.md)」を参照してください。
+ モジュールで指定されたパラメータは、テンプレートレベルのパラメータには伝達されません。

  ただし、モジュールレベルのパラメータを参照するテンプレートレベルのパラメータを作成できます。詳細については、「[パラメータを使用してモジュール値を指定する](module-using-params.md)」を参照してください。

# モジュールのバージョニングの概要
<a name="module-versioning"></a>

CloudFormation レジストリは、AWS アカウント およびリージョン内で使用するモジュールの登録および管理ができるリポジトリとして機能します。アカウントおよびリージョン内で AWS、サードパーティーのパブリッシャー、独自のカスタム拡張機能など、さまざまなソースからモジュールを登録できます。詳細については、「[CloudFormation レジストリによる拡張機能の管理](registry.md)」を参照してください。

モジュールには異なるバージョンが存在する場合もあるため、使用するモジュールのバージョンを指定できます。このバージョニング機能は、モジュールに依存する既存のスタックを壊さずにモジュールを更新または変更する必要があるときには特に便利です。

複数のバージョンのモジュールを使用するとき、次の点に注意してください。
+ スタックオペレーション中、CloudFormation は、スタックオペレーションが実行されている AWS アカウント およびリージョンで、デフォルトバージョンとして現在登録されているモジュールのバージョンを使用します。これには、他のモジュールにネストされているモジュールも含まれます。

  したがって、異なるアカウントまたはリージョンで、同じモジュールの異なるバージョンをデフォルトバージョンとして登録している場合、同じテンプレートを使用しても異なる結果になる可能性があることに注意してください。
+ スタックオペレーション中、CloudFormation は、スタックオペレーションが実行されている AWS アカウント およびリージョンで、デフォルトバージョンとして現在登録されているリソースのバージョンを使用します。これには、モジュールを含めることによって生成されたリソースが含まれます。
+ モジュールのデフォルトバージョンを変更しても、スタックの更新オペレーションは開始されません。ただし、次にそのモジュールを含むテンプレート (スタックの更新など) でスタックオペレーションを実行すると、CloudFormation は新しいデフォルトバージョンをオペレーションで使用します。

  これに関する例外の 1 つは、以下で説明するように、[**use previous template**] オプションを指定してスタックの更新を実行することです。
+ スタックの更新オペレーションで、[**use previous template**] (以前のテンプレートを使用) オプションを指定すると、CloudFormation はスタック更新のために以前に処理されたテンプレートを使用し、モジュールに加えた変更については再処理しません。
+ 一貫した結果を保証するには、スタックセットで使用するスタックテンプレートにモジュールを含める場合、スタックインスタンスのデプロイを考えているすべてのアカウントおよびリージョンで、同じバージョンのモジュールがデフォルトバージョンとして設定されていることを確認してください。これは、他のモジュールにネストされているモジュールの場合を含みます。詳細については、「[StackSets を使用したアカウントとリージョン全体でのスタックの管理](what-is-cfnstacksets.md)」を参照してください。

## サードパーティーのパブリックモジュールのアクティブ化における要件
<a name="requirements-for-modules"></a>

アカウントおよびリージョンでサードパーティのパブリックモジュールを正常にアクティブ化するには、モジュールに含まれる各サードパーティのパブリック拡張機能 (リソースまたはモジュール) に対して次の事項が当てはまる必要があります。
+ **拡張機能のアクティブ化** – 拡張機能は、使用するアカウントおよびリージョンでアクティブ化する必要があります。詳細については、「[CloudFormation レジストリからサードパーティーのパブリック拡張を使用する](registry-public.md)」を参照してください。
+ **エイリアス登録** – モジュール内のエクステンションがタイプ名のエイリアスを使用する場合、エクステンションは同じタイプ名のエイリアスを使用してアカウントおよびリージョンに登録する必要があります。詳細については、「[拡張を参照するエイリアスを使用する](registry-public.md#registry-public-enable-alias)」を参照してください。
+ **バージョン互換性** – 現在アクティブ化されているエクステンションのバージョンは、モジュールで指定されているエクステンションのサポートされているメジャーバージョンのいずれかである必要があります。

適切なサードパーティのパブリック拡張機能および拡張機能のバージョンがアクティブ化されていない場合、CloudFormation はオペレーションに失敗し、モジュールを正常にアクティブ化する前にアクティブ化する必要がある拡張機能およびバージョンを一覧表示したエラーが表示されます。

# CloudFormation プライベートレジストリのモジュールの使用
<a name="modules-using"></a>

このトピックでは、CloudFormation テンプレートでモジュールを使用する方法について説明します。モジュールは、テンプレートに追加できるリソースの事前作成されたバンドルと考えてください。

モジュールを使用するには、次の手順を実行してください。
+ **モジュールの登録** – CloudFormation レジストリでモジュールをプライベート拡張機能として登録します。作業している AWS アカウント およびリージョンで登録されていることを確認します。詳細については、「[CloudFormation レジストリの概念](registry-concepts.md)」を参照してください。
+ **テンプレートに含める** – 他のリソースと同様に、モジュールを CloudFormation テンプレートの [Resources](resources-section-structure.md) セクションに追加します。モジュールに必要なプロパティを指定する必要もあります。
+ **スタックの作成または更新** – スタックオペレーションを開始すると、含まれているモジュールを適切なリソースに解決する処理済みテンプレートが CloudFormation によって生成します。
+ **変更のプレビュー** – 変更を行う前に、変更セットを使用して追加または変更されるリソースを確認できます。詳細については、「[変更セットを使用して CloudFormation スタックを更新する](using-cfn-updating-stacks-changesets.md)」を参照してください。

次の例を考えてみましょう。リソースとモジュールの両方を含むテンプレートがあります。テンプレートには、1 つの個別のリソース `ResourceA` とモジュール `ModuleParent` が含まれます。このモジュールには、`ResourceB` および `ResourceC` の 2 つのリソースと、ネストされたモジュール `ModuleChild` が含まれます。`ModuleChild` には、1 つのリソース `ResourceD` が含まれます。このテンプレートからスタックを作成すると、CloudFormation はテンプレートを処理し、モジュールを適切なリソースに解決します。結果のスタックには、`ResourceA`、`ResourceB`、`ResourceC`、`ResourceD` の 4 つのリソースがあります。

![\[スタックオペレーション中、CloudFormation はスタックテンプレートに含まれている 2 つのモジュールを適切な 4 つのリソースに解決します。\]](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/images/modules-resource-inclusion.png)


CloudFormation は、スタック内のどのリソースがモジュールから作成されたかを追跡します。この情報は、特定のスタックの [**Events**] (イベント)、[**Resources**] (リソース)、および [**Drifts**] (ドリフト) タブに表示できます。また、変更セットのプレビューにも表示されます。

モジュールはテンプレート内のリソースと区別できます。これは、リソースで使用される一般的な 3 つのパート規則とは対照的に、次の 4 つの部分からなる命名規則に従っているためです。

```
organization::service::use-case::MODULE
```

# パラメータを使用してモジュール値を指定する
<a name="module-using-params"></a>

CloudFormation では、スタックの作成時または更新中に入力値を指定することにより、テンプレートパラメータを使用してスタックをカスタマイズできます。これらのパラメータにより、必要に応じてスタックの特定の特徴を変更できます。テンプレートのパラメータの定義に関する詳細は、「[CloudFormation テンプレートの Parameters 構文](parameters-section-structure.md)」を参照してください。

同様に、モジュールにパラメータを含めることもできます。これらのモジュールパラメータにより、使用しているテンプレート (または別のモジュール) からモジュールにカスタム値を入力できます。モジュールはこれらのカスタム値を使用し、プロパティ値が含まれるリソースにそのプロパティ値を設定できます。

スタック操作時にモジュールに渡される値を入力できるように、モジュールプロパティを設定するテンプレートパラメータを定義することもできます。

独自のモジュールパラメータを持つネストされたモジュールがモジュールに含まれている場合、次のいずれかの操作ができます。
+ ネストされたモジュールのパラメータの値を親モジュールで直接指定します。
+ 親モジュール内の対応するモジュールパラメータを定義して、ネストされたモジュールのパラメータを、親モジュールが含まれているテンプレート (またはモジュール) で設定できるようにします。

## テンプレートパラメータを使用したモジュールパラメータ値の指定
<a name="module-using-params-example-1"></a>

次の例は、モジュールに値を渡すテンプレートパラメータを定義する方法を示しています。

`My::S3::SampleBucket::MODULE` を含むこのテンプレートは、スタック操作時にユーザーが S3 バケット名を指定できるようにするテンプレートパラメータの `BucketName` を定義します。

```
# 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
```

## 親モジュールから子モジュール内のリソースのプロパティを指定する
<a name="module-using-params-example-2"></a>

次の例は、別のモジュール内にネストされているモジュールでパラメータ値を指定する方法を示しています。

この最初のモジュール `My::S3::SampleBucketPrivate::MODULE` は、子モジュールになります。これは、`BucketName` と `AccessControl` の 2 つのパラメータを定義します。これらのパラメータに指定された値は、モジュールに含まれる `AWS::S3::Bucket` リソースの `BucketName` および`AccessControl` プロパティを指定するために使用されます。以下は `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
```

次に、前のモジュールは親モジュール `My::S3::SampleBucket::MODULE` 内にネストされます。親モジュール `My::S3::SampleBucket::MODULE` は、次の方法で子モジュールのパラメータを設定します。
+ `My::S3::SampleBucketPrivate::MODULE` の `AccessControl` パラメータを `Private` に設定します。
+ `BucketName` では 、モジュールパラメータを定義します。これにより、`My::S3::SampleBucket::MODULE` を含むテンプレート (またはモジュール) でバケット名を指定できます 。

```
# 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
```

## モジュールパラメータの制約の指定
<a name="modules-using-parameters-constraints"></a>

モジュールパラメータは、制約の適用をサポートしていません。モジュールパラメータに対して制約チェックを実行するには、必要な制約を持つテンプレートパラメータを作成します。その後、モジュールパラメータでそのテンプレートパラメータを参照します。テンプレートのパラメータの定義に関する詳細は、「[CloudFormation テンプレートの Parameters 構文](parameters-section-structure.md)」を参照してください。

# CloudFormation テンプレートのリファレンスモジュールリソース
<a name="module-ref-resources"></a>

CloudFormation テンプレートでは、別のリソースの名前またはプロパティに基づいて、あるリソースのプロパティを設定しなければならないことがよくあります。詳細については、「[リソースの参照](resources-section-structure.md#using-cross-resource-references)」を参照してください。

CloudFormation テンプレートのモジュール内に含まれるリソースを参照するには、次の 2 つの論理名を組み合わせる必要があります。
+ テンプレートにモジュールを含めたときにそのモジュール自体に付けた論理名。
+ そのモジュール内にある特定リソースの論理名。

これらの 2 つの論理名は、それらの間にピリオド (.) を使用するか、使用せずに組み合わせることができます。たとえば、モジュールの論理名が「`MyModule`」でリソースの論理名が「`MyBucket`」の場合、「`MyModule.MyBucket`」または「`MyModuleMyBucket`」とすることで、そのリソースを参照できます。

モジュール内のリソースの論理名を確認するには、CloudFormation レジストリまたは「[https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeType.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeType.html)」操作を使用することにより、モジュールのスキーマを参照できます。スキーマリストには、モジュールの一部であるすべてのリソースおよびその論理名が一覧表示されます。

完全な論理名を取得したら、`GetAtt` や `Ref` などの CloudFormation 関数を使用してモジュールリソースのプロパティ値にアクセスできます。

たとえば、「`S3Bucket`」という論理名の `AWS::S3::Bucket` リソースを含む `My::S3::SampleBucket::MODULE` モジュールがあるとします。`Ref` 関数を使用してこのバケットの名前を参照するには、テンプレート (`MyBucket`) のモジュール名をモジュール (`S3Bucket`) のリソースの論理名と組み合わせます。完全な論理名は「`MyBucket.S3Bucket`」または「`MyBucketS3Bucket`」のいずれかです。

**サンプルテンプレート**  
次のテンプレート例では、`My::S3::SampleBucket::MODULE` モジュールを使用して S3 バケットを作成します。Amazon SQS キューも作成し、名前をモジュールのバケット名と同じに設定します。さらに、テンプレートは作成された S3 バケットの Amazon リソースネーム (ARN) を出力します。

```
# 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
```