Amazon CloudFront を使用してウェブコンテンツを配信したところ、ウェブサイトへのトラフィックが誤ったエッジロケーションにルーティングされています。
簡単な説明
CloudFront は、ディストリビューションの価格クラス、関連する位置情報データベース、EDNS0 クライアントサブネットサポートに基づいてトラフィックをルーティングします。これらの要素の組み合わせによっては、ウェブサイトの閲覧者が予期しないエッジロケーションにルーティングされる可能性があります。その結果、CloudFront エッジロケーションからオブジェクトを取得する際の全体的な遅延が増加する可能性があります。
トラフィックが予期しないエッジロケーションにルーティングされる現象をトラブルシューティングするには、次のことを確認してください。
- 価格クラスが、想定通りのエッジロケーションをサポートしている。
- DNS リゾルバーが Anycast ルーティングをサポートしている。
- DNS リゾルバーが EDNS0 クライアントサブネットをサポートしている。
解決策
価格クラスが、想定通りのエッジロケーションをサポートしている
お使いの CloudFront ディストリビューションの価格クラスに含まれるエッジロケーションを確認します。他のエッジロケーションを含める場合は、価格クラスを変更してください。
DNS リゾルバーが Anycast ルーティングをサポートしている
DNS リゾルバーが Anycast ルーティングをサポートしている場合、DNS リゾルバーが使用するエッジロケーションが複数あります。リクエスト元のエッジロケーションは最適な遅延に基づいたものであるため、リゾルバーの IP アドレスに対するロケーションが予期しないものとなる可能性があります。
DNS リゾルバーが Anycast をサポートしているかどうかを確認するには、次のコマンドのいずれかを複数回実行します。
Windows 以外のオペレーティングシステム (OS):
dig +nocl TXT o-o.myaddr.l.google.com
Windows:
nslookup -type=txt o-o.myaddr.l.google.com
コマンドを実行するたびに出力に同じ IP アドレスが含まれる場合は、DNS リゾルバーは Anycast をサポートしていません。コマンドを実行するたびに出力に異なる IP アドレスが含まれる場合は、DNS リゾルバーは Anycast をサポートしています。
DNS リゾルバーが EDNS0 クライアントサブネットをサポートしている
次のコマンドのいずれかを実行して、DNS リゾルバーが EDNS0 クライアントサブネットをサポートしているかどうかを確認します。
Windows 以外の OS:
dig +nocl TXT o-o.myaddr.l.google.com
Windows:
nslookup -type=txt o-o.myaddr.l.google.com
注: TTL 値を確認し、TTL の期限が切れ次第このコマンドを実行するようにしてください。実行しない場合、再帰リゾルバーがキャッシュされた応答を返す可能性があります。
DNS リゾルバーが EDNS0 クライアントサブネットをサポートしていない場合の出力例を次に示します。
$ dig +nocl TXT o-o.myaddr.l.google.com +short
"192.0.2.1"
上記の例では、192.0.2.1 が Anycast を使用した最も近い DNS サーバーの IP アドレスです。DNS リゾルバーは EDNS0 クライアントサブネット をサポートしていません。
ウェブサイトのトラフィックが正しい場所にルーティングされるようにするには、次のいずれかの手順を実行します。
- DNS リゾルバーを、ウェブサイトのクライアントから地理的に近い位置にある再帰 DNS リゾルバーに変更します。
- EDNS0 クライアントサブネットをサポートする DNS リゾルバーに変更します。
DNS リゾルバーが EDNS0 クライアントサブネットをサポートしている場合、出力には CloudFront の権威ネームサーバーへの切り捨てられたクライアントサブネット (/24 または /32) が表示されます。
$ dig +nocl TXT o-o.myaddr.l.google.com @8.8.8.8 +short
"192.0.2.1"
"edns0-client-subnet 198.51.100.0/24"
上記の例では、192.0.2.1 が最も近い DNS リゾルバーの IP アドレスです。DNS クエリへの応答に使われるクライアントサブネットの範囲は 198.51.100.0/24 です。
DNS リゾルバーが EDNS0 クライアントサブネットをサポートしている場合も、ウェブサイトのトラフィックが誤ってルーティングされる場合があります。この問題を解決するには、DNS リゾルバーにクエリを送信するクライアントサブネットの範囲に公開地理位置情報データベースを関連付けます。DNS リゾルバーが切り捨てられたクライアント IP アドレスを CloudFront ネームサーバーに転送する場合、CloudFront は複数の公開地理位置情報データベースに基づいてデータベースをチェックするようになります。
リクエストを正しくルーティングするには、位置情報データベースの IP アドレスを正しくマッピングする必要があります。
DNS リゾルバーが EDNS0 クライアントサブネットをサポートしている場合は、次の DNS ルックアップコマンドを実行し、トラフィックがルーティングされるエッジロケーションを判断します。
$ dig dftex7example.cloudfront.net. +short
13.224.77.109
13.224.77.62
13.224.77.65
13.224.77.75
次に、上記のコマンドが返す IP アドレスに対して DNS の逆ルックアップを実行します。
$ dig -x 13.224.77.62 +short
server-13-224-77-62.man50.r.cloudfront.net.
上記の例では、トラフィックはマンチェスターのエッジロケーションにルーティングされています。
ヒント: 追加のテストを行う場合は、EDNS0 クライアントサブネットをサポートするパブリック DNS リゾルバー (8.8.8.8、8.8.4.4、1.1.1.1 など) を使用することができます。エッジロケーションの IP アドレスを含むクエリをパブリック DNS リゾルバーに送信します。次に、DNS クエリの結果を確認し、CloudFront にお使いの EDNS0 クライアントサブネットに関する正しい情報があるかどうかを確認します。