您能否有条件地将生命周期块应用于 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)
不,你不能。
生命周期设置都会影响 Terraform 如何构建和遍历依赖图。因此,只能使用文字值,因为对于任意表达式评估而言,处理发生得太早。
虽然这并没有明确禁止for_each或其他可以实现您的目标的动态使用,但此类构造直到稍后执行才能确定。
当前最好的解决方法是资源的两个单独副本,一个有这个块,另一个没有:
lifecycle {
ignore_changes = [
target_group_arns,
]
}
Run Code Online (Sandbox Code Playgroud)
希望未来版本的 Terraform 将支持动态生命周期块和其中的非常量表达式。
归档时间: |
|
查看次数: |
3316 次 |
最近记录: |