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