CloudWatch SQS 指标问题上的 AWS Autoscaling

Posted

技术标签:

【中文标题】CloudWatch SQS 指标问题上的 AWS Autoscaling【英文标题】:AWS Autoscaling on CloudWatch SQS metric problem 【发布时间】:2021-03-16 14:04:39 【问题描述】:

在我的 aws 帐户中,我为我的 SQS 消费者设置了 ASG。它的最小容量为 3,最大容量为 8。终止策略设置为“默认”。它有 2 个简单的扩展策略,附加到监控 SQS 队列大小的云监视警报。

这里是云监视警报ApproximateNumberOfMessagesVisible >= 10 for 1 consecutive periods of 300 seconds for the metric dimensions的阈值。

当云监控警报状态在 300 秒后处于“警报”状态时,ASG 会添加 1 个实例,直到达到最大容量。同样,当云监视警报状态在 300 秒后为“正常”时,ASG 会删除 1 个实例,直到达到最小容量。

ASG 似乎可以毫无问题地扩展到最大容量。然而,我遇到的问题是在 ASG 缩减时发生的。当警报状态从“警报”变回“正常”时,ASG 似乎只是随机选择要关闭的实例。如果要关闭的实例当前正在处理 SQS 消息,则会出现问题。

例如,如果我的 SQS 队列有 20 条可见消息,那么我的 ASG 将扩大,假设为 8。一旦可见消息低于或等于 10,ASG 将开始从我的 ASG 中终止实例。但是,它可能会选择一个正在处理 SQS 消息的实例。如果是,则该 SQS 消息将进入我的 DLQ。

以前有人遇到过这个问题吗?

有没有办法将 ASG 配置为监控 SQS 长度并仅终止已完成消息处理的实例?也许当 SQS 是“好的”并且实例的 CPU 较低时?或者,我应该将云手表警报中的阈值设置为 2 之类的吗?

【问题讨论】:

该消息不应直接进入 DLQ,而应至少重试一次。同一条消息两次发生这种情况的机会很低,如果增加重试次数,概率会更低。除了那个 afaik 之外,您还可以将您的实例配置为不立即关闭而是正常关闭:***.com/questions/20468955/… 【参考方案1】:

您的应用需要明确告诉 asg 实例当前不能被杀死。查看Instance scale-in protection 的文档。

在开始处理消息之前,您需要执行以下操作:

aws autoscaling set-instance-protection --instance-ids i-5f2e8a0d --auto-scaling-group-name my-asg --protected-from-scale-in

然后处理来自自动缩放组my-asg 中受保护实例i-5f2e8a0d 的消息。最后在您完成处理后停用实例保护:

aws autoscaling set-instance-protection --instance-ids i-5f2e8a0d --auto-scaling-group-name my-asg --no-protected-from-scale-in

一旦机器受到保护,ASG 将无法终止它。关闭保护后,可以终止实例,并且自动缩放将继续按预期扩展。如果所有实例都受到保护,则自动缩放不会终止任何实例(因此请注意始终关闭实例保护,否则您可能会在完全扩展时卡住)。

【讨论】:

以上是关于CloudWatch SQS 指标问题上的 AWS Autoscaling的主要内容,如果未能解决你的问题,请参考以下文章

以 SQS 队列为目标的 CloudWatch 事件无法工作

AWS Cloudwatch 上的警报设置

Cloudwatch 代理在服务缩减时丢失指标

AWS Cloudwatch get-metric-statistics 命令返回的是指标名称,而不是自定义 cloudwatch 指标的值

如何使用 AWS CLI 访问跨账户的 cloudwatch 指标

AWS CloudWatch 中的指标、日志和事件之间有啥区别? [关闭]