Amazon が提供する DNS サーバーへの DNS クエリが失敗するか、タイムアウトになります。VPC DNS スロットリングが原因で、インスタンスからの DNS クエリが失敗していませんか?
簡単な説明
Amazon が提供する DNS サーバーは、Elastic Network Interface ごとに 1 秒あたり 1024 パケットの制限を適用します。Amazon が提供する DNS サーバーは、この制限を超えたトラフィックをすべて拒否します。
VPC フローログは、アプリケーションが Amazon が提供する DNS サーバーに送信するトラフィックをキャプチャしません。パケットキャプチャまたはトラフィックミラーリングを使用して、DNS クエリ障害の原因を特定できます。
注:Amazon Route 53 のクエリロギングでは、VPC.2 リゾルバー (AmazonProvidedDNS) に到達したトラフィックのみがキャプチャされます。ただし、DNS クエリは Elastic Network Interface レベルで抑制されます。したがって、スロットルされたクエリはクエリログに表示されません。
解決方法
まず、次のいずれかの方法を使用して、DNS クエリの失敗の原因を特定します。次に、原因が DNS スロットリングであると判断した場合は、次の推奨される修正のいずれかを使用します。
DNS クエリの失敗の原因を特定する
オプション 1 : tcpdump を使用する (Linux のみ)
1. 次のコマンドを使用して、EC2 インスタンスでパケットキャプチャをローテーションします。次のコマンドは、パケットの最初の 350 バイトをキャプチャするとともに、古いパケットキャプチャを上書きしながら、それぞれ 100 MB の 20のファイルを保存します。
sudo tcpdump -i eth0 -s 350 -C 100 -W 20 -w /var/tmp/$(curl http://169.254.169.254/latest/meta-data/instance-id).$(date +%Y-%m-%d:%H:%M:%S).pcap
2. 次の Linux コマンドを実行して、送信された DNS クエリの数を確認します。
tcpdump -r <file_name.pcap> -nn dst port 53 | awk -F " " '{ print $1 }' | cut -d"." -f1 | uniq -c
3. DNS クエリの数が 1 秒あたり 1024 以上の場合、追加のクエリはすべて抑制されます。
オプション 2: トラフィックミラーリングを使用する
ユースケースで tcpdump を使用することが不可能な場合は、トラフィックミラーリングを利用して、DNS クエリが抑制されているかどうかを識別できます。
**注:**トラフィックミラーリングは、 Nitro ベースのインスタンスと非 Nitro インスタンスタイプで利用できます。トラフィックミラーリング料金が適用されます。
まず、トラフィックデータをキャプチャします。
1. トラフィックミラーリングの前提条件が満たされていることを確認します。
2. トラフィックミラーのターゲットを作成します。ターゲットの Elastic Network Interface または Network Load Balancer がポート UDP4789 でインバウンドトラフィックを許可していることを確認します。
3. トラフィックミラーフィルターを作成します。フィルターの設定で、amazon-dns が Network services - optional で有効になっていることを確認します。
4. トラフィックミラーセッションを作成します。トラフィックミラーリングを設定すると、ミラーリングされたトラフィックが収集され、トラフィックミラーターゲットに保存されます。
**注:**トラフィックミラーリングはライブデータストリーミングです。ターゲットに着信するミラーリングされたパケットをキャプチャして pcap ファイルに保存するには、UDP ポート 4789 でトラフィックをキャプチャします。
次に、Wireshark を使用してキャプチャされたデータを分析します。
1. Wireshark でキャプチャされたトラフィックを開きます。
2. [Statistics (統計)] タブを選択します。
3. [I/O Graph (I/O グラフ)] を選択し、すべてのオプションをオフにします。
4. (Linux のみ) [Display Filter (フィルターの表示)] で、[VXLAN Network Identifier (VXLAN ネットワーク識別子)] と [DNS] クエリフラグを使用して、フィルターを追加します。たとえば、[VXLAN Network Identifier] が 53 で、DNS クエリフラグが 0x0100 の場合、グラフの表示フィルターを (vxlan.vni == 53) && (dns.flags == 0x0100) にします。
5. グラフを確認して、1024 (Amazon が提供する DNS サーバーの 1 秒あたりのパケット数の制限) 付近でフラットになるかどうかを確認します。グラフがこの値の周りで平坦になっている場合は、ミラーリングされた出典で DNS スロットリングが発生しています。
オプション 3: Elastic Network Adapter (ENA) ドライバーネットワークパフォーマンスメトリクス
EC2 インスタンスが次の ENA ドライバーバージョンのいずれかを実行している場合は、linklocal_allowance_exceededメトリクスを使用して DNS スロットルのリアルタイムメトリクスを確認できます。
- Linux: 2.2.10 以降
- Window: 2.2.2.0 以降
linklocal_allowance_exceededメトリクスは、ローカルサービスの PPS レート許容値を超えたために整形およびドロップされたパケットの数を示します。ローカルサービスの例としては、Amazon VPC DNS サービス、インスタンスメタデータサービス (IMDS)、Amazon Time Sync Service があります。このメトリクスを複数の間隔で確認して、カウントが増加しているかどうかを確認できます。このメトリクスは、ドライバーの最後の再起動 (通常はインスタンスの停止と開始または再起動による) 以降累積的であるため、このメトリクスは増加している場合にのみ重要です。
メトリクス linklocal_allowance_exceeded 値を取得するには、次のコマンドを実行します。
ethtool -S eth0
DNS スロットリングの問題を修正する
DNS エラーの原因が DNS スロットリングである場合、以下を実行します。
関連情報
トラフィックミラーリングのクォータと考慮事項
トラフィックミラーリングを使用する
EC2 インスタンスのネットワークパフォーマンスをモニタリングする