不幸的是,CloudFormation 的Intrinsic Functions 没有可用的迭代,正如您所指出的,AWS::EC2::SecurityGroupIngress 资源本身只接受单个String 的CidrIp 属性。
作为替代方案,如果/当需要更大的表达能力时,我建议选择一种中间格式,以使用预处理器编译成 CloudFormation 模板 JSON。您可以使用功能齐全的库,例如 troposphere,但也很容易编写自己的基本预处理层以满足您的用例和编程语言/库偏好。
我目前的选择是 YAML 与嵌入式 Ruby (ERB) 的组合,主要是因为我已经熟悉它们。这是一个示例 template.yml.erb 文件,它将生成上面的示例 JSON:
SecurityGroupIngress:
<% ["100.10.77.66/32", "100.10.66.66/32" , "101.10.77.66/32"].each do |cidr| -%>
- IpProtocol: tcp
CidrIp: <%=cidr%>
FromPort: 3306
ToPort: 3306
<% end -%>
这是一个最小的预处理器脚本,process_template.rb:
require 'erb'
require 'yaml'
require 'json'
puts JSON.pretty_generate(YAML.load(ERB.new(ARGF.read, nil, '-').result))
运行ruby ./process_template.rb template.yml.erb 产生:
{
"SecurityGroupIngress": [
{
"IpProtocol": "tcp",
"CidrIp": "100.10.77.66/32",
"FromPort": 3306,
"ToPort": 3306
},
{
"IpProtocol": "tcp",
"CidrIp": "100.10.66.66/32",
"FromPort": 3306,
"ToPort": 3306
},
{
"IpProtocol": "tcp",
"CidrIp": "101.10.77.66/32",
"FromPort": 3306,
"ToPort": 3306
}
]
}