是否可以有一个默认为 0 的 AWS EC2 规模组,并且只在有工作要做时才包含实例?
Is it possible to have an AWS EC2 scale group that defaults to 0 and only contains instances when there is work to do?
我正在尝试设置一个 EC2 缩放组,该组根据 SQS 队列中的项目数量进行缩放。
当 SQS 队列有项目可见时,我需要缩放组有 1 个可用实例,当 SQS 队列为空(例如,没有可见或不可见消息)时,我希望有 0 个实例。
Desired instances 它设置为 0,min 设置为 0,max 设置为 1。
我在我的 SQS 队列上设置了 cloudwatch 警报,当可见消息大于零时触发,并且当不可见消息小于一时触发警报(即没有更多工作要做)。
目前,Cloudwatch 警报会触发创建实例,但扩展组会自动终止实例以满足所需的设置。我希望警报在最小和最大设置内调整所需的实例数,但事实似乎并非如此。
是的,您当然可以拥有一个 Auto Scaling 组:
- 最小 = 0
- 最大值 = 1
- 报警:当
ApproximateNumberOfMessagesVisible
> 0持续1分钟,增加1个实例
这将导致 Auto Scaling 在队列中有消息等待时启动实例。它将继续尝试启动更多实例,但最大设置会将其限制为 1 个实例。
在没有消息的情况下进行缩放有点诡异。
首先,可能很难真正知道何时缩小。如果有消息等待处理,则 ApproximateNumberOfMessagesVisible
将大于零。但是,没有消息在等待,这并不一定意味着您希望缩小,因为消息可能当前正在处理 ("in flight"),如 ApproximateNumberOfMessagesNotVisible
所示。所以,如果这两个都为零,您只想缩小。不幸的是,CloudWatch 警报只能引用一个指标,而不是两个。
其次,当 Amazon SQS 队列为空时,它不会向 Amazon CloudWatch 发送指标。这是有道理的,因为队列大多是空的,所以它会不断发送一个零指标。但是,这会导致 CloudWatch 在队列为空时不接收指标的问题。相反,警报将进入 INSUFFICIENT_DATA
状态。
因此,您可以将闹钟创建为:
- 当
ApproximateNumberOfMessagesVisible
= 0 持续 15 分钟时,删除 1 个实例 但将操作设置为在 INSUFFICIENT_DATA
而不是 ALARM
注意建议的“15 分钟”延迟以避免抖动实例。这是快速连续添加和删除实例的地方,因为消息会定期但不频繁地传入。所以,还是等一段时间再决定缩容比较好。
这留下了实例在仍在处理消息时终止的问题。这可以通过利用 Auto Scaling Lifecycle Hooks 来避免,它会在实例即将终止时发送信号,让应用程序有机会延迟终止直到工作完成。然后,您的应用程序应该仅在消息处理完成时发出信号表明它已准备好终止。
底线
以上大部分取决于:
- 您的应用程序接收消息的频率
- 处理一条消息需要多长时间
- 所涉及的成本节约
如果您的消息不常见且易于处理,则可能值得连续 运行 个 t2.micro
实例。在 2c/hour 时,缩减的好处很小。此外,添加和删除实例时始终存在您可能实际支付 更多 的风险,因为实例按小时收费 -- 运行 实例 30 分钟,终止它,然后启动另一个实例 30 分钟实际上将按两个小时收费。
最后,您可以考虑使用 AWS Lambda 而不是 Amazon EC2 实例。 Lambda 是无需服务器即可执行短期代码的理想选择。它可以完全消除使用 Amazon EC2 实例的需要,并且您只需在 Lambda 函数实际上 运行ning.
时付费
对于简单的 conf,每秒 aws ami/ubuntu 计费不用担心浪费 startup/shutdown 时间,只需自行终止您的 ec2,w/o 任何 asg down 策略添加一点 bash 在客户端启动代码中或将其预安装在 cron 中并轮询进程是否存在或 cpu 加载和术语 ec2 或关闭(如果附加卷并需要它们自动销毁,终止更好)在处理完成后。关于 asg 定义为 0/0/1 (min/desired/max) 有一个烦人的事情,在 sqs 上有默认值和 ApproximateNumberOfMessagesNotVisible - 在以某种方式触发 ec2 后它切换到 1/0/1 并且它开始循环触发 ec2 即使有什么都不是 sqs(我正在做视频转码,排队 sns/sqs 并使用在非空 sqs 上定义的 asg 触发 ffmpeg 节点)
我正在尝试设置一个 EC2 缩放组,该组根据 SQS 队列中的项目数量进行缩放。
当 SQS 队列有项目可见时,我需要缩放组有 1 个可用实例,当 SQS 队列为空(例如,没有可见或不可见消息)时,我希望有 0 个实例。
Desired instances 它设置为 0,min 设置为 0,max 设置为 1。
我在我的 SQS 队列上设置了 cloudwatch 警报,当可见消息大于零时触发,并且当不可见消息小于一时触发警报(即没有更多工作要做)。
目前,Cloudwatch 警报会触发创建实例,但扩展组会自动终止实例以满足所需的设置。我希望警报在最小和最大设置内调整所需的实例数,但事实似乎并非如此。
是的,您当然可以拥有一个 Auto Scaling 组:
- 最小 = 0
- 最大值 = 1
- 报警:当
ApproximateNumberOfMessagesVisible
> 0持续1分钟,增加1个实例
这将导致 Auto Scaling 在队列中有消息等待时启动实例。它将继续尝试启动更多实例,但最大设置会将其限制为 1 个实例。
在没有消息的情况下进行缩放有点诡异。
首先,可能很难真正知道何时缩小。如果有消息等待处理,则 ApproximateNumberOfMessagesVisible
将大于零。但是,没有消息在等待,这并不一定意味着您希望缩小,因为消息可能当前正在处理 ("in flight"),如 ApproximateNumberOfMessagesNotVisible
所示。所以,如果这两个都为零,您只想缩小。不幸的是,CloudWatch 警报只能引用一个指标,而不是两个。
其次,当 Amazon SQS 队列为空时,它不会向 Amazon CloudWatch 发送指标。这是有道理的,因为队列大多是空的,所以它会不断发送一个零指标。但是,这会导致 CloudWatch 在队列为空时不接收指标的问题。相反,警报将进入 INSUFFICIENT_DATA
状态。
因此,您可以将闹钟创建为:
- 当
ApproximateNumberOfMessagesVisible
= 0 持续 15 分钟时,删除 1 个实例 但将操作设置为在INSUFFICIENT_DATA
而不是ALARM
注意建议的“15 分钟”延迟以避免抖动实例。这是快速连续添加和删除实例的地方,因为消息会定期但不频繁地传入。所以,还是等一段时间再决定缩容比较好。
这留下了实例在仍在处理消息时终止的问题。这可以通过利用 Auto Scaling Lifecycle Hooks 来避免,它会在实例即将终止时发送信号,让应用程序有机会延迟终止直到工作完成。然后,您的应用程序应该仅在消息处理完成时发出信号表明它已准备好终止。
底线
以上大部分取决于:
- 您的应用程序接收消息的频率
- 处理一条消息需要多长时间
- 所涉及的成本节约
如果您的消息不常见且易于处理,则可能值得连续 运行 个 t2.micro
实例。在 2c/hour 时,缩减的好处很小。此外,添加和删除实例时始终存在您可能实际支付 更多 的风险,因为实例按小时收费 -- 运行 实例 30 分钟,终止它,然后启动另一个实例 30 分钟实际上将按两个小时收费。
最后,您可以考虑使用 AWS Lambda 而不是 Amazon EC2 实例。 Lambda 是无需服务器即可执行短期代码的理想选择。它可以完全消除使用 Amazon EC2 实例的需要,并且您只需在 Lambda 函数实际上 运行ning.
时付费对于简单的 conf,每秒 aws ami/ubuntu 计费不用担心浪费 startup/shutdown 时间,只需自行终止您的 ec2,w/o 任何 asg down 策略添加一点 bash 在客户端启动代码中或将其预安装在 cron 中并轮询进程是否存在或 cpu 加载和术语 ec2 或关闭(如果附加卷并需要它们自动销毁,终止更好)在处理完成后。关于 asg 定义为 0/0/1 (min/desired/max) 有一个烦人的事情,在 sqs 上有默认值和 ApproximateNumberOfMessagesNotVisible - 在以某种方式触发 ec2 后它切换到 1/0/1 并且它开始循环触发 ec2 即使有什么都不是 sqs(我正在做视频转码,排队 sns/sqs 并使用在非空 sqs 上定义的 asg 触发 ffmpeg 节点)