Вопрос или проблема
У меня есть два аккаунта AWS: старый и новый.
У меня есть размещенная ЗОНА в старом аккаунте под управлением сервиса Route 53.
Я хочу полностью мигрировать ее из старого аккаунта в новый.
Как я могу это сделать? Есть ли заранее определенные шаги для такого случая?
Обратите внимание, что размещенная зона используется в рабочей среде. Я не могу слишком рисковать с пробами и ошибками.
Вы также можете использовать jq (“sed для 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-блок ваших записей, который очень близок к формату, необходимому для повторного импорта в новую зону, используя команду change-resource-record-sets
. Просмотрите документацию, изучая формат вывода list-resource-record-sets
и входной формат change-resource-record-sets
, и будет ясно, что нужно сделать для импорта записей.
Как только у вас будут записи в новой зоне, обновите регистратора домена, чтобы указать на набор серверов имен Route53 для этой зоны.
Я только что создал инструмент для этой проблемы.
https://github.com/andersjanmyr/route53copy
$ route53copy
Использование: 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 непосредственно из веб-консоли (“Hosted Zone ID” столбец на предыдущем изображении) или из терминала: $ aws route53 list-hosted-zones --profile account1
.
Этот параметр --profile account1
является ссылкой на потенциально множественную конфигурацию аккаунтов, хранящуюся изначально в папке ~/.aws: файлы 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 из account1 в каждый объект, начиная с "Action"
в JSON, который нужно отправить в account2. Затем мы отправим это так:
$ aws route53 change-resource-record-sets --hosted-zone-id Z3IVB20ZV4QU6O --change-batch file://adaptedfile.json --profile account2
Обратите внимание, что файлы в aws CLI ссылаются с помощью схемы file://.
Бонусный совет: если вы столкнетесь с ошибками, вы можете добавить параметр --debug
, который может помочь вам выяснить, что не так.
Здесь вы можете найти решение для автоматизации этого:
https://repost.aws/articles/ART6hB9UmXR46LVC7CjwzV-Q
Наслаждайтесь! 🙂
Ответ или решение
Для миграции хостинговой зоны из одной учетной записи AWS в другую вам потребуется следовать ряду четких шагов, поскольку процесс требует внимательности, особенно если хостинговая зона используется в рабочей среде. Рассмотрим этот процесс детально и поэтапно.
Шаг 1: Подготовьте новую учетную запись
Перед тем как начинать миграцию, убедитесь, что в вашей новой учетной записи AWS создана пустая хостинговая зона. Обратите внимание, что вы не сможете создать хостинговую зону для верхнеуровневого домена (TLD) через AWS CLI; это необходимо сделать через веб-интерфейс консоли AWS.
- Зайдите в консоль AWS в новую учетную запись.
- Перейдите к Route 53 и создайте новую хостинговую зону, указав имя домена.
Шаг 2: Получите данные из старой учетной записи
Теперь вам нужно извлечь записи DNS из существующей хостинговой зоны. Для этого выполните следующие команды в AWS CLI:
-
Найдите идентификатор хостинговой зоны в старой учетной записи:
aws route53 list-hosted-zones --profile old_account
-
Получите все ресурсы (записи) из хостинговой зоны:
aws route53 list-resource-record-sets --hosted-zone-id <YOUR_HOSTED_ZONE_ID> --output json --profile old_account > records.json
-
Откройте файл
records.json
в текстовом редакторе для редактирования.
Шаг 3: Подготовьте данные для загрузки
Вам необходимо адаптировать полученные данные для правильного формата команд change-resource-record-sets
. Используйте jq
для фильтрации и преобразования записей, исключая записи типа SOA
и NS
, которые не следует добавлять в новую хостинговую зону:
jq '.ResourceRecordSets | {"Changes":[.[] | select(.Type!="SOA") | select(.Type!="NS") | {"Action":"CREATE","ResourceRecordSet": .}]}' records.json > adapted_records.json
Шаг 4: Импортируйте записи в новую учетную запись
Теперь, когда у вас есть файл с записями в правильном формате, вы можете загрузить их в новую учетную запись:
- Выполните команду для добавления записей в новую хостинговую зону:
aws route53 change-resource-record-sets --hosted-zone-id <NEW_HOSTED_ZONE_ID> --change-batch file://adapted_records.json --profile new_account
Шаг 5: Обновите DNS-серверы у регистратора доменов
После успешного переноса записей DNS, вам нужно обновить записи Name Server (NS) у вашего регистратора доменов, чтобы они соответствовали NS-записям новой хостинговой зоны. Это ключевой шаг, так как он позволит вашему домену использовать новую инфраструктуру DNS.
Шаг 6: Тестирование
После обновления NS-записей проверьте, что все записи DNS работают корректно:
- Используйте инструменты, такие как
dig
илиnslookup
, чтобы убедиться, что записи правильно разрешаются. - Убедитесь, что ваше приложение функционирует как ожидалось.
Вывод
Миграция хостинговой зоны в AWS требует внимательности и точности, особенно когда речь идет о рабочей среде. Следуя вышеописанным шагам, вы сможете без проблем перенести вашу хостинговую зону. Обязательно протестируйте все изменения и обновления, чтобы убедиться в бесперебойной работе вашего веб-сервиса.