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

基于service_count的Terraform资源循环创建:ACM与Route53关联报错

Terraform 按数量关联 ACM 证书与 Route53 验证记录解决方案

核心思路

放弃count和for_each混用的方式,统一用for_each控制所有相关资源,通过集合映射实现证书与验证记录的精准关联,同时满足service_count的数量控制需求。

完整代码示例

1. 定义基础变量

variable "service_count" {
  type        = number
  description = "部署的服务数量,0则不创建任何资源"
  default     = 0
}

variable "service_domains" {
  type        = list(string)
  description = "每个服务对应的域名列表,数量需大于等于service_count"
  example     = ["service1.example.com", "service2.example.com"]
}

variable "route53_zone_id" {
  type        = string
  description = "托管域名的Route53区域ID"
}

2. 创建ACM证书(按数量控制)

resource "aws_acm_certificate" "foo" {
  # 根据service_count截取对应数量的域名,转为集合用于for_each
  for_each = toset(slice(var.service_domains, 0, var.service_count))

  domain_name               = each.value
  validation_method         = "DNS"
  subject_alternative_names = ["*.${each.value}"] # 按需调整SAN配置

  tags = {
    Service = each.key
  }
}

3. 创建Route53验证记录(关联对应证书)

resource "aws_route53_record" "acm_validation" {
  # 扁平化所有证书的验证选项,生成唯一键避免重复
  for_each = {
    for cert in aws_acm_certificate.foo :
    "${cert.domain_name}-${cert.domain_validation_options[0].resource_record_name}" => cert.domain_validation_options[0]
    if length(cert.domain_validation_options) > 0
  }

  zone_id = var.route53_zone_id
  name    = each.value.resource_record_name
  type    = each.value.resource_record_type
  ttl     = 60

  records = [each.value.resource_record_value]
}

关键说明

  • 数量控制逻辑:通过slice(var.service_domains, 0, var.service_count)截取指定数量的域名,当service_count为0时,截取结果为空集合,所有资源都不会创建。
  • 避免索引问题:用for_each替代count,每个资源实例都以域名作为唯一标识,彻底解决列表索引不匹配导致的报错。
  • 验证记录关联:通过遍历所有证书的domain_validation_options,生成包含域名和验证记录名称的唯一键,确保每个验证记录精准绑定对应证书。

内容的提问来源于stack exchange,提问作者emmdee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:40:40