変更セットのサンプル - AWS CloudFormation

変更セットのサンプル

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

変更セットの詳細は、コンソール、AWS CLI、または CloudFormation DescribeChangeSet API 操作を使用して表示できます。

以下の各変更セットは、以下のサンプルテンプレートを使用したスタックから生成されています。

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

テンプレートの直接編集

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

{ "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/SampleStack/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": "SampleStack", "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 では更新されたリソースへの参照が変更されるかどうかは決定できません。

入力パラメータ値の修正

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

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

{ "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/SampleStack/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": "SampleStack", "NotificationARNs": [], "ChangeSetId": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/SampleChangeSet/1a2345b6-0000-00a0-a123-00abc0abc000" }

Changes 構造は、テンプレートの直接編集の例と似たような方法で機能します。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 フィールドの値の決定

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

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

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

{ "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/SampleStack/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": "SampleStack", "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 がインスタンスを置き換える条件を把握するには、AWS::EC2::Instance リソースタイプの InstanceType プロパティの更新動作を確認します。

リソースの追加および削除

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

{ "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/SampleStack/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": "SampleStack", "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 は、変更セットを実行すると新しいリソースを作成します。

プロパティレベルの変更の表示

以下の例は、Amazon EC2 インスタンスの Tag プロパティに対するプロパティレベルの変更を示しています。ValueKey タグが 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 構造は、変更セットが実行される前の KeyValue の値と、変更セットが実行された後の値を示しています。