不幸的是,虽然EC2 RunInstances API 支持启动多个 EC2 实例(通过 MaxCount/MinCount 参数),AWS::EC2::Instance CloudFormation 资源只允许您一次创建一个 EC2 实例(请参阅也 this forum post 来自 ChrisW@AWS 对此限制的确认)。
此外,使用 CloudFormation 的Intrinsic Functions 无法在模板内进行迭代,因此这也不是一个选项。
作为替代方案,我建议使用中间模板格式,然后在需要更大的表达能力时使用预处理器编译成 CloudFormation 模板(JSON 或 YML)。您可以使用功能齐全的库,例如 troposphere,但也很容易编写自己的基本预处理层以适应您的用例和编程语言/库偏好。
我目前的选择是嵌入式 Ruby (ERB),主要是因为我已经熟悉它。这是一个使用迭代生成 CloudFormation YAML 的示例 template.yml.erb 文件:
Resources:
<% (1..5).each do |i| -%>
Instance<%=i%>:
Type: AWS::EC2::Instance
# ...etc etc...
<% end -%>
要处理,请运行cat template.yml.erb | | ruby -rerb -e "puts ERB.new(ARGF.read, nil, '-').result" > template.yml,它将以下 CloudFormation-ready 模板写入template.yml:
Resources:
Instance1:
Type: AWS::EC2::Instance
# ...etc etc...
Instance2:
Type: AWS::EC2::Instance
# ...etc etc...
Instance3:
Type: AWS::EC2::Instance
# ...etc etc...
Instance4:
Type: AWS::EC2::Instance
# ...etc etc...
Instance5:
Type: AWS::EC2::Instance
# ...etc etc...
我已使用此技术帮助管理复杂 CloudFormation 堆栈中的大量资源,并取得了良好的效果。