首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过JSON参数传递CloudFormation YAML列表

通过JSON参数传递CloudFormation YAML列表
EN

Stack Overflow用户
提问于 2021-06-28 11:09:25
回答 1查看 783关注 0票数 0

我试图将现有的负载均衡器导入到CloudFormation堆栈中。侦听器必须指定为YAML列表,但列表(数组)或对象不存在CloudFormation参数类型,因此YAML列表的参数必须是字符串。这将导致以下CloudFormation错误

属性侦听器的

值必须为List类型

侦听器的字符串参数的值使用CLI -

代码语言:javascript
运行
复制
aws elb describe-load-balancers --load-balancer-names $ELB_DNS_NAME --query 'LoadBalancerDescriptions[0].ListenerDescriptions[].Listener' | jq --compact-output '.' | sed -e 's/"/\\"/g'

注意,上面命令的结果JSON是转义的。我怀疑这是问题的根源。

代码语言:javascript
运行
复制
[
...
    {
        "ParameterKey": "ElbListeners",
        "ParameterValue": "[{\"Protocol\":\"TCP\",\"LoadBalancerPort\":443,\"InstanceProtocol\":\"TCP\",\"InstancePort\":31672},{\"Protocol\":\"TCP\",\"LoadBalancerPort\":80,\"InstanceProtocol\":\"TCP\",\"InstancePort\":30545}]"
    },
...
]

CloudFormation似乎没有提供任何不转义字符串参数的方法,因此下面的模板失败了。

代码语言:javascript
运行
复制
AWSTemplateFormatVersion: 2010-09-09
Resources:
  ...
  IngressLoadBalancer:
    Type: AWS::ElasticLoadBalancing::LoadBalancer
    DeletionPolicy: Delete
    Properties: 
      Listeners: !Ref ElbListeners
      LoadBalancerName: !Ref ElbName


Parameters:
  ...
  ElbListeners:
    Type: String
    Description: Listeners for the load balancer
    Default: ""
  ElbName:
    Type: String
    Description: Name of the load balancer
    Default: ""

将结果JSON中的引号替换为参数文件中的${quote},然后使用!Sub替换${quote}!Sub的第一个输入似乎不能是!Ref ParameterName

我不知道会有多少侦听器,所以在模板中硬编码侦听器列表并为端口/协议传递多个参数是不可行的。

如何将YAML列表作为JSON字符串参数传递?

EN

回答 1

Stack Overflow用户

发布于 2021-06-30 10:03:28

您可以将ElbListeners参数的内容简单地插入到模板中,从参数中删除它。生成的模板如下所示:

代码语言:javascript
运行
复制
AWSTemplateFormatVersion: 2010-09-09
Resources:
  ...
  IngressLoadBalancer:
    Type: AWS::ElasticLoadBalancing::LoadBalancer
    DeletionPolicy: Delete
    Properties: 
      Listeners:
        - Protocol: TCP
          LoadBalancerPort: 443
          InstanceProtocol: TCP
          InstancePort: 31672
        - Protocol: TCP
          LoadBalancerPort: 80
          InstanceProtocol: TCP
          InstancePort: 30545
      LoadBalancerName: !Ref ElbName


Parameters:
  ...
  ElbName:
    Type: String
    Description: Name of the load balancer
    Default: ""
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68162287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档