Назад | Перейти на главную страницу

AWS Route 53: как полностью перенести зону хостинга из одной учетной записи в другую?

У меня две учетные записи AWS, старая и новая.

У меня есть размещенная ЗОНА на старой учетной записи в службе Route 53.

Я хочу полностью перенести его со старого на новый.

Как мне это сделать ? Есть ли какие-либо заранее определенные шаги для такого случая?

Обратите внимание, что размещенная зона используется в реальной среде. Я не могу рисковать методом проб и ошибок.

Вы также можете использовать jq ("sed for JSON"), чтобы преобразовать вывод JSON из list-resource-record-sets на вход JSON в change-resource-record-sets:

jq '.ResourceRecordSets 
  |{"Changes":[.[] 
  |select(.Type!="SOA") 
  |select(.Type!="NS") 
  |{"Action":"CREATE","ResourceRecordSet":.}]}' 

Предполагается, что вы уже создали новую зону хостинга и она пуста, за исключением SOA и NS записи, которые поэтому удаляются из файла JSON. (Разрывы строк предназначены для удобства чтения; удалите их, чтобы использовать команду.)

Это тривиально с использованием AWS CLI. Сначала получите идентификатор своей зоны хостинга:

$ aws route53 list-hosted-zones
{
    "HostedZones": [
         {
            "ResourceRecordSetCount": 15,
            "CallerReference": "A5A5A3AF-C239-39FB-DA4C-556BA9FD1767",
            "Config": {},
            "Id": "/hostedzone/Z1LVCQHJBJUCM5",
            "Name": "example.com."
        }
    ]
}

Затем экспортируйте список ресурсов для этой размещенной зоны:

$ aws route53 list-resource-record-sets --hosted-zone Z1LVCQHJBJUCM5

Это приведет к выводу json blob ваших записей, который очень близок к формату, который вам понадобится повторно импортировать в новую зону, используя change-resource-record-sets команда. Просмотрите документацию, изучив выходной формат list-resource-record-sets и формат ввода change-resource-record-sets и будет понятно, что вам нужно сделать, чтобы импортировать записи.

После того, как у вас есть записи в новой зоне, обновите регистратора доменов, чтобы он указывал на набор серверов имен Route53 для этой зоны.

Я только что создал инструмент для этой самой проблемы.

https://github.com/andersjanmyr/route53copy

$ route53copy Usage: route53copy-linux <source_profile> <dest_profile> <domain>

Более обновленный ответ. Вот как я сделал это без внешних инструментов, просто aws и текстовый редактор.

Во-первых, согласно документы CLI: "Вы не могу создать размещенная зона для домена верхнего уровня (TLD), такого как .com"(или .org, .net и т. д.).

Ничего особенного, перейдите в новую учетную запись и создайте ее вручную, это кратко:

Теперь, когда вы создали размещенную зону, остается лишь заполнить ее записями. Итак, для удобства перенесите записи из старой учетной записи в файл .json:

$ aws route53 list-resource-record-sets --hosted-zone YOURHOSTZONEID --output json --profile account1 > records.json

Вы можете получить свой YOURHOSTZONEID непосредственно из веб-консоли (столбец «Идентификатор размещенной зоны» на предыдущем изображении) или с вашего терминала: $ aws route53 list-hosted-zones --profile account1.

это --profile account1 option - это ссылка на конфигурацию потенциально нескольких учетных записей, изначально хранящуюся в папке ~ / .aws: files config и credentials. Если вы их не настроили, вы можете редактировать два файла вручную (добавляя все нужные учетные записи, включая IAM), но я рекомендую использовать $ aws configure объяснил Вот.

Теперь, когда вы используете любую команду aws с определенным --profile, он будет знать, какую учетную запись вы хотите использовать.

Скачанный нами JSON необходимо «адаптировать» к фактической структуре JSON. change-resource-record-sets ожидает. По какой-то причине использование --generate-cli-skeleton должен дать вам образец, чтобы знать, какая структура ожидается. Тем не менее, в этом случае это отличается (и поэтому неверно), не знаю почему, от того, что ожидается (что вы можете найти здесь, первый пример JSON). Это уменьшенная и немного скрытая версия, но с правильной структурой:

{
  "Comment": "",
  "Changes": [
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "domain.org.",
        "Type": "A",
        "TTL": 300,
        "ResourceRecords": [
          {
            "Value": "11.111.111.111"
          }
        ]
      }
    },
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "domain.org.",
        "Type": "MX",
        "TTL": 300,
        "ResourceRecords": [
          {
            "Value": "20 mx1.domain.com"
          },
          {
            "Value": "10 mx2.domain.com"
          },
          {
            "Value": "50 mx3.domain.com"
          }
        ]
      }
    },
    {
      "Action": "UPSERT",
      "ResourceRecordSet": {
        "Name": "domain.org.",
        "Type": "NS",
        "TTL": 172800,
        "ResourceRecords": [
          {
            "Value": "number.awsdns-28.com."
          },
          {
            "Value": "number.awsdns-23.org."
          },
          {
            "Value": "number.awsdns-31.co.uk."
          },
          {
            "Value": "number.awsdns-49.net."
          }
        ]
      }
    }
  ]
}

Как видите, вам нужно вставить каждый ResourceRecordSets'JSON из учетной записи1 в каждый объект, начиная с "Action" в JSON для отправки на аккаунт 2. Затем отправляем его так:

$ aws route53 change-resource-record-sets --hosted-zone-id Z3IVB20ZV4QU6O --change-batch file://adaptedfile.json --profile account2

Обратите внимание, что файлы в интерфейсе командной строки aws ссылаются на file: // схема.

Бонусный совет: если вы столкнетесь с ошибками, вы можете добавить --debug вариант, который может помочь вам понять, что не так.