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은 실행 시간 시 이를 연결된 값으로 바꿉니다. 변수를
${
으로 씁니다. 변수는 템플릿 파라미터 이름, 리소스의 논리적 ID, 리소스 속성 또는 키-값 맵의 변수일 수 있습니다. 템플릿 파라미터 이름, 리소스의 논리적 ID 및 리소스 속성만 지정하는 경우에는 키-값 맵을 지정하지 마십시오.MyVarName
}템플릿 파라미터 이름 또는 리소스의 논리적 ID(예:
${InstanceTypeParameter}
)를 지정하는 경우 CloudFormation에서는Ref
내장 함수를 사용했을 때와 동일한 값을 반환합니다. 리소스 속성(예:${MyInstance.PublicIp}
)을 지정하는 경우 CloudFormation에서는Fn::GetAtt
내장 함수를 사용했을 때와 동일한 값을 반환합니다.달러 문자 및 중괄호(
${}
)를 그대로 쓰려면 여는 중괄호 뒤에 느낌표(!
)를 추가합니다(예:${!
). CloudFormation은 이 텍스트를Literal
}${
로 확인합니다.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::Region
및 AWS::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::StackName
및 AWS::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
파라미터의 경우 어떠한 함수도 사용할 수 없습니다. 문자열 값을 지정해야 합니다.
VarName
및 VarValue
파라미터의 경우 다음 함수를 사용할 수 있습니다.