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

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

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

由拉姆·康達斯瓦米(AWS)創建

環境:生產

技術:網路、雲端原生、基礎架 DevOps構

AWS 服務:AWS Cloud9;Amazon Route 53;Amazon S3

Summary

網路工程師和雲端管理員需要有效且簡單的方法,將網域名稱系統 (DNS) 記錄新增至 Amazon Route 53 中的私有託管區域。使用手動方法將項目從 Microsoft Excel 工作表複製到 Route 53 主控台中的適當位置是乏味且容易出錯的。這種模式描述了一種自動化方法,可以減少添加多個記錄所需的時間和精力。它還為多個託管區域建立提供了一組可重複的步驟。

此模式使用 AWS Cloud9 整合式開發環境 (IDE) 進行開發和測試,並使用亞馬遜簡單儲存服務 (Amazon S3) 存放記錄。為了有效地處理資料,模式會使用 JSON 格式,因為它的簡單性和支援 Python 字典 (dict資料類型) 的能力。

注意:如果您可以從系統產生區域檔案,請考慮改用 Route 53 匯入功能

先決條件和限制

先決條件

  • 包含私人託管區域記錄的 Excel 工作表

  • 熟悉不同類型的 DNS 記錄,例如 A 記錄、名稱授權指標 (NAPTR) 記錄和 SRV 記錄 (請參閱支援的 DNS 記錄類型)

  • 熟悉 Python 語言及其庫

限制

  • 該模式不會為所有使用案例案例提供廣泛的涵蓋範圍。例如,調用不會使用 API 的所有可用屬性。

  • 在 Excel 工作表中,每行中的值被假定為唯一。每個完整網域名稱 (FQDN) 的多個值預期會出現在同一列中。如果不是這樣,您應該修改此模式中提供的代碼以執行必要的串聯。

  • 該模式使用適用於 Python 的 AWS 開發套件 (Boto3) 直接呼叫 Route 53 服務。您可以增強程式碼以針對create_stackupdate_stack命令使用 AWS CloudFormation 包裝函式,並使用 JSON 值填入範本資源。

架構

技術堆疊

  • Route 53 私人託管區域,用於路由流量

  • 適用於開發和測試的 AWS Cloud9 IDE

  • Amazon S3 用於存儲輸出 JSON 文件

將 DNS 記錄大量遷移到 Amazon Route 53 私有託管區域的工作流程和架構

工作流程包含這些步驟,如上圖所示,並在 Epics 一節中討論:

  1. 將具有記錄集資訊的 Excel 工作表上傳至 S3 儲存貯體。

  2. 建立並執行將 Excel 資料轉換為 JSON 格式的 Python 指令碼。

  3. 從 S3 儲存貯體讀取記錄並清除資料。

  4. 在您的私人託管區域中建立記錄集。

工具

  • 路線 53 — Amazon Route 53 是高度可用且可擴展的 DNS 網路服務,可處理網域註冊、DNS 路由和運作狀態檢查。

  • AWS Cloud9 — AWS Cloud9 是一種 IDE,提供豐富的程式碼編輯體驗,並支援多種程式設計語言和執行階段除錯器,以及內建終端機。其中包含用於編碼、建置、執行、測試、除錯以及在雲端中發行軟體的工具集合。

  • Amazon S3 — Amazon Simple Storage Service (Amazon S3) 是一種對象存儲服務。您可以使用 Amazon S3 隨時從 Web 任何地方存放和擷取任意資料量。

史诗

任務描述所需技能
為您的記錄創建一個 Excel 文件。

使用您從目前系統匯出的記錄,建立包含記錄所需欄的 Excel 工作表,例如完整網域名稱 (FQDN)、記錄類型、存留時間 (TTL) 和值。對於 NAPTR 和 SRV 記錄,值是多個屬性的組合,因此請使用 Excel 的concat方法來組合這些屬性。

FqdnName

RecordType

TTL

一些. 示例

A

1.1.1.1

900

數據工程師,卓越技能
確認工作環境。

在 AWS Cloud9 IDE 中,建立一個 Python 檔案,將 Excel 輸入工作表轉換為 JSON 格式。您也可以使用 Amazon SageMaker 筆記本來處理 Python 代碼,而不是 AWS Cloud9。)

確認您使用的 Python 版本是 3.7 或更新版本。

 python3 --version

安裝熊貓包

 pip3 install pandas --user
一般 AWS
將 Excel 工作表資料轉換為 JSON。

創建一個 Python 文件,其中包含以下代碼以從 Excel 轉換為 JSON。

import pandas as pd data=pd.read_excel('./Book1.xls') data.to_json(path_or_buf='my.json',orient='records')

其中Book1是 Excel 工作表的名稱,my.json是輸出 JSON 檔案的名稱。

資料工程師、Python 技能
將 JSON 檔案上傳到 S3 儲存貯體。

上傳 my.json 至 S3 儲存貯體。如需詳細資訊,請參閱 Amazon S3 文件中的建立儲存貯體。

應用程式開發人員
任務描述所需技能
建立私有託管區域。

使用創建的主機 API 和下面的 Python 示例代碼來創建一個私有託管區域vpcId用您自己的值取代參數hostedZoneNamevpcRegion、和。

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)

您也可以使用基礎設施即程式碼 (IaC) 工具 (例如 AWS), CloudFormation 將這些步驟取代為使用適當資源和屬性建立堆疊的範本。

雲端架構師、網路管理員、Python 技能
從 Amazon S3 擷取作為字典的詳細資訊。

使用下列程式碼從 S3 儲存貯體讀取,並以 Python 字典的形式取得 JSON 值。 

fileobj = s3_client.get_object(         Bucket=bucket_name,         Key='my.json'         )     filedata = fileobj['Body'].read()     contents = filedata.decode('utf-8')     json_content=json.loads(contents)     print(json_content)

其中json_content包含 Python 字典。

應用程式開發者、Python 技能
清理空格和 Unicode 字符的數據值。

為確保資料正確性的安全措施,請使用下列程式碼對中的值執行分段作業。json_content此代碼刪除每個字符串的前面和結尾的空格字符。它還使用該replace方法來刪除硬(不斷行)空格(字\xa0符)。

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()                 }
應用程式開發者、Python 技能
插入記錄。

使用下面的代碼作為上一個for循環的一部分。

change_response = route53_client.change_resource_record_sets( HostedZoneId="xxxxxxxx",             ChangeBatch={                 'Comment': 'Created by automation',                 'Changes': [                     {                         'Action': 'UPSERT',                         'ResourceRecordSet': {                             'Name': fqn_name,                             'Type': rec_type,                             'TTL': item["TTL"],                             'ResourceRecords': res_rec                         }                     }                 ]             }     )

這部史詩第一步的託管區域 ID 在xxxxxxx哪裡。

應用程式開發者、Python 技能

相關資源

參考

教學課程和影片