CloudFormation 템플릿 Conditions 구문
Conditions
섹션(선택 사항)에는 엔터티가 생성 또는 구성된 환경을 정의하는 문이 포함되어 있습니다. 예를 들어 조건을 생성하고 이를 리소스 또는 출력에 연결하여 조건이 true인 경우에만 CloudFormation에서 리소스 또는 출력을 생성하도록 할 수 있습니다. 이와 유사하게 조건을 속성에 연결하여 조건이 true인 경우에만 CloudFormation에서 속성을 특정 값으로 설정하도록 할 수 있습니다. 조건이 false인 경우 CloudFormation에서 사용자가 지정한 대체 값으로 속성을 설정합니다.
다양한 컨텍스트(예: 테스트 환경과 프로덕션 환경)에서 리소스를 생성하는 데 템플릿을 재사용하려는 경우에 조건을 사용할 수 있습니다. 예를 들어 템플릿에서 prod
또는 test
를 입력으로 수락하는 EnvironmentType
입력 파라미터를 추가할 수 있습니다. prod
환경에서는 특정 기능을 가진 EC2 인스턴스를 포함할 수 있지만, test
환경에서는 비용 절감을 위해 더 적은 기능을 사용하려고 합니다. 이 조건 정의를 통해, 생성되는 리소스와 각 환경 유형에 대한 리소스 구성 방법을 정의할 수 있습니다.
구문
Conditions
섹션은 키 이름 Conditions
로 이루어집니다. 각 조건 선언에는 논리적 ID와 하나 이상의 내장 함수가 포함됩니다.
JSON
"Conditions": { "
LogicalConditionName1
": { "Intrinsic function
":...
[ }, "LogicalConditionName2
": { "Intrinsic function
":...
} }
YAML
Conditions:
LogicalConditionName1
:Intrinsic function
:...
LogicalConditionName2
:Intrinsic function
:...
조건 작동 방식
조건을 사용하려면 다음 단계를 따릅니다.
-
파라미터 정의 추가 - 템플릿의
Parameters
섹션에서 조건을 사용하여 평가할 입력을 정의합니다. 조건은 이러한 입력 파라미터의 값에 따라 true 또는 false로 평가합니다. 가상 파라미터는 자동으로 제공되며Parameters
섹션에 명시적으로 정의할 필요가 없습니다. 가상 파라미터에 대한 자세한 내용은 가상 파라미터를 사용하여 AWS 값 가져오기 단원을 참조하십시오. -
조건 정의 추가 -
Fn::If
,Fn::Equals
및Fn::Not
과 같은 내장 함수를 사용하여Conditions
섹션에 조건을 정의합니다. 이러한 조건은 CloudFormation에서 연결된 리소스가 생성되는 경우를 결정합니다. 조건은 다음을 기준으로 할 수 있습니다.-
입력 또는 가상 파라미터 값
-
기타 조건
-
매핑 값
-
-
조건을 리소스 또는 출력과 연결 -
Condition
키와 조건의 논리적 ID를 사용하여 리소스 또는 출력에서 조건을 참조합니다. 필요한 경우, 템플릿의 다른 부분(예: 속성 값)에Fn::If
을 사용하여 조건을 기준으로 값을 설정할 수 있습니다.
CloudFormation은 스택을 생성하거나 업데이트할 때 조건을 평가합니다. CloudFormation에서는 true 조건과 연결된 엔터티를 생성하고 false 조건과 연결된 엔터티를 무시합니다. 또한 CloudFormation은 리소스를 수정하기 전에 각 스택 업데이트 시에 이러한 조건을 다시 평가합니다. true 조건과 연결된 상태로 남아 있는 엔터티는 업데이트되고, false 조건과 연결되는 엔터티는 삭제됩니다.
중요
스택 업데이트 중에는 조건을 자체적으로 업데이트할 수 없습니다. 조건은 리소스를 추가, 수정 또는 삭제하는 변경 내용을 포함할 때만 업데이트할 수 있습니다.
조건 내장 함수
다음 내장 함수를 사용하여 조건을 정의할 수 있습니다.
참고
템플릿의 Resources
섹션과 Outputs
섹션에 있는 메타데이터 속성, 업데이트 정책 속성 및 속성값에서만 Fn::If
가 지원됩니다.
예시
환경 기반 리소스 생성
다음 예에서는 EC2 인스턴스를 프로비저닝하고, 환경 유형이 prod
인 경우에만 새 EBS 볼륨을 조건부로 생성 및 연결합니다. 환경이 test
인 경우에는 추가 볼륨 없이 EC2 인스턴스만 생성합니다.
JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Parameters": { "EnvType": { "Description": "Environment type", "Default": "test", "Type": "String", "AllowedValues": [ "prod", "test" ], "ConstraintDescription": "must specify prod or test" } }, "Conditions": { "CreateProdResources": { "Fn::Equals": [ { "Ref": "EnvType" }, "prod" ] } }, "Resources": { "EC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-1234567890abcdef0" } }, "MountPoint": { "Type": "AWS::EC2::VolumeAttachment", "Condition": "CreateProdResources", "Properties": { "InstanceId": { "Ref": "EC2Instance" }, "VolumeId": { "Ref": "NewVolume" }, "Device": "/dev/sdh" } }, "NewVolume": { "Type": "AWS::EC2::Volume", "Condition": "CreateProdResources", "Properties": { "Size": 100, "AvailabilityZone": { "Fn::GetAtt": [ "EC2Instance", "AvailabilityZone" ] } } } } }
YAML
AWSTemplateFormatVersion: 2010-09-09 Parameters: EnvType: Description: Environment type Default: test Type: String AllowedValues: - prod - test ConstraintDescription: must specify prod or test Conditions: CreateProdResources: !Equals - !Ref EnvType - prod Resources: EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: ami-1234567890abcdef0 MountPoint: Type: AWS::EC2::VolumeAttachment Condition: CreateProdResources Properties: InstanceId: !Ref EC2Instance VolumeId: !Ref NewVolume Device: /dev/sdh NewVolume: Type: AWS::EC2::Volume Condition: CreateProdResources Properties: Size: 100 AvailabilityZone: !GetAtt - EC2Instance - AvailabilityZone
다중 조건 리소스 프로비저닝
다음 예에서는 버킷 이름이 제공된 경우 조건부로 S3 버킷을 생성하고, 환경이 prod
로 설정된 경우에만 버킷 정책을 연결합니다. 버킷 이름이 지정되지 않았거나 환경이 test
인 경우에는 리소스가 생성되지 않습니다.
JSON
{ "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
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: ...