Route 53 の加重ルーティングポリシーに関する問題のトラブルシューティング方法を教えてください。

最終更新日: 2021 年 5 月 22 日

Amazon Route 53 で加重ルーティングポリシーを設定しました。しかし、DNS 解決をテストすると、予期しない結果が発生します。この問題を解決するには、どうすればよいですか?

簡単な説明

「weighted.awsexampledomain.com」という名前の TXT レコードを作成したとします。レコードには 300 秒の Time to Live (TTL) があり、次のように重みが設定されています。

名前 タイプ TTL 重み ヘルスチェックのステータス
weighted.awsexampledomain.com. TXT 300 「重み 0 のレコード」 Weight=0 関連付けられたヘルスチェック
weighted.awsexampledomain.com. TXT 300 「重み 20 のレコード」 Weight=20 関連付けられたヘルスチェック
weighted.awsexampledomain.com. TXT 300 「重み 50 のレコード」 Weight=50 関連付けられたヘルスチェック
weighted.awsexampledomain.com. TXT 300 「重み 70 のレコード」 Weight=70 関連付けられたヘルスチェック

この設定は、以下の例で参照されます。

解決方法

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用していることを確認してください

加重ルーティングポリシーをテストして問題を特定する

複数の (10,000 を超える) クエリを送信して、加重ルーティングポリシーをテストします。複数の場所から DNS 解決をテストするか、権威ネームサーバーに直接クエリを実行してポリシーを理解します。ドメイン名の複数の DNS クエリを送信するには、次のスクリプトを使用します。

再帰的なリゾルバーを使用して DNS クエリを送信します。

#!/bin/bash
for i in {1..10000}
do
domain=$(dig <domain-name> <type> @RecursiveResolver_IP +short)
echo -e  "$domain" >> RecursiveResolver_results.txt
done

DNS クエリを権威ネームサーバーに直接送信します。

#!/bin/bash
for i in {1..10000}
do
domain=$(dig <domain-name> <type> @AuthoritativeNameserver_IP +short)
echo -e  "$domain" >> AuthoritativeNameServer_results.txt
done

AWS CLI で awk ツールを使用した出力例:

$ for i in {1..10000}; do domain=$(dig weighted.awsexampledomain.com. TXT @172.16.173.64 +short); echo -e  "$domain" >> RecursiveResolver_results.txt; done
$ awk ' " " ' RecursiveResolver_results.txt | sort | uniq -c
1344 "Record with Weight 20"
3780 "Record with Weight 50"
4876 "Record with Weight 70"

テスト結果を使用して特定の問題のトラブルシューティングを行う

問題: 加重レコードのエンドポイントリソースが、予想されるトラフィック率を受け取っていません。

Route 53 は、すべてのレコードの重みの合計に対する割合としてレコードに割り当てられた重みに基づいて、リソースにトラフィックを送信します。DNS レスポンスは、レコード TTL の期間中、中間 DNS リゾルバーによってキャッシュされます。クライアントは、キャッシュされたレスポンスのため、期間中は特定のエンドポイントにのみ誘導されます。

例えば、キャッシング DNS リゾルバー 192.168.1.2 に対してクエリを実行する場合:

$ for i in {1..10000}; do domain=$(dig weighted.awsexampledomain.com. TXT @192.168.1.2 +short); echo -e  "$domain" >> CachingResolver_results.txt; done

$ awk ' " " ' CachingResolver_results.txt | sort | uniq -c
3561 "Record with Weight 20"
1256 "Record with Weight 50"
5183 "Record with Weight 70"

上記の結果は、再帰的な DNS リゾルバーのキャッシュが原因で想定どおりではないことに注意してください。

問題: 一部の加重レコードが返されません。

例えば、一部のヘルスチェックが失敗するとします。

名前 タイプ TTL 重み ヘルスチェックのステータス
weighted.awsexampledomain.com. TXT 300 「重み 0 のレコード」 Weight=0 ヘルスチェックは正常に実行されました
weighted.awsexampledomain.com. TXT 300 「重み 20 のレコード」 Weight=20 ヘルスチェックは正常に実行されました
weighted.awsexampledomain.com. TXT 300 「重み 50 のレコード」 Weight=50 ヘルスチェックは失敗しました
weighted.awsexampledomain.com. TXT 300 「重み 70 のレコード」 Weight=70 ヘルスチェックは正常に実行されました
$ for i in {1..10000}; do domain=$(dig weighted.awsexampledomain.com. TXT @192.168.1.2 +short); echo -e  "$domain" >> HealthCheck_results.txt; done

$ awk ' " " ' HealthCheck_results.txt | sort | uniq -c
3602 "Record with Weight 20"
6398 "Record with Weight 70"

ヘルスチェックが失敗しているため、「重み 50 のレコード」が Route 53 から返されないことに留意してください。

問題: 加重レコードがすべて異常です。

レコードのグループ内に正常なレコードがない場合でも、Route 53 は DNS クエリに対する応答を提供する必要があります。しかし、レコードを選択するための根拠がありません。この場合、Route 53 はグループ内のすべてのレコードを正常とみなします。1 つのレコードは、ルーティングポリシーと各レコードに指定した値に基づいて選択されます。

例:

名前 タイプ TTL 重み ヘルスチェックのステータス
weighted.awsexampledomain.com. TXT 300 「重み 0 のレコード」 Weight=0 ヘルスチェックは失敗しました
weighted.awsexampledomain.com. TXT 300 「重み 20 のレコード」 Weight=20 ヘルスチェックは失敗しました
weighted.awsexampledomain.com. TXT 300 「重み 50 のレコード」 Weight=50 ヘルスチェックは失敗しました
weighted.awsexampledomain.com. TXT 300 「重み 70 のレコード」 Weight=70 ヘルスチェックは失敗しました
$ for i in {1..10000}; do domain=$(dig weighted.awsexampledomain.com. TXT @205.251.194.16 +short); echo -e  "$domain" >> All_UnHealthy_results.txt; done

$ awk ' " " ' All_UnHealthy_results.txt | sort | uniq -c
1446 "Record with Weight 20"
3554 "Record with Weight 50"
5000 "Record with Weight 70"

Route 53 はすべてのレコードを正常 (Fail Open) であるとみなしたことに留意してください。Route 53 は、設定された比率に基づいて DNS リクエストに応答しました。「Weight 0 のレコード」は、重みがゼロであるため、返されません。

注意: ゼロ以外の重みを一部のレコードに設定し、他のレコードに重みをゼロに設定した場合、ヘルスチェックはすべてのレコードの重みがゼロ以外の場合と同様に機能します。以下のようないくつかの例外もあります。

  • Route 53 は、最初に正常なゼロ以外の加重レコード (存在する場合) のみを考慮します。
  • ゼロ以外のレコードがすべて異常である場合、Route 53 は正常なゼロの加重レコードを考慮します。

例:

名前 タイプ TTL 重み ヘルスチェックのステータス
weighted.awsexampledomain.com. TXT 300 「重み 0 のレコード」 Weight=0 ヘルスチェックはパスしました
weighted.awsexampledomain.com. TXT 300 「重み 20 のレコード」 Weight=20 ヘルスチェックはパスしました
weighted.awsexampledomain.com. TXT 300 「重み 50 のレコード」 Weight=50 ヘルスチェックは失敗しました
weighted.awsexampledomain.com. TXT 300 「重み 70 のレコード」 Weight=70 ヘルスチェックは失敗しました
$ for i in {1..10000}; do domain=$(dig weighted.awsexampledomain.com. TXT @192.168.1.2 +short); echo -e  "$domain" >> HealthCheck_results.txt; done

$ awk ' " " ' HealthCheck_results.txt | sort | uniq -c
10000 "Record with Weight 20"

Route 53 では、重みがゼロのレコードは考慮されません。すべての加重レコードが正常でない限り、Route 53 は重みゼロのレコードを返しません。

グループ内のすべてのレコードに等しい重みを設定すると、トラフィックは等しい確率ですべての正常なリソースにルーティングされます。グループ内のすべてのレコードに対して「重み」をゼロに設定すると、トラフィックは等しい確率ですべての正常なリソースにルーティングされます。