您可以使用reusable delegation sets 使 Route53 区域对每个区域使用相同的名称服务器,无论是多个并发区域还是一遍又一遍地重建区域:
一组四个权威名称服务器,可用于多个托管区域。默认情况下,Route 53 将随机选择的名称服务器分配给每个新的托管区域。为了更轻松地将大量域的 DNS 服务迁移到 Route 53,您可以创建一个可重用的委派集,然后将可重用的委派集与新的托管区域相关联。 (您无法更改与现有托管区域关联的名称服务器。)
在 Terraform 中,这些是使用 aws_route53_delegation_set resource 创建的,文档中给出的示例如下所示:
resource "aws_route53_delegation_set" "main" {
reference_name = "DynDNS"
}
resource "aws_route53_zone" "primary" {
name = "hashicorp.com"
delegation_set_id = aws_route53_delegation_set.main.id
}
resource "aws_route53_zone" "secondary" {
name = "terraform.io"
delegation_set_id = aws_route53_delegation_set.main.id
}
如果您要销毁区域并重建它们并想要相同的名称服务器,那么您需要确保不要同时销毁委托集。
如果您只想选择区域,可以通过运行 terraform destroy -target aws_route53_zone.example 来实现。
或者,您可以在一个目录中创建委托集,然后在单独的目录中创建 Route53 区域(以及其他任何内容),而不破坏委托集资源目录。所以你会有这样的东西:
.
├── delegation-set
│ └── delegation-set.tf
└── route53-zone
└── route53-zone.tf
### delegation-set.tf
resource "aws_route53_delegation_set" "example" {
reference_name = "Example"
}
output "delegation_set_id" {
value = aws_route53_delegation_set.example.id
}
### route53-zone.tf
data "aws_route53_delegation_set" "example" {
id = "INSERT_DELEGATION_SET_ID_HERE"
}
resource "aws_route53_zone" "example" {
name = "example.com"
delegation_set_id = data.aws_route53_delegation_set.example.id
}
不幸的是,正如您在上面的示例中看到的那样,aws_route53_delegation_set data source 仅获取委托集的 ID 而不能为其提供调用者引用,因此您需要对生成和输出的引用 ID 进行硬编码运行terraform apply delegation-set。
您也可以使用terraform_remote_state data source 代替aws_route53_delegation_set 数据源:
### route53-zone.tf
data "terraform_remote_state" "delegation_set" {
backend = "remote"
config = {
organization = "example"
workspaces = {
name = "delegation-set"
}
}
}
resource "aws_route53_zone" "example" {
name = "example.com"
delegation_set_id = data.terraform_remote_state.delegation_set.id
}
上述配置需要适应您存储状态的方式。