Je souhaite 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 les variables d'une chaîne d'entrée par les valeurs de votre choix.
Pour remplacer la valeur de fonctions prises en charge, vous devez utiliser un mappage de variables avec leur nom et valeur selon l’exemple suivant :
JSON :
{ "Fn::Sub" : [ String, { Var1Name: Var1Value, Var2Name: Var2Value } ] }
YAML :
!Sub
- String
- Var1Name: Var1Value
Var2Name: Var2Value
Résolution
Utilisation de Fn::Sub avec la fonction Ref
L'exemple suivant utilise un mappage pour remplacer la variable Domain par la valeur obtenue par 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 obtenue par 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 obtenue par la fonction Fn::ImportValue.
Remarque : DomainName est le nom de la sortie exportée 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