DNS レコードを Amazon Route 53 プライベートホストゾーンに一括移行する - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

DNS レコードを Amazon Route 53 プライベートホストゾーンに一括移行する

作成者: Ram Kandaswamy (AWS)

環境:本稼働

テクノロジー: ネットワーキング; CloudNative DevOps;; インフラストラクチャ

AWS サービス: AWS Cloud9、Amazon Route 53、Amazon S3

[概要]

ネットワークエンジニアとクラウド管理者は、Amazon Route 53 のプライベートホストゾーンにドメインネームシステム (DNS) レコードを追加する効率的で簡単な方法が必要です。Microsoft Excel ワークシートのエントリを Route 53 コンソールの適切な場所に手動でコピーする方法は、手間がかかり、エラーが発生しやすくなります。このパターンは、複数のレコードを追加するのに必要な時間と労力を削減する自動化されたアプローチについて説明します。また、複数のホストゾーンを作成する手順を繰り返すこともできます。 

このパターンでは、AWSCloud9 統合開発環境 (IDE) を使用して開発とテストを行い、Amazon Simple Storage Service (Amazon S3) を使用してレコードを保存します。データを効果的に操作するために、パターンは JSON形式を使用します。これは、そのシンプルさと Python ディクショナリ (dict データ型) をサポートする機能があるためです。

注: システムからゾーンファイルを生成できる場合は、代わりに Route 53 インポート機能を使用することを検討してください。

前提条件と制限

前提条件

  • プライベートホストゾーンのレコードを含む Excel ワークシート 

  • A DNSレコード、名前権限ポインタ (NAPTR) レコード、SRVレコードなど、さまざまなタイプのレコードに精通していること (サポートされているDNSレコードタイプを参照)

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

制約事項

  • このパターンは、すべてのユースケースシナリオを網羅しているわけではありません。例えば、change_resource_record_sets 呼び出しでは、 で使用できるすべてのプロパティが使用されませんAPI。

  • Excel ワークシートでは、各行の値は固有であると想定されます。完全修飾ドメイン名 (FQDN) ごとに複数の値が同じ行に表示されることが予想されます。そうでない場合は、このパターンで提供されるコードを修正して、必要な連結を実行する必要があります。

  • このパターンでは、 AWS SDK for Python (Boto3) を使用して Route 53 サービスを直接呼び出します。コードを強化して、 create_stack および update_stack コマンドのAWS CloudFormation ラッパーを使用し、 JSON値を使用してテンプレートリソースを入力できます。

アーキテクチャ

テクノロジースタック

  • トラフィックをルーティングするための Route 53 プライベートホストゾーン

  • AWS 開発とテストIDE用の Cloud9

  • 出力JSONファイルを保存するための Amazon S3

Route 53 プライベートホストゾーンにDNSレコードを一括移行するワークフロー。

このワークフローは、前の図と「エピック」セクションで説明したように、以下のステップで構成されています。

  1. レコードセット情報を含む Excel ワークシートを S3 バケットにアップロードします。

  2. Excel データをJSON形式に変換する Python スクリプトを作成して実行します。

  3. S3 バケットのレコードを読み取り、データをクリーンアップします。

  4. プライベートホストゾーンにレコードセットを作成します。

ツール

  • Route 53 –Amazon Route 53 は、ドメイン登録、DNSルーティング、ヘルスチェックを処理する可用性とスケーラビリティの高いDNSウェブサービスです。

  • AWS Cloud9 – AWS Cloud9 は、複数のプログラミング言語とランタイムデバッガー、および組み込みターミナルをサポートする豊富なコード編集エクスペリエンスIDEを提供する です。また、ソフトウェアのコード作成、ビルド、実行、テスト、デバッグに使用するツールのコレクションが含まれ、クラウドへのソフトウェアのリリースに役立ちます。

  • Amazon S3 — Amazon Simple Storage Service (Amazon S3) は、オブジェクトストレージサービスです。Simple Storage Service (Amazon S3) を使用すると、いつでもウェブ上の任意の場所から任意の量のデータを保存および取得できます。

エピック

タスク説明必要なスキル

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

現在のシステムからエクスポートしたレコードを使用して、完全修飾ドメイン名 (FQDN)、レコードタイプ、存続期間 (TTL)、値など、レコードに必要な列を含む Excel ワークシートを作成します。NAPTR および SRVレコードの場合、値は複数のプロパティの組み合わせであるため、Excel の concatメソッドを使用してこれらのプロパティを結合します。

FqdnName

RecordType

TTL

something.example.org

A

1.1.1.1

900

データエンジニア、Excel のスキル

作業環境を確認します。

AWS Cloud9 でIDE、Python ファイルを作成して Excel 入力ワークシートをJSON形式に変換します。(AWSCloud9 の代わりに、Amazon SageMaker ノートブックを使用して Python コードを使用することもできます)。

Python のバージョン 3.7 以降を使用していることを確認してください。

python3 --version

pandas パッケージをインストールします。

pip3 install pandas --user
全般 AWS

Excel ワークシートデータを に変換しますJSON。

Excel から に変換する次のコードを含む Python ファイルを作成します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 バケットにアップロードします。

S3 バケットに my.json ファイルをアップロードします。詳細については、Amazon S3 ドキュメントの「バケットの作成」を参照してください。

アプリ開発者
タスク説明必要なスキル

プライベートホストゾーンを作成します。

create_hosted_zone APIと次の Python サンプルコードを使用して、プライベートホストゾーンを作成します。パラメータ hostedZoneNamevpcRegion、および vpcId をユーザー自身の値に置き換えてください。

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)

などの Infrastructure as Code (IaC) ツールを使用して、これらのステップAWS CloudFormation を、適切なリソースとプロパティを持つスタックを作成するテンプレートに置き換えることもできます。

クラウドアーキテクト、ネットワーク管理者、Python のスキル

Amazon S3 から詳細をディクショナリとして取得します。

次のコードを使用して S3 バケットから読み取り、JSON値を Python ディクショナリとして取得します。 

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 } } ] } )

ここで xxxxxxx は、このエピックの最初のステップであるホストゾーン ID です。

アプリ開発者、Python のスキル

関連リソース

リファレンス

チュートリアルと動画