Terraform用for_each创建AWS NLB监听器关联目标组报arn不存在错误
错误原因
- each变量作用域冲突:
aws_lb_listener资源块外层已经通过for_each = var.http_tcp_listeners定义了顶层each变量,指向当前监听器的配置参数。你在dynamic "default_action"块中直接使用each.value.arn时,Terraform优先读取外层监听器的each.value,而你的监听器配置中没有arn字段,因此触发了找不到key "arn"的报错。 - 逻辑配置冗余错误:你不需要通过
dynamic块遍历所有目标组,每个监听器仅需绑定和它同key的目标组即可(http监听器对应http目标组、https监听器对应https目标组),原配置会给每个监听器生成2条default_action规则,不符合预期。
修复方案
直接删除多余的dynamic "default_action"块,通过监听器的each.key直接引用对应key的目标组ARN即可,修改后的aws_lb_listener资源完整配置如下:
resource "aws_lb_listener" "frontend_http_tcp" { for_each = var.http_tcp_listeners load_balancer_arn = aws_lb.main.arn port = each.value.port protocol = each.value.protocol alpn_policy = each.value.alpn_policy # 仅当监听器配置了certificate_arn时才添加该参数,避免http监听器冗余配置 dynamic "certificate_arn" { for_each = contains(keys(each.value), "certificate_arn") ? [each.value.certificate_arn] : [] content { value = certificate_arn.value } } default_action { type = "forward" target_group_arn = aws_lb_target_group.main[each.key].arn } depends_on = [ aws_lb.main, aws_lb_target_group.main, ] }
内容的提问来源于stack exchange,提问作者Rostyslav Malenko
相关产品推荐
相关产品推荐

