Java アプリケーションで UnknownHostException エラーをトラブルシューティングするにはどうすればよいですか?

所要時間3分
0

Java アプリケーションで UnknownHostException エラーをトラブルシューティングするにはどうすればよいですか?

簡単な説明

UnknownHostException は、Java アプリケーションの一般的なエラーメッセージです。このエラーは通常、DNS 解決に失敗したことを示します。Java アプリケーションが有効な DNS 応答を取得できない場合、UnknownHostException エラーがスローされる可能性があります。

DNS の問題に加えて、このエラーの根本原因として考えられるものは次のとおりです。

  • DNS 解決に影響を与えたソフトウェアの問題
  • ドライバーの問題
  • Amazon Elastic Compute Cloud (Amazon EC2) インスタンスでのネットワーク停止

解決策

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

エラーの根本原因を特定する

  1. Windows Remote Desktop Protocol (RDP) または Secure Shell (SSH) プロトコルを使用して、Java アプリケーションをホストするサーバーに接続します。
  2. エラーの原因となった DNS 名に対して dig コマンド (Linux) または nslookup コマンド (Windows) を実行します。
  3. 出力に基づいて、次のシナリオを確認します。

dig コマンドまたは nslookup コマンドからの有効な回答

アプリケーションレベルの問題は、dig コマンドまたはnslookup コマンドから有効な回答を得たものの、Java アプリケーションで UnknownHostException エラーを引き続き受け取る場合に発生する可能性があります。アプリケーションレベルの問題を解決するには、次の方法を試してください。

  • アプリケーションを再起動します。
  • Java アプリケーションに不正な DNS キャッシュがないことを確認します。可能であれば、DNS TTL に準拠するようにアプリケーションを設定します。固定 TTL を使用するには、60 秒以下を指定します。詳細については、「Setting the JVM TTL for DNS name lookups」を参照してください。

次の例では、サーバーまたは DNS リゾルバーにネットワークの問題があります。アプリケーションは接続に失敗し、タイムアウトします。

$ dig timeout.example.com

;; global options: +cmd
;; connection timed out; no servers could be reached

Amazon EC2 インスタンスの dig コマンドでサーバーに到達できなかったことが示された場合は、ソース VPC で DNS サポートオプションが有効になっているかどうかを確認します。詳細については、「Amazon DNS server」を参照してください。

次の例では、DNS サポートは VPC レベルで無効になっています。クラウドフレア DNS サーバー (1.1.1.1) の dig が解決している間、VPC リゾルバー (10.1.1.2) に対する dig クエリと telnet は失敗しています。

$ dig google.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> google.com
;; global options: +cmd
;; connection timed out; no servers could be reached

$ telnet 10.1.1.2 53
Trying 10.1.1.2...
telnet:connect to address 10.1.1.2: No route to host

$ dig google.com @1.1.1.1 +short
142.251.16.102
142.251.16.139
142.251.16.138
142.251.16.113
142.251.16.101
142.251.16.100

有効な回答セクションがない有効な NOERROR 応答

このシナリオは通常、位置情報ルーティングポリシーは存在するものの、レコードにサーバーの地理的位置についての DNS 応答がない場合に発生します。レコードを作成して位置情報レコードを定義するか、デフォルトレコードを作成できます。

以下は、このシナリオの出力例です。

$ dig noanswer.example.com

;; ->>HEADER<<- opcode: QUERY, <b>status: NOERROR</b>, id: 49948
;; flags: qr rd ra; QUERY: 1,
    ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; AUTHORITY SECTION:
example.com.   
    300    IN    SOA    ns1.example.com. ns2.example.com. 1 7200 900 1209600 86400

DNS レコードがパブリックホストゾーンで作成されておらず、ドメインネームシステムセキュリティ拡張 (DNSSEC) が有効になっている場合は、NXDOMAIN の代わりに NOERROR - NOANSWER が返されます。

DNSSEC のステータスを確認するには、次の dig コマンドを実行して NSEC を表示します。 注:****ドメインは、ご自分のドメインに置き換えます。

dig <domain> +trace

出力は次のようになります。

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> example.co.uk
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43917
;; flags: qr rd ra; QUERY: 1, ANSWER:0, AUTHORITY: 1, ADDITIONAL: 1
;; AUTHORITY SECTION:
example.co.uk. 300 IN SOA ns-1578.awsdns-05.co.uk. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400

次の例の dig 出力は、作成されず、DNSSEC が有効になっていない DNS レコードの NXDOMAIN を示しています。

$ dig example.amazon.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>>
    example.amazon.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 64351
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; AUTHORITY SECTION:
amazon.com. 24 IN SOA dns-external-master.amazon.com. root.amazon.com. 2010158906 180 60 3024000 60

**NXDOMAIN または NOERROR (応答なし) の応答 **

DNS パブリックホストゾーン をチェックして、DNS レコードが正しく設定されていることを確認します。

SERVFAIL ステータス

または

DNS リゾルバーまたはサーバーに接続できない

Java アプリケーションに Amazon EC2 インスタンスを使用する場合、ネットワークの停止はまれですが、発生する可能性はあります。dig または nslookup の応答は、DNS リゾルバーまたはサーバーに繰り返し接続できないことを示しています。この場合、AWS リージョンでアクティブなネットワーク停止がないか確認します

Route 53 リゾルバーエンドポイントを介して Route 53 プライベートホストゾーンに接続するオンプレミスサーバーを使用する場合は、VPC 上のエンドポイントの設定を確認します。セキュリティグループ、ネットワークアクセスコントロールリスト (ネットワーク ACL)、およびルートテーブルの設定を確認します。手順については、「インターネットからの Amazon EC2 インスタンス接続タイムアウトエラーをトラブルシューティングするにはどうすればよいですか?」を参照してください。

この例では、出力は SERVFAIL ステータスになります。

$ dig servfail.example.com

;; ->>HEADER<<- opcode: QUERY, <b>status: SERVFAIL</b>, id: 57632
;; flags: qr rd ra;
    QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

プライベートホストゾーンとリゾルバールールがソース VPC に関連付けられているかどうかを確認する

Amazon が提供する DNS リゾルバーは、最も具体的な一致を次の優先度順で評価します。

  1. リゾルバールール
  2. プライベートホストゾーン
  3. パブリックホストゾーン

DNS クエリがリゾルバールールと一致する場合は、ターゲット IP アドレスから正しい回答が返ってくることを確認します。プライベートホストゾーンを使用している場合は、DNS レコードがプライベートホストゾーンに作成されていることを確認してください。DNS レコードがプライベートホストゾーンに存在しない場合、パブリックホストゾーンにフォールバックせず、NXDOMAIN を返します。

詳細については、「Resolving DNS queries between VPCs and your network」を参照してください。

サブドメインの委任に関する問題を確認する

親ゾーン、子ゾーン、孫ゾーン間で適切なサブドメイン委任が作成されていることを確認します。孫ゾーンネームサーバ (NS) が親ゾーンに存在するものの、子ゾーンには存在しない場合、断続的な NXDOMAIN が発生することが予想されます。すべての子ゾーンの NS レコードは、その親ホストゾーンに存在する必要があります。

断続的な DNS 解決の問題を回避するには

以下は、ドメイン委任の例です。

  • 親ゾーン: example.com
  • 子ゾーン: today.example.com
  • 孫ゾーン: api.today.example.com

孫ゾーン (api.today.example.com) NS レコードが親ゾーン (example.com) に存在する場合は、子ゾーン (today.example.com) にも存在することを確認してください。詳細については、「委任されたサブドメインが正しく解決されるかどうかをテストする方法を教えてください。」を参照してください。

UnknownHostException エラーが断続的に発生する場合は、Amazon EC2 DNS 制限が要因である可能性があります。この制限はネットワークインターフェイスごとに 1,024 パケット/秒であり、引き上げることはできません。Amazon が提供する DNS サーバーでサポートされる 1 秒あたりのDNSクエリの数は、クエリの種類、レスポンスサイズ、およびプロトコルの種類によって異なります。詳細については、「VPC DNS スロットリングが原因で、Amazon が提供する DNS サーバーへの DNS クエリが失敗しているかどうかを確認するにはどうすればよいですか?」を参照してください。


AWS公式
AWS公式更新しました 2年前