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

Date de la dernière mise à jour : 31/12/2019

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

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 parent et 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 {« subnet-aaaa, subnet-bbbb »} est reconvertie en [« subnet-aaaa, subnet-bbbb »].


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

Cette page peut-elle être améliorée ?


Vous avez besoin d'aide ?