Amazon DNS サーバーへの DNS クエリが Amazon 仮想プライベートクラウド (Amazon VPC) で失敗したりタイムアウトしたりする理由を把握したいです。
簡単な説明
Amazon DNS のクォータは、Elastic ネットワークインターフェイスごとに 1,024 パケット/秒 (PPS) です。このクォータを超えると、Amazon Route 53 はトラフィックを拒否します。
VPC フローログは、アプリケーションが Amazon DNS サーバーに送信するトラフィックをキャプチャしません。DNS クエリでの障害の原因を特定するには、パケットキャプチャまたはトラフィックミラーリングを使用します。
注: Route 53 のクエリログは、VPC.2 リゾルバー AmazonProvidedDNS に到達したトラフィックのみをキャプチャします。スロットリングされた DNS クエリは、ネットワークインターフェイスレベルでスロットリングされるため、クエリログには表示されません。
解決策
DNS クエリエラーの原因を特定する
tcpdump を使用する (Linux のみ)
tcpdump を使用するには、次の手順を実行します。
-
Amazon Elastic Compute Cloud (Amazon EC2) インスタンスで次のコマンドを実行します。
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
INSTANCE_ID=`curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/instance-id`
sudo tcpdump -i eth0 -s 350 -C 100 -W 20 -w /var/tmp/$INSTANCE_ID.$(date +%Y-%m-%d:%H:%M:%S).pcap
注: 上記のコマンドは、パケットの最初の 350 バイトをキャプチャし、各 100 MB のファイルを20 個保存し、古いパケットキャプチャを上書きします。プライマリネットワークインターフェイスが eth0 以外の場合は、上記のコマンドで eth0 をプライマリネットワークインターフェイスに置き換えます。プライマリインターフェイスを見つけるには、次のコマンドを実行します。
netstat -i
-
次のコマンドを実行し、送信された DNS クエリの数をカウントします。
tcpdump -r <file_name.pcap> -nn dst port 53 | awk -F " " '{ print $1 }' | cut -d"." -f1 | uniq -c
トラフィックミラーリングを使用する
tcpdump を使用できない場合は、トラフィックミラーリングを使用して DNS クエリがスロットリングされているかどうかを確認します。
注: トラフィックミラーリングは、Nitro ベースのインスタンスおよび、一部の非 Nitro インスタンスタイプで使用できます。トラフィックミラーリングの料金が適用されます。
トラフィックデータをキャプチャして分析するには、次の手順を実行します。
- トラフィックミラーリングの前提条件を満たす必要があります。
- トラフィックミラーのターゲットを作成します。ターゲットネットワークインターフェイスまたはネットワークロードバランサーがインバウンドトラフィックを UDP ポート 4789 で許可していることを確認します。
- トラフィックミラーのフィルターを作成します。[フィルター設定] において、[ネットワークサービス - オプション] で amazon-dns が有効になっていることを確認します。
- トラフィックミラーセッションを作成します。
トラフィックミラーリングは、ミラーリングされたトラフィックを収集し、トラフィックミラーのターゲットに保存します。
注: トラフィックミラーリングは、データのライブストリームです。ターゲット上のミラーリングされたパケットをキャプチャして .pcap ファイルに保存するには、UDP ポート 4789 でトラフィックをキャプチャします。
Wireshark を使用する
次の手順を実行します。
- キャプチャされたトラフィックを Wireshark で開く
注: Wireshark をダウンロードするには、Wireshark のウェブサイトでダウンロードページを参照してください。
- [統計情報] タブを選択します。
- [I/O グラフ] を選択し、すべてのオプションをクリアします。
- [表示フィルター] で VXLAN のネットワーク識別子と DNS クエリを使用してフィルターを追加します。DNS ヘッダーの QR フィールドは 0 です。たとえば、VXLAN のネットワーク識別子が 16777215 の場合、グラフの表示フィルタは (vxlan.vni == 16777215) && (dns.flags.response == 0) となります。
- グラフをレビューします。約 1024 PPS から変化していない場合は、ミラーリングされたソースでスロットリングが発生しています。
ENA ドライバーネットワークのパフォーマンスメトリクスを確認する
EC2 インスタンスが次のいずれかの Elastic Network Adapter (ENA) ドライバーバージョンを実行している場合は、DNS スロットリングのリアルタイムメトリクスを確認します。
- Linux: 2.2.10 以降
- Windows: 2.2.2.0 以降
linklocal_allowance_exceeded メトリクスを参照し、トラフィックが次のローカルサービスにおいて、PPS クォータを超えたことが原因でドロップされたパケットの数を確認します。
- Amazon VPC DNS サービス
- Instance Metadata サービス (IMDS)
- Amazon Time Sync サービス
メトリクスを複数の間隔で確認して、カウントが増加しているかどうかを判断します。linklocal_allowance_exceeded メトリクスは、ドライバーの停止と起動、またはリブートによる再起動が最後に行われた時点から累積されます。このメトリクスが増加している場合にのみ、問題が発生しています。
linklocal_allowance_exceeded の値を取得するには、eth0 に次のコマンドを実行します。
ethtool -S eth0 | grep link
インターフェイス名が ens5 であるインスタンス:
ethtool -S ens5 | grep link
DNS スロットリングの問題を解決する
DNS スロットリングが原因で障害が発生した場合は、次のいずれかの手順を実行して問題を解決します。
関連情報
トラフィックミラーターゲットの概念
トラフィックミラーリングを使用してネットワークトラフィックをコピーする