【问题标题】:How to do a graceful shutdown of a AWS ASG with terraform?如何使用 terraform 优雅地关闭 AWS ASG?
【发布时间】:2019-10-23 22:26:23
【问题描述】:

问题

terraform destroy 上,所有 ASG 资源都已终止,某些服务(在我的情况下为 spark streaming)可能仍有数据需要处理。

为确保我的应用程序正常关闭,我连接到我的 ASG 的每个实例以执行 systemctl stop service,并且我想使用 Terraform 自动执行此过程

潜在客户

我知道 when="destroy 关键字和 remote-exec 供应商,但我不确定在 ASG 中正常关闭实例的推荐方法是什么。

resource "aws_instance" "app" {
  # ...

  provisioner "remote-exec" {
    when    = "destroy"
    inline = [ "systemctl stop service" ]
  }
}

来源:

【问题讨论】:

    标签: amazon-web-services terraform terraform-provider-aws


    【解决方案1】:

    您可以使用autoscaling group lifecycle hooks 防止 ASG 在挂钩标记为完成之前终止实例。

    您可以使用aws_autoscaling_lifecycle_hook resource 将终止生命周期挂钩附加到您的 ASG:

    resource "aws_autoscaling_group" "example" {
      availability_zones   = ["us-west-2a"]
      name                 = "example"
      min_size             = 1
      max_size             = 2
    }
    
    resource "aws_autoscaling_lifecycle_hook" "example" {
      name                   = "example"
      autoscaling_group_name = "${aws_autoscaling_group.example.name}"
      default_result         = "CONTINUE"
      heartbeat_timeout      = 300
      lifecycle_transition   = "autoscaling:EC2_INSTANCE_TERMINATING"
    
      notification_target_arn = "arn:aws:sqs:us-west-2:444455556666:queue1*"
      role_arn                = "arn:aws:iam::123456789012:role/S3Access"
    }
    

    上述示例将在标记实例准备终止后让 ASG 等待 5 分钟(300 秒)。一旦 ASG 触发生命周期挂钩尝试终止实例,它将向 notification_target_arn 发送通知,该通知可以是 SQS 队列或 SNS 主题。

    然后,您需要使用可以执行您想做的任何操作的东西来处理通知。在您的情况下,您可能会在每个实例上运行一个小型应用程序,该应用程序轮询 SQS 队列以查找其自己的实例 ID 的终止通知,如果它收到该通知,则停止服务。或者,您可以让 SNS 主题触发 Lambda 函数来执行某些操作。

    操作完成后,您需要通过使用相关信息调用 AWS API 来将生命周期挂钩标记为完成。或者,您可以等待超时,并允许 ASG 根据 aws_authscaling_lifecycle_hook 资源上的 default_result 参数继续终止。

    【讨论】:

    • 我使用了 ASG 的生命周期钩子,它向 SQS 队列发送消息,触发 Lambda 函数,该函数使用简单系统管理器 (SSM) 向 ASG 的实例发送 bash 命令
    • 是的,这很好用。我有需要排空的 ECS 集群,因此有一个 Lambda 函数触发实例的排空,然后将消息重新排队,直到实例完成排空,然后再将实例的终止生命周期挂钩标记为完成。
    猜你喜欢
    • 2014-12-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2017-04-06
    • 2010-11-04
    • 2015-06-25
    相关资源
    最近更新 更多