새로운 AWS CloudFormation 템플릿 참조 안내서입니다. 북마크와 링크를 업데이트하세요. CloudFormation을 시작하는 데 도움이 필요한 경우 AWS CloudFormation 사용 설명서를 참조하세요.
조건 함수
Fn::If
또는 Fn::Equals
등과 같은 내장 함수를 사용하여 조건부 로직을 기반으로 스택 리소스를 생성하고 구성할 수 있습니다. 이러한 조건은 스택 생성 또는 업데이트 중에 평가됩니다. 모든 조건을 정의한 후 템플릿의 Resources
및 Outputs
섹션에서 조건을 리소스 또는 리소스 속성과 연결할 수 있습니다.
고급 시나리오의 경우 Fn::And
또는 Fn::Or
함수를 사용하여 조건을 결합하거나Fn::Not
을 사용하여 조건 값을 무효화할 수 있습니다. 조건을 중첩하여 더 복잡한 조건부 로직을 생성할 수도 있습니다.
템플릿에서 조건을 처음 사용하는 경우 먼저 AWS CloudFormation 사용자 가이드의 CloudFormation 템플릿 Conditions 구문 주제를 검토하는 것이 좋습니다.
참고
템플릿의 Conditions
섹션에서 Fn::If
조건을 제외한 모든 조건을 정의해야 합니다. Metadata
속성, UpdatePolicy
속성, Resources
및 Outputs
섹션에 있는 속성 값에서 Fn::If
조건을 사용할 수 있습니다.
Fn::And
지정된 모든 조건이 true로 평가되면 true
가 반환되고, 조건 중 하나라도 false로 평가되는 경우 false
가 반환됩니다. Fn::And
는 AND 연산자 역할을 합니다. 포함할 수 있는 최소 조건 수는 2이고 최대값은 10입니다.
선언
JSON
"Fn::And": [{
condition
}, {...
}]
파라미터
- condition
-
true
또는false
로 평가되는 조건입니다.
Fn::And
사용 예
다음 MyAndCondition
이 true로 평가되려면 참조된 보안 그룹 이름이 sg-mysggroup
과 같고 SomeOtherCondition
이 true로 평가되어야 합니다.
JSON
"MyAndCondition": { "Fn::And": [ {"Fn::Equals": ["sg-mysggroup", {"Ref": "ASecurityGroup"}]}, {"Condition": "SomeOtherCondition"} ] }
YAML
MyAndCondition: !And - !Equals ["sg-mysggroup", !Ref ASecurityGroup] - !Condition SomeOtherCondition
Fn::Equals
두 값이 같은지 여부를 비교합니다. 두 값이 같으면 true
를 반환하고 다르면 false
를 반환합니다.
선언
JSON
"Fn::Equals" : ["
value_1
", "value_2
"]
YAML
전체 함수 이름의 구문:
Fn::Equals: [
value_1
,value_2
]
짧은 형식의 구문:
!Equals [
value_1
,value_2
]
파라미터
- value
-
비교하려는 문자열 값.
Fn::Equals
사용 예
다음 IsProduction
조건이 true로 평가되려면 EnvironmentType
파라미터 값이 prod
와 같아야 합니다.
JSON
"IsProduction" : { "Fn::Equals": [ {"Ref": "EnvironmentType"}, "prod" ] }
YAML
IsProduction: !Equals [!Ref EnvironmentType, prod]
Fn::If
지정된 조건이 true
로 평가되면 특정 값을 반환하고 지정된 조건이 false
로 평가되면 다른 값을 반환합니다. 현재 CloudFormation에서는 Metadata
속성, UpdatePolicy
속성, 템플릿의 Resources
섹션과 Outputs
섹션에 있는 속성 값에서 Fn::If
내장 함수를 지원합니다. AWS::NoValue
가상 파라미터를 반환 값으로 사용하여 해당 속성을 제거할 수 있습니다.
선언
JSON
"Fn::If": [
condition_name
,value_if_true
,value_if_false
]
YAML
전체 함수 이름의 구문:
Fn::If: [
condition_name
,value_if_true
,value_if_false
]
짧은 형식의 구문:
!If [
condition_name
,value_if_true
,value_if_false
]
파라미터
- condition_name
-
조건 섹션의 조건에 대한 참조입니다. 조건의 이름을 사용하여 조건을 참조합니다.
- value_if_true
-
지정된 조건이 true로 평가되는 경우에 반환될 값입니다.
- value_if_false
-
지정된 조건이
false
로 평가되는 경우에 반환될 값입니다.
Fn::If
사용 예
조건부로 리소스 선택
다음 예제에서는 Amazon EC2 리소스 정의의 Fn::If
함수를 사용하여 인스턴스와 연결할 보안 그룹 리소스를 결정합니다. CreateNewSecurityGroup
조건이 true로 평가되면, CloudFormation은 참조된 값 NewSecurityGroup
(템플릿의 다른 곳에서 생성된 보안 그룹)을 사용하여 SecurityGroupIds
속성을 지정합니다. CreateNewSecurityGroup
이 false인 경우 CloudFormation은 참조된 값 ExistingSecurityGroupId
(기존 보안 그룹을 참조하는 파라미터)을 사용합니다.
JSON
"Resources": { "EC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-0abcdef1234567890", "InstanceType": "t3.micro", "SecurityGroupIds": { "Fn::If": [ "CreateNewSecurityGroup", [{"Ref": "NewSecurityGroup"}], [{"Ref": "ExistingSecurityGroupId"}] ] }] } } }
YAML
Resources: EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: ami-0abcdef1234567890 InstanceType: t3.micro SecurityGroupIds: !If - CreateNewSecurityGroup - [!Ref NewSecurityGroup] - [!Ref ExistingSecurityGroupId]
조건부 출력
템플릿의 Output
섹션에서 Fn::If
함수를 사용하여 정보를 조건부로 출력할 수 있습니다. 다음 코드 조각에서 CreateNewSecurityGroup
조건이 true로 평가되면 CloudFormation에서 NewSecurityGroup
리소스의 보안 그룹 ID를 출력합니다. 조건이 false이면 CloudFormation은 ExistingSecurityGroup
리소스의 보안 그룹 ID를 출력합니다.
JSON
"Outputs" : { "SecurityGroupId" : { "Description" : "Group ID of the security group used.", "Value" : { "Fn::If" : [ "CreateNewSecurityGroup", {"Ref" : "NewSecurityGroup"}, {"Ref" : "ExistingSecurityGroupId"} ] } } }
YAML
Outputs: SecurityGroupId: Description: Group ID of the security group used. Value: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroupId]
조건부 배열 값
다음 예제에서는 Fn::If
를 사용하여 조건에 따라 다른 배열 값을 조건부로 제공합니다. MoreThan2AZs
조건이 true로 평가되면 3개의 퍼블릭 서브넷을 사용합니다. 그렇지 않으면 2개의 퍼블릭 서브넷만 사용합니다.
JSON
"Subnets": { "Fn::If": [ "MoreThan2AZs", [ {"Fn::ImportValue": "PublicSubnet01"}, {"Fn::ImportValue": "PublicSubnet02"}, {"Fn::ImportValue": "PublicSubnet03"} ], [ {"Fn::ImportValue": "PublicSubnet01"}, {"Fn::ImportValue": "PublicSubnet02"} ] ] }
YAML
Subnets: Fn::If: - MoreThan2AZs - - Fn::ImportValue: PublicSubnet01 - Fn::ImportValue: PublicSubnet02 - Fn::ImportValue: PublicSubnet03 - - Fn::ImportValue: PublicSubnet01 - Fn::ImportValue: PublicSubnet02
조건부 속성 및 속성 값
다음 예제에서는 Fn::If
함수에서 AWS::NoValue
가상 파라미터를 사용합니다. 스냅샷 ID가 제공된 경우에만 조건에서 Amazon RDS DB 인스턴스에 대한 스냅샷을 사용합니다. UseDBSnapshot
조건이 true로 평가되면 CloudFormation에서는 DBSnapshotIdentifier
속성에 대한 DBSnapshotName
파라미터 값을 사용합니다. 조건이 false로 평가되면 CloudFormation이 DBSnapshotIdentifier
속성을 제거합니다.
또한 Amazon RDS DB 인스턴스의 AllocatedStorage
속성에 Fn::If
함수를 사용합니다. IsProduction
조건이 true로 평가되면 스토리지 크기가 100
으로 설정됩니다. 그렇지 않으면 20
로 설정됩니다.
JSON
"MyDatabase" : { "Type" : "AWS::RDS::DBInstance", "Properties": { "DBInstanceClass": "db.t3.micro", "AllocatedStorage": { "Fn::If": [ "IsProduction", 100, 20 ] }, "Engine" : "MySQL", "EngineVersion" : "5.5", "MasterUsername" : { "Ref" : "DBUser" }, "MasterUserPassword" : { "Ref" : "DBPassword" }, "DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" }, "DBSnapshotIdentifier" : { "Fn::If" : [ "UseDBSnapshot", {"Ref" : "DBSnapshotName"}, {"Ref" : "AWS::NoValue"} ] } } }
YAML
MyDatabase: Type: AWS::RDS::DBInstance Properties: DBInstanceClass: db.t3.micro AllocatedStorage: !If [IsProduction, 100, 20] Engine: MySQL EngineVersion: 5.5 MasterUsername: !Ref DBUser MasterUserPassword: !Ref DBPassword DBParameterGroupName: !Ref MyRDSParamGroup DBSnapshotIdentifier: !If [UseDBSnapshot, !Ref DBSnapshotName, !Ref "AWS::NoValue"]
조건부 업데이트 정책
다음은 RollingUpdates
조건이 true로 평가되는 경우에만 Auto Scaling 업데이트 정책을 제공하는 코드 조각입니다. 조건이 false로 평가되면 CloudFormation이 AutoScalingRollingUpdate
업데이트 정책을 제거합니다.
JSON
"UpdatePolicy": { "Fn::If": [ "RollingUpdates", { "AutoScalingRollingUpdate": { "MaxBatchSize": 2, "MinInstancesInService": 2, "PauseTime": "PT0M30S" } }, { "Ref": "AWS::NoValue" } ] }
YAML
UpdatePolicy: !If - RollingUpdates - AutoScalingRollingUpdate: MaxBatchSize: 2 MinInstancesInService: 2 PauseTime: PT0M30S - !Ref "AWS::NoValue"
Fn::Not
false
로 평가되는 조건에 대해 true
를 반환하고 true
로 평가되는 조건에 대해 false
를 반환합니다. Fn::Not
는 NOT 연산자 역할을 합니다.
선언
JSON
"Fn::Not": [{
condition
}]
파라미터
- condition
-
Fn::Equals
또는true
로 평가되는 조건(예:false
)입니다.
Fn::Not
사용 예
다음 EnvCondition
조건이 true로 평가되려면 EnvironmentType
파라미터 값이 prod
와 같지 않아야 합니다.
JSON
"MyNotCondition" : { "Fn::Not" : [{ "Fn::Equals" : [ {"Ref" : "EnvironmentType"}, "prod" ] }] }
YAML
MyNotCondition: !Not [!Equals [!Ref EnvironmentType, prod]]
Fn::Or
지정된 모든 조건 중 하나라도 true로 평가되면 true
가 반환되고, 조건 모두가 false로 평가되는 경우 false
가 반환됩니다. Fn::Or
는 OR 연산자 역할을 합니다. 포함할 수 있는 최소 조건 수는 2이고 최대값은 10입니다.
선언
JSON
"Fn::Or": [{
condition
}, {...
}]
YAML
전체 함수 이름의 구문:
Fn::Or: [
condition, ...
]
짧은 형식의 구문:
!Or [
condition, ...
]
파라미터
- condition
-
true
또는false
로 평가되는 조건입니다.
Fn::Or
사용 예
다음 MyOrCondition
이 true로 평가되려면 참조된 보안 그룹 이름이 sg-mysggroup
과 같거나 SomeOtherCondition
이 true로 평가되어야 합니다.
JSON
"MyOrCondition" : { "Fn::Or" : [ {"Fn::Equals" : ["sg-mysggroup", {"Ref" : "ASecurityGroup"}]}, {"Condition" : "SomeOtherCondition"} ] }
YAML
MyOrCondition: !Or [!Equals [sg-mysggroup, !Ref ASecurityGroup], Condition: SomeOtherCondition]
지원되는 함수
Fn::If
조건에서 다음과 같은 함수를 사용할 수 있습니다.
-
Fn::Base64
-
Fn::FindInMap
-
Fn::GetAtt
-
Fn::GetAZs
-
Fn::If
-
Fn::Join
-
Fn::Select
-
Fn::Sub
-
Ref
Fn::Equals
및 Fn::Or
등 나머지 모든 조건 함수에서 다음과 같은 함수를 사용할 수 있습니다.
-
Fn::FindInMap
-
Ref
-
기타 조건 함수
샘플 템플릿
프로덕션, 개발 또는 테스트 스택에 대한 리소스를 조건부로 생성
비슷하지만 약간 조정된 스택을 생성하려는 경우도 있습니다. 예를 들어, 프로덕션 애플리케이션에 사용할 템플릿이 필요할 수 있습니다. 개발 또는 테스트에 사용할 수 있도록 동일한 프로덕션 스택을 생성하려고 합니다. 하지만 개발 및 테스트의 경우 프로덕션 레벨 스택에 포함되는 추가 용량 중 일부가 필요하지 않을 수도 있습니다. 그 대신 다음 예제와 같이 환경 유형 입력 파라미터를 사용하여 프로덕션, 개발 또는 테스트에 특정한 스택 리소스를 조건부로 생성할 수 있습니다.
prod
파라미터에 대해 dev
, test
또는 EnvType
를 지정할 수 있습니다. 템플릿에서는 환경 유형별로 다른 인스턴스 유형을 지정합니다. 인스턴스 유형은 대용량의 컴퓨팅 최적화된 인스턴스 유형부터 작은 범용 인스턴스 유형까지 다양합니다. 인스턴스 유형을 조건부로 지정하려면 템플릿의 Conditions
섹션에서 CreateProdResources
조건(EnvType
파라미터 값이 prod
와 같으면 true로 평가됨)과 CreateDevResources
조건(파라미터 값이 dev
와 같으면 true로 평가됨)을 정의합니다.
InstanceType
속성에서 템플릿은 두 Fn::If
내장 함수를 중첩하여 사용할 인스턴스 유형을 결정합니다. CreateProdResources
조건이 true이면 인스턴스 유형은 c5.xlarge
이고, false이면 CreateDevResources
조건이 평가됩니다. CreateDevResources
조건이 true이면 인스턴스 유형이 t3.medium
이고, 그렇지 않으면 t3.small
입니다.
인스턴스 유형 이외에 프로덕션 환경에서는 Amazon EC2 볼륨을 생성하여 인스턴스에 연결합니다. 조건이 true로 평가되는 경우에만 리소스가 생성되도록 MountPoint
및 NewVolume
리소스는 CreateProdResources
조건과 연결됩니다.
예 JSON
{ "AWSTemplateFormatVersion" : "2010-09-09", "Parameters" : { "EnvType" : { "Description" : "Environment type.", "Default" : "test", "Type" : "String", "AllowedValues" : ["prod", "dev", "test"], "ConstraintDescription" : "must specify prod, dev, or test." } }, "Conditions" : { "CreateProdResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "prod"]}, "CreateDevResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "dev"]} }, "Resources" : { "EC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : "ami-1234567890abcdef0", "InstanceType" : { "Fn::If" : [ "CreateProdResources", "c5.xlarge", {"Fn::If" : [ "CreateDevResources", "t3.medium", "t3.small" ]} ]} } }, "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, dev, test] ConstraintDescription: must specify prod, dev, or test. Conditions: CreateProdResources: !Equals [!Ref EnvType, prod] CreateDevResources: !Equals [!Ref EnvType, "dev"] Resources: EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: ami-1234567890abcdef0 InstanceType: !If [CreateProdResources, c5.xlarge, !If [CreateDevResources, t3.medium, t3.small]] 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
참고
조건을 사용하여 리소스를 생성하는 더 복잡한 예는 Condition 속성 주제를 참조하세요.