传递列表到儿童模板云形成

时间:2018-05-13 05:38:39

标签: amazon-web-services amazon-cloudformation

即时创建嵌套的cf模板,我有父模板,其中包含此列表参数

 "DatabaseSubnets": {
      "Description": "The subnets to place database instances in.",
      "Type": "List<AWS::EC2::Subnet::Id>"
    }

和像这样的资源

"Resources": {
    "VPCStack": {
      "Type": "AWS::CloudFormation::Stack",
      "Properties": {
        "Parameters": {
                    "ClassB": {                      

                           "Ref": "ClassB"                     

                    }                
                },
          "TemplateURL": "https://s3.us-east-2.amazonaws.com/xxx/vpc-2.json",
          "TimeoutInMinutes": "5"
      }
    },
      "RDSStack": {
      "Type": "AWS::CloudFormation::Stack",
      "Properties": {
        "Parameters": {
                   "DatabaseInstanceType":{"Ref":"DatabaseInstanceType"},
                   "DatabasePassword":{"Ref":"DatabasePassword"},
                   "DatabaseUsername":{"Ref":"DatabaseUsername"},
                   "DatabaseBackupRetentionPeriod":{"Ref":"DatabaseBackupRetentionPeriod"},
                   "DatabaseSubnets":{ "Fn::GetAtt": [ "VPCStack", "Outputs.SubnesPublic" ] } ,
                   "DatabaseSecurityGroups":{"Ref":"DatabaseSecurityGroups"}            
                },
          "TemplateURL": "https://s3.us-east-2.amazonaws.com/xxx/rds.json",
          "TimeoutInMinutes": "5"
      },
      "DependsOn": "VPCStack"
    }

  }

并且我从vpc子模板返回列表并尝试传递到rds模板但我得到并且错误说明属性值参数必须是具有String(或简单类型)属性的对象。

我研究它,有些人说你不能将列表传递给子模板等等。我怎么能克服这个?

2 个答案:

答案 0 :(得分:1)

是的,我通过从父模板传递两个字符串并将这两个字符串作为列表连接来计算解决方案。在这种情况下,传递两个子网并创建一个subnetIds列表

父模板

"Subnets1":{
                  "Fn::GetAtt":[
                     "VPCStack",
                     "Outputs.SubnetAPublic"
                  ]
               },
               "Subnets2":{
                  "Fn::GetAtt":[
                     "VPCStack",
                     "Outputs.SubnetBPublic"
                  ]
               }

子模板

"VPCZoneIdentifier": [
           {
            "Ref": "Subnets1"
          },
          {
            "Ref": "Subnets2"
          }
        ] 

答案 1 :(得分:0)

我认为你在讨论SubnesPublic的{​​{1}}输出。

不是像VPCStack中那样传递,而是先Fn::Join列表。例如:

RDSStack将返回字符串"Fn::Join" : [ ":", [ "a", "b", "c" ] ]

然后你可以在堆栈中Fn::Split。例如:

a:b:c将返回字符串"Fn::Split" : [ ":" , "a:b:c" ]的数组。

所以在你的情况下,你可以这样做:

["a", "b", "c"]

并且在RDSStack内部,您可以按如下方式读取db子网:

"DatabaseSubnets":{ "Fn::Join" [":", "Fn::GetAtt": [ "VPCStack", "Outputs.SubnesPublic" ]] }

我更习惯输入YAML,所以请仔细检查我写的json。