변경 세트의 예 - AWS CloudFormation

변경 세트의 예

이 단원에서는 CloudFormation에서 일반적인 스택 변경을 위해 생성하는 변경 세트의 예를 제공합니다. 이러한 예에서는 템플릿을 직접 편집하는 방법, 단일 입력 파라미터를 수정하는 방법, 백업되지 않은 데이터 손실을 방지하거나 스택에서 실행 중인 애플리케이션이 중단되지 않도록 리소스 재생성(대체)을 계획하는 방법, 그리고 리소스를 추가 및 제거하는 방법을 보여줍니다. 변경 세트의 작동 방식을 설명하기 위해 제출된 변경 사항을 살펴보고 그 결과 생성된 변경 세트에 대해 알아봅니다. 각 예는 여러분이 이전의 예를 이해하고 있다고 가정하고 작성되었으므로 해당하는 예를 순서대로 읽어보는 것이 좋습니다. 변경 세트 내 각 필드에 대한 설명은 AWS CloudFormation API 참조Change 데이터 유형을 참조하세요.

콘솔, 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 구조가 하나 뿐입니다. 이 구조는 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 구조가 하나 뿐이고, 이 구조는 Tags EC2 인스턴스의 i-1abc23d4 속성에 대한 변경 사항을 설명합니다.

그러나 Details 구조에서는 단일 파라미터 값이 변경되었더라도 변경 세트에는 Tags 속성에 대한 변경 사항이 2개 표시됩니다. (Ref 내장 함수를 사용하여) 변경된 파라미터 값을 참조하는 리소스에는 변경 사항이 항상 2개 있습니다. 하나는 Dynamic 평가와 관련된 변경 사항이고 다른 하나는 Static 평가와 관련된 변경 사항입니다. 이러한 유형의 변경 사항은 다음 필드를 보고 확인할 수 있습니다.

  • Static 평가 변경의 경우 ChangeSource 필드를 확인합니다. 이 예에서 ChangeSource 필드는 ParameterReference와 동일합니다. 즉, 이 변경은 업데이트된 파라미터 참조 값의 결과입니다. 변경 세트에는 유사한 Dynamic 평가 변경이 포함되어 있어야 합니다.

  • 두 변경 사항에 대한 Dynamic 구조를 비교해 일치하는 Target 평가 변경을 찾을 수 있습니다. 이러한 구조에는 동일한 정보가 포함됩니다. 이 예에서 두 변경 사항에 대한 Target 구조에는 AttributeRequireRecreation 필드에 대해 동일한 값이 포함되어 있습니다.

이러한 변경 유형의 경우, 변경 사항에 대해 가장 자세한 정보를 제공하는 정적 평가를 중점적으로 살펴보겠습니다. 이 예에서 정적 평가는 변경 사항이 파라미터 참조 값(ParameterReference)을 변경한 결과임을 보여줍니다. 변경된 정확한 파라미터는 CauseEntity 필드(Purpose 파라미터)로 표시됩니다.

대체 필드의 값 확인

ResourceChange 구조의 Replacement 필드는 CloudFormation에서 리소스를 다시 생성할지 여부를 나타냅니다. 리소스 재생성(대체)을 계획하면 백업되지 않은 데이터 손실 또는 스택에서 실행 중인 애플리케이션 중단이 방지됩니다.

Replacement 필드의 값은 변경 시 리소스를 바꿔야 하는지 여부에 따라 달라지며, 변경의 RequiresRecreation 구조 내 Target 필드로 표시됩니다. 예를 들어, RequiresRecreation 필드가 Never이면 Replacement 필드는 False입니다. 그러나 한 리소스에 대한 변경 사항이 여러 개인데 변경마다 RequiresRecreation 필드 값이 다른 경우, CloudFormation은 가장 적극적인 개입 동작을 사용하여 리소스를 업데이트합니다. 다시 말해, 여러 변경 사항 중 리소스를 바꿔야 하는 것이 하나뿐인 경우 CloudFormation은 해당 리소스를 바꾸기 위해 Replacement 필드를 True로 설정합니다.

다음 변경 세트는 전부 EC2 인스턴스에서 사용되는 모든 파라미터(Purpose, InstanceTypeKeyPairName)의 값을 변경하여 생성된 것입니다. 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이 인스턴스를 바꿔야 하는 조건을 찾아보려면 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 구조에는 리소스마다 하나씩 세 가지 ResourceChange 구조가 있습니다. 각 리소스의 Action 필드는 CloudFormation에서 리소스를 추가하는지 아니면 제거하는지 여부를 나타냅니다. ScopeDetails 필드는 수정된 리소스에만 적용되므로 비어 있습니다.

새 리소스의 경우, 변경 세트를 실행할 때까지 CloudFormation이 일부 필드의 값을 확인할 수 없습니다. 예를 들어 오토 스케일링의 물리적 ID 및 시작 구성이 아직 존재하지 않기 때문에 CloudFormation은 이러한 정보를 제공하지 않습니다. CloudFormation은 변경 세트를 실행할 때 새 리소스를 생성합니다.