文档首页/ 云解析服务 DNS/ 最佳实践/ 内网域名解析最佳实践/ 批量迁移DNS解析记录到华为云内网域名解析
更新时间:2026-07-02 GMT+08:00
分享

批量迁移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清单。

模板获取方式:

  1. 在内网域名列表中单击已创建的内网域名。
  2. 选择进入“批量导入/导出”页面。
  3. 在页面上方单击“下载模板”。

格式转换

执行本地Python脚本,将Excel域名数据转换为华为云DNS API标准JSON格式文件。

文件归档(可选)

将JSON标准化文件上传至OBS桶进行持久化存储。

批量写入

通过华为云SDK调用DNS批量API,读取JSON文件内容,批量新增内网解析记录。

任务核验

调用任务查询接口,校验批量写入任务状态、成功条数、失败明细。

结果验证

在关联VPC内的ECS节点测试内网域名解析,确认迁移生效。

准备工作

  • 获取 IAM 访问密钥(AK/SK)
    1. 登录华为云控制台,进入统一身份认证IAM服务;
    2. 选择已有子账号或新建运维专用IAM用户,绑定云解析批量管理权限策略;
    3. 进入用户详情 - 访问密钥页面,新建AK/SK,妥善保存密钥信息,用于API鉴权。
  • 部署 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. 创建内网域名,详细请参见创建内网域名
    2. 创建完成后,在内网域名列表设置“自定义显示列”勾选“域名ID”,记录已创建的内网域名ID。
  2. 整理存量DNS记录Excel清单
    1. 统一梳理线下IDC或其他云平台存量内网DNS记录。
    2. 进入内网域名列表页面
    3. 单击管理控制台左上角的,选择区域和项目。
    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记录一致,确认批量迁移生效。

相关文档