2017-04-13 12 views
0

我想通過使用AWS::CloudFormation::Stack資源類型將CloudFormation模板嵌套到另一個模板中。嵌套模板的參數類型爲List<AWS::EC2::Subnet::Id>將List <AWS :: EC2 :: Subnet :: Id>類型的參數傳遞給嵌套的CloudFormation模板

單獨地,嵌套模板運行得很好。但是當嵌入AWS控制檯時說遇到不受支持的屬性ELBSubnetList

將參數的類型更改爲字符串/逗號分隔列表似乎是一種解決方法,詳情請參考here,但在通過AWS控制檯交互創建模板時,我會丟失花哨的UI。

你有什麼想法如何通過子網ID列表作爲參數?

這是嵌入的模板:

{ 
    "AWSTemplateFormatVersion" : "2010-09-09", 
    "Parameters" : { 
     "ELBSubnetList" : { 
      "Type" : "List<AWS::EC2::Subnet::Id>", 
      "Description" : "Subnet List for Elastic Loadbalancer" 
     }, 
     "ELBSecurityGroupList": { 
      "Type": "List<AWS::EC2::SecurityGroup::Id>", 
      "Description": "Security Group List for Elastic Loadbalancer" 
     } 
    }, 
    "Resources" : { 
     "ELB" : { 
      "Type" : "AWS::ElasticLoadBalancing::LoadBalancer", 
      "Properties" : { 
       "Subnets": { "Ref": "ELBSubnetList" }, 
       "CrossZone" : "true", 
       "SecurityGroups": { "Ref": "ELBSecurityGroupList" }, 
       "LBCookieStickinessPolicy" : [ { 
        "PolicyName" : "CookieBasedPolicy", 
        "CookieExpirationPeriod" : "30" 
       }], 
       "Listeners" : [ { 
        "LoadBalancerPort" : "80", 
        "InstancePort" : "80", 
        "Protocol" : "HTTP", 
        "PolicyNames" : [ "CookieBasedPolicy" ] 
       } ], 
       "HealthCheck" : { 
        "Target" : "HTTP:80/wordpress/wp-admin/install.php", 
        "HealthyThreshold" : "2", 
        "UnhealthyThreshold" : "5", 
        "Interval" : "10", 
        "Timeout" : "5" 
       } 
      } 
     } 
    } 
} 

這embedds模板:

{ 
    "AWSTemplateFormatVersion" : "2010-09-09", 
    "Parameters": { 
     "ChildTemplate": { 
      "Type": "String", 
      "Default": "https://s3.eu-central-1.amazonaws.com/cf-templates-xxxxxxxxxxx-eu-central-1/sample_child.template" 
     }, 
     "ELBSubnetList" : { 
      "Type" : "List<AWS::EC2::Subnet::Id>", 
      "Description" : "Subnet List for Elastic Loadbalancer" 
     }, 
     "ELBSecurityGroupList": { 
      "Type": "List<AWS::EC2::SecurityGroup::Id>", 
      "Description": "Security Group List for Elastic Loadbalancer" 
     } 
    }, 
    "Resources": { 
     "Child": { 
      "Type": "AWS::CloudFormation::Stack", 
      "Properties": { 
       "TemplateURL": { "Ref": "ChildTemplate" }, 
       "Parameters": { 
        "ELBSubnetList": { "Ref": "ELBSubnetList" }, 
        "ELBSecurityGroupList": { "Ref": "ELBSecurityGroupList" } 
       } 
      } 
     } 
    } 
} 
+0

根據CloudFormation文檔,這是不受支持的,只有字符串可以傳遞到今天的嵌套堆棧。 http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html#cfn-cloudformation-stack-parameters –

+0

您是否嘗試過基於Lambda的自定義資源? –

+0

@MichalGasek你是對的。在修復了AWS- CloudFormation :: Stack'-Resource中的拼寫錯誤之後,錯誤信息變得更加清晰:屬性值_value參數必須是帶有String(或簡單類型)屬性的對象_ – Stephan

回答

1

解釋可被轉換成字符串,反之亦然。所以工作調用是

{ 
    "AWSTemplateFormatVersion" : "2010-09-09", 
    "Parameters": { 
     "ChildTemplate": { 
      "Type": "String", 
      "Default": "https://s3.eu-central-1.amazonaws.com/cf-templates-xxxxxxxxxxx-eu-central-1/sample_child.template" 
     }, 
     "ELBSubnetList" : { 
      "Type" : "List<AWS::EC2::Subnet::Id>", 
      "Description" : "Subnet List for Elastic Loadbalancer" 
     }, 
     "ELBSecurityGroupList": { 
      "Type": "List<AWS::EC2::SecurityGroup::Id>", 
      "Description": "Security Group List for Elastic Loadbalancer" 
     } 
    }, 
    "Resources": { 
     "Child": { 
      "Type": "AWS::CloudFormation::Stack", 
      "Properties": { 
       "TemplateURL": { "Ref": "ChildTemplate" }, 
       "Parameters": { 
        "ELBSubnetList": {"Fn::Join": [",", { "Ref": "ELBSubnetList" }]}, 
        "ELBSecurityGroupList": {"Fn::Join": [",", { "Ref": "ELBSecurityGroupList" }]} 
       } 
      } 
     } 
    } 
} 
+1

您好。這正是我想要做的,但它不會工作。我把我的子網作爲一個參數列表,比如「Subnets」:「List ',但是當我嘗試用'Subnets:!Join [」,「,[!Ref Subnets]](在yaml中)將它傳遞給一個嵌套堆棧時, CloudFormation中斷了模板驗證錯誤:模板錯誤:每個Fn :: Join對象都需要兩個參數,(1)字符串分隔符和(2)要連接的字符串列表或返回字符串列表的函數(例如Fn :: GetAZs)被加入。我錯過了什麼? !Ref Subnets應該是一個列表,不是嗎?任何建議歡迎 – kgorskowski

+0

我在yaml遇到同樣的問題以及... – ElasticThoughts

1

在YAML中,您需要通過使用Select「拆分」子網。例如有兩個子網:

!Join [",", [!Select [0, !Ref Subnets], !Select [1, !Ref Subnets]]] 
相關問題