子网参数不接受列表作为云形成模板aws中的输入

时间:2017-02-28 17:36:35

标签: amazon-web-services yaml amazon-cloudformation devops

我有一个嵌套模板设置,我试图将子网值传递给子ELB模板。但是,我一直收到Value of property Subnets must be of type List of String错误。 这就是我在父模板中设置值的方法:

ELBSubnetAZ: "subnet-*****,subnet-****"

这就是我将值传递给子模板的方式:

ELBSubnetAZ: !FindInMap [ AccountSettings, !Ref "ChefServerRegion", ELBSubnetAZ ]

这就是我在子模板中使用值的方法:

ELBSubnetAZ:
 Description: "ELB Subnet 1"
 Type: "List<AWS::EC2::Subnet::Id>"

我也尝试过:

 ELBSubnetAZ:
  Description: "ELB Subnet 1"
  Type: CommaDelimitedList

在资源中:

  Subnets:
      - !Ref ELBSubnetAZ

如果我只从父模板传递单个子网值并在子节点中接受为字符串变量,那么一切正常。 我错过了什么?

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。 我用于部署ELB的原始AWS CF模板是:

Parameters:
  ELBSubnetID:
    Type: 'List<AWS::EC2::Subnet::Id>'
    Description: Subnet ID for ELB
Resources:
  MyLoadBalancer:
    Type: 'AWS::ElasticLoadBalancing::LoadBalancer'
    Properties:
      Listeners:
        - LoadBalancerPort: '80'
          InstancePort: '80'
          Protocol: HTTP
      Subnets:
        - !Ref ELBSubnetID

当我使用模板在AWS CF中创建堆栈时,它抛出了以下错误消息:

Value of property Subnets must be of type List of String

我修复了模板中的 Subnets 属性部分,如下所示,然后我就能成功创建堆栈:

Parameters:
  ELBSubnetID:
    Type: 'List<AWS::EC2::Subnet::Id>'
    Description: Subnet ID for ELB
Resources:
  MyLoadBalancer:
    Type: 'AWS::ElasticLoadBalancing::LoadBalancer'
    Properties:
      Listeners:
        - LoadBalancerPort: '80'
          InstancePort: '80'
          Protocol: HTTP
      Subnets:
        - !Join
          - ','
          - !Ref ELBSubnetID

答案 1 :(得分:0)

以下是我解决它的方法:

我没有在父模板中进行任何更改,但在子模板中,我收到的值为String,然后使用Fn :: Split函数将字符串拆分为list。幸运的是,Fn :: Split函数输出返回List。

ELBSubnetAZ:
  Description: "ELB Subnets"
  Type: String

在我的资源中,这是我分裂它的方式:

Subnets: { "Fn::Split" : [ ",", { "Ref":"ELBSubnetAZ" } ] }