如何使用地形对 AWS ASG 进行正常关闭?



>问题

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" ]
}
}

源:

  • https://www.terraform.io/docs/provisioners/index.html#destroy-time-provisioners
  • https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html#what-happens-terminate

您可以使用自动缩放组生命周期挂钩来防止 ASG 在挂钩标记为完成之前终止实例。

可以使用aws_autoscaling_lifecycle_hook资源将终止生命周期挂钩附加到 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参数继续终止。

最新更新