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

Lecture de 3 minute(s)
0

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

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an