Terraform 在正常关闭 EC2 实例时等待 ASG 删除

Terraform 在正常关闭 EC2 实例时等待 ASG 删除

我使用 Terraform 为运行 sidekiq 的工作服务器设置 ASG。部署时,当 AMI image_id 发生更改时,实例需要长时间正常关闭才能终止以完成作业处理(最长 30 分钟)。

我实现这一目标的想法是:

  1. 使用自动缩放autoscaling:EC2_INSTANCE_TERMINATING具有初始生命周期挂钩的模块,用于在部署时设置删除旧 ASG 和创建新 ASG 的过渡状态。

  2. 将过渡状态发送到 SQS 队列。

  3. 设置 AWS Lambda 函数,该函数接收来自 SQS 的状态消息,使用 SSM 发送远程命令以在 EC2 实例上启动正常关闭。在实例上运行的正常关闭脚本将向 sidekiq 发送 SIGTERM,监视 sidekiq 是否完成,然后shutdown -h now在最后发送命令以停止实例。

  4. Lambda 立即退出,不会等待关闭脚本完成(这是预期的)。它会在成功和失败时发送 SNS 通知。现在的问题是 Terraform 会等到 ASG 成功删除,然后超时(默认为 10 分钟)。我想在选择删除 ASG 后强制 Terraform 继续,而不是等待它完成删除。

我已经force_delete=true设置wait_for_capacity_timeout=0了选项。

来自文档:

force_delete -(可选)允许删除自动缩放组,而无需等待池中的所有实例终止。即使自动缩放组正在缩放资源,您也可以强制删除它。通常,Terraform 会在删除组之前耗尽所有实例。这会绕过该行为并可能使资源悬而未决。

Terraform 在 10 分钟后存在,并显示以下错误消息:

Error: Error deleting autoscaling group: Auto Scaling Group still exists

为什么不起作用?你认为这是一个错误吗?

答案1

我认为问题在于 ASG 在所有实例都被删除之前不会删除自身,并且它会等待钩子完成运行。

想法:1)除非你需要 SQS 的排队机制,否则通过 CW 事件触发 lambda 通常更容易

2) 发送关机 -h 命令时,您可能还希望让它发送一个命令来完成生命周期钩子,这样您就不必等待钩子超时以便 ASG 完成扩展活动 https://docs.aws.amazon.com/cli/latest/reference/autoscaling/complete-lifecycle-action.html

3) 您要更改的设置用于启动实例,文档中说“Terraform 在超时之前应等待 ASG 实例正常运行的最长时间”。这意味着它仅用于启动 https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html

4)尝试更改“删除”超时: https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html#delete

相关内容