조건 함수 - AWS CloudFormation

새로운 AWS CloudFormation 템플릿 참조 안내서입니다. 북마크와 링크를 업데이트하세요. CloudFormation을 시작하는 데 도움이 필요한 경우 AWS CloudFormation 사용 설명서를 참조하세요.

조건 함수

Fn::If 또는 Fn::Equals 등과 같은 내장 함수를 사용하여 조건부 로직을 기반으로 스택 리소스를 생성하고 구성할 수 있습니다. 이러한 조건은 스택 생성 또는 업데이트 중에 평가됩니다. 모든 조건을 정의한 후 템플릿의 ResourcesOutputs 섹션에서 조건을 리소스 또는 리소스 속성과 연결할 수 있습니다.

고급 시나리오의 경우 Fn::And 또는 Fn::Or 함수를 사용하여 조건을 결합하거나Fn::Not을 사용하여 조건 값을 무효화할 수 있습니다. 조건을 중첩하여 더 복잡한 조건부 로직을 생성할 수도 있습니다.

템플릿에서 조건을 처음 사용하는 경우 먼저 AWS CloudFormation 사용자 가이드CloudFormation 템플릿 Conditions 구문 주제를 검토하는 것이 좋습니다.

참고

템플릿의 Conditions 섹션에서 Fn::If 조건을 제외한 모든 조건을 정의해야 합니다. Metadata 속성, UpdatePolicy 속성, ResourcesOutputs 섹션에 있는 속성 값에서 Fn::If 조건을 사용할 수 있습니다.

Fn::And

지정된 모든 조건이 true로 평가되면 true가 반환되고, 조건 중 하나라도 false로 평가되는 경우 false가 반환됩니다. Fn::And는 AND 연산자 역할을 합니다. 포함할 수 있는 최소 조건 수는 2이고 최대값은 10입니다.

선언

JSON

"Fn::And": [{condition}, {...}]

YAML

전체 함수 이름의 구문:

Fn::And: [condition]

짧은 형식의 구문:

!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 가상 파라미터를 반환 값으로 사용하여 해당 속성을 제거할 수 있습니다.

선언

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}]

YAML

전체 함수 이름의 구문:

Fn::Not: [condition]

짧은 형식의 구문:

!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::EqualsFn::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로 평가되는 경우에만 리소스가 생성되도록 MountPointNewVolume 리소스는 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 속성 주제를 참조하세요.