批量迁移DNS解析记录到华为云内网域名解析
方案介绍
场景背景
企业混合云、IDC上云、跨云迁移场景下,需要将自建DNS、第三方云DNS批量内网域名记录,统一迁移至华为云云解析服务内网域名。传统手动逐条添加内网DNS记录,操作繁琐、耗时久、人工录入错误率高,无法满足大批量域名记录快速迁移上线诉求。
方案概述
本方案提供自动化批量迁移内网DNS记录的落地实现,参考云上自动化集成思路,通过Excel批量整理域名解析数据,借助Python脚本完成数据格式标准化转换,结合华为云开放API,批量写入内网域名解析记录,实现大规模DNS记录高效、一键式迁移至华为云内网域名。
方案优势
- 自动化处理,规避手动操作失误,提升迁移效率。
- 标准化数据格式适配华为云DNS内网域名接口规范。
- 支持大规模记录批量写入,适配企业级迁移场景。
- 全流程脚本化,可复用、可定制、可纳入运维自动化。
约束与限制
- 内网域名前置约束
需提前在华为云DNS创建内网域名,并完成目标内网VPC关联,未绑定VPC的内网域名无法下发内网解析记录。
- 接口批量限制
华为云DNS V2.1批量记录创建接口,单次调用支持最大2000条解析记录,超量需分批执行迁移任务。
- 记录类型约束
批量写入仅支持标准内网解析类型,包括A、AAAA、CNAME、MX、TXT、SRV、CAA等,不支持特殊协议类、DNSSEC专属记录。
- 权限约束
调用API的IAM账号,必须授予云解析服务DNS批量记录管理、内网域名查询、任务查询等最小权限策略,需配置合法AK/SK访问密钥。
- 数据格式约束
域名、主机记录、TTL、记录值需符合DNS规范,非法格式数据会导致批量任务执行失败。
- 网络约束
运行自动化脚本的环境,需公网可访问华为云区域DNS开放API终端节点,网络策略不可拦截云服务接口请求。
资源规划
| 区域 | 资源 | 资源说明 | 数量 | 费用 |
|---|---|---|---|---|
| 华北-北京四 | 云解析服务(DNS) | 内网域名:对应业务内网根域名 | 1个及以上 | 免费 |
| 对象存储服务(OBS) | 标准存储桶:用于存放批量迁移数据源与日志文件 | 1 | 详细请参见对象存储服务产品价格详情。 | |
| 统一身份认证服务(IAM) | IAM授权子账号:绑定DNS专属权限策略; | 1 | 免费 | |
| 弹性云服务器ECS(可选) | 运行环境:具备Python3运行环境的设备/云主机,安装华为云SDK、表格处理依赖库。 | 1 | 详细请参见弹性云服务器产品价格详情。 |
配置流程
| 步骤 | 说明 |
|---|---|
| 准备工作 | 获取IAM AK/SK密钥、搭建Python运行环境、安装依赖组件。 |
| 创建内网域名 | 在云解析服务内网域名控制台创建内网域名并关联业务VPC,获取域名ID。 |
| 数据整理 | 按照规范模板整理存量DNS解析记录,输出Excel清单。 模板获取方式:
|
| 格式转换 | 执行本地Python脚本,将Excel域名数据转换为华为云DNS API标准JSON格式文件。 |
| 文件归档(可选) | 将JSON标准化文件上传至OBS桶进行持久化存储。 |
| 批量写入 | 通过华为云SDK调用DNS批量API,读取JSON文件内容,批量新增内网解析记录。 |
| 任务核验 | 调用任务查询接口,校验批量写入任务状态、成功条数、失败明细。 |
| 结果验证 | 在关联VPC内的ECS节点测试内网域名解析,确认迁移生效。 |
准备工作
- 获取 IAM 访问密钥(AK/SK)
- 登录华为云控制台,进入统一身份认证IAM服务;
- 选择已有子账号或新建运维专用IAM用户,绑定云解析批量管理权限策略;
- 进入用户详情 - 访问密钥页面,新建AK/SK,妥善保存密钥信息,用于API鉴权。
- 部署 Python 运行环境
- 准备Python 3.6及以上版本环境。可执行 python3 --version 检查当前 python 的版本信息;
- 确保pip包管理器存在。可执行pip3 -V检查当前pip的版本信息。如提示
pip3: command not found
可通过如下命令安装:
sudo yum -y install python3-pip
- 执行命令安装依赖库,包含华为云DNS SDK、表格处理、数据序列化组件:
pip3 install huaweicloudsdkdns huaweicloudsdkcore pandas openpyxl
配置步骤
- 创建华为云内网域名并获取域名ID
- 创建内网域名,详细请参见创建内网域名。
- 创建完成后,在内网域名列表设置“自定义显示列”勾选“域名ID”,记录已创建的内网域名ID。
- 整理存量DNS记录Excel清单
- 统一梳理线下IDC或其他云平台存量内网DNS记录。
- 进入内网域名列表页面。
- 单击管理控制台左上角的
,选择区域和项目。 - 在域名列表中,单击迁移解析记录的域名名称。
- 在页面顶部导航,选择进入“批量导入/导出”页面。
- 单击“下载模板”,获取导入模板。
- 按模板要求完成解析记录的填写。
- 将Excel转为标准JSON格式 编写转换脚本,读取本地DNS记录Excel,自动拼接完整域名、适配华为云DNS请求体结构,生成可直接调用API的JSON文件:
# coding: utf-8 import pandas as pd import json if __name__ == "__main__": # 配置参数 # 此处替换为整理的存量DNS记录Excel清单完整路径 excel_path = "dns_private_recordsets.xlsx" json_output_path = "dns_private_recordsets.json" # 读取Excel表格 df = pd.read_excel( excel_path, engine="openpyxl", dtype={ "主机记录或域名": str, "记录类型": str, "记录值": str, "描述": str, } ) recordset_list = [] for index, row in df.iterrows(): item = { "name": row["主机记录或域名"] if pd.notna(row["主机记录或域名"]) else "", "type": row["记录类型"] if pd.notna(row["记录类型"]) else "", "ttl": int(row["TTL (秒)"]) if pd.notna(row["TTL (秒)"]) else 300, "records": [r.strip() for r in row["记录值"].replace("_x000D_", "").splitlines() if r.strip()], "description": row["描述"] if pd.notna(row["描述"]) else "" } recordset_list.append(item) # 输出标准化JSON with open(json_output_path, "w", encoding="utf-8") as f: json.dump(recordset_list, f, ensure_ascii=False, indent=2) print(f"数据转换完成,已生成标准JSON文件:{json_output_path}") - (可选)JSON文件上传至OBS归档
通过OBS SDK或OBS控制台,将转换完成的DNS标准JSON文件上传至指定OBS桶,实现配置文件云端归档,便于后续复用与版本管理。
- 添加ak/sk到环境变量
认证用的ak和sk直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。
export HUAWEICLOUD_SDK_AK="你的AK" export HUAWEICLOUD_SDK_SK="你的SK"
- 调用华为云DNS API批量写入内网域名解析记录 基于华为云官方SDK,读取本地/OBS JSON数据,调用批量记录创建接口,批量提交解析记录至目标内网域名:
# coding: utf-8 import os import json from huaweicloudsdkcore.auth.credentials import BasicCredentials from huaweicloudsdkdns.v2.region.dns_region import DnsRegion from huaweicloudsdkcore.exceptions import exceptions from huaweicloudsdkdns.v2 import * if __name__ == "__main__": # 配置参数 # 此处region替换为实际region字段 region = "cn-north-4" zone_id = "替换为华为云内网域名ID" # 此处替换为本地json文件的实际路径 json_file = "dns_private_recordsets.json" # 配置认证信息 # 请勿将认证信息硬编码到代码中,有安全风险 # 可通过环境变量等方式配置认证信息 credentials = BasicCredentials(os.getenv("HUAWEICLOUD_SDK_AK"), os.getenv("HUAWEICLOUD_SDK_SK")) # 创建服务客户端 client = DnsClient.new_builder() \ .with_credentials(credentials) \ .with_region(DnsRegion.value_of(region)) \ .build() # 读取解析记录JSON with open(json_file, "r", encoding="utf-8") as f: dns_recordsets = json.load(f) # 发送请求并获取响应 try: request = BatchCreateRecordSetsTaskRequest() request.zone_id = zone_id request.body = BatchCreateRecordSetsTaskRequestBody(recordsets=dns_recordsets) response = client.batch_create_record_sets_task(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) - 查询批量任务执行结果
通过任务ID调用查询接口,获取批量导入任务状态、成功数量、失败原因,便于问题排查与数据修正:
# coding: utf-8 import os from huaweicloudsdkcore.auth.credentials import BasicCredentials from huaweicloudsdkdns.v2.region.dns_region import DnsRegion from huaweicloudsdkcore.exceptions import exceptions from huaweicloudsdkdns.v2 import * if __name__ == "__main__": # 配置参数 # 此处region替换为实际region字段 region = "cn-north-4" zone_id = "替换为华为云内网域名ID" # 配置认证信息 # 请勿将认证信息硬编码到代码中,有安全风险 # 可通过环境变量等方式配置认证信息 credentials = BasicCredentials(os.getenv("HUAWEICLOUD_SDK_AK"), os.getenv("HUAWEICLOUD_SDK_SK")) # 创建服务客户端 client = DnsClient.new_builder() \ .with_credentials(credentials) \ .with_region(DnsRegion.value_of(region)) \ .build() # 发送请求并获取响应 try: request = ShowBatchCreateRecordSetsTaskRequest() request.zone_id = zone_id response = client.show_batch_create_record_sets_task(request) print(response) print(f"任务状态:{response.status}") print(f"批量创建记录集的总数:{response.total_count}") print(f"记录集创建成功的数量:{response.success_count}") print(f"记录集创建失败的数量:{response.error_count}") except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg) - 清理任务
建议每次任务执行完成后及时清理,方便执行下一次迁移任务。
# coding: utf-8 import os from huaweicloudsdkcore.auth.credentials import BasicCredentials from huaweicloudsdkdns.v2.region.dns_region import DnsRegion from huaweicloudsdkcore.exceptions import exceptions from huaweicloudsdkdns.v2 import * if __name__ == "__main__": # 配置参数 # 此处region替换为实际region字段 region = "cn-north-4" zone_id = "替换为华为云内网域名ID" # 配置认证信息 # 请勿将认证信息硬编码到代码中,有安全风险 # 可通过环境变量等方式配置认证信息 credentials = BasicCredentials(os.getenv("HUAWEICLOUD_SDK_AK"), os.getenv("HUAWEICLOUD_SDK_SK")) # 创建服务客户端 client = DnsClient.new_builder() \ .with_credentials(credentials) \ .with_region(DnsRegion.value_of(region)) \ .build() # 发送请求并获取响应 try: request = DeleteBatchCreateRecordSetsTaskRequest() request.zone_id = zone_id response = client.delete_batch_create_record_sets_task(request) print(response) except exceptions.ClientRequestException as e: print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)
解析生效验证
- 登录该内网域名关联VPC内的ECS。
- 使用nslookup、dig等命令测试内网域名解析。
- 核对解析返回地址与原始DNS记录一致,确认批量迁移生效。