

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

# DNS レコードを Amazon Route 53 プライベートホストゾーンに一括で移行する
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone"></a>

*Ram Kandaswamy、Amazon Web Services*

## 概要
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-summary"></a>

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

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

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

## 前提条件と制限事項
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-prereqs"></a>

**前提条件**
+ アクティブな AWS アカウント
+ 完全修飾ドメイン名 (FQDN)、レコードタイプ、有効期限 (TTL)、および値の列を含むホストゾーンレコードを含む Excel ワークシート
+ Python 3.12 以降 ([Python のダウンロード](https://www.python.org/downloads/)を参照)
+ pandas Python ライブラリがインストールされている (`pip3 install pandas`)
+ A、NAPTR、SRV レコードなどの DNS レコードタイプに精通していること ([「サポートされている DNS レコードタイプ](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/ResourceRecordTypes.html)」を参照)
+ Python 言語とそのライブラリを理解していること

**制限事項**
+ このパターンでは、`change_resource_record_sets`API コールで使用できるすべてのプロパティを使用するわけではありません。ユースケースに応じてコードを拡張します。
+ Excel ワークシートでは、各行の値は固有であると想定されます。FQDN ごとに複数の値が同じ行に表示されることが予想されます。そうでない場合は、同じ FQDN の複数の値を連結するようにコードを変更します。
+ このパターンでは、Boto3 を使用して Route 53 API を直接呼び出します。コードを強化して、 コマンド`create_stack`と `update_stack` コマンドに AWS CloudFormation ラッパーを使用し、JSON 値を使用してテンプレートリソースを入力できます。
+ ソースシステムが BIND ゾーンファイル形式でレコードをエクスポートできる場合は、代わりに Route 53 インポート機能を使用することを検討してください。
+ 一部の AWS サービスは、すべての で利用できるわけではありません AWS リージョン。リージョンの可用性については、 AWS[「リージョン別のサービス](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)」を参照してください。特定のエンドポイントについて確認するには、「[サービスエンドポイントとクォータ](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)」ページを参照し、サービスのリンクを選択してください。

## アーキテクチャ
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-architecture"></a>



![](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/a81c29ea-f0c5-4d4a-ba87-93111a0f1ee9/images/e5c65fa5-346e-4a24-bddf-a523f30afa95.png)


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

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

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

## ツール
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-tools"></a>

*AWS サービス*
+ [Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) –  DNS レコードが作成されるホストゾーンを提供します。このパターンでは、 `create_hosted_zone`および `change_resource_record_sets` API オペレーションを使用します。
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) - 移行する DNS レコードデータを含む JSON ファイルを保存します。

*その他のツール*
+ **Kiro** — エージェント AI 機能を備えた IDE。Python 移行スクリプトの開発と実行に使用されます。詳細については、[「Kiro](https://kiro.dev/)」を参照してください。
+ **pandas** — Excel ワークシートを JSON 形式に変換するために使用される Python データ分析ライブラリ。

## ベストプラクティス
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-best-practices"></a>
+ すべてのレコードに対してスクリプトを実行する前に、5～10 個のレコードの小さなサブセットでテストし、データのフォーマットと正しいレコードの作成を検証します。
+ の代わりに `UPSERT`アクションを使用します`CREATE`。`UPSERT` アクションは、レコードが存在しない場合は作成し、存在しない場合は更新します。これにより、スクリプトはべき等で安全に再実行できます。
+ `ChangeResourceRecordSets` リクエスト制限内に収まるように[変更をバッチ処理します](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DNSLimitations.html#limits-api-requests-changeresourcerecordsets)。`UPSERT` アクションを使用すると、各`ResourceRecord`要素は 1,000 要素の最大数に 2 回カウントされます。
+ [挿入前にデータを検証](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/ResourceRecordTypes.html)します。FQDNsピリオド (`.`) で終わること、TTL 値が正の整数であること、およびレコードタイプがサポートされている DNS レコードタイプと一致することを確認します。
+ 一括変更を行う前に、[既存のレコードをバックアップ](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/route53.html#Route53.Client.list_resource_record_sets)します。を使用して現在のホストゾーンレコードをエクスポート`list_resource_record_sets`し、ロールバックポイントを指定します。
+ Route 53 API レート制限を処理するには、エクスポネンシャルバックオフを使用して再試行ロジックを実装します。詳細については、[「エラーの再試行とエクスポネンシャルバックオフ AWS](https://docs.aws.amazon.com/general/latest/gr/api-retries.html)」を参照してください。
+ 最小特権の原則に従い、タスクの実行に必要な最小限の権限を付与します。詳細については、 AWS Identity and Access Management (IAM) ドキュメントの[「最小特権の付与](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)」と[「セキュリティのベストプラクティス](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)」を参照してください。

## エピック
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-epics"></a>

### データ自動化の準備
<a name="prepare-data-for-automation"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| レコード用の Excel ファイルを作成します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html)行の例: [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html) | データエンジニア | 
| Excel ワークシートのデータを JSON に変換します。　 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html)<pre>import pandas as pd<br /><br />data=pd.read_excel('./Book1.xls')<br />data.to_json(path_or_buf='my.json',orient='records')</pre>[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html) | データエンジニア、Python 開発者 | 
| JSON ファイルを Amazon S3 バケットにアップロードします。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html) | アプリ開発者 | 
| FQDNName | RecordType | 値 | TTL | 
| something.example.org | A | 192.0.2.1 | 900 | 

### ホストゾーンにレコードを挿入する
<a name="insert-records-into-the-hosted-zone"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| ホストゾーンの作成。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html)<pre>import boto3<br />import random<br /><br />hostedZoneName ="xxx"<br />vpcRegion = "us-east-1"<br />vpcId="vpc-xxxx"<br />route53_client = boto3.client('route53')<br />response = route53_client.create_hosted_zone(<br />        Name= hostedZoneName,<br />        VPC={<br />            'VPCRegion': vpcRegion,<br />            'VPCId': vpcId<br />        },<br />        CallerReference=str(random.random()*100000),<br />        HostedZoneConfig={<br />            'Comment': "private hosted zone created by automation",<br />            'PrivateZone': True<br />        }<br />    )<br /><br /> print(response)</pre>[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html)などの Infrastructure as Code (IaC) ツールを使用して AWS CloudFormation 、これらのステップを、適切なリソースとプロパティを持つスタックを作成するテンプレートに置き換えることもできます。詳細については、 CloudFormation ドキュメントの[AWS 「Route 53::HostedZone](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-route53-hostedzone.html)」を参照してください。 | クラウドアーキテクト、ネットワーク管理者、Python のスキル | 
| Amazon S3 から JSON データを読み取ります。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html)<pre>import json<br />import boto3<br /><br />s3_client = boto3.client('s3')<br />fileobj = s3_client.get_object(<br />    Bucket='<your-bucket-name>',<br />    Key='my.json'<br />)<br /><br />filedata = fileobj['Body'].read()<br />contents = filedata.decode('utf-8')<br />json_content = json.loads(contents)</pre>[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html) | アプリ開発者、Python 開発者 | 
| データ値をクリーンアップし、レコードを挿入します。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html)<pre>import unicodedata<br />import time<br /><br />for item in json_content:<br />    fqn_name = unicodedata.normalize(<br />        "NFKD",<br />        item["FqdnName"].replace("u'", "'").replace('\xa0', '').strip()<br />    )<br />    rec_type = item["RecordType"].replace('\xa0', '').strip()<br />    res_rec = {'Value': item["Value"].replace('\xa0', '').strip()}<br /><br />    change_response = route53_client.change_resource_record_sets(<br />        HostedZoneId='<hosted-zone-id>',<br />        ChangeBatch={<br />            'Comment': 'Created by automation',<br />            'Changes': [<br />                {<br />                    'Action': 'UPSERT',<br />                    'ResourceRecordSet': {<br />                        'Name': fqn_name,<br />                        'Type': rec_type,<br />                        'TTL': item["TTL"],<br />                        'ResourceRecords': [res_rec]<br />                    }<br />                }<br />            ]<br />        }<br />    )<br /><br />    time.sleep(1)  # Delay to avoid PriorRequestNotComplete errors</pre>[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html) | アプリ開発者、Python のスキル | 

## トラブルシューティング
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| `PriorRequestNotComplete` エラー  | `change_resource_record_sets` 呼び出し間に 1～2 秒の`time.sleep()`遅延を追加します。Route 53 は変更を非同期的に処理し、以前の変更がまだ進行中である可能性があります。 | 
| `InvalidChangeBatch` エラー | このエラーは、 `CREATE`アクションを使用して、既に存在するレコードを作成しようとすると発生します。`UPSERT` 代わりに を使用してスクリプトをべき等にします。 | 
| スロットリングエラー (レート制限超過)  | 1 秒あたり 5 つの API リクエストを超えました。ジッターを使用してエクスポネンシャルバックオフを実装します。詳細については、[「エラーの再試行とエクスポネンシャルバックオフ AWS](https://docs.aws.amazon.com/general/latest/gr/api-retries.html)」を参照してください。 | 
| レコードが解決されない | VPC がホストゾーンに関連付けられていること、および VPC で DNS 解決が有効になっていることを確認します。`enableDnsSupport` と の両方を に設定`enableDnsHostnames`する必要があります`true`。 | 
| `InvalidInput` レコード値のエラー | データには、改行しないスペース (`\xa0`) または先頭/末尾の空白が含まれます。挿入する前に、「Clean data values and insert records」タスクからデータクリーニングコードを適用します。 | 

## 関連リソース
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-resources"></a>

**リファレンス**
+ [ゾーンファイルをインポートしてレコードを作成する](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-creating-import.html) (Route 53 ドキュメント)
+ [create\_hosted\_zone](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/route53/client/create_hosted_zone.html) (Boto3 ドキュメント)
+ [change\_resource\_record\_sets](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/route53/client/change_resource_record_sets.html) (Boto3 ドキュメント)
+ [サポートされている DNS レコードタイプ](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/ResourceRecordTypes.html) (Route 53 ドキュメント)
+ [でのエラーの再試行とエクスポネンシャルバックオフ AWS](https://docs.aws.amazon.com/general/latest/gr/api-retries.html)

**チュートリアルと動画**

[Amazon Route 53 を使用した DNS 設計](https://www.youtube.com/watch?v=example) (ビデオ)

## 追加情報
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-additional"></a>

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

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

## アタッチメント
<a name="attachments-a81c29ea-f0c5-4d4a-ba87-93111a0f1ee9"></a>

このドキュメントに関連付けられている追加のコンテンツにアクセスするには、添付ファイルをダウンロードして解凍します。[zip](samples/p-attach/a81c29ea-f0c5-4d4a-ba87-93111a0f1ee9/attachments/attachment.zip)