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

Amazon cloudformation AWS CloudFormation模板:是否可以添加许多CidrIp作为列表?,amazon-cloudformation,Amazon Cloudformation,我想在云形成模板中创建安全组的入站规则。我想从许多不同的IP打开3306端口 "SecurityGroupIngress": [ { "IpProtocol": "tcp", "CidrIp": "0.0.0.0/0", "FromPort": "3306", "ToPort": "3306" } 我知道文档中说

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

    "SecurityGroupIngress": [
            {
                "IpProtocol": "tcp",
                "CidrIp": "0.0.0.0/0",
                "FromPort": "3306",
                "ToPort": "3306"
            }

我知道文档中说字符串是
CidrIp
类型,但是否可以这样做
[“100.10.77.66/32”,“100.10.66.66/32”,“101.10.77.66/32”]
,以避免多次写入同一块?

恐怕不行,正如文档所述,它只接受字符串而不接受列表,因此需要多个块


与在web控制台中创建入口规则的方式相同,每个CIDR都有一个新规则。

不幸的是,CloudFormation没有可用的迭代,正如您所指出的,资源本身只接受其
CidrIp
属性的单个
字符串

另外,如果需要更大的表达能力,我建议选择一种中间格式,使用预处理器编译成CloudFormation模板JSON。您可以使用一个功能齐全的库,如,但也可以很容易地编写自己的基本预处理层,以适合您的用例和编程语言/库首选项

我目前选择的是嵌入式Ruby(),主要是因为我已经熟悉它们。下面是一个示例
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 -%>
运行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
    }
  ]
}
基于的方法,这里有一种类似的方法,可以在ERB模板中的单独文件中指定CidrIp。首先,创建一个ERB文件。例如,让我们看看
sgi trusted ip range.erb

require 'erb'
require 'yaml'
require 'json'
puts JSON.pretty_generate(YAML.load(ERB.new(ARGF.read, nil, '-').result))
类型:“AWS::EC2::SecurityGroupIngress”
-IpProtocol:tcp
CidrIp:
FromPort:80
托波特:80
-IpProtocol:tcp
CidrIp:
FromPort:443
托波特:443
放置CIDR列表文件,只要您的要求符合以下命名约定,例如内容为:

100.10.77.66/32
100.10.66.66/32
101.10.77.66/32
然后,通过以下一行程序生成YAML文件:

ruby-r erb-e'erb.new(ARGF.read,nil,“-”).run'
此外,您可以验证生成的YAML文件,如下所示:

aws云信息验证模板--模板正文”file://__PATH_TO_FILE__.yml"

我很好奇为什么没有关于Cloudformation定制资源的答案。 您仍然可以使用lambda函数创建自己的自定义安全组,该函数根据您的cloudformation状态(创建、更新、删除)创建/删除安全组。 我写了一个简单的自定义资源,如果您觉得方便,可以随意修改自定义资源参数。 然后,可以在创建堆栈时输入逗号分隔的cidr块。 您可以使用以下命令在实例(或其他资源)上引用此安全组:
!GetAtt CustomSG.SecGroupId