Terraform 说我必须创建 NS 记录,但它们似乎是默认创建的?

Terraform says I have to create NS records but they appear to be created by default?

aws_route53_zone 资源状态的 docs

Public Subdomain Zone

For use in subdomains, note that you need to create a aws_route53_record of type NS as well as the subdomain zone.

resource "aws_route53_zone" "main" {
  name = "example.com"
}

resource "aws_route53_zone" "dev" {
  name = "dev.example.com"

  tags = {
    Environment = "dev"
  }
}

resource "aws_route53_record" "dev-ns" {
  zone_id = aws_route53_zone.main.zone_id
  name    = "dev.example.com"
  type    = "NS"
  ttl     = "30"
  records = aws_route53_zone.dev.name_servers
}

然而,当我创建一个 public 子域时,它已经包含一个 ns 记录 - 文档是否已过时或是否需要执行其他步骤,例如删除 ns 记录?

您在此处探索的情况更像是一般的 DNS 怪癖,而不是特定于 Route53 或特定于 Terraform 的问题。

解析域名时,DNS 客户端会依次递归解析部分名称,从根域名服务器开始,了解哪些 DNS 服务器负责 com,然后从那里到哪些服务器是负责 example.com,然后最终从那里到 dev.example.com

为了回答这个问题,parent 域必须包含 NS 记录,告诉客户端要向哪些域名服务器重新提问。

Route53 默认创建 NS 记录,区域通过这些记录描述 它自己的 权威名称服务器。但是,DNS 客户端无法找到这些记录,除非 parent 区域也包含相同的记录。

综上所述,您的示例 Terraform 配置在这里所做的是声明我们需要将 NS 记录值从 aws_route53_zone.dev 复制到父区域 aws_route53_zone.main,在两个地方使用相同的主机名。

当客户端查找此主机名时,它将首先询问aws_route53_zone.main.name_servers中给出的其中一个名称服务器(假设您已在您的域中正确注册它们注册商的设置),这些服务器将使用 aws_route53_record.dev-ns 声明的这些记录进行响应,因此客户端将能够向权威名称服务器重新提出问题并获得最终答案。

为了使其有用,您还需要在 dev.example.com 区域中包含至少一个非 NS 记录,以便将最后一个问题发送到 aws_route53_zone.dev.name_servers 将 return AAAAAMXCNAME