Comment puis-je utiliser la fonction Fn::Sub dans AWS CloudFormation avec Fn::FindInMap, Fn::ImportValue ou d'autres fonctions prises en charge ?

Date de la dernière mise à jour : 01/04/2022

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

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?