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

使用Terraform创建Route53时,如何获取AD域名控制器主机名?

解决Terraform创建Route53 SRV记录时获取AD域控制器主机名的问题

我帮你搞定这个问题!在Terraform 0.11.3和AWS Provider 1.11.0这个组合里,确实aws_directory_service_directory资源只返回域控制器的IP地址,没有直接提供主机名字段。不过我们可以借助AWS CLI来获取域控制器的主机名,再配合Terraform的资源来创建需要的A记录和SRV记录,具体实现如下:

1. 修改AD资源,添加local-exec获取主机名

我们在已有的AD资源中加入local-exec provisioner,调用AWS CLI查询域控制器的主机名并保存到本地文件:

resource "aws_directory_service_directory" "MyActiveDirectory" {
  name       = "${var.DOMAINNAME}"
  password   = "${var.DOMAINADMINPASSWORD}"
  size       = "${var.DOMAINSIZE}"
  vpc_settings {
    vpc_id     = "${aws_vpc.MyVpc.id}"
    subnet_ids = ["${aws_subnet.PvtSubnetA.id}", "${aws_subnet.PvtSubnetB.id}"]
  }

  # 通过AWS CLI获取域控制器主机名并写入本地文件
  provisioner "local-exec" {
    command = "aws ds describe-directories --directory-id ${aws_directory_service_directory.MyActiveDirectory.id} --query 'DirectoryDescriptions[0].DomainControllers[*].Hostname' --output text > dc_hostnames.txt"
    # 注意:执行Terraform的环境需要安装AWS CLI,且配置了能访问Directory Service的权限
  }
}

2. 读取主机名文件并转换为列表

用template_file数据源读取刚才生成的文件,把空格分隔的主机名字符串转成Terraform能遍历的列表:

data "template_file" "dc_hostnames" {
  template = "${file("dc_hostnames.txt")}"

  vars {
    # 将空格分隔的主机名转为列表
    hostnames = "${split(" ", self.template)}"
  }
}

3. 创建Route53私有区域(如果是内部DNS)

如果是替代AD的内部DNS,需要创建关联VPC的Route53私有区域:

resource "aws_route53_zone" "ad_domain" {
  name = "${var.DOMAINNAME}"
  
  # 关联到AD所在的VPC,确保VPC内的实例能解析这个区域的记录
  vpc {
    vpc_id = "${aws_vpc.MyVpc.id}"
  }
}

4. 创建域控制器的A记录

通过count遍历IP列表和主机名列表,为每个域控制器创建A记录:

resource "aws_route53_record" "dc_a_records" {
  count   = "${length(aws_directory_service_directory.MyActiveDirectory.domain_controller_ip_addresses)}"
  zone_id = "${aws_route53_zone.ad_domain.zone_id}"
  name    = "${element(data.template_file.dc_hostnames.vars.hostnames, count.index)}"
  type    = "A"
  ttl     = "300"
  records = ["${element(aws_directory_service_directory.MyActiveDirectory.domain_controller_ip_addresses, count.index)}"]
}

5. 创建指向域控制器的SRV记录

以LDAP的SRV记录为例,创建符合AD要求的SRV记录(格式为priority weight port hostname.,注意末尾的点):

resource "aws_route53_record" "ldap_srv" {
  zone_id = "${aws_route53_zone.ad_domain.zone_id}"
  name    = "_ldap._tcp.dc._msdcs.${var.DOMAINNAME}"
  type    = "SRV"
  ttl     = "300"
  records = [
    "0 100 389 ${element(data.template_file.dc_hostnames.vars.hostnames, 0)}.",
    "0 100 389 ${element(data.template_file.dc_hostnames.vars.hostnames, 1)}."
  ]
}

额外注意事项

  • 确保执行Terraform的环境已正确配置AWS CLI,且IAM权限允许调用ds:DescribeDirectories操作
  • 如果需要其他SRV记录(比如Kerberos),可以参照上面的格式创建,端口对应为88即可
  • 因为AWS Managed AD默认会创建2个域控制器,所以count和列表索引都能正常匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:16:35