如何将Terraform ACM模块的lb_public证书ARN用于其他资源?
解决Terraform中for_each创建的ACM模块输出引用问题
当你通过for_each基于local.lb_domain创建ACM证书模块后,模块实例会以**映射(map)**的形式存在,键就是local.lb_domain中的键(比如lb_public、lb_internal)。要引用指定实例的acm_certificate_arn,需要通过键索引来访问模块实例,再获取输出属性。
具体步骤和示例
确认模块定义
假设你的模块配置是这样的:locals { lb_domain = { lb_public = "public.yourdomain.com" lb_internal = "internal.yourdomain.com" } } module "dev_acm" { source = "./path/to/your/acm-module" for_each = local.lb_domain domain_name = each.value # 其他ACM证书所需参数,比如validation_method等 }模块内的输出定义
确保你的ACM模块(./path/to/your/acm-module)中已经正确输出证书ARN:output "acm_certificate_arn" { value = aws_acm_certificate.this.arn description = "ARN of the ACM certificate" }引用指定实例的证书ARN
在其他资源中引用lb_public对应的证书ARN时,使用键索引的方式:# 示例:在ALB监听器中使用证书 resource "aws_lb_listener" "public_https" { load_balancer_arn = aws_lb.public.arn port = 443 protocol = "HTTPS" # 引用lb_public对应的ACM证书ARN certificate_arn = module.dev_acm["lb_public"].acm_certificate_arn default_action { type = "forward" target_group_arn = aws_lb_target_group.public.arn } }
为什么不能用点语法?
当模块使用for_each时,Terraform会将模块实例组织成一个映射集合,而不是单个实例。点语法(比如module.dev_acm.lb_internal.acm_certificate_arn)只适用于未使用for_each/count的单实例模块,或者模块输出本身是映射的场景。而这里需要先通过键索引定位到具体的模块实例,再访问其输出属性。
内容的提问来源于stack exchange,提问作者Nightt
相关产品推荐
相关产品推荐

