如何在Cloudformation模板中创建可变数量的EC2实例资源?
如何根据模板参数在Cloudformation模板中创建可变数量的EC2实例资源?
EC2 API 和管理工具允许启动同一 AMI 的多个实例,但我找不到如何使用 Cloudformation 来执行此操作。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
AWS::EC2::Instance
资源不支持底层RunInstances
API,因此不可能通过将参数传递给单个实例来创建可变数量的 EC2 实例本资源的副本。要根据模板参数在 CloudFormation 模板中创建可变数量的 EC2 实例资源,而不部署 Auto Scaling 组,有两种选择:
1. 条件
您可以使用
条件
,用于创建可变数量的AWS::EC2 ::Instance
资源取决于参数。它有点冗长(因为您必须使用
Fn::Equals
),但它有效。以下是一个工作示例,允许用户最多指定 5 个实例:
1a.带条件的模板预处理器
作为上述的变体,您可以使用模板预处理器,例如 Ruby 的 Erb根据指定的最大值生成上述模板,使源代码更加紧凑并消除重复:
要将上述源处理为与 CloudFormation 兼容的模板,请运行:
为了方便起见,这里是 10 个变量 EC2 实例。
2. 自定义资源
另一种方法是实施 自定义资源 调用
RunInstances
/TerminateInstances
直接 API :The
AWS::EC2::Instance
Resource doesn't support theMinCount
/MaxCount
parameters of the underlyingRunInstances
API, so it's not possible to create a variable number of EC2 instances by passing Parameters to a single copy of this Resource.To create a variable number of EC2 instance resources in CloudFormation template according to a template Parameter, and without deploying an Auto Scaling Group instead, there are two options:
1. Conditions
You can use
Conditions
to create a variable number ofAWS::EC2::Instance
Resources depending on the Parameter.It's a little verbose (because you have to use
Fn::Equals
), but it works.Here's a working example that allows the user to specify up to a maximum of 5 instances:
1a. Template preprocessor with Conditions
As a variation on the above, you can use a template preprocessor like Ruby's Erb to generate the above template based on a specified maximum, making your source code more compact and eliminating duplication:
To process the above source into a CloudFormation-compatible template, run:
For convenience, here is a gist with the generated output YAML for 10 variable EC2 instances.
2. Custom Resource
An alternate approach is to implement a Custom Resource that calls the
RunInstances
/TerminateInstances
APIs directly:我认为原始海报所追求的是:
......
换句话说,从参数插入初始实例的数量(容量)。
I think what the original poster was after is something like:
...
...in other words, insert the number of initial instances (the capacity) from a parameter.
简短的回答是:你不能。您无法获得完全相同的结果(N 个相同的 EC2 实例,未通过自动扩展组绑定)。
从控制台启动多个实例与创建一个具有 N 个实例作为所需容量的自动伸缩组不同。这只是您拥有的一个有用的快捷方式,而不必执行 N 次相同的 EC2 创建过程。它称为“预留”(与预留实例无关)。
Auto Scaling 组是一个不同的野兽(即使您最终拥有 N 个相同的 EC2 实例)。
您可以:
问题是,数量EC2 实例的数量不是动态的,它不能是参数。
它不是真实 CloudFormation 参数,但最终您会获得 EC2 的动态数量。
Short answer is : you can't. You can't get the exact same result (N identical EC2 instances, not tied by an auto scaling group).
Launching several instances alike from the console is not like creating an auto scaling group with N instances as desired capacity. It's just a useful shortcut you have, instead of having to go N times through the same EC2 creation process. It's called "a reservation" (no relation to reserved instance).
Auto scaling groups are a different beast (even though you end up with N identical EC2 instances).
You can either:
Problem is, the number of EC2 instances will not be dynamic, it cannot be a parameter.
It's not a real CloudFormation parameter, but at the end of the day, you get your dynamical number of EC2.
同时,有许多可用的 AWS CloudFormation 示例模板,其中一些包括启动多个实例,尽管通常同时展示其他功能;例如,AutoScalingKeepAtNSample.template 创建一个 负载平衡、自动缩放示例网站,并配置为为此目的启动 2 个 EC2 实例,根据此模板摘录:
还有更高级/完整的示例可用,例如 具有多可用区 Amazon RDS 数据库实例并使用 S3 存储文件内容的高可用 Web 服务器,当前配置为允许 1-5 个 Web 服务器实例与 进行通信多可用区 MySQL Amazon RDS 数据库实例并在 Elastic Load Balancer,它通过 自动缩放。
Meanwhile there are lots of AWS CloudFormation Sample Templates available, and several include launching multiple instances, albeit usually demonstrating other features in parallel; for example, the AutoScalingKeepAtNSample.template creates a load balanced, Auto Scaled sample website and is configured to start 2 EC2 instances for this purpose as per this template excerpt:
There are more advanced/complete samples available as well, e.g. the Drupal template for a Highly Available Web Server with Multi-AZ Amazon RDS database instance and using S3 for storing file content, which is currently configured to allow 1-5 web server instances talking to a Multi-AZ MySQL Amazon RDS database instance and running behind an Elastic Load Balancer, which orchestrates the web server instances via Auto Scaling.
使用
Ref
函数。http://docs.aws.amazon.com /AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html
用户定义的变量在配置文件的
“Parameters”
部分中定义。在配置文件的“资源”部分中,您可以使用对这些参数的引用来填写值。在上面的示例中,
{ "Ref": ... }
用于将值填充到模板中。在本例中,我们提供整数作为“MinSize”
和“MaxSize”
的值。Use the
Ref
function.http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-ref.html
User-defined variables are defined in the
"Parameters"
section of the config file. In the"Resources"
section of the config file you can fill in values using references to these parameters.In the example above
{ "Ref": ... }
is used to fill values into the template. In this case we're providing integers as values for"MinSize"
and"MaxSize"
.