メニュー
AWS CloudFormation
ユーザーガイド (API Version 2010-05-15)

変更セットのサンプル

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

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

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

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

テンプレートの直接編集

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

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

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

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

入力パラメータ値の修正

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

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

Copy
{ "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": "2016-03-16T23: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 つのみがあり、i-1abc23d4 EC2 インスタンスの Tags 属性への変更を記述します。

ただし、Details 構造では、変更されたパラメーター値が単一でも、変更セットには Tags 属性に対する 2 つの変更が表示されます。変更されたパラメーター値を参照するリソース (Ref 組み込み関数を使用) は、常に 2 つの変更になります。ひとつは Dynamic 評価、もうひとつは Static 評価です。以下のフィールドを参照して、このようなタイプの変更を確認できます。

  • Static 評価の変更の場合、ChangeSource フィールドを参照します。この例では、ChangeSource フィールドは ParameterReference と等しく、この変更が更新されたパラメーターの参照値の結果であることを意味します。変更セットには、似たような Dynamic 評価の変更があるはずです。

  • 同じ情報を含む 2 つの変更の Target 構造を比較することで、一致する Dynamic 評価の変更を検索できます。この例では、両方の変更の Target 構造で、Attribute および RequireRecreation フィールドに同じ値が含まれます。

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

Replacement フィールドの値の決定

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

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

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

Copy
{ "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": "2016-03-17T00: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 プロパティに対する変更がもっとも大きな更新動作になるため、常に再作成が必要になります。キー名が変更されるため、AWS CloudFormation によってインスタンスが置き換えられます。

キー名が変わらない場合は、InstanceType プロパティに対する変更がもっとも大きな更新動作 (Conditionally) になります。したがって、Replacement フィールドは Conditionally です。AWS CloudFormation によってインスタンスが置き換えられる条件を確認するには、InstanceType プロパティの更新動作を参照してください。

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

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

Copy
{ "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": "2016-03-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 フィールドには AWS CloudFormation によってリソースが追加または削除されるかどうかが示されています。Scope および Details フィールドはリソースの変更にのみ適用されるため、空になります。

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