Quiero transferir parámetros CommaDelimitedList a pilas anidadas en AWS CloudFormation.
Descripción corta
No se pueden transferir valores del tipoCommaDelimitedList a una pila anidada. En lugar de ello, utilice la función intrínseca Fn::Join de su pila principal para convertir el tipo CommaDelimitedList en el tipo String.
Resolución
El siguiente ejemplo muestra cómo transferir una lista de SecurityGroupIds de una pila principal a una pila anidada.
1. Abra el archivo JSON o YAML de su pila principal y, a continuación, configure el Tipo de SecurityGroupIds como CommaDelimitedList.
En la sección Recursos del archivo JSON, la función Fn::Join devuelve la cadena combinada. En la sección Recursos del archivo YAML, la función !Join devuelve la cadena combinada. En los archivos JSON y YAML, la cadena combinada convierte el tipo de parámetro SecurityGroupIds de CommaDelimitedList a String.
Ejemplo de archivo JSON principal:
{
"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"
}
}
}
}
}
}
Ejemplo de archivo YAML principal:
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
Nota: Si transfiere dos subredes, como ["subnet-aaaa, subnet-bbbb"], el resultado de Fn::Join es {"subnet-aaaa, subnet-bbbb"}.
2. En el archivo JSON o YAML de la pila anidada, configure el Tipo de SecurityGroupIds como CommaDelimitedList.
Ejemplo de archivo JSON anidado:
{
"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"
}
}
}
}
}
Ejemplo de archivo YAML anidado:
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
Nota: En la pila anidada, la cadena combinada de la pila principal se transfiere a SecurityGroupIds como CommaDelimitedList. Por ejemplo, el valor {"sg-aaaaa, sg-bbbbb"} se convierte de nuevo en ["sg-aaaaa", "sg-bbbbb"]. Por lo tanto, se debe hacer referencia directa aSecurityGroupIds mediante SecurityGroupIds: !Ref SecurityGroupIds y no como una lista de cadenas.
Información relacionada
Trabajo con pilas anidadas
AWS::CloudFormation::Stack