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 ホストゾーンへの一括移行を自動化します。 AWS SDK for Python (Boto3) で Python スクリプトを使用して、Amazon Simple Storage Service (Amazon S3) に保存されている JSON ファイルからレコードデータを読み取り、Route 53 API を使用してプログラムでレコードを作成します。

ソースシステムが標準の BIND ゾーンファイルをエクスポートする場合、Route 53 ネイティブインポート機能または cli53 (コミュニティが管理するオープンソースの CLI ツール AWS) は、カスタムスクリプトを使用せずに移行を処理できます。ただし、多くのエンタープライズ環境では、DNS レコードはゾーンファイルではなく Excel ワークシートに存在します。Excel エクスポートには、標準のインポートツールでは処理されない、改行しないスペースや Unicode 文字などのデータ品質の問題が含まれていることがよくあります。このパターンは、このギャップに対処します。Excel から読み取り、データをクリーンアップしてend-to-endのレコードを作成します。

このパターンは、コンソールを使用して各レコードを手動で作成することなく、既存のシステムから Route 53 ホストゾーンに多数の DNS レコードを移行する必要がある場合に使用します。

前提条件と制限事項

前提条件

  • アクティブな AWS アカウント

  • 完全修飾ドメイン名 (FQDN)、レコードタイプ、有効期限 (TTL)、および値の列を含むホストゾーンレコードを含む Excel ワークシート

  • Python 3.12 以降 (Python のダウンロードを参照)

  • pandas Python ライブラリがインストールされている (pip3 install pandas)

  • A、NAPTR、SRV レコードなどの DNS レコードタイプに精通している (「サポートされている DNS レコードタイプ」を参照)

  • Python 言語とそのライブラリを理解していること

制限事項

  • このパターンでは、change_resource_record_setsAPI コールで使用できるすべてのプロパティを使用するわけではありません。ユースケースに応じてコードを拡張します。

  • Excel ワークシートでは、各行の値は固有であると想定されます。FQDN ごとに複数の値が同じ行に表示されることが予想されます。そうでない場合は、同じ FQDN の複数の値を連結するようにコードを変更します。

  • このパターンでは、Boto3 を使用して Route 53 API を直接呼び出します。コードを強化して、 コマンドcreate_stackupdate_stack コマンドに AWS CloudFormation ラッパーを使用し、JSON 値を使用してテンプレートリソースを入力できます。

  • ソースシステムが BIND ゾーンファイル形式でレコードをエクスポートできる場合は、代わりに Route 53 インポート機能の使用を検討してください。

  • 一部の AWS サービスは、すべての で利用できるわけではありません AWS リージョン。リージョンの可用性については、 AWS「リージョン別のサービス」を参照してください。特定のエンドポイントについて確認するには、「サービスエンドポイントとクォータ」ページを参照し、サービスのリンクを選択してください。

アーキテクチャ

  1. ユーザーは、DNS レコードデータを含む Excel ワークシートを Amazon S3 バケットにアップロードします。

  2. ローカル (または Kiro などの IDE) で実行されている Python スクリプトは、Boto3 を使用して Amazon S3 バケットから JSON ファイルを読み取ります。

  3. このスクリプトはレコードを処理し、Route 53 change_resource_record_sets API オペレーションを呼び出して、ホストゾーンにレコードを作成します。

ツール

AWS サービス

  • Route 53 –  DNS レコードが作成されるホストゾーンを提供します。このパターンでは、 create_hosted_zoneおよび change_resource_record_sets API オペレーションを使用します。

  • Amazon S3 - 移行する DNS レコードデータを含む JSON ファイルを保存します。

その他のツール

  • Kiro — エージェント AI 機能を備えた IDE。Python 移行スクリプトの開発と実行に使用されます。詳細については、「Kiro」を参照してください。

  • pandas — Excel ワークシートを JSON 形式に変換するために使用される Python データ分析ライブラリ。

ベストプラクティス

  • すべてのレコードに対してスクリプトを実行する前に、5~10 個のレコードの小さなサブセットでテストし、データのフォーマットと正しいレコードの作成を検証します。

  • の代わりに UPSERTアクションを使用しますCREATEUPSERT アクションは、レコードが存在しない場合は作成し、存在しない場合は更新します。これにより、スクリプトはべき等で、再実行しても安全になります。

  • ChangeResourceRecordSets リクエスト制限内に収まるように変更をバッチ処理しますUPSERT アクションを使用すると、各ResourceRecord要素は 1,000 要素の最大数に 2 回カウントされます。

  • 挿入前にデータを検証します。FQDNsピリオド (.) で終わること、TTL 値が正の整数であること、およびレコードタイプがサポートされている DNS レコードタイプと一致することを確認します。

  • 一括変更を行う前に、既存のレコードをバックアップします。を使用して現在のホストゾーンレコードをエクスポートlist_resource_record_setsし、ロールバックポイントを指定します。

  • Route 53 API レート制限を処理するには、エクスポネンシャルバックオフを使用して再試行ロジックを実装します。詳細については、「エラーの再試行とエクスポネンシャルバックオフ AWS」を参照してください。

  • 最小特権の原則に従い、タスクの実行に必要な最小限の権限を付与します。詳細については、 AWS Identity and Access Management (IAM) ドキュメントの「最小特権の付与」と「セキュリティのベストプラクティス」を参照してください。

エピック

タスク説明必要なスキル

レコード用の Excel ファイルを作成します。

  1. 現在の DNS システムからレコードをエクスポートします。

  2. FqdnNameRecordType、 の列を使用して Excel ワークシートを作成しますValueTTL

  3. NAPTR レコードと SRV レコードの場合は、Excel の CONCAT 関数を使用して、複数のプロパティ値を Value列に結合します。

  4. 各 FQDN がピリオド (.) で終わり、TTL 値が正の整数であることを確認します。

行の例:

FQDNName

RecordType

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. Excel ワークシートを JSON に変換するには、次のコードで Python ファイルを作成します。

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 を書き留めます。

などの Infrastructure as Code (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. このコードを使用してデータ値をクリーンアップし、ホストゾーンにレコードを挿入します。を、以前に設定したホストゾーンの ID <hosted-zone-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 代わりに を使用してスクリプトをべき等にします。

スロットリングエラー (レート制限超過)

1 秒あたり 5 つの API リクエストを超えました。ジッターを使用してエクスポネンシャルバックオフを実装します。詳細については、「エラーの再試行とエクスポネンシャルバックオフ AWS」を参照してください。

レコードが解決されない

VPC がホストゾーンに関連付けられていること、および VPC で DNS 解決が有効になっていることを確認します。enableDnsSupport と の両方を に設定enableDnsHostnamesする必要がありますtrue

InvalidInput レコード値のエラー

データには、改行しないスペース (\xa0) または先頭/末尾の空白が含まれます。挿入する前に、「Clean data values and insert records」タスクからデータクリーニングコードを適用します。

関連リソース

リファレンス

チュートリアルと動画

Amazon Route 53 を使用した DNS 設計 (ビデオ)

追加情報

NAPTR レコードと SRV レコードの場合、Excel ワークシートの Valueフィールドには、1 つの文字列に連結されたすべての必須コンポーネントが含まれている必要があります。Excel の CONCAT 関数を使用して、JSON にエクスポートする前に、個々のプロパティ (順序、設定、フラグ、サービス、regexp、NAPTR の置き換え、優先度、重み、ポート、SRV のターゲット) を結合します。

移行に 1,000 を超えるレコードが含まれる場合は、JSON ファイルをバッチに分割し、各バッチを個別に処理して Route 53 API の制限内に収めます。UPSERT アクションを使用すると、各ResourceRecord要素はChangeResourceRecordSetsリクエストごとに 1,000 要素の最大数に 2 回カウントされます。

アタッチメント

このドキュメントに関連する追加コンテンツにアクセスするには、次のファイルを解凍してください。「attachment.zip