Comment puis-je transmettre les paramètres CommaDelimitedList aux piles imbriquées dans AWS CloudFormation ?

Lecture de 3 minute(s)
0

Je souhaite transmettre les paramètres CommaDelimitedList aux piles imbriquées dans AWS CloudFormation.

Brève description

Vous ne pouvez pas transmettre des valeurs de type CommaDelimitedList à une pile imbriquée. Utilisez plutôt la fonction intrinsèque Fn::Join dans votre pile parent pour convertir le type CommaDelimitedList en type String.

Résolution

L’exemple suivant montre comment transmettre une liste de SecurityGroupIds d’une pile parent à une pile imbriquée.

1.    Ouvrez le fichier JSON ou YAML de votre pile parente, puis définissez le Type de SecurityGroupIds sur CommaDelimitedList.

Dans la section Resources du fichier JSON, la fonction Fn::Join renvoie la chaîne combinée. Dans la section Resources du fichier YAML, la fonction ! Join renvoie la chaîne combinée. Dans les fichiers JSON et YAML, la chaîne combinée convertit le type de paramètre SecurityGroupIds de CommaDelimitedList en String.

Exemple de fichier JSON parent :

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters": {
    "SubnetId": {
      "Type": "AWS::EC2::Subnet::Id"
    },
    "SecurityGroupIds": {
      "Type": "List<AWS::EC2::SecurityGroup::Id>"
    },
    "KeyName": {
      "Type": "AWS::EC2::KeyPair::KeyName"
    },
    "ImageId": {
      "Type": "String"
    }
  },
  "Resources": {
    "Instance": {
      "Type": "AWS::CloudFormation::Stack",
      "Properties": {
        "TemplateURL": "https://s3.amazonaws.com/cloudformation-templates-us-east-2/nested.yml",
        "Parameters": {
          "SubnetId": {
            "Ref": "SubnetId"
          },
          "SecurityGroupIds": {
            "Fn::Join": [
              ",",
              {
                "Ref": "SecurityGroupIds"
              }
            ]
          },
          "KeyName": {
            "Ref": "KeyName"
          },
          "ImageId": {
            "Ref": "ImageId"
          }
        }
      }
    }
  }
}

Exemple de fichier YAML parent :

AWSTemplateFormatVersion: 2010-09-09
Parameters:
  SubnetId:
    Type: 'AWS::EC2::Subnet::Id'
  SecurityGroupIds:
    Type: 'List<AWS::EC2::SecurityGroup::Id>'
  KeyName:
    Type: 'AWS::EC2::KeyPair::KeyName'
  ImageId:
    Type: String
Resources:
  Instance:
    Type: 'AWS::CloudFormation::Stack'
    Properties:
      TemplateURL: 'https://s3.amazonaws.com/cloudformation-templates-us-east-2/nested.yml'
      Parameters:
        SubnetId: !Ref SubnetId
        SecurityGroupIds: !Join 
          - ','
          - !Ref SecurityGroupIds
        KeyName: !Ref KeyName
        ImageId: !Ref ImageId

Remarque : si vous transmettez deux sous-réseaux, tels que [« subnet-aaaa, subnet-bbbb »], la sortie de Fn::Join est {« subnet-aaaa, subnet-bbbb »}.

2.    Dans le fichier JSON ou YAML de votre pile imbriquée, définissez le Type de SecurityGroupIds sur CommaDelimitedList.

Exemple de fichier JSON imbriqué :

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters": {
    "SubnetId": {
      "Type": "String"
    },
    "SecurityGroupIds": {
      "Type": "CommaDelimitedList"
    },
    "KeyName": {
      "Type": "String"
    },
    "ImageId": {
      "Type": "String"
    }
  },
  "Resources": {
    "Ec2instance": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "ImageId": {
          "Ref": "ImageId"
        },
        "KeyName": {
          "Ref": "KeyName"
        },
        "SecurityGroupIds": {
          "Ref": "SecurityGroupIds"
        },
        "SubnetId": {
          "Ref": "SubnetId"
        }
      }
    }
  }
}

Exemple de fichier YAML imbriqué :

AWSTemplateFormatVersion: 2010-09-09
Parameters:
  SubnetId:
    Type: String
  SecurityGroupIds:
    Type: CommaDelimitedList
  KeyName:
    Type: String
  ImageId:
    Type: String
Resources:
  Ec2instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId: !Ref ImageId
      KeyName: !Ref KeyName
      SecurityGroupIds: !Ref SecurityGroupIds
      SubnetId: !Ref SubnetId

Remarque : Dans la pile imbriquée, la chaîne combinée de la pile parent est transmise à SecurityGroupIds en tant que CommaDelimitedList. Par exemple, la valeur {"sg-aaaaa, sg-bbbbb"} est convertie en ["sg-aaaaa", "sg-bbbbb"]. Par conséquent, SecurityGroupIds doit être directement référencé par SecurityGroupIds: !Ref SecurityGroupIds et non sous la forme d'une liste de chaînes.


Informations connexes

Utilisation des piles imbriquées

AWS::CloudFormation::Stack

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 2 ans