Определить c адресов серверов имен - PullRequest
1 голос
/ 24 марта 2020

С помощью AWS как я могу получить детерминированные c адреса серверов имен между применениями / уничтожением terraform?

В настоящий момент мои серверы имен выглядят примерно так:

ns-XXX.awsdns-YY.com. 
ns-XXX.awsdns-YY.org. 
ns-XXX.awsdns-YY.net. 
ns-XXX.awsdns-YY.co.uk.

И каждый раз, когда я запускаю «Применить / уничтожить», значения XXX и YY меняются.

Так что, если у меня есть домен, зарегистрированный с помощью godaddy / namecheap / other, то они также должны быть обновление, которое требует времени для распространения.

Поэтому мне интересно, есть ли способ повлиять на значения XXX/YY, чтобы они могли сохраняться между сеансами?

Например, я пытался это, и хотя он установил серверы имен, как я хотел, к сожалению, он не разрешится.

resource "aws_route53_record" "ns" {
  allow_overwrite = true
  name            = "my_fixed_ns"
  ttl             = 30
  type            = "NS"
  zone_id         = aws_route53_zone.zone.zone_id
  records         = [
    "ns1.amazon.com",
    "ns2.amazon.org",
    "ns3.amazon.net",
    "ns4.amazon.co.uk"
  ]
}

1 Ответ

2 голосов
/ 24 марта 2020

Вы можете использовать повторно используемые наборы делегирования , чтобы зоны Route53 использовали одни и те же серверы имен для каждой зоны, будь то несколько одновременных зон или перестройка зоны снова и снова:

A набор из четырех авторитетных серверов имен, которые вы можете использовать с несколькими размещенными зонами. По умолчанию маршрут 53 назначает случайный выбор серверов имен для каждой новой размещенной зоны. Чтобы упростить миграцию службы DNS на Route 53 для большого количества доменов, вы можете создать повторно используемый набор делегаций и затем связать повторно используемый набор делегаций с новыми размещенными зонами. (Вы не можете изменить серверы имен, связанные с существующей размещенной зоной.)

В Terraform они создаются с ресурсом aws_route53_delegation_set и примером, приведенным в Документы выглядят следующим образом:

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 принимает только идентификатор набора делегирования, а не чем дать ему ссылку на вызывающего абонента, поэтому вам нужно жестко закодировать идентификатор ссылки, сгенерированный и выведенный с помощью команды terraform apply delegation-set.

В качестве альтернативы вы можете использовать источник данных terraform_remote_state вместо источника данных 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
}

Приведенную выше конфигурацию необходимо адаптировать, как бы вы ни были сохраняя ваше состояние.

...