조건 함수 - AWS CloudFormation

조건 함수

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}, {...}]

YAML

전체 함수 이름의 구문:

Fn::And: [condition]

짧은 형식의 구문:

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

선언

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

YAML

전체 함수 이름의 구문:

Fn::Not: [condition]

짧은 형식의 구문:

!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::EqualsFn::Or 등 나머지 모든 조건 함수에서 다음과 같은 함수를 사용할 수 있습니다.

  • Fn::FindInMap

  • Ref

  • 기타 조건 함수