Terraform中for_each参数嵌套for循环的作用及ACM证书代码解析
代码整体功能
这段Terraform代码实现了AWS ACM SSL证书的全自动创建、DNS验证记录自动配置、证书自动校验生效的完整流程,无需手动操作Route53或ACM控制台。
核心for循环语法逻辑解释
你关注的aws_route53_record资源中for_each内部嵌套的是Terraform的for表达式,作用是把ACM返回的域名验证参数列表转换为符合for_each要求的map结构,具体逻辑拆解如下:
- 迭代的数据源是
aws_acm_certificate.nonprod_cert.domain_validation_options:当你选择DNS方式验证ACM证书时,AWS会为每个需要验证的域名(主域名 + 所有额外添加的SAN备用域名)返回一组专属的DNS验证配置,所有配置会以列表形式存在这个属性里,每个元素对应一个域名的验证参数。 - for表达式的语法规则为
{ for 迭代变量 in 待迭代集合 : 键 => 值 },这里的逻辑是:- 遍历每个域名验证参数(迭代变量命名为dvo,是domain validation option的常用缩写)
- 用
dvo.domain_name作为生成map的键,保证每个键唯一 - 键对应的值是一个仅保留Route53记录必填参数的对象,包含
resource_record_name/resource_record_value/resource_record_type三个属性
- 这么设计的好处:
for_each要求传入map或者字符串集合,不能直接传入列表,否则后续列表元素顺序变化会导致Terraform错误重建已有资源- 用域名作为map的键,后续如果新增/删除证书的备用域名,Terraform只会对应新增/删除对应域名的Route53记录,不会影响其他已有的验证记录,稳定性更高。
完整三段代码逻辑梳理
- 第一段
aws_acm_certificate资源:
创建ACM证书,指定主域名和DNS验证方式,创建成功后AWS会返回所有域名的验证配置到domain_validation_options属性。 - 第二段
aws_route53_record资源:
基于前面构造的map批量创建Route53 DNS记录,每个记录对应一个域名的ACM验证要求,完成验证所需的DNS配置。 - 第三段
aws_acm_certificate_validation资源:
等所有Route53记录创建完成后,自动触发ACM的域名校验,校验通过后证书就会变为已签发状态可正常使用,其中的[for record in ...]也是for表达式,作用是把所有创建的Route53记录的FQDN收集为列表,传给验证资源的必填参数。
内容的提问来源于stack exchange,提问作者scrow
相关产品推荐
相关产品推荐

