조건 함수
Fn::If
, Fn::Equals
, Fn::Not
등과 같은 내장 함수를 사용하여 스택 리소스를 조건부로 생성할 수 있습니다. 스택을 생성하거나 업데이트할 때 선언하는 입력 파라미터를 기준으로 이러한 조건을 평가합니다. 모든 조건을 정의한 후 템플릿의 리소스 및 출력 섹션에서 리소스 또는 리소스 속성과 조건을 연결할 수 있습니다.
템플릿의 조건 섹션에서 Fn::If
조건을 제외한 모든 조건을 정의합니다. 템플릿의 리소스 섹션과 출력 섹션에 있는 메타데이터 속성, 업데이트 정책 속성 및 속성 값에서 Fn::If
조건을 사용할 수 있습니다.
다양한 컨텍스트(예: 테스트 환경과 프로덕션 환경)에서 리소스를 생성할 수 있는 템플릿을 재사용하려는 경우에 조건을 사용할 수 있습니다. 템플릿에서 prod
또는 test
를 입력으로 수락하는 EnvironmentType
입력 파라미터를 추가할 수 있습니다. 프로덕션 환경에서는 특정 기능을 가진 Amazon EC2 인스턴스를 포함할 수 있지만, 테스트 환경에서는 비용 절감을 위해 더 적은 기능을 사용하려고 합니다. 조건을 사용하여 생성되는 리소스와 각 환경 유형에 대한 리소스 구성 방법을 정의할 수 있습니다.
조건 섹션에 대한 자세한 내용은 조건 단원을 참조하십시오.
참고
템플릿의 파라미터 및 매핑 섹션에서만 다른 조건과 값을 참조할 수 있습니다. 예를 들어, 입력 파라미터에서 값을 참조할 수 있지만 조건에서 리소스의 논리적 ID를 참조할 수 없습니다.
조건 연결
리소스, 리소스 속성 또는 출력을 조건부로 생성하려면 조건을 해당 항목과 연결해야 합니다. 다음 코드 조각에 표시된 대로 Condition:
키와 조건의 논리적 ID를 속성으로 추가하여 조건을 연결합니다. AWS CloudFormation에서는 CreateProdResources
조건이 true로 평가되는 경우에만 NewVolume
리소스를 생성합니다.
JSON
"NewVolume" : { "Type" : "AWS::EC2::Volume", "Condition" : "CreateProdResources", "Properties" : { "Size" : "100", "AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]} }
YAML
NewVolume: Type: "AWS::EC2::Volume" Condition: CreateProdResources Properties: Size: 100 AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone
Fn::If
Fn::If
함수의 경우 조건 이름만 지정하면 됩니다. 다음은 Fn::If
를 사용하여 리소스 속성을 조건부로 지정하는 방법을 보여주는 코드 조각입니다. CreateLargeSize
조건이 true인 경우 CloudFormation에서는 볼륨 크기를 100
으로 설정합니다. 조건이 false인 경우 CloudFormation은 볼륨 크기를 10
으로 설정합니다.
JSON
{ "NewVolume": { "Type": "AWS::EC2::Volume", "Properties": { "Size": { "Fn::If": [ "CreateLargeSize", "100", "10" ] }, "AvailabilityZone": { "Fn::GetAtt": [ "Ec2Instance", "AvailabilityZone" ] } }, "DeletionPolicy": "Snapshot" } }
YAML
NewVolume: Type: 'AWS::EC2::Volume' Properties: Size: 'Fn::If': - CreateLargeSize - '100' - '10' AvailabilityZone: 'Fn::GetAtt': - Ec2Instance - AvailabilityZone DeletionPolicy: Snapshot
중첩된 조건
다른 조건의 내부에 조건을 사용할 수도 있습니다. 다음은 템플릿의 Conditions
섹션에서 가져온 코드 조각입니다. MyAndCondition
조건은 SomeOtherCondition
조건을 포함합니다.
JSON
"MyAndCondition": { "Fn::And": [ {"Fn::Equals": ["sg-mysggroup", {"Ref": "ASecurityGroup"}]}, {"Condition": "SomeOtherCondition"} ] }
YAML
MyAndCondition: !And - !Equals ["sg-mysggroup", !Ref "ASecurityGroup"] - !Condition SomeOtherCondition
Fn::And
지정된 모든 조건이 true로 평가되면 true
가 반환되고, 조건 중 하나라도 false로 평가되는 경우 false
가 반환됩니다. Fn::And
는 AND 연산자 역할을 합니다. 포함할 수 있는 최소 조건 수는 2이고 최대값은 10입니다.
선언
JSON
"Fn::And": [{
condition
}, {...
}]
파라미터
condition
-
true
또는false
로 평가되는 조건입니다.
예
다음 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
-
비교하려는 유형의 값입니다.
예
다음 UseProdCondition
조건이 true로 평가되려면 EnvironmentType
파라미터 값이 prod
와 같아야 합니다.
JSON
"UseProdCondition" : { "Fn::Equals": [ {"Ref": "EnvironmentType"}, "prod" ] }
YAML
UseProdCondition: !Equals [!Ref EnvironmentType, prod]
Fn::If
지정된 조건이 true
로 평가되면 특정 값을 반환하고 지정된 조건이 false
로 평가되면 다른 값을 반환합니다. 현재 CloudFormation에서는 템플릿의 리소스 섹션과 출력 섹션에 있는 메타데이터 속성, 업데이트 정책 속성 및 속성 값에서 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
로 평가되는 경우에 반환될 값입니다.
예
추가 샘플을 보려면 샘플 템플릿 단원을 참조하십시오.
예 1
다음 코드 조각은 Amazon EC2 리소스에 대한 SecurityGroups
속성에서 Fn::If
함수를 사용합니다. CreateNewSecurityGroup
조건이 true로 평가되면 CloudFormation에서는 NewSecurityGroup
의 참조된 값을 사용하여 SecurityGroups
속성을 지정하고, 그렇지 않으면 CloudFormation은 ExistingSecurityGroup
의 참조된 값을 사용합니다.
JSON
"SecurityGroups" : [{ "Fn::If" : [ "CreateNewSecurityGroup", {"Ref" : "NewSecurityGroup"}, {"Ref" : "ExistingSecurityGroup"} ] }]
YAML
SecurityGroups: - !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroup]
예제 2
템플릿의 출력 섹션에서 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" : "ExistingSecurityGroup"} ] } } }
YAML
Outputs: SecurityGroupId: Description: Group ID of the security group used. Value: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroup]
예 3
다음 코드 조각은 AWS::NoValue
함수에서 Fn::If
가상 파라미터를 사용합니다. 스냅샷 ID가 제공된 경우에만 조건에서 Amazon RDS DB 인스턴스에 대한 스냅샷을 사용합니다. UseDBSnapshot
조건이 true로 평가되면 CloudFormation에서는 DBSnapshotIdentifier
속성에 대한 DBSnapshotName
파라미터 값을 사용합니다. 조건이 false로 평가되면 CloudFormation이 DBSnapshotIdentifier
속성을 제거합니다.
JSON
"MyDB" : { "Type" : "AWS::RDS::DBInstance", "Properties" : { "AllocatedStorage" : "5", "DBInstanceClass" : "db.t2.small", "Engine" : "MySQL", "EngineVersion" : "5.5", "MasterUsername" : { "Ref" : "DBUser" }, "MasterUserPassword" : { "Ref" : "DBPassword" }, "DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" }, "DBSnapshotIdentifier" : { "Fn::If" : [ "UseDBSnapshot", {"Ref" : "DBSnapshotName"}, {"Ref" : "AWS::NoValue"} ] } } }
YAML
MyDB: Type: "AWS::RDS::DBInstance" Properties: AllocatedStorage: 5 DBInstanceClass: db.t2.small Engine: MySQL EngineVersion: 5.5 MasterUsername: !Ref DBUser MasterUserPassword: !Ref DBPassword DBParameterGroupName: !Ref MyRDSParamGroup DBSnapshotIdentifier: !If [UseDBSnapshot, !Ref DBSnapshotName, !Ref "AWS::NoValue"]
예 4
다음은 RollingUpdates
조건이 true로 평가되는 경우에만 Auto Scaling 업데이트 정책을 제공하는 코드 조각입니다. 조건이 false로 평가되면 CloudFormation이 AutoScalingRollingUpdate
업데이트 정책을 제거합니다.
JSON
"UpdatePolicy": { "AutoScalingRollingUpdate": { "Fn::If": [ "RollingUpdates", { "MaxBatchSize": "2", "MinInstancesInService": "2", "PauseTime": "PT0M30S" }, { "Ref" : "AWS::NoValue" } ] } }
YAML
UpdatePolicy: AutoScalingRollingUpdate: !If - RollingUpdates - 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
)입니다.
예
다음 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
로 평가되는 조건입니다.
예
다음 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
-
기타 조건 함수