AWS Route 53:如何将托管区域从一个帐户完全迁移到另一个帐户?

AWS Route 53:如何将托管区域从一个帐户完全迁移到另一个帐户?

我有两个新旧 AWS 账户。

我在 Route 53 服务下的旧帐户上有一个托管区域。

我想将它从旧版本彻底迁移到新版本。

我该怎么做? 这种情况是否有任何预定义的步骤?

请注意,托管区域正在实时环境中使用。我不能冒太多的反复试验的风险。

答案1

您还可以使用杰奇(“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 文件中删除了这些记录。(换行符是为了便于阅读;删除它们以使用该命令。)

答案2

使用 AWS CLI 很简单。首先,获取您的托管区域 ID:

$ 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 名称服务器集。

答案3

我刚刚针对这个问题创建了一个工具。

https://github.com/andersjanmyr/route53copy

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

答案4

更新的答案。这是我不使用外部工具,只使用aws文本编辑器的方法。

首先,根据CLI 文档:”无法创建顶级域名 (TLD)(例如 .com)的托管区域“(或 .org、.net 等等)。

没什么大不了的,去新帐户并手动创建它,这是一件简洁的事情:

在此处输入图片描述

现在您已经创建了托管区域,接下来只需在其中填充记录即可。因此,为了方便起见,请将旧帐户中的记录放入 .json 文件中:

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

您可以直接从 Web 控制台(上图中的“托管区域 ID”列)或从您的终端获取您的 YOURHOSTZONEID $ aws route53 list-hosted-zones --profile account1:。

--profile account1选项是对潜在多个账户配置的引用,最初存储在 ~/.aws 文件夹中:文件configcredentials。如果您尚未配置它们,您可以手动编辑这两个文件(添加您想要的所有账户,包括 IAM),但我建议使用$ aws configureexplained这里

现在,当您使用任何带有特定 的 aws 命令时--profile,它就会知道您要使用哪个帐户。

我们下载的 JSON 需要“适应”所change-resource-record-sets期望的实际 JSON 结构。出于某种原因,使用--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来自 account1 的每个 JSON 插入到每个对象中,从"Action"要发送到 account2 的 JSON 开始。然后我们像这样发送它:

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

请注意,aws CLI 中的文件引用了文件:// 架构

附加提示:如果遇到错误,您可以添加一个--debug选项来帮助您找出问题所在。

相关内容