我试图将现有的负载均衡器导入到CloudFormation堆栈中。侦听器必须指定为YAML列表,但列表(数组)或对象不存在CloudFormation参数类型,因此YAML列表的参数必须是字符串。这将导致以下CloudFormation错误
属性侦听器的
值必须为List类型
侦听器的字符串参数的值使用CLI -
aws elb describe-load-balancers --load-balancer-names $ELB_DNS_NAME --query 'LoadBalancerDescriptions[0].ListenerDescriptions[].Listener' | jq --compact-output '.' | sed -e 's/"/\\"/g'
注意,上面命令的结果JSON是转义的。我怀疑这是问题的根源。
[
...
{
"ParameterKey": "ElbListeners",
"ParameterValue": "[{\"Protocol\":\"TCP\",\"LoadBalancerPort\":443,\"InstanceProtocol\":\"TCP\",\"InstancePort\":31672},{\"Protocol\":\"TCP\",\"LoadBalancerPort\":80,\"InstanceProtocol\":\"TCP\",\"InstancePort\":30545}]"
},
...
]
CloudFormation似乎没有提供任何不转义字符串参数的方法,因此下面的模板失败了。
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字符串参数传递?
发布于 2021-06-30 10:03:28
您可以将ElbListeners参数的内容简单地插入到模板中,从参数中删除它。生成的模板如下所示:
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: ""
https://stackoverflow.com/questions/68162287
复制相似问题