CloudWatch SQS 指标问题上的 AWS Autoscaling

AWS Autoscaling on CloudWatch SQS metric problem

在我的 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 之类的值吗?

您的应用需要明确告知 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 将无法终止它。一旦关闭保护,实例就可以终止,自动缩放将继续按预期进行缩放。如果所有实例都受到保护,自动缩放将不会终止任何实例(因此请务必关闭实例保护,否则您可能会卡住完全扩展)。