AWS CloudFormation模板:是否可以将许多CidrIp添加为列表?

Kos*_*ris 5 aws-cloudformation

我想在云形成模板中创建安全组的入站规则.我想从许多不同的IP打开3306端口.

    "SecurityGroupIngress": [
            {
                "IpProtocol": "tcp",
                "CidrIp": "0.0.0.0/0",
                "FromPort": "3306",
                "ToPort": "3306"
            }
Run Code Online (Sandbox Code Playgroud)

我知道文档说String是CidrIp类型但是可以做这样的事情["100.10.77.66/32", "100.10.66.66/32" , "101.10.77.66/32"]以避免多次写同一个块吗?

wjo*_*dan 8

不幸的是,没有可通过CloudFormation的迭代内部函数,并且正如你所指出的AWS::EC2::SecurityGroupIngress资源本身只接受一个String为它的CidrIp性能.

作为替代方案,我建议选择一种中间格式,使用预处理器编译为CloudFormation模板JSON,如果/需要更强的表现力.您可以使用像对流层这样的全功能库,但它也很容易编写您自己的基本预处理层,以适应您的用例和编程语言/库首选项.

我目前的选择是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 -%>
Run Code Online (Sandbox Code Playgroud)

这是一个最小的预处理器脚本,process_template.rb:

require 'erb'
require 'yaml'
require 'json'
puts JSON.pretty_generate(YAML.load(ERB.new(ARGF.read, nil, '-').result))
Run Code Online (Sandbox Code Playgroud)

跑步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
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)


小智 7

不要害怕,因为文档声明它只接受String而不是List,因此需要多个块.

可以想象它与在Web控制台中创建入口规则的方式相同,每个CIDR都有一个新规则.