【问题标题】:pass list to child template cloud formation将列表传递给子模板云形成
【发布时间】:2018-10-23 02:19:52
【问题描述】:

我正在创建一个嵌套的 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 模板,但我得到并错误提示属性参数的值必须是具有字符串(或简单类型)属性的对象。

我对此进行了研究,有人说您不能将列表传递给子模板等等。我该如何克服呢?

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation


    【解决方案1】:

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

    父模板

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

    子模板

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

    【讨论】:

      【解决方案2】:

      我认为您是在谈论来自VPCStackSubnesPublic 输出。

      您可以先通过Fn::Join 列表而不是在RDSStack 中传递它。示例:

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

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

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

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

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

      在 RDSStack 中,您可以按如下方式读取 db 子网:

      "Fn::Split" : [ ":" , {"Ref": "DatabaseSubnets" } ]

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

      【讨论】:

        猜你喜欢
        • 2019-11-13
        • 1970-01-01
        • 2012-09-27
        • 2021-07-26
        • 1970-01-01
        • 2019-02-15
        • 2021-09-03
        • 2011-08-17
        相关资源
        最近更新 更多