Je veux utiliser la fonction intrinsèque Fn::Sub dans AWS CloudFormation avec Fn::FindInMap, Fn::ImportValue ou d'autres fonctions prises en charge.
Brève description
Vous pouvez utiliser la fonction intrinsèque Fn::Sub pour remplacer les fonctions prises en charge ou pour remplacer les variables d'une chaîne d'entrée par les valeurs que vous spécifiez.
Pour remplacer la valeur des fonctions prises en charge, vous devez utiliser une mappe de variables avec le nom et la valeur comme indiqué ci-dessous :
JSON :
{ "Fn::Sub" : [ String, { Var1Name: Var1Value, Var2Name: Var2Value } ] }
YAML :
!Sub
- String
- Var1Name: Var1Value
Var2Name: Var2Value
Solution
Utilisation de Fn::Sub avec la fonction Ref
L'exemple suivant utilise un mappage pour remplacer la variable Domain par la valeur résultante de la fonction 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
Utilisation de Fn::Sub avec la fonction Fn::FindInMap
L'exemple suivant utilise un mappage pour remplacer la variable log_group_name par la valeur résultante de la fonction 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
Utilisation de Fn::Sub avec la fonction Fn::ImportValue
L'exemple suivant utilise un mappage pour remplacer la variable Domain par la valeur résultante de la fonction Fn::ImportValue.
Remarque : « DomainName » est le nom du résultat exporté par une autre pile 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