【问题标题】:Terraform conditionally apply lifecycle blockTerraform 有条件地应用生命周期块
【发布时间】:2020-06-17 11:29:48
【问题描述】:

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

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

    lifecycle {
      ignore_changes = [
       target_group_arns,
      ]
    }

【问题讨论】:

标签: terraform


【解决方案1】:

不,你不能。

来自The lifecycle Meta-Argument documentation

lifecycle 设置都会影响 Terraform 构建和遍历依赖关系图的方式。因此,只能使用文字值,因为对于任意表达式求值而言,处理发生得太早了。

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

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

lifecycle {
  ignore_changes = [
   target_group_arns,
  ]
}

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 2020-02-17
      • 2020-08-10
      • 2021-09-06
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      相关资源
      最近更新 更多