Fn::Sub - AWS CloudFormation

Fn::Sub

내장 함수 Fn::Sub는 입력 문자열의 변수를 지정한 값으로 바꿉니다. 템플릿에 이 함수를 사용해 스택을 생성하거나 업데이트해야만 사용할 수 있는 값이 포함된 명령 또는 출력을 만들 수 있습니다.

선언

다음 단원에서는 함수의 구문을 보여줍니다.

JSON

{ "Fn::Sub" : [ String, { Var1Name: Var1Value, Var2Name: Var2Value } ] }

템플릿 파라미터, 리소스의 논리적 ID 또는 String 파라미터의 리소스 속성만 바꾸는 경우 변수 맵을 지정하지 마십시오.

{ "Fn::Sub" : String }

YAML

전체 함수 이름의 구문:

Fn::Sub: - String - Var1Name: Var1Value Var2Name: Var2Value

짧은 형식의 구문:

!Sub - String - Var1Name: Var1Value Var2Name: Var2Value

템플릿 파라미터, 리소스의 논리적 ID 또는 String 파라미터의 리소스 속성만 바꾸는 경우 변수 맵을 지정하지 마십시오.

전체 함수 이름의 구문:

Fn::Sub: String

짧은 형식의 구문:

!Sub String

파라미터

String

변수가 포함된 문자열로, AWS CloudFormation은 실행 시간 시 이를 연결된 값으로 바꿉니다. 변수를 ${MyVarName}으로 씁니다. 변수는 템플릿 파라미터 이름, 리소스의 논리적 ID, 리소스 속성 또는 키-값 맵의 변수일 수 있습니다. 템플릿 파라미터 이름, 리소스의 논리적 ID 및 리소스 속성만 지정하는 경우에는 키-값 맵을 지정하지 마십시오.

템플릿 파라미터 이름 또는 리소스의 논리적 ID(예: ${InstanceTypeParameter})를 지정하는 경우 CloudFormation에서는 Ref 내장 함수를 사용했을 때와 동일한 값을 반환합니다. 리소스 속성(예: ${MyInstance.PublicIp})을 지정하는 경우 CloudFormation에서는 Fn::GetAtt 내장 함수를 사용했을 때와 동일한 값을 반환합니다.

달러 문자 및 중괄호(${})를 그대로 쓰려면 여는 중괄호 뒤에 느낌표(!)를 추가합니다(예: ${!Literal}). CloudFormation은 이 텍스트를 ${Literal}로 확인합니다.

VarName

String 파라미터에 포함한 변수의 이름입니다.

VarValue

CloudFormation은 실행 시간 시 연결된 변수 이름을 이 값으로 바꿉니다.

반환 값

CloudFormation은 모든 변수를 이 값으로 바꾸어 원본 문자열을 반환합니다.

예시

다음은 Fn::Sub 함수의 사용 방법을 설명하는 예제입니다.

키-값 맵 없이 Fn::Sub 사용

이 간단한 예제에서는 InstanceSecurityGroup 리소스의 설명이 AWS::StackName 가상 파라미터를 사용하여 동적으로 생성됩니다. 예를 들어 스택 이름이 "VPC-EC2-ALB-Stack"인 경우 결과로 나오는 설명은 "SSH security group for VPC-EC2-ALB-Stack"입니다.

JSON

"InstanceSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Properties" : { "GroupDescription" : {"Fn::Sub": "SSH security group for ${AWS::StackName}"} }}

YAML

InstanceSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: !Sub "SSH security group for ${AWS::StackName}"

키-값 맵을 포함하여 Fn::Sub 사용

이 예제에서는 WWWBucket 리소스의 이름이 키-값 맵을 사용하여 동적으로 생성됩니다. Fn::Sub 함수는 동일한 스택 템플릿 내에 정의된 RootDomainName 파라미터를 참조하는 Ref 함수의 www.${Domain} 값으로 입력 문자열의 ${Domain}을 대체합니다. 예를 들어, 루트 도메인 이름이 "mydomain.com"인 경우 그에 따라 리소스의 이름은 "www.mydomain.com"입니다.

JSON

"WWWBucket":{ "Type":"AWS::S3::Bucket", "Properties":{ "BucketName":{ "Fn::Sub":[ "www.${Domain}", { "Domain":{ "Ref":"RootDomainName" } } ] } } }

YAML

WWWBucket: Type: AWS::S3::Bucket Properties: BucketName: !Sub - 'www.${Domain}' - Domain: !Ref RootDomainName

여러 변수를 사용하여 ARN을 구성합니다.

다음 예제에서는 AWS::RegionAWS::AccountId 가상 파라미터와 vpc 리소스 논리적 ID와 함께 Fn::Sub를 사용하여 VPC에 대한 Amazon 리소스 이름(ARN)을 생성합니다.

JSON

{ "Fn::Sub": "arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}" }

YAML

!Sub 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}'

사용자 데이터 스크립트에 파라미터 값 전달

다음 예제에서는 Fn::Sub를 사용하여 런타임 시 실제 스택 이름 및 리전을 AWS::StackNameAWS::Region 가상 파라미터로 바꿉니다.

JSON

가독성을 위해, JSON 예제에서는 전체 사용자 데이터 스크립트를 단일 문자열 값으로 지정하는 대신 Fn::Join 함수를 사용하여 각 명령을 구분합니다.

"UserData": { "Fn::Base64": { "Fn::Join": ["\n", [ "#!/bin/bash -xe", "yum update -y aws-cfn-bootstrap", { "Fn::Sub": "/opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfig --configsets wordpress_install --region ${AWS::Region}" }, { "Fn::Sub": "/opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}" }]] }}

YAML

YAML 예제에서는 리터럴 블록을 사용하여 사용자 데이터 스크립트를 지정합니다.

UserData: Fn::Base64: !Sub | #!/bin/bash -xe yum update -y aws-cfn-bootstrap /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource LaunchConfig --configsets wordpress_install --region ${AWS::Region} /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServerGroup --region ${AWS::Region}

매핑을 사용하여 조건 값 지정

이 예제에서 myLogGroup 리소스의 이름은 log_group_name 변수를 Fn::FindInMap 함수의 결과 값으로 대체하여 동적으로 생성됩니다.

JSON

{ "Mappings": { "LogGroupMapping": { "Test": { "Name": "test_log_group" }, "Prod": { "Name": "prod_log_group" } } }, "Resources": { "myLogGroup": { "Type": "AWS::Logs::LogGroup", "Properties": { "LogGroupName": { "Fn::Sub": [ "cloud_watch_${log_group_name}", { "log_group_name": { "Fn::FindInMap": [ "LogGroupMapping", "Test", "Name" ] } } ] } } } } }

YAML

Mappings: LogGroupMapping: Test: Name: test_log_group Prod: Name: prod_log_group Resources: myLogGroup: Type: 'AWS::Logs::LogGroup' Properties: LogGroupName: !Sub - 'cloud_watch_${log_group_name}' - log_group_name: !FindInMap - LogGroupMapping - Test - Name

지원되는 함수

String 파라미터의 경우 어떠한 함수도 사용할 수 없습니다. 문자열 값을 지정해야 합니다.

VarNameVarValue 파라미터의 경우 다음 함수를 사용할 수 있습니다.