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