Ich möchte die Fn::Sub intrinsic function in AWS CloudFormation with Fn::FindInMap, Fn::ImportValue, oder anderen unterstützten Funktionen verwenden.
Kurzbeschreibung
Sie können die intrinsische Funktion Fn::Sub verwenden, um unterstützte Funktionen zu ersetzen oder Variablen in einer Eingabezeichenfolge durch von Ihnen angegebene Werte zu ersetzen.
Um den Wert aus unterstützten Funktionen zu ersetzen, müssen Sie Variablenmap mit dem Namen und Wert wie unten gezeigt verwenden:
JSON:
{ "Fn::Sub" : [ String, { Var1Name: Var1Value, Var2Name: Var2Value } ] }
YAML:
!Sub
- String
- Var1Name: Var1Value
Var2Name: Var2Value
Behebung
Verwendung von Fn::Sub mit der Ref-Funktion
Im folgenden Beispiel wird ein Mapping verwendet, um die Domain-Variable durch den aus der Ref-Funktion resultierenden Wert zu ersetzen.
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
Verwendung von Fn::Sub mit der Funktion Fn: :FindInMap
Das folgende Beispiel verwendet ein Mapping, um die Variable log\ _group_name durch den resultierenden Wert der Funktion Fn::findInMap zu ersetzen.
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
**Verwendung von Fn::Sub mit der Funktion Fn::ImportValue **
Das folgende Beispiel verwendet ein Mapping, um die Domain-Variable durch den resultierenden Wert der Funktion Fn::ImportValue zu ersetzen.
Hinweis: „DomainName“ ist der Name der Ausgabe, die von einem anderen CloudFormation-Stack exportiert wurde.
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