我有一个很烦人的问题,我无法解决,将尽力解释。

以下简化示例可以在其中引用参数,并通过SecurityGroupIds属性将安全组分配给我的实例:

"Parameters" : {
      "pDefaultSg" : {
        "Description" : "AWS2 VPC default security groups",
        "Type" : "List<AWS::EC2::SecurityGroup::Id>",
        "Default" : "sg-245xxxxx,sg-275xxxxx,sg-235xxxxx"
      }
    }

    "Resources" : {
      "ec2Instance" : {
        "Type" : "AWS::EC2::Instance",
        "Properties" : {
        "SecurityGroupIds" : { "Ref" : "pDefaultSg" }
      }
}


当我还想向引用相同模板中实例化的安全组资源的SecurityGroupIds属性添加第二个值时,问题就开始了:

"Resources" : {
    "ec2Instance" : { ...
        "SecurityGroupIds" : [ { "Ref" : "pDefaultSg" }, { "Fn::GetAtt" : "sgDb", "GroupId" } ],
    ....

    "sgDb" : {
        "Type" : "AWS::EC2::SecurityGroup",
        "Properties" : { ...


然后,我无法避免以下错误导致Cloudformation堆栈回滚:

属性SecurityGroupIds的值必须为字符串列表类型

我真的很感谢任何指示。

非常感谢

最佳答案

问题是,当通过pDefaultSg内在函数访问Ref时,它返回一个列表,因此您的SecurityGroupIds属性看起来像

[["sg-245xxxxx","sg-275xxxxx","sg-235xxxxx"],"sg-1234DB"]

解决方案是将SecurityGroupIds属性更改为Fn::Join,然后将pDefaultSg列表更改为逗号分隔的字符串,然后再添加sgDb:

"SecurityGroupIds": [
  {"Fn::Join":
    [",",
      {"Ref": "pDefaultSg"}
    ]
  },
  { "Fn::GetAtt" : ["sgDb", "GroupId"] }
]

关于amazon-web-services - AWS特定参数和EC2 SecurityGroupIds列表字符串错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40006882/

10-11 06:53