You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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,需要通过键索引来访问模块实例,再获取输出属性。

具体步骤和示例

  1. 确认模块定义
    假设你的模块配置是这样的:

    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等
    }
    
  2. 模块内的输出定义
    确保你的ACM模块(./path/to/your/acm-module)中已经正确输出证书ARN:

    output "acm_certificate_arn" {
      value = aws_acm_certificate.this.arn
      description = "ARN of the ACM certificate"
    }
    
  3. 引用指定实例的证书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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:45:24