基于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
相关产品推荐
相关产品推荐

