首页 > 解决方案 > Terraform Destroy 在触发钩子之前先删除 Terminate Lifecyclehook

问题描述

预期行为

当使用具有终止生命周期挂钩设置的自动缩放组部署资源时,Terraform destroy 命令应调用/触发终止生命周期挂钩并等待实例终止,然后终止生命周期挂钩被销毁。

实际行为

当使用带有终止生命周期挂钩设置的自动缩放组部署资源时,Terraform destroy 命令不会触发终止生命周期挂钩,而是注意到生命周期资源在自动缩放组/实例终止/销毁之前首先被销毁。

重现问题的步骤

下面的代码用于部署自动缩放组,具有初始生命周期挂钩和用于终止的单独生命周期资源。

resource "aws_autoscaling_group" "asg_group" {
  count                     = var.autoscaling ? 1 : 0
  name                      = var.asg_name
  max_size                  = var.asg_max_size
  min_size                  = var.asg_min_size
  wait_for_capacity_timeout = "0"
  health_check_grace_period = var.asg_health_check_grace_period
  desired_capacity          = var.asg_desired_capacity
  launch_configuration      = var.operating_system == "rhel" ? 
  aws_launch_configuration.launch_cf[0].name : 
  aws_launch_configuration.launch_cf_windows[0].name
  vpc_zone_identifier       = local.subnet_ids
  tags = concat(local.asg_tags,local.custom_tags_format)
  timeouts {
    delete = var.asg_timeouts
  }

initial_lifecycle_hook {
    name                 = "${var.asg_name}-launching"
    default_result       = "CONTINUE"
    heartbeat_timeout    = 600
    lifecycle_transition = "autoscaling:EC2_INSTANCE_LAUNCHING"
  
}
resource "aws_autoscaling_lifecycle_hook" "terminating" {
  count = var.autoscaling ? 1 : 0
  name                   = "${var.asg_name}-terminating"
  depends_on             = [aws_autoscaling_group.asg_group]
  autoscaling_group_name = aws_autoscaling_group.asg_group[0].name
  default_result         = "CONTINUE"
  heartbeat_timeout      = 900
  lifecycle_transition   = "autoscaling:EC2_INSTANCE_TERMINATING"
  
  lifecycle {
    create_before_destroy = true
  }
}

尝试过的解决方案:

尝试在 aws_autoscaling_lifecycle_hook 中添加depends_on,但没有帮助。

depends_on = [aws_autoscaling_group.asg_group]

标签: amazon-web-servicesterraform

解决方案


推荐阅读