如何使用 Terraform 正常关闭 AWS ASG?
How to do a graceful shutdown of a AWS ASG with terraform?
问题
在 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" ]
}
}
来源:
您可以使用 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
参数继续终止。
问题
在 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" ]
}
}
来源:
您可以使用 autoscaling group lifecycle hooks 来防止 ASG 在挂钩标记为完成之前终止实例。
您可以使用 aws_autoscaling_lifecycle_hook
resource:
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
参数继续终止。