質問・問題
EC2上で稼働しているJavaアプリケーションで以下のような「java.net.UnknownHostException」が発生しました。
エラーの例)
・java.net.UnknownHostException: xxxxxx.execute-api.ap-northeast-1.amazonaws.com
・java.net.UnknownHostException: xxxxxx.s3.ap-northeast-1.amazonaws.com
・java.net.UnknownHostException: sns.ap-northeast-1.amazonaws.com
・java.net.UnknownHostException: sqs.ap-northeast-1.amazonaws.com
Javaアプリケーションが稼働しているリソースから、各AWSサービスのエンドポイントのホスト名が一時的に名前解決できなかったようですが、原因や対策について教えてください。
回答・解決方法
名前解決にAmazon DNSサーバ(参考記事[1])をご利用されている場合に、リンクローカルサービスアクセスへのネットワークインターフェイス毎最大PPS制限(参考記事[2])を超えていなかったかをご確認ください。(Amazon DNSサーバへのアクセスもリンクローカルサービスアクセスに含まれます)
こちらの制限発生有無はENAドライバーのメトリクス「linklocal_allowance_exceeded」にてご確認いただけます。当該メトリクスの利用前提条件や取得方法等詳細は「参考記事[2]」をご参照ください。
対処としては、別途ローカルDNSキャッシュをセットアップいただく方法がございます。(参考記事[3])
もしくはRoute53リゾルバのインバウンドエンドポイントを設定し、インバウンドエンドポイント宛てにDNSクエリを発行いただく方法もございます。エンドポイントENIあたり10,000クエリ/秒処理でき、ENIを増やすことでさらにスケールさせることも可能です。(参考記事[4])
その他補足
※ 上記対処方法の他、アプリケーション側の修正が可能であれば、Javaアプリケーション側の修正にてDNSクエリ発行間隔を変更したり、リトライを実施する(すでに実施されている場合はリトライ間隔を増やす)といった方法は有効な手段となります。
※ リンクローカルサービスアクセスへのネットワーク制限はインスタンスタイプによらず固定となっておりますので、インスタンスタイプ変更は有効ではございません。
【参考記事】
[1] VPC の DHCP オプションセット - Amazon DNS サーバー
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_DHCP_Options.html#AmazonDNS
[2] EC2 インスタンスのネットワークパフォーマンスをモニタリングします。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/monitoring-network-performance-ena.html
``` (抜粋)
リンクローカルサービスアクセス - Amazon EC2 は、DNS サービス、インスタンスメタデータサービス、Amazon Time Sync Service などのサービスへのトラフィックに対して、ネットワークインターフェイスごとに最大 PPS を提供します。
(中略)
linklocal_allowance_exceeded
ローカルプロキシサービスへのトラフィックの PPS がネットワークインターフェイスの最大値を超えたためにドロップされたパケットの数。これは、DNS サービス、インスタンスメタデータサービス、および Amazon Time Sync Service へのトラフィックに影響します。
```
[3] Amazon EC2 Linux インスタンスでの DNS 解決の失敗を回避するにはどうすればよいですか?
https://aws.amazon.com/jp/premiumsupport/knowledge-center/dns-resolution-failures-ec2-linux/
[4] Quotas - Quotas on Route 53 Resolver
https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DNSLimitations.html#limits-api-entities-resolver
```(抜粋)
Queries per second per IP address in an endpoint
10,000*
```
Java アプリケーションで UnknownHostException エラーをトラブルシューティングするにはどうすればよいですか?
https://aws.amazon.com/jp/premiumsupport/knowledge-center/route-53-fix-unknownhostexception-error/