

# CloudFormation スタックの変更セットの例
<a name="using-cfn-updating-stacks-changesets-samples"></a>

このセクションでは、一般的なスタックの変更で CloudFormation によって作成される変更セットの例を示します。例では、テンプレートを直接編集する方法、単独の入力パラメータを変更する方法、バックアップされていないデータの損失またはスタックで実行中のアプリケーションの中断を防止するリソース再作成の計画、およびリソースの追加方法と削除方法が示されています。変更セットの機能を理解するために、送信された変更を説明して、その結果である変更セットについて解説します。各例は、お客様が前出の例を理解していることを前提に構築されているため、順を追って読むことをお勧めします。変更セットの各フィールドの説明については、「AWS CloudFormation API リファレンス」の「[変更](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_Change.html)データ型」を参照してください。

変更セットの詳細は、[コンソール](using-cfn-updating-stacks-changesets-view.md)、AWS CLI、または CloudFormation [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeChangeSet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeChangeSet.html) API 操作を使用して表示できます。

以下の各変更セットは、以下の[サンプルテンプレート](https://s3.amazonaws.com/cloudformation-examples/user-guide/changesets/ec2-instance.txt)を使用したスタックから生成されています。

```
{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Description" : "A sample EC2 instance template for testing change sets.",
  "Parameters" : {
    "Purpose" : {
      "Type" : "String",
      "Default" : "testing",
      "AllowedValues" : ["testing", "production"],
      "Description" : "The purpose of this instance."
    },
    "KeyPairName" : {
      "Type": "AWS::EC2::KeyPair::KeyName",
      "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instance"
    },
    "InstanceType" : {
      "Type" : "String",
      "Default" : "t2.micro",
      "AllowedValues" : ["t2.micro", "t2.small", "t2.medium"],
      "Description" : "The EC2 instance type."
    }
  },
  "Resources" : {
    "MyEC2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "KeyName" : { "Ref" : "KeyPairName" },
        "InstanceType" : { "Ref" : "InstanceType" },
        "ImageId" : "ami-8fcee4e5",
        "Tags" : [
          {
            "Key" : "Purpose",
            "Value" : { "Ref" : "Purpose" }
          }
        ]
      }
    }
  }
}
```

## テンプレートの直接編集
<a name="using-cfn-updating-stacks-changesets-samples-directly-editing-a-template"></a>

スタックのテンプレートでリソースを直接変更して変更セットを生成すると、この変更は CloudFormation で直接変更として分類されます。パラメータ値の更新に伴って開始された変更とはみなされません。以下の変更セットは、`i-1abc23d4` インスタンスに新しいタグを追加する直接変更の例です。パラメータ値や機能など、その他の入力値はすべて変更しないため、`Changes` 構造ついて説明します。

```
{
    "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/MyStack/1a2345b6-0000-00a0-a123-00abc0abc000",
    "Status": "CREATE_COMPLETE",
    "ChangeSetName": "SampleChangeSet-direct",
    "Parameters": [
        {
            "ParameterValue": "testing",
            "ParameterKey": "Purpose"
        },
        {
            "ParameterValue": "MyKeyName",
            "ParameterKey": "KeyPairName"
        },
        {
            "ParameterValue": "t2.micro",
            "ParameterKey": "InstanceType"
        }
    ],
    "Changes": [
        {
            "ResourceChange": {
                "ResourceType": "AWS::EC2::Instance",
                "PhysicalResourceId": "i-1abc23d4",
                "Details": [
                    {
                        "ChangeSource": "DirectModification",
                        "Evaluation": "Static",
                        "Target": {
                            "Attribute": "Tags",
                            "RequiresRecreation": "Never"
                        }
                    }
                ],
                "Action": "Modify",
                "Scope": [
                    "Tags"
                ],
                "LogicalResourceId": "MyEC2Instance",
                "Replacement": "False"
            },
            "Type": "Resource"
        }
    ],
    "CreationTime": "2020-11-18T23:35:25.813Z",
    "Capabilities": [],
    "StackName": "MyStack",
    "NotificationARNs": [],
    "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/SampleChangeSet-direct/1a2345b6-0000-00a0-a123-00abc0abc000"
}
```

`Changes` 構造には、`ResourceChange` 構造 1 つのみが存在します。この構造は、CloudFormation が変更するリソースのタイプ、CloudFormation が実行するアクション、リソースの ID、変更対象、および変更で置き換え (CloudFormation が新しいリソースを作成して古いものを削除する) が必要かどうかなどの情報を記述します。例では、CloudFormation によって `i-1abc23d4` EC2 インスタンスの `Tags` 属性が変更され、インスタンスの置き換えは必要ないことが変更セットによって示されています。

`Details` 構造で、この変更がインスタンスの再作成 (置き換え) が不要な直接変更であると CloudFormation で分類されます。CloudFormation がインスタンスを置き換えないことを確認し、安心してこの変更を実行できます。

CloudFormation は、この変更を `Static` 評価として表示します。静的評価とは、変更セットを実行する前に CloudFormation によってタグの値を決定できることを意味します。場合によっては、変更セットを実行した後にしか CloudFormation が値を決定できないこともあります。CloudFormation は、これらの変更を `Dynamic` 評価としてラベル付けします。例えば、更新されたリソースの参照でそのリソースが条件付きで置き換えられる場合、CloudFormation では更新されたリソースへの参照が変更されるかどうかは決定できません。

## 入力パラメータ値の修正
<a name="using-cfn-updating-stacks-changesets-samples-modifying-a-single-input-parameter-value"></a>

入力パラメータ値を変更すると、CloudFormation では更新されたパラメータ値を使用する各リソースで 2 つの変更が生成されます。この例では、これらの変更がどのようなもので、どの情報に注目すべきかを取り上げます。次の例は、`Purpose` 入力パラメータの値の変更のみによって生成されています。

`Purpose` パラメータは、EC2 インスタンスのタグキーの値を指定します。例では、パラメータ値が `testing` から `production` に変更されています。新しい値は `Parameters` 構造に表示されます。

```
{
    "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/MyStack/1a2345b6-0000-00a0-a123-00abc0abc000",
    "Status": "CREATE_COMPLETE",
    "ChangeSetName": "SampleChangeSet",
    "Parameters": [
        {
            "ParameterValue": "production",
            "ParameterKey": "Purpose"
        },
        {
            "ParameterValue": "MyKeyName",
            "ParameterKey": "KeyPairName"
        },
        {
            "ParameterValue": "t2.micro",
            "ParameterKey": "InstanceType"
        }
    ],
    "Changes": [
        {
            "ResourceChange": {
                "ResourceType": "AWS::EC2::Instance",
                "PhysicalResourceId": "i-1abc23d4",
                "Details": [
                    {
                        "ChangeSource": "DirectModification",
                        "Evaluation": "Dynamic",
                        "Target": {
                            "Attribute": "Tags",
                            "RequiresRecreation": "Never"
                        }
                    },
                    {
                        "CausingEntity": "Purpose",
                        "ChangeSource": "ParameterReference",
                        "Evaluation": "Static",
                        "Target": {
                            "Attribute": "Tags",
                            "RequiresRecreation": "Never"
                        }
                    }
                ],
                "Action": "Modify",
                "Scope": [
                    "Tags"
                ],
                "LogicalResourceId": "MyEC2Instance",
                "Replacement": "False"
            },
            "Type": "Resource"
        }
    ],
    "CreationTime": "2020-11-18T23:59:18.447Z",
    "Capabilities": [],
    "StackName": "MyStack",
    "NotificationARNs": [],
    "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/SampleChangeSet/1a2345b6-0000-00a0-a123-00abc0abc000"
}
```

`Changes` 構造は、「[テンプレートの直接編集](#using-cfn-updating-stacks-changesets-samples-directly-editing-a-template)」の例に似た方法で機能します。`ResourceChange` 構造 1 つのみがあり、`Tags` EC2 インスタンスの `i-1abc23d4` 属性への変更を記述します。

ただし、`Details` 構造では、変更されたパラメータ値が単一でも、変更セットには `Tags` 属性に対する 2 つの変更が表示されます。変更されたパラメータ値を参照するリソース (`Ref` 組み込み関数を使用) は、常に 2 つの変更になります。ひとつは `Dynamic` 評価、もうひとつは `Static` 評価です。以下のフィールドを参照して、このようなタイプの変更を確認できます。
+ `Static` 評価の変更の場合、`ChangeSource` フィールドを参照します。この例では、`ChangeSource` フィールドは `ParameterReference` と等しく、この変更が更新されたパラメータの参照値の結果であることを意味します。変更セットには、似たような `Dynamic` 評価の変更があるはずです。
+ 同じ情報を含む 2 つの変更の `Dynamic` 構造を比較することで、一致する `Target` 評価の変更を検索できます。この例では、両方の変更の `Target` 構造で、`Attribute` および `RequireRecreation` フィールドに同じ値が含まれます。

このようなタイプの変更では、静的評価に注目します。ここには、変更に関するもっとも詳細な情報が提供されています。この例では、変更がパラメータ参照値 (`ParameterReference`) の変更の結果であることが静的評価に示されています。変更された正確なパラメータは `CauseEntity` フィールド (`Purpose` パラメータ) で示されます。

## Replacement フィールドの値の決定
<a name="using-cfn-updating-stacks-changesets-samples-determining-the-value-of-the-replacement-field"></a>

`ResourceChange` 構造の `Replacement` フィールドには、CloudFormation でリソースが再作成されるかどうかが示されています。リソースの再作成 (置き換え) に備えておくと、バックアップされていないデータの損失やスタックで実行中のアプリケーションの中断を防ぐことができます。

`Replacement` フィールドの値は、変更で置き換えが必要かどうかによって異なります。これは変更の `RequiresRecreation` 構造の `Target` フィールドに示されています。たとえば、`RequiresRecreation` フィールドが `Never` であれば、`Replacement` フィールドは `False` です。ただし、1 つのリソースに複数の変更があり、各変更の `RequiresRecreation` フィールドの値が異なる場合、CloudFormation では、もっとも大きい動作を使用してリソースを更新します。つまり、多くの変更の中の 1 つのみで置き換えが必要な場合、CloudFormation はリソースを置き換えるため、`Replacement` フィールドは `True` に設定されます。

次の変更セットは各パラメータ (`Purpose`、`InstanceType`、`KeyPairName`) の値を変更することで生成されています。これらすべてのパラメータは EC2 インスタンスで使用されます。これらの変更に伴い、`Replacement` フィールドが `True` に等しくなるため、CloudFormation によるインスタンスの置き換えが必要になります。

```
{
    "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/MyStack/1a2345b6-0000-00a0-a123-00abc0abc000",
    "Status": "CREATE_COMPLETE",
    "ChangeSetName": "SampleChangeSet-multiple",
    "Parameters": [
        {
            "ParameterValue": "production",
            "ParameterKey": "Purpose"
        },
        {
            "ParameterValue": "MyNewKeyName",
            "ParameterKey": "KeyPairName"
        },
        {
            "ParameterValue": "t2.small",
            "ParameterKey": "InstanceType"
        }
    ],
    "Changes": [
        {
            "ResourceChange": {
                "ResourceType": "AWS::EC2::Instance",
                "PhysicalResourceId": "i-7bef86f8",
                "Details": [
                    {
                        "ChangeSource": "DirectModification",
                        "Evaluation": "Dynamic",
                        "Target": {
                            "Attribute": "Properties",
                            "Name": "KeyName",
                            "RequiresRecreation": "Always"
                        }
                    },
                    {
                        "ChangeSource": "DirectModification",
                        "Evaluation": "Dynamic",
                        "Target": {
                            "Attribute": "Properties",
                            "Name": "InstanceType",
                            "RequiresRecreation": "Conditionally"
                        }
                    },
                    {
                        "ChangeSource": "DirectModification",
                        "Evaluation": "Dynamic",
                        "Target": {
                            "Attribute": "Tags",
                            "RequiresRecreation": "Never"
                        }
                    },
                    {
                        "CausingEntity": "KeyPairName",
                        "ChangeSource": "ParameterReference",
                        "Evaluation": "Static",
                        "Target": {
                            "Attribute": "Properties",
                            "Name": "KeyName",
                            "RequiresRecreation": "Always"
                        }
                    },
                    {
                        "CausingEntity": "InstanceType",
                        "ChangeSource": "ParameterReference",
                        "Evaluation": "Static",
                        "Target": {
                            "Attribute": "Properties",
                            "Name": "InstanceType",
                            "RequiresRecreation": "Conditionally"
                        }
                    },
                    {
                        "CausingEntity": "Purpose",
                        "ChangeSource": "ParameterReference",
                        "Evaluation": "Static",
                        "Target": {
                            "Attribute": "Tags",
                            "RequiresRecreation": "Never"
                        }
                    }
                ],
                "Action": "Modify",
                "Scope": [
                    "Tags",
                    "Properties"
                ],
                "LogicalResourceId": "MyEC2Instance",
                "Replacement": "True"
            },
            "Type": "Resource"
        }
    ],
    "CreationTime": "2020-11-18T00:39:35.974Z",
    "Capabilities": [],
    "StackName": "MyStack",
    "NotificationARNs": [],
    "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/SampleChangeSet-multiple/1a2345b6-0000-00a0-a123-00abc0abc000"
}
```

リソースの置換を要する変更を特定するには、各変更 (`Details` 構造の静的評価) を表示します。この例では、各変更の `RequireRecreation` フィールドの値は異なりますが、`KeyName` プロパティに対する変更がもっとも大きな更新動作になるため、常に再作成が必要になります。キー名が変更されたため、CloudFormation はインスタンスを置き換えます。

キー名が変わらない場合は、`InstanceType` プロパティに対する変更がもっとも大きな更新動作 (`Conditionally`) になります。したがって、`Replacement` フィールドは `Conditionally` です。CloudFormation がインスタンスを置き換える条件を把握するには、[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) リソースタイプの `InstanceType` プロパティの更新動作を確認します。

## リソースの追加および削除
<a name="using-cfn-updating-stacks-changesets-samples-adding-and-removing-resources"></a>

次の例は、EC2 インスタンスを削除し、Auto Scaling グループと起動構成を追加するように変更したテンプレートを送信することで生成されています。

```
{
    "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/MyStack/1a2345b6-0000-00a0-a123-00abc0abc000",
    "Status": "CREATE_COMPLETE",
    "ChangeSetName": "SampleChangeSet-addremove",
    "Parameters": [
        {
            "ParameterValue": "testing",
            "ParameterKey": "Purpose"
        },
        {
            "ParameterValue": "MyKeyName",
            "ParameterKey": "KeyPairName"
        },
        {
            "ParameterValue": "t2.micro",
            "ParameterKey": "InstanceType"
        }
    ],
    "Changes": [
        {
            "ResourceChange": {
                "Action": "Add",
                "ResourceType": "AWS::AutoScaling::AutoScalingGroup",
                "Scope": [],
                "Details": [],
                "LogicalResourceId": "AutoScalingGroup"
            },
            "Type": "Resource"
        },
        {
            "ResourceChange": {
                "Action": "Add",
                "ResourceType": "AWS::AutoScaling::LaunchConfiguration",
                "Scope": [],
                "Details": [],
                "LogicalResourceId": "LaunchConfig"
            },
            "Type": "Resource"
        },
        {
            "ResourceChange": {
                "ResourceType": "AWS::EC2::Instance",
                "PhysicalResourceId": "i-1abc23d4",
                "Details": [],
                "Action": "Remove",
                "Scope": [],
                "LogicalResourceId": "MyEC2Instance"
            },
            "Type": "Resource"
        }
    ],
    "CreationTime": "2020-11-18T01:44:08.444Z",
    "Capabilities": [],
    "StackName": "MyStack",
    "NotificationARNs": [],
    "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/SampleChangeSet-addremove/1a2345b6-0000-00a0-a123-00abc0abc000"
}
```

`Changes` 構造には 3 つの `ResourceChange`構造があり、各リソースに 1 つずつ対応しています。各リソースで、`Action` フィールドには CloudFormation によってリソースが追加または削除されるかどうかが示されています。`Scope` および `Details` フィールドはリソースの変更にのみ適用されるため、空になります。

新しいリソースの場合、CloudFormation では変更セットが実行されるまで一部のフィールドの値を決定できません。例えば、Auto Scaling グループの物理 ID と起動構成はまだ存在していないため、CloudFormation では入力できません。CloudFormation は、変更セットを実行すると新しいリソースを作成します。

## プロパティレベルの変更の表示
<a name="using-cfn-updating-stacks-changesets-samples-property-level-change-set"></a>

以下の例は、Amazon EC2 インスタンスの `Tag` プロパティに対するプロパティレベルの変更を示しています。`Value` と `Key` タグが `Test` に変更されます。

```
"ChangeSetName": "SampleChangeSet",
    "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/SampleChangeSet/38d91d27-798d-4736-9bf1-fb7c46207807",
    "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/SampleEc2Template/68edcdc0-f6b6-11ee-966c-126d572cdd11",
    "StackName": "SampleEc2Template",
    "Description": "A sample EC2 instance template for testing change sets.",
    "Parameters": [
        {
            "ParameterKey": "KeyPairName",
            "ParameterValue": "BatchTest"
        },
        {
            "ParameterKey": "Purpose",
            "ParameterValue": "testing"
        },
        {
            "ParameterKey": "InstanceType",
            "ParameterValue": "t2.micro"
        }
    ],
    "CreationTime": "2024-04-09T21:29:10.759000+00:00",
    "ExecutionStatus": "AVAILABLE",
    "Status": "CREATE_COMPLETE",
    "StatusReason": null,
    "NotificationARNs": [],
    "RollbackConfiguration": {
:...skipping...
{
    "Changes": [
        {
            "Type": "Resource",
            "ResourceChange": {
                "Action": "Modify",
                "LogicalResourceId": "MyEC2Instance",
                "PhysicalResourceId": "i-0cc7856a36315e62b",
                "ResourceType": "AWS::EC2::Instance",
                "Replacement": "False",
                "Scope": [
                    "Tags"
                ],
                "Details": [
                    {
                        "Target": {
                            "Attribute": "Tags",
                            "RequiresRecreation": "Never",
                            "Path": "/Properties/Tags/0/Value",
                            "BeforeValue": "testing",
                            "AfterValue": "Test",
                            "AttributeChangeType": "Modify"
                        },
                        "Evaluation": "Static",
                        "ChangeSource": "DirectModification"
                    },
                    {
                        "Target": {
                            "Attribute": "Tags",
                            "RequiresRecreation": "Never",
                            "Path": "/Properties/Tags/0/Key",
                            "BeforeValue": "Purpose",
                            "AfterValue": "Test",
                            "AttributeChangeType": "Modify"
                        },
                        "Evaluation": "Static",
                        "ChangeSource": "DirectModification"
                    }
                ],
                "BeforeContext": "{\"Properties\":{\"KeyName\":\"BatchTest\",\"ImageId\":\"ami-8fcee4e5\",\"InstanceType\":\"t2.micro\",\"Tags\":[{\"Value\":\"testing\",\"Key\":\"Purpose\"}]}}",
                "AfterContext": "{\"Properties\":{\"KeyName\":\"BatchTest\",\"ImageId\":\"ami-8fcee4e5\",\"InstanceType\":\"t2.micro\",\"Tags\":[{\"Value\":\"Test\",\"Key\":\"Test\"}]}}"
            }
        }
    ]
```

`Details` 構造は、変更セットが実行される前の `Key` と `Value` の値と、変更セットが実行された後の値を示しています。