Terraform 有条件地应用生命周期块

Ala*_*ery 10 terraform

您能否有条件地将生命周期块应用于 Terraform 0.12 中的资源。

例如,如果我想根据传递给模块的参数将此块添加到 AWS ASG 资源。

    lifecycle {
      ignore_changes = [
       target_group_arns,
      ]
    }
Run Code Online (Sandbox Code Playgroud)

Ala*_*ery 13

感谢您回答问题的评论。目前最好的解决方案似乎是复制资源,以便一个具有生命周期块,一个不具有生命周期块,并通过计数测试来控制它们。

resource "aws_autoscaling_group" "asg" {
  count = var.enabled && var.manage_targets ? 1 : 0

  name                = var.name
  vpc_zone_identifier = var.subnets

  launch_configuration = join("", aws_launch_configuration.lc.*.id)
  load_balancers       = var.load_balancers
  target_group_arns    = var.target_group_arns

  min_size             = var.min
  max_size             = var.max
  default_cooldown     = var.cooldown
  termination_policies = var.termination_policies

  health_check_grace_period = var.health_check_grace_period
  health_check_type         = var.health_check_type

  enabled_metrics = var.enabled_metrics

  tags = flatten([
    {
      key                 = "Name"
      value               = var.name
      propagate_at_launch = true
    },
    {
      key                 = "Environment"
      value               = var.envname
      propagate_at_launch = true
    },
    {
      key                 = "Service"
      value               = var.service
      propagate_at_launch = true
    },
    var.extra_tags,
    slice(
      [{
        "key"                 = "Patch Group"
        "value"               = var.patch_group
        "propagate_at_launch" = true
      }],
      var.patch_group == "" ? 1 : 0,
      1,
    ),
  ])
}

resource "aws_autoscaling_group" "asg_unmanaged_targets" {
  count = var.enabled && !var.manage_targets ? 1 : 0

  name                = var.name
  vpc_zone_identifier = var.subnets

  launch_configuration = join("", aws_launch_configuration.lc.*.id)
  load_balancers       = var.load_balancers
  target_group_arns    = var.target_group_arns

  min_size             = var.min
  max_size             = var.max
  default_cooldown     = var.cooldown
  termination_policies = var.termination_policies

  health_check_grace_period = var.health_check_grace_period
  health_check_type         = var.health_check_type

  enabled_metrics = var.enabled_metrics

  lifecycle {
    ignore_changes = [
     target_group_arns,
    ]
  }

  tags = flatten([
    {
      key                 = "Name"
      value               = var.name
      propagate_at_launch = true
    },
    {
      key                 = "Environment"
      value               = var.envname
      propagate_at_launch = true
    },
    {
      key                 = "Service"
      value               = var.service
      propagate_at_launch = true
    },
    var.extra_tags,
    slice(
      [{
        "key"                 = "Patch Group"
        "value"               = var.patch_group
        "propagate_at_launch" = true
      }],
      var.patch_group == "" ? 1 : 0,
      1,
    ),
  ])
}
Run Code Online (Sandbox Code Playgroud)


Ala*_*Dea 9

不,你不能。

生命周期:生命周期自定义文档

生命周期设置都会影响 Terraform 如何构建和遍历依赖图。因此,只能使用文字值,因为对于任意表达式评估而言,处理发生得太早。

虽然这并没有明确禁止for_each或其他可以实现您的目标的动态使用,但此类构造直到稍后执行才能确定。

当前最好的解决方法是资源的两个单独副本,一个有这个块,另一个没有:

lifecycle {
  ignore_changes = [
   target_group_arns,
  ]
}
Run Code Online (Sandbox Code Playgroud)

希望未来版本的 Terraform 将支持动态生命周期块和其中的非常量表达式。