Terraform условно применяет блок жизненного цикла - PullRequest
2 голосов
/ 17 июня 2020

Можно ли условно применить блоки жизненного цикла к ресурсам в Terraform 0.12.

Например, если бы я хотел добавить этот блок к ресурсу AWS ASG на основе параметра, переданного модулю.

    lifecycle {
      ignore_changes = [
       target_group_arns,
      ]
    }

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Нет, вы не можете.

Из жизненного цикла : Документация по настройке жизненного цикла :

Все настройки жизненного цикла влияют на то, как Terraform создает и пересекает граф зависимостей. В результате могут использоваться только литеральные значения, поскольку обработка происходит слишком рано для вычисления произвольного выражения.

Хотя это явно не запрещает for_each или другое динамическое c используйте для достижения вашей цели, такие конструкции не могут быть определены до более позднего выполнения.

Лучшее текущее обходное решение - это две отдельные копии ресурса, одна с этим блоком, а другая без:

lifecycle {
  ignore_changes = [
   target_group_arns,
  ]
}

Будем надеяться, что будущая версия Terraform будет поддерживать блоки динамического c жизненного цикла и непостоянные выражения в них.

0 голосов
/ 17 июня 2020

Спасибо за комментарии, отвечая на вопрос. Лучшее решение на данный момент, похоже, дублирует ресурс, так что есть один с блоком 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,
    ),
  ])
}
...