Quero passar os parâmetros CommaDelimitedList para pilhas aninhadas no AWS CloudFormation.
Breve descrição
Você não pode passar valores do tipo CommaDelimitedList para uma pilha aninhada. Em vez disso, use a função intrínseca Fn::Join em sua pilha principal para converter o tipo CommaDelimitedList no tipo String.
Resolução
O exemplo a seguir mostra como passar uma lista de SecurityGroupIds de uma pilha principal para uma pilha aninhada.
1.Abra o arquivo JSON ou YAML da sua pilha principal e defina o Tipo de SecurityGroupIds como CommaDelimitedList.
Na seção Recursos do arquivo JSON, a função Fn::Join retorna a string combinada. Na seção Recursos do arquivo YAML, a função !Join retorna a string combinada. Nos arquivos JSON e YAML, a string combinada converte o tipo de parâmetro SecurityGroupIds de CommaDelimitedList em String.
Exemplo de arquivo 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"
}
}
}
}
}
}
Exemplo de arquivo 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
**Observação:**Se você passar duas sub-redes, como [ “subnet-aaaa, subnet-bbbb”], a saída de Fn::Join será {"subnet-aaaa, subnet-bbbb"}.
2.No arquivo JSON ou YAML da sua pilha aninhada, defina o Tipo de SecurityGroupIds como CommaDelimitedList.
Exemplo de arquivo JSON aninhado:
{
"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"
}
}
}
}
}
Exemplo de arquivo YAML aninhado:
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
**Observação:**Na pilha aninhada, a string combinada da pilha principal é passada para SecurityGroupIds como CommaDelimitedList. Por exemplo, o valor {"sg-aaaaa, sg-bbbbb"} é convertido novamente em [“sg-aaaaa”, “sg-bbbbb”]. Portanto, **SecurityGroupIds ** deve ser referenciado diretamente por SecurityGroupIds: !Ref SecurityGroupIds e não como uma lista de strings.
Informações relacionadas
Trabalhando com pilhas aninhadas
AWS::CloudFormation::Stack