

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# DNS 名参照用の JVM TTL を設定する
<a name="jvm-ttl-dns"></a>

Java 仮想マシン (JVM) は DNS 名参照をキャッシュします。JVM がホスト名を IP アドレスに変換するとき、*time-to-live* (TTL) と呼ばれる指定期間 IP アドレスをキャッシュします。

 AWS リソースは DNS 名エントリを使用するため、TTL 値を 5 秒に設定することをお勧めします。これにより、リソースの IP アドレスが変更されたときに、アプリケーションは DNS に対して再度クエリを実行することで、リソースの新しい IP アドレスを取得し、使用できるようになります。

一部の Java 設定では JVM のデフォルトの TTL が設定されるため、JVM が再起動されるまで、DNS エントリが更新されることは*ありません*。したがって、アプリケーションの実行中に AWS リソースの IP アドレスが変更された場合、JVM *を手動で再起動*し、キャッシュされた IP 情報が更新されるまで、そのリソースを使用することはできません。この場合、キャッシュされた IP 情報が定期的に更新されるように JVM の TTL を設定することが極めて重要です。

## JVM TTL を設定する方法
<a name="how-to-set-the-jvm-ttl"></a>

JVM の TTL を変更するには、[networkaddress.cache.ttl](https://docs.oracle.com/en/java/javase/17/core/java-networking.html#GUID-A680DADB-C4C1-40F1-B568-D9A97C917F5D) セキュリティプロパティ値を設定します。`networkaddress.cache.ttl` は*セキュリティプロパティ*であり、システムプロパティではありません。つまり、`-D`コマンドラインフラグで設定することはできません。

### オプション 1: アプリケーションでプログラムで設定する
<a name="set-ttl-programmatically"></a>

 AWS SDK クライアントが作成される前、およびネットワークリクエストが行われる前に、アプリケーション起動の[https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/security/Security.html](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/security/Security.html)早い段階で を呼び出します。

```
import java.security.Security;

public class MyApplication {
    public static void main(String[] args) {
        Security.setProperty("networkaddress.cache.ttl", "5");

        // ... create SDK clients and run application
    }
}
```

### オプション 2: java.security ファイルで設定する
<a name="set-ttl-java-security-file"></a>

Java 8 の場合は `$JAVA_HOME/jre/lib/security/java.security` ファイル、Java 11 以降の場合は `$JAVA_HOME/conf/security/java.security` ファイルで `networkaddress.cache.ttl`プロパティを設定します。

以下は、TTL キャッシュが 5 秒に設定された `java.security` ファイルからのスニペットです。

```
#
# The Java-level namelookup cache policy for successful lookups:
#
# any negative value: caching forever
# any positive value: the number of seconds to cache an address for
# zero: do not cache
#
...
networkaddress.cache.ttl=5
...
```

`$JAVA_HOME` 環境変数で表される JVM で実行されるすべてのアプリケーションは、この設定を使用します。

### オプション 3: JDK システムプロパティのフォールバックを使用する (コマンドライン)
<a name="set-ttl-system-property"></a>

セキュリティ設定またはコードを変更できない場合は、JDK システムプロパティを使用できます。セキュリティプロパティが定義されていない場合、これらはフォールバックとして機能します。
+ `sun.net.inetaddr.ttl` – 正常なルックアップを制御する (正の TTL)
+ `sun.net.inetaddr.negative.ttl` – 失敗したルックアップを制御する (負の TTL)

```
java -Dsun.net.inetaddr.ttl=5 -Dsun.net.inetaddr.negative.ttl=1 -jar myapp.jar
```

**注記**  
これらは、「Oracle [Java 8 Networking Properties](https://docs.oracle.com/javase/8/docs/technotes/guides/net/properties.html) reference as private properties that " may not be supported in future releases」に記載されている JDK 内部プロパティです。可能な場合はオプション 1～2 を使用します。