共计 3537 个字符,预计需要花费 9 分钟才能阅读完成。
背景
Route53 旧域托管在一个单独的账号A下,不便于维护。账号B是主要维护的账号,计划将域切换至B。
迁移方式调研
直接转移(不推荐)
此方式依赖条件过多,需要在域名注册商进行大量配置才可以实现。
而且也未知最终效果是否理想。如果出问题影响面积巨大,不便于回滚。
参考链接:https://docs.aws.amazon.com/zh_cn/Route53/latest/DeveloperGuide/domain-transfer-to-route-53.html
使用区域文件导入导出 (不能满足需求)
AWS支持使用bind格式,将域名解析全量导入至域中。导入验证完毕后,需在dns托管商进行域ns变更指向。
参考链接:https://docs.aws.amazon.com/zh_cn/Route53/latest/DeveloperGuide/domain-transfer-to-route-53.html
获取bind格式域名记录
AWS没有客户API可用于导出区域文件,咨询AWS售后,反馈是需要提case让后台导出。
但bind记录仅有 域名
、ttl
、解析类型
、解析值
四个字段,不能满足 geo 或者 alias 此类更为复杂的路由类型的导入和导出。(geo、alias 有更多的字段需求)
参考链接:
使用第三方套件导入和导出解析(推荐)
github 上有开源第三方套件用于精细化操作route53,可借此执行对解析的导入和导出。
参考链接:GitHub – barnybug/cli53:Amazon Route 53 的命令行工具
创建域
在账号B下创建需迁移的域托管区
创建完毕后,域下会自动生成新的ns记录:
配置第三方程序
首先下载最新版本的包,配置环境
参考链接:github.com/barnybug/cli5…
$ wget https://github.com/barnybug/cli53/releases/download/0.8.18/cli53-linux-amd64
$ chmod +x cli53-linux-amd64
$ mkdir files
$ mkdir tmp
编写导出脚本
在账号A 创建IAM用户,并分配 aksk,需要授权 route53 读取权限。
然后编写导出脚本 export.sh
,用于在账号A 导出域名解析记录。
# 配置脚本
$ vim export.sh
#指定账号,domain,ak,sk
account=accountA
domain='***.com'
export AWS_ACCESS_KEY_ID='***'
export AWS_SECRET_ACCESS_KEY='***'
./cli53-linux-amd64 export $domain |grep -wvE "SOA|NS" |tee ./files/$account-$domain-resolve_list.txt
# 执行脚本观察效果
$ bash export.sh
$ORIGIN ***.com.
_dnsauth 300 IN TXT "202203020000000r0f01xt7sxi75t6s5lg5jy5usgaqqyjshdsxfxqxk708tu6e0"
_dnsauth.eu 300 IN TXT "202009240000004z65fr8nfcw7n2jobsrv8d8sds3mjdwlx3bwg892560dvy9n7o"
_dnsauth.in 300 IN TXT "202009240000003s0hvumqah6ixj1pvh9y07symc15w4motwwvhbrfm9l5vxpppj"
eu 300 IN CNAME forbidden.***.com. ; AWS routing="GEOLOCATION" countryCode="CN" identifier="中国"
eu 300 IN CNAME s-euc.***.com. ; AWS routing="GEOLOCATION" countryCode="*" identifier="欧洲"
......
可以看到解析已经被打印在终端,并且存储在文件中。
导出后人工核验解析记录是否与控制台一致,避免错漏。
编写导入脚本
在账号A 创建IAM用户,并分配 aksk,需要授权 route53 读取和写入权限。
然后编写导出脚本 import.sh
,用于在账号B 导入域名解析记录。
# 配置脚本
$ vim import.sh
account=accountB
domain='***.com'
export AWS_ACCESS_KEY_ID='***'
export AWS_SECRET_ACCESS_KEY='***'
./cli53-linux-amd64 import --file ./files/$account-$domain-resolve_list.txt --upsert $domain
编写检验脚本
检验脚本用于在账号B 导入解析后,再将其导出。
对比和之前从账号A 导出的解析是否有差异。
$ vim check.sh
src_account=accountA
src_ak='***'
src_sk='***'
dest_account=accountB
dest_ak='***'
dest_sk='***'
domain='***.com'
# 导出源账号下解析,剔除soa和ns,排序后输出到文件
export AWS_ACCESS_KEY_ID=$src_ak
export AWS_SECRET_ACCESS_KEY=$src_sk
echo "导出源账号解析..."
./cli53-linux-amd64 export $domain |grep -wvE "SOA|NS" > ./tmp/$src_account-$domain-resolve_list.txt
# 导出目标账号下解析,剔除soa和ns,排序后输出到文件
export AWS_ACCESS_KEY_ID=$dest_ak
export AWS_SECRET_ACCESS_KEY=$dest_sk
echo "导出目标账号解析..."
./cli53-linux-amd64 export $domain |grep -wvE "SOA|NS" > ./tmp/$dest_account-$domain-resolve_list.txt
# 判断文件内容差异,一致的话表示成功
# "执行验证..."
diff ./tmp/$src_account-$domain-resolve_list.txt ./tmp/$dest_account-$domain-resolve_list.txt
if [ $? -eq 0 ];then
echo "源账号和目标账号下 $domain 解析完全一致"
else
echo "异常"
fi
参考链接:
GitHub – barnybug/cli53:Amazon Route 53 的命令行工具
执行迁移
步骤如下:
- 运维侧通知业务方:停止对迁移域的任何解析变更操作、约定变更时间、评估影响面。
- 将域名解析从账号A导出:执行导出脚本
- 将域名解析导入至账号B:执行导入脚本
- 检验 A 、B 账号解析是否一致:执行检验脚本 & 控制台核对
- 检验 B账号下域解析是否正常:指定 B账号中 创建域后分配的ns,执行 dig 测试部分域名解析
dig ***.com @ns-887.awsdns-46.net.
- 上述检验无问题后,在域名注册商切换ns指向为 B账号域分配的ns。
- 运维 & QA 执行解析测试,核心业务测试。
- 放开对域的解析变更,同时需持续两周观察状态,账号B ns生效需要很长时间。可以在账号A 查询该域名的解析次数。
- 确认账号B 新ns全面生效,且账号A 的解析次数下降到忽略不计额地步时,可删除A 下的域。
故障回滚
若发生故障,在域名注册商回滚ns指向,指向值为 账号A 域分配的ns。
同时需注意,在账号B ns生效时期内,若对域名有变更。回滚解析时需要将变更同步到A账号。
总结
在生产环境操作完毕后,并未发生故障。
此类重大变更,一定要遵循以下原则:
- 测试环境验证方案可靠性
- 确认影响面
- 全面通知相关业务方
- 完备的测试流程
- 回滚方案
引用链接
- https://docs.aws.amazon.com/zh_cn/Route53/latest/DeveloperGuide/domain-transfer-to-route-53.html
- https://docs.aws.amazon.com/zh_cn/Route53/latest/DeveloperGuide/resource-record-sets-creating-import.html?icmpid=docs_console_unmapped
- https://docs.aws.amazon.com/zh_cn/Route53/latest/DeveloperGuide/hosted-zones-migrating.html#hosted-zones-migrating-create-file
- GitHub - barnybug/cli53:Amazon Route 53 的命令行工具
- github.com/barnybug/cli5...