# 批量迁移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        | 详细请参见[对象存储服务产品价格详情](https://www.huaweicloud.com/pricing/calculator.html#/obs)。 |
| 华北-北京四 | 统一身份认证服务（IAM）    | IAM授权子账号：绑定DNS专属权限策略；                        | 1     | 免费                                                                             |
| 华北-北京四 | 弹性云服务器ECS（可选） | 运行环境：具备Python3运行环境的设备/云主机，安装华为云SDK、表格处理依赖库。 | 1     | 详细请参见[弹性云服务器产品价格详情](https://www.huaweicloud.com/pricing.html#/ecs)。           |
   
#### 配置流程
| 步骤     | 说明                                                                                                                                                                                                                                                                                                                                                                                                        |
|:---|:---|
| 准备工作     | 获取IAM AK/SK密钥、搭建Python运行环境、安装依赖组件。                                                                                                                                                                                                                                                                                                                                                                         |
| 创建内网域名   | 在云解析服务[内网域名控制台](https://console.huaweicloud.com/dns/?#/dns/privatezones)创建内网域名并关联业务VPC，获取域名ID。                                                                                                                                                                                                                                                                                                            |
| 数据整理   | 按照规范模板整理存量DNS解析记录，输出Excel清单。 模板获取方式： 1. 在内网域名列表中单击已创建的内网域名。  2. 选择进入"批量导入/导出"页面。  3. 在页面上方单击"下载模板"。   |
| 格式转换      | 执行本地Python脚本，将Excel域名数据转换为华为云DNS API标准JSON格式文件。                                                                                                                                                                                                                                                                                                                                                               |
| 文件归档（可选） | 将JSON标准化文件上传至OBS桶进行持久化存储。                                                                                                                                                                                                                                                                                                                                                                                    |
| 批量写入      | 通过华为云SDK调用DNS批量API，读取JSON文件内容，批量新增内网解析记录。                                                                                                                                                                                                                                                                                                                                                                    |
| 任务核验    | 调用任务查询接口，校验批量写入任务状态、成功条数、失败明细。                                                                                                                                                                                                                                                                                                                                                                             |
| 结果验证    | 在关联VPC内的ECS节点测试内网域名解析，确认迁移生效。                                                                                                                                                                                                                                                                                                                                                                              |
   
#### 准备工作
- **获取 IAM 访问密钥（AK/SK）**
  要使用华为云Python SDK，您需要拥有华为云账号以及该账号对应的Access Key（AK）和 Secret Access Key（SK）。请在华为云控制台 "我的凭证-访问密钥" 页面上创建和查看您的AK\&SK。更多信息请查看[访问密钥](https://support.huaweicloud.com/usermanual-ca/ca_05_0003.html)。
  
- **部署 Python 运行环境**
  1. 准备Python 3.6及以上版本环境。可执行python3 --version检查当前 python 的版本信息；
  
  2. 确保pip包管理器存在。可执行pip3 -V检查当前pip的版本信息。如提示
     ```
     pip3: command not found
     ```
     可通过如下命令安装：
     ```
     sudo yum -y install python3-pip
     ```
     
  
  3. 执行命令安装依赖库，包含华为云DNS SDK、表格处理、数据序列化组件：
     ```
     pip3 install huaweicloudsdkdns huaweicloudsdkcore pandas openpyxl
     ```
     
   
 
#### 配置步骤
1. **创建华为云内网域名** **并获取域名ID**
   1. 创建内网域名，详细请参见[创建内网域名](https://support.huaweicloud.com/usermanual-dns/zh-cn_topic_0057773658.html)。
   
   2. 创建完成后，在内网域名列表后方单击![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002635376962.png)。
   
   3. 在"自定义显示列"勾选"域名ID"。
   
   4. 单击"确定"。
    
2. **整理存量DNS记录Excel清单**
   1. 统一梳理线下IDC或其他云平台存量内网DNS记录。
   
   2. 进入[内网域名列表页面](https://console.huaweicloud.com/dns/?#/dns/privatezones)。
   
   3. 单击管理控制台左上角的![](https://support.huaweicloud.com/bestpractice-dns/zh-cn_image_0000002662912711.png)，选择区域和项目。
   
   4. 在域名列表中，单击迁移解析记录的域名名称。
   
   5. 在页面顶部导航，选择进入"批量导入/导出"页面。
   
   6. 单击"下载模板"，获取导入模板。
   
   7. 按模板要求完成解析记录的填写。
    
3. **将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}")
   ```
   
4. **（可选）JSON文件上传至OBS归档**
   通过OBS SDK或OBS控制台，将转换完成的DNS标准JSON文件上传至指定OBS桶，实现配置文件云端归档，便于后续复用与版本管理。
   
5. **添加AK/SK到环境变量**
   认证用的AK和SK直接写到代码中有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全。
   ```
   export HUAWEICLOUD_SDK_AK="你的AK"
   export HUAWEICLOUD_SDK_SK="你的SK"
   ```
   
6. **调用华为云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)
   ```
   
7. **查询批量任务执行结果**
   通过任务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)
   ```
   
8. **清理任务**
   建议每次任务执行完成后及时清理，方便执行下一次迁移任务。
   ```
   # 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)
   ```
   
 
#### 解析生效验证
1. 登录该内网域名关联VPC内的ECS。
2. 使用nslookup、dig等命令测试内网域名解析。
3. 核对解析返回地址与原始DNS记录一致，确认批量迁移生效。
 
