Terraform配置AWS ALB监听器:目标组与证书的循环关联问题
解决方案
核心问题是单个Terraform资源不能同时使用count和for_each,要实现监听器与目标组、证书一一对应,需要统一循环逻辑,推荐调整变量结构让目标组与域名绑定,再用for_each统一遍历。
步骤1:调整变量结构,绑定目标组与对应域名
修改target_groups变量,为每个目标组添加对应的domain字段,确保每个监听器对应的目标组和证书一一关联:
variable "target_groups" { type = list(object({ name = string port = string protocol = string target_type = string resource_type = string domain = string # 新增:绑定该目标组对应的证书域名 })) }
步骤2:将证书数据源改为for_each遍历
把原来用count的证书数据源改成for_each,基于target_groups的唯一键(name),这样每个证书对应一个目标组:
data "aws_acm_certificate" "generic_certificate" { for_each = { for tg in var.target_groups : tg.name => tg } domain = each.value.domain }
步骤3:修改ALB监听器资源,统一用for_each关联
监听器的for_each和目标组、证书保持一致,通过each.key关联对应的目标组和证书:
resource "aws_lb_listener" "alb_generic_https_listener" { for_each = { for tg in var.target_groups : tg.name => tg } load_balancer_arn = aws_lb.generic_alb.arn port = var.https_listener_port protocol = var.https_listener_protocol ssl_policy = var.https_policy certificate_arn = data.aws_acm_certificate.generic_certificate[each.key].arn default_action { type = var.https_default_action_type target_group_arn = aws_lb_target_group.generic_alb_tg[each.key].arn } }
可选方案:不修改原变量结构的映射方式
如果不想调整target_groups变量,可以通过创建本地映射来关联目标组索引和域名索引(前提是两者顺序严格对应):
locals { tg_domain_map = zipmap( [for tg in var.target_groups : tg.name], var.domain_name ) } # 证书数据源改为for_each data "aws_acm_certificate" "generic_certificate" { for_each = local.tg_domain_map domain = each.value } # 监听器中引用 resource "aws_lb_listener" "alb_generic_https_listener" { for_each = { for tg in var.target_groups : tg.name => tg } load_balancer_arn = aws_lb.generic_alb.arn port = var.https_listener_port protocol = var.https_listener_protocol ssl_policy = var.https_policy certificate_arn = data.aws_acm_certificate.generic_certificate[each.key].arn default_action { type = var.https_default_action_type target_group_arn = aws_lb_target_group.generic_alb_tg[each.key].arn } }
注意:第二种方案依赖var.target_groups和var.domain_name的顺序完全匹配,一旦顺序错位会导致证书分配错误,优先推荐第一种调整变量结构的方式,逻辑更清晰且不易出错。
内容的提问来源于stack exchange,提问作者Tom Pospíšil
相关产品推荐
相关产品推荐

