如何通过AWS Terraform实现跨账号自动验证ACM证书?
跨AWS账号自动完成ACM证书DNS验证
场景:在Dev个人账号创建ACM证书,但域名的Route53托管在Prod根账号下,需要实现terraform apply时自动在Prod账号添加DNS验证记录,完成证书从"Pending Validation"到"Issued"状态的自动切换。
解决方案步骤
1. 配置双AWS Provider
在Terraform配置中添加两个AWS Provider实例,分别指向Dev账号(默认)和Prod账号(别名prod),推荐用IAM角色切换的方式实现安全的跨账号权限访问:
provider "aws" { region = var.region # Dev账号凭证可通过环境变量、AWS凭证文件或工作区配置传入 } provider "aws" { alias = "prod" region = var.region assume_role { role_arn = "arn:aws:iam::PROD_ACCOUNT_ID:role/terraform-route53-access" # 替换为Prod账号中允许Dev账号操作Route53的角色ARN } }
2. 新增必要变量
添加变量用于接收Prod账号中目标域名的Route53托管区ID:
variable "prod_zone_id" { type = string description = "Prod根账号中目标域名的Route53托管区ID" } variable "region" { type = string description = "AWS区域(CloudFront关联证书需用us-east-1)" default = "us-east-1" }
3. 修改原public_dns.tf代码
调整资源归属逻辑,让ACM证书在Dev账号创建,DNS验证记录自动写入Prod账号的Route53:
# 移除原Dev账号下的Route53 Zone资源(域名托管在Prod账号) # resource "aws_route53_zone" "public" { # name = var.domain # } # 在Dev账号创建ACM证书 resource "aws_acm_certificate" "elb_cert" { domain_name = var.domain subject_alternative_names = ["*.${var.domain}"] validation_method = "DNS" } # 在Prod账号的Route53中自动添加验证记录 resource "aws_route53_record" "cert_validation" { for_each = { for dvo in aws_acm_certificate.elb_cert.domain_validation_options : dvo.domain_name => { name = dvo.resource_record_name record = dvo.resource_record_value type = dvo.resource_record_type } } provider = aws.prod allow_overwrite = true name = each.value.name records = [each.value.record] ttl = 60 type = each.value.type zone_id = var.prod_zone_id } # 在Dev账号等待DNS验证完成,自动签发证书 resource "aws_acm_certificate_validation" "elb_cert" { count = var.certify_domain ? 1 : 0 certificate_arn = aws_acm_certificate.elb_cert.arn validation_record_fqdns = [for record in aws_route53_record.cert_validation : record.fqdn] }
关键注意事项
- 权限配置:确保Prod账号的IAM角色具备
route53:ChangeResourceRecordSets、route53:GetHostedZone等权限,同时Dev账号的Terraform执行角色有权限Assume该Prod角色。 - 凭证安全:禁止硬编码账号凭证,优先使用环境变量、AWS CLI配置或IAM角色切换机制。
- 区域适配:若证书用于CloudFront服务,必须在
us-east-1区域创建ACM证书。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

