我有两个新旧 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 文件夹中:文件config
和credentials
。如果您尚未配置它们,您可以手动编辑这两个文件(添加您想要的所有账户,包括 IAM),但我建议使用$ aws configure
explained这里。
现在,当您使用任何带有特定 的 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
选项来帮助您找出问题所在。