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



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

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

lifecycle {
ignore_changes = [
target_group_arns,
]
}

不,你不能。

从生命周期元参数文档中:

lifecycle设置都会影响 Terraform 构造和遍历依赖关系图的方式。因此,只能使用文本值,因为处理发生得太早,无法进行任意表达式计算。

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

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

lifecycle {
ignore_changes = [
target_group_arns,
]
}

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

感谢您回答问题的评论。 目前最好的解决方案似乎是复制资源,以便有一个有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,
),
])
}

最新更新