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

时间:2020-06-17 11:29:48

标签: terraform

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

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

[dafault]

2 个答案:

答案 0 :(得分:4)

不,你不能。

来自enter image description here

生命周期设置都会影响Terraform如何构造和遍历依赖关系图。结果,只能使用文字值,因为对于任意表达式求值而言,处理太早了。

虽然并没有明确禁止实现目标的 for_each 或其他 dynamic 使用,但此类构造要到以后执行才能确定。

目前最好的解决方法是资源的两个单独副本,一个带有此块,另一个不带:

lifecycle {
  ignore_changes = [
   target_group_arns,
  ]
}

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

答案 1 :(得分:0)

感谢您回答问题的评论。 目前最好的解决方案似乎是复制资源,以便有一个带有life_cycle块的资源,一个不带life_cycle块的资源,并通过计数测试对其进行控制。

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,
    ),
  ])
}