Fn::FindInMap, Fn::ImportValue 또는 기타 지원되는 함수와 함께 AWS CloudFormation에서 Fn::Sub 함수를 사용하고 싶습니다.
간략한 설명
Fn::Sub 내장 함수를 사용하여 지원되는 함수를 대체하거나 입력 문자열의 변수를 지정한 값으로 대체할 수 있습니다.
지원되는 함수의 값을 대체하려면 아래와 같이 이름과 값이 있는 변수 맵을 사용해야 합니다.
JSON:
{ "Fn::Sub" : [ String, { Var1Name: Var1Value, Var2Name: Var2Value } ] }
YAML:
!Sub
- String
- Var1Name: Var1Value
Var2Name: Var2Value
해결 방법
Ref 함수로 Fn::Sub 사용
다음 예시에서는 매핑을 사용하여 Domain 변수를 Ref 함수의 결과 값으로 대체합니다.
JSON:
{
"Parameters": {
"RootDomainName": {
"Type": "String",
"Default": "example123.com"
}
},
"Resources": {
"DNS": {
"Type": "AWS::Route53::HostedZone",
"Properties": {
"Name": {
"Fn::Sub": [
"www.${Domain}",
{
"Domain": {
"Ref": "RootDomainName"
}
}
]
}
}
}
}
}
YAML:
Parameters:
RootDomainName:
Type: String
Default: example123.com
Resources:
DNS:
Type: 'AWS::Route53::HostedZone'
Properties:
Name: !Sub
- 'www.${Domain}'
- Domain: !Ref RootDomainName
Fn::FindInMap 함수로 Fn::Sub 사용
다음 예시에서는 매핑을 사용하여 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
Fn::ImportValue 함수로 Fn::Sub 사용
다음 예시에서는 매핑을 사용하여 Domain 변수를 Fn::ImportValue 함수의 결과 값으로 대체합니다.
참고: “DomainName”은 다른 CloudFormation 스택에서 내보낸 출력의 이름입니다.
JSON:
{
"Resources": {
"DNS": {
"Type": "AWS::Route53::HostedZone",
"Properties": {
"Name": {
"Fn::Sub": [
"www.${Domain}",
{
"Domain": {
"Fn::ImportValue": "DomainName"
}
}
]
}
}
}
}
}
YAML:
Resources:
DNS:
Type: 'AWS::Route53::HostedZone'
Properties:
Name: !Sub
- 'www.${Domain}'
- Domain: !ImportValue DomainName