View a markdown version of this page

將大量 DNS 記錄遷移至 Amazon Route 53 私有託管區域 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

將大量 DNS 記錄遷移至 Amazon Route 53 私有託管區域

Ram Kandaswamy,Amazon Web Services

摘要

此模式會自動將 DNS 記錄大量遷移到 Amazon Route 53 託管區域。它使用 Python 指令碼搭配適用於 Python 的 AWS SDK (Boto3),從存放在 Amazon Simple Storage Service (Amazon S3) 中的 JSON 檔案讀取記錄資料,並使用 Route 53 API 以程式設計方式建立記錄。

如果您的來源系統匯出標準 BIND 區域檔案,Route 53 原生匯入功能或 cli53 (與 無關的社群維護開放原始碼 CLI 工具 AWS) 可以處理遷移,而無需自訂指令碼。不過,在許多企業環境中,DNS 記錄存在於 Excel 工作表中,而不是區域檔案。Excel 匯出通常包含非中斷空間和 Unicode 字元等資料品質問題,標準匯入工具不會處理這些問題。此模式可解決該差距:它會從 Excel 讀取並清除資料,以end-to-end建立記錄。

當您需要將大量 DNS 記錄從現有系統遷移到 Route 53 託管區域,而無需透過主控台手動建立每個記錄時,請使用此模式。

先決條件和限制

先決條件

  • 作用中的 AWS 帳戶

  • Excel 工作表,其中包含託管區域記錄,其中包含完整網域名稱 (FQDN)、記錄類型、存留時間 (TTL) 和值的資料欄

  • Python 3.12 或更新版本 (請參閱下載 Python)

  • 已安裝 pandas Python 程式庫 (pip3 install pandas)

  • 熟悉 DNS 記錄類型,例如 A、NAPTR 和 SRV 記錄 (請參閱支援的 DNS 記錄類型)

  • 熟悉 Python 語言及其程式庫

限制

  • 此模式不會使用 change_resource_record_sets API 呼叫的所有可用屬性。根據您的使用案例視需要擴展程式碼。

  • 在 Excel 工作表中,假設每一列中的值是唯一的。每個 FQDN 的多個值預期會出現在相同的資料列中。如果不是這種情況,請修改程式碼來串連相同 FQDN 的多個值。

  • 此模式使用 Boto3 直接呼叫 Route 53 API。 Boto3 您可以增強程式碼以使用 create_stackupdate_stack命令的 AWS CloudFormation 包裝函式,並使用 JSON 值填入範本資源。

  • 如果您的來源系統可以 BIND 區域檔案格式匯出記錄,請考慮改用 Route 53 匯入功能。

  • 有些 AWS 服務無法全部使用 AWS 區域。如需區域可用性,請參閱 AWS依區域列出的 服務。如需特定端點,請參閱服務端點和配額頁面,然後選擇服務的連結。

Architecture

  1. 使用者將具有 DNS 記錄資料的 Excel 工作表上傳至 Amazon S3 儲存貯體。

  2. 在本機 (或在 IDE 中,例如 Kiro) 執行的 Python 指令碼會使用 Boto3 從 Amazon S3 儲存貯體讀取 JSON 檔案。

  3. 指令碼會處理記錄並呼叫 Route 53 change_resource_record_sets API 操作,以在託管區域中建立記錄。

工具

AWS 服務

  • Route 53 –  提供建立 DNS 記錄的託管區域。此模式使用 create_hosted_zonechange_resource_record_sets API 操作。

  • Amazon S3 - 存放 JSON 檔案,其中包含要遷移的 DNS 記錄資料。

其他工具

  • Kiro — 具有代理式 AI 功能的 IDE,用於開發和執行 Python 遷移指令碼。如需詳細資訊,請參閱 Kiro

  • pandas — Python 資料分析程式庫,用於將 Excel 工作表轉換為 JSON 格式。

最佳實務

  • 在針對所有記錄執行指令碼之前,先使用 5-10 筆記錄的小子集進行測試,以驗證資料格式和正確的記錄建立。

  • 使用 UPSERT動作,而非 CREATE。如果記錄不存在,則UPSERT動作會建立記錄,如果記錄不存在,則會對其進行更新。這可讓指令碼具有等冪性且安全地重新執行。

  • 將您的變更批次處理,以保持在ChangeResourceRecordSets請求限制內。當您使用 UPSERT動作時,每個ResourceRecord元素會計入最多 1,000 個元素。

  • 插入前驗證資料。確認 FQDNs以句點 (.) 結尾、TTL 值為正整數,以及記錄類型符合支援的 DNS 記錄類型。

  • 在您進行大量變更之前,請先備份現有的記錄。使用 匯出目前的託管區域記錄list_resource_record_sets,以提供轉返點。

  • 實作具有指數退避的重試邏輯,以處理 Route 53 API 速率限制。如需詳細資訊,請參閱錯誤重試和指數退避 AWS

  • 遵循最低權限原則,並授予執行任務所需的最低許可。如需詳細資訊,請參閱《 AWS Identity and Access Management (IAM) 文件》中的授予最低權限安全最佳實務

史詩

任務說明所需的技能

為您的記錄建立 Excel 檔案。

  1. 從您目前的 DNS 系統匯出記錄。

  2. 使用下列資料欄建立 Excel 工作表:FqdnNameRecordTypeValueTTL

  3. 對於 NAPTR 和 SRV 記錄,請使用 Excel 的 CONCAT 函數將多個屬性值合併到 Value欄中。

  4. 確認每個 FQDN 以句點 (.) 結尾,且 TTL 值為正整數。

範例資料列:

FqdnName

RecordType

Value

TTL

something.example.org

A

192.0.2.1

900

資料工程師

將 Excel 工作表資料轉換為 JSON。

  1. 透過在終端機python3 --version中執行 ,確認 Python 3.12 或更新版本已安裝。

  2. 在終端機pip3 install pandas --user中執行 安裝 pandas 程式庫。

  3. 使用下列程式碼建立 Python 檔案,將 Excel 工作表轉換為 JSON:

import pandas as pd data=pd.read_excel('./Book1.xls') data.to_json(path_or_buf='my.json',orient='records')
  1. 執行指令碼。確認輸出檔案my.json包含預期的記錄。

資料工程師,Python 開發人員

將 JSON 檔案上傳至 Amazon S3 儲存貯體。

  1. 如果 Amazon S3 儲存貯體尚未存在,請建立儲存貯體。如需詳細資訊,請參閱 Amazon S3 文件中的建立儲存貯體。

  2. my.json檔案上傳至 儲存貯體。

應用程式開發人員
任務說明所需的技能

建立託管區域。

  1. 使用下列程式碼建立 Python 檔案,以建立託管區域。將 <hosted-zone-name><vpc-region>和 取代<vpc-id>為您的值。

import boto3 import random hostedZoneName ="xxx" vpcRegion = "us-east-1" vpcId="vpc-xxxx" route53_client = boto3.client('route53') response = route53_client.create_hosted_zone( Name= hostedZoneName, VPC={ 'VPCRegion': vpcRegion, 'VPCId': vpcId }, CallerReference=str(random.random()*100000), HostedZoneConfig={ 'Comment': "private hosted zone created by automation", 'PrivateZone': True } ) print(response)
  1. 執行指令碼,並記下回應中的託管區域 ID。

您也可以使用基礎設施做為程式碼 (IaC) 工具,例如 AWS CloudFormation ,將這些步驟取代為使用適當資源和屬性建立堆疊的範本。如需詳細資訊,請參閱 CloudFormation 文件中的 AWS Route 53::HostedZone

雲端架構師、網路管理員、Python 技能

從 Amazon S3 讀取 JSON 資料。

  1. 使用此程式碼從 Amazon S3 儲存貯體讀取,並將其載入為 Python 字典。 

import json import boto3 s3_client = boto3.client('s3') fileobj = s3_client.get_object( Bucket='<your-bucket-name>', Key='my.json' ) filedata = fileobj['Body'].read() contents = filedata.decode('utf-8') json_content = json.loads(contents)
  1. 透過列印前幾個項目,確認 json_content包含預期的記錄。

應用程式開發人員、Python 開發人員

清除資料值並插入記錄。

  1. 使用此程式碼來清除資料值,並將記錄插入託管區域。<hosted-zone-id> 將 取代為先前設定之託管區域的 ID。

import unicodedata import time for item in json_content: fqn_name = unicodedata.normalize( "NFKD", item["FqdnName"].replace("u'", "'").replace('\xa0', '').strip() ) rec_type = item["RecordType"].replace('\xa0', '').strip() res_rec = {'Value': item["Value"].replace('\xa0', '').strip()} change_response = route53_client.change_resource_record_sets( HostedZoneId='<hosted-zone-id>', ChangeBatch={ 'Comment': 'Created by automation', 'Changes': [ { 'Action': 'UPSERT', 'ResourceRecordSet': { 'Name': fqn_name, 'Type': rec_type, 'TTL': item["TTL"], 'ResourceRecords': [res_rec] } } ] } ) time.sleep(1) # Delay to avoid PriorRequestNotComplete errors
  1. 監控輸出是否有錯誤。如果發生限流,請增加延遲或實作指數退避。

應用程式開發人員、Python 技能

疑難排解

問題解決方案

PriorRequestNotComplete 錯誤

change_resource_record_sets通話之間新增 1–2 秒的time.sleep()延遲。Route 53 程序會以非同步方式變更,先前的變更可能仍在進行中。

InvalidChangeBatch 錯誤

當您嘗試使用 CREATE動作建立已存在的記錄時,就會發生此錯誤。請UPSERT改用 讓指令碼成為等冪。

調節錯誤 (超過速率限制)

您已超過每秒五個 API 請求。使用抖動實作指數退避。如需詳細資訊,請參閱錯誤重試和指數退避 AWS

記錄未解析

確認 VPC 與託管區域相關聯,且已在 VPC 上啟用 DNS 解析。enableDnsSupportenableDnsHostnames 必須同時設定為 true

InvalidInput 記錄值發生錯誤

資料包含非中斷空格 (\xa0) 或前置/追蹤空格。在插入之前,套用來自「清除資料值和插入記錄」任務的資料清理程式碼。

相關資源

參考

教學課程和影片 

使用 Amazon Route 53 的 DNS 設計 (影片)

其他資訊

對於 NAPTR 和 SRV 記錄,Excel 工作表中的 Value 欄位必須包含串連為單一字串的所有必要元件。在匯出至 JSON 之前,使用 Excel 的 CONCAT 函數合併個別屬性 (訂單、偏好設定、旗標、服務、regexp、取代 NAPTR; 優先順序、權重、連接埠、SRV 目標)。

如果您的遷移涉及超過 1,000 個記錄,請將 JSON 檔案分割為批次,並分別處理每個批次,以保持在 Route 53 API 限制內。當您使用 UPSERT動作時,每個ResourceRecord元素會計入每個ChangeResourceRecordSets請求的 1,000 個元素上限兩次。

附件

若要存取與本文件相關聯的其他內容,請解壓縮下列檔案: attachment.zip