

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

# MongoDB Java ドライバーを使用した Amazon DocumentDB への接続
<a name="java-pg-connect-mongo-driver"></a>

このセクションでは、Java ドライバーを使用して Amazon DocumentDB に接続するためのステップバイステップのガイドを提供します。これにより、DocumentDB を Java アプリケーションへの統合を開始できるようになります。

**Topics**
+ [ステップ 1: プロジェクトをセットアップする](#step1-set-up)
+ [ステップ 2: 接続文字列を作成する](#step2-create-connection-string)
+ [ステップ 3: 接続コードを書き込む](#step3-write-connect-code)
+ [ステップ 4: 接続例外を処理する](#step4-handle-connect-exceptions)
+ [ステップ 5: コードの実行](#step5-running-code)
+ [接続のベストプラクティス](#java-connect-best-practices)

## ステップ 1: プロジェクトをセットアップする
<a name="step1-set-up"></a>

1. Maven を使用して、Java プロジェクトを作成します。

   ```
   mvn archetype:generate -DgroupId=com.docdb.guide -DartifactId=my-docdb-project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
   ```

1. MongoDB Java ドライバーをプロジェクトの依存関係として「pom.xml」ファイルに追加します。

   ```
   <dependency>
       <groupId>org.mongodb</groupId>
       <artifactId>mongodb-driver-sync</artifactId> 
       <version>5.3.0</version> 
   </dependency>
   ```

## ステップ 2: 接続文字列を作成する
<a name="step2-create-connection-string"></a>

Amazon DocumentDB 接続文字列は、アプリケーションと DocumentDB クラスター間の接続を確立するために不可欠です。この文字列は、クラスターエンドポイント、ポート、認証の詳細、さまざまな接続オプションなどの重要な情報をカプセル化します。DocumentDB 接続文字列を構築するには、通常、基本的な形式から始めます。

```
"mongodb://{{username}}:{{password}}@cluster-endpoint:port/?[connection options]"
```

「username」と「password」を実際の認証情報に置き換える必要があります。クラスターのエンドポイントとポート番号は、 AWS マネジメントコンソール だけでなく、 からも確認できます AWS CLI。クラスターのクラスターエンドポイントを見つけるには、「[クラスターのエンドポイントの検索](db-cluster-endpoints-find.md)」を参照してください。DocumentDB のデフォルトのポートは、27017 です。

**接続文字列の例**
+ 転送中の暗号化を使用して DocumentDB に接続し、読み取りリクエストがリードレプリカに送信され、プライマリに書き込まれることを確認します。

  ```
  "mongodb://username:password@cluster-endpoint:27017/?tls=true& 
     tlsCAFile=global-bundle.pem& 
     readPreference=secondaryPreferred&
     retryWrites=false"
  ```
+ IAM 認証を使用して DocumentDB に接続する:

  ```
  "mongodb://cluster-endpoint:27017/?tls=true& 
     tlsCAFile=global-bundle.pem& 
     readPreference=secondaryPreferred&
     retryWrites=false&
     authSource=%24external&
     authMechanism=MONGODB-AWS"
  ```

接続文字列で使用できるさまざまなオプションは次のとおりです。
+ [TLS 証明書](#connection-string-tls)
+ [リードレプリカからの読み取り](#connection-string-read-rep)
+ [ライトコンサーンとジャーナリング](#connection-string-write-journal)
+ [RetryWrites](#connection-string-retry-writes)
+ [IAM 認証](#connection-string-iam-auth)
+ [接続プール](#connection-string-pool)
+ [接続タイムアウトパラメータ](#connection-string-timeout)

### TLS 証明書
<a name="connection-string-tls"></a>

**`tls=true|false`** — このオプションは Transport Layer Security (TLS) を有効または無効にします。デフォルトでは、転送中の暗号化は Amazon DocumentDB クラスターで有効になっているため、クラスターレベルで TLS が無効になっていない限り、このオプションの値は `true` である必要があります。

TLS を使用する場合、コードは DocumentDB クラスターへの接続を作成するときに SSL 証明書を提供する必要があります。クラスターへの安全な接続に必要な証明書をダウンロードします: [https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem](https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem)。`global-bundle.pem` ファイルを使用するには 2 つの方法があります。
+ **オプション 1** — `global-bundle.pem` ファイルからすべての証明書を抽出し、Java の keytool を使用して、後でコードで使用できる `.jks` ファイルに保存します。これを行う方法を示すスクリプトについては、[TLS が有効な場合の接続](connect_programmatically.md#connect_programmatically-tls_enabled) の Java タブを参照してください。
+ **オプション 2** — `global-bundle.pem` ファイルをコードに動的に追加し、インメモリキーストアを構築し、`SSLContext` を使用して接続の一部として証明書を提供します。

### リードレプリカからの読み取り
<a name="connection-string-read-rep"></a>

**`replicaSet=rs0&readPreference=secondaryPreferred`** — これら 2 つのオプションを指定すると、すべての読み取りリクエストがリードレプリカにルーティングされ、書き込みリクエストがプライマリインスタンスにルーティングされます。接続文字列で `replicaSet=rs0` を使用すると、MongoDB ドライバーはクラスタートポロジの自動更新ビューを維持できるため、インスタンスの追加または削除時にアプリケーションが現在のノード設定の可視性を維持できます。これらのオプションを提供しない場合、または `readPreference=primary` を指定しない場合、すべての読み取りと書き込みがプライマリインスタンスに送信されます。`readPreference` のオプションについては、「[読み込み設定のオプション](how-it-works.md#durability-consistency-isolation)」を参照してください。

### ライトコンサーンとジャーナリング
<a name="connection-string-write-journal"></a>

書き込みの懸念は、書き込みオペレーションのためにデータベースからリクエストされた確認のレベルを決定します。MongoDB ドライバーには、書き込みの懸念ファイルとジャーナルファイルを調整するオプションがあります。Amazon DocumentDB では、書き込みの懸念とジャーナルを設定することは想定されておらず、`w` と `j` (`writeConcern` と `journal`) に送信された値は無視されます。DocumentDB は常に `writeConcern`: `majority` および `journal`: `true` でデータを書き込みます。そのため、クライアントに確認を送信する前に、書き込みは大部分のノードに永続的に記録されます。

### RetryWrites
<a name="connection-string-retry-writes"></a>

**`retryWrites=false`** — DocumentDB は再試行可能な書き込みをサポートしていないため、この属性は常に `false` に設定する必要があります。

### IAM 認証
<a name="connection-string-iam-auth"></a>

**`authSource=%24external` および `authMechanism=MONGODB-AWS`** — この 2 つのパラメータは、 を使用した認証に使用されます AWS Identity and Access Management。IAM 認証は現在、インスタンスベースのクラスターバージョン 5.0 でのみ使用できます。詳細については、「[IAM ID を使用した認証](iam-identity-auth.md)」を参照してください。

### 接続プール
<a name="connection-string-pool"></a>

これらのオプションは、接続プーリングで使用できます。
+ **`maxPoolSize`** — プールに作成できる接続の最大数を設定します。すべての接続が使用されていて、新しいリクエストが入ると、接続が利用可能になるまで待機します。MongoDB Java ドライバーのデフォルトは 100 です。
+ **`minPoolSize`** — プールで常に維持する必要がある接続の最小数を示します。MongoDB Java ドライバーのデフォルトは 0 です。
+ **`maxIdleTimeMS`** — 接続を、閉じたり削除したりする前に、プールでアイドル状態のままにできる時間を決定します。MongoDB Java ドライバーのデフォルトは 100 ミリ秒です。
+ **`waitQueueTimeoutMS`** — プールが最大サイズになったときに、接続が利用可能になるまでスレッドが待機する時間を設定します。この時間内に接続が利用可能にならない場合は、例外がスローされます。MongoDB Java ドライバーのデフォルト値は 120,000 ミリ秒 (2 分) です。

### 接続タイムアウトパラメータ
<a name="connection-string-timeout"></a>

タイムアウトは、オペレーションまたは接続の試行が失敗したと見なされるまでにかかる時間を制限するメカニズムです。次のタイムアウトパラメータは、無期限の待機を防ぎ、リソース割り当てを管理するために使用できます。
+ **`connectTimeoutMS`** — ドライバーがクラスターへの接続を確立するのを待機する時間を設定します。デフォルトは 10,000 ミリ秒 (10 秒) です。
+ **`socketTimeoutMS`** — ドライバーがサーバーからの非書き込みオペレーションのレスポンスを待機する時間を指定します。デフォルトは 0 (タイムアウトまたは無限なし) です。
+ **`serverSelectionTimeoutMS`** — ドライバーがクラスター内の使用可能なサーバーを見つけるまで待機する時間を指定します。この設定のデフォルト値は 30 秒で、フェイルオーバー中に新しいプライマリインスタンスを選択するのに十分です。

## ステップ 3: 接続コードを書き込む
<a name="step3-write-connect-code"></a>

次のコード例は、Amazon DocumentDB への TLS 接続を行う方法を示しています。
+ Java の [https://docs.oracle.com/javase/8/docs/api/java/security/KeyStore.html](https://docs.oracle.com/javase/8/docs/api/java/security/KeyStore.html) および [`SSLContext`>](https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/SSLContext.html) オブジェクトが作成されます。
+ また、[https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/ConnectionString.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/ConnectionString.html) オブジェクトに渡すことで [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/MongoClientSettings.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-core/com/mongodb/MongoClientSettings.html) オブジェクトを作成します。TLS 接続を行うには、 `MongoClientSettings` オブジェクトを使用して `connectionstring` と `sslcontext` をバインドする必要があります。
+ [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoClients.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoClients.html) を使用すると、 [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoClient.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoClient.html) オブジェクトが取得されます。

```
public static MongoClient makeDbConnection(String dbName, String DbUserName, String DbPassword,
    String DbClusterEndPoint, String keyStorePass) throws Exception {
    MongoClient connectedClient;
    String connectionOptions = "?replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false";
    String connectionUrl = "mongodb://" + DbUserName + ":" + DbPassword + "@" + DbClusterEndPoint + ":27017/" +
        dbName + connectionOptions;

    try {
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        try (FileInputStream fis = new FileInputStream("src/main/resources/certs/truststore.jks")) {
            trustStore.load(fis, keyStorePass.toCharArray());
            TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            tmf.init(trustStore);

            SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
            sslContext.init(null, tmf.getTrustManagers(), new SecureRandom());
            ConnectionString connectionString = new ConnectionString(connectionUrl);
            MongoClientSettings settings = MongoClientSettings.builder()
                .applyConnectionString(connectionString)
                .applyToSslSettings(builder - > {
                    builder.enabled(true);
                    builder.context(sslContext);
                })
                .build();
            connectedClient = MongoClients.create(settings);
        }
        return connectedClient;
    } catch (MongoException e5) {
        throw new RuntimeException(e5);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
```

## ステップ 4: 接続例外を処理する
<a name="step4-handle-connect-exceptions"></a>

Java アプリケーションで DocumentDB を使用する場合、堅牢で信頼性の高いデータベースオペレーションを維持するには、接続例外の処理が不可欠です。これらの例外を適切に管理することで、問題を迅速に診断できるだけでなく、アプリケーションが一時的なネットワーク中断やサーバーの非可用性を正常に処理できるため、安定性とユーザーエクスペリエンスが向上します。接続の確立に関連する重要な例外には、次のようなものがあります。
+ **`MongoException`** — 一般的な例外であり、より具体的な例外の対象ではないさまざまなシナリオで発行される場合があります。これは一般的なすべての MongoDB 例外のキャッチであるため、この例外は他のすべての特定の例外の後に処理されることを確認してください。
+ **`MongoTimeoutException`** — オペレーションがタイムアウトしたときに発行されます。例えば、存在しないクラスターエンドポイントのクエリなどです。
+ **`MongoSocketException`** — ネットワーク関連の問題に対して発行されます。例えば、オペレーション中の突然のネットワーク切断などです。
+ **`MongoSecurityException`** — 認証が失敗した場合に発行されます。例えば、誤った認証情報での接続などです。
+ **`MongoConfigurationException`** — クライアント設定にエラーがある場合に発行されます。例えば、無効な接続文字列の使用などです。

## ステップ 5: コードの実行
<a name="step5-running-code"></a>

次のコードサンプルは、Amazon DocumentDB 接続を作成し、すべてのデータベースを出力します。

```
public static void TestConnection() {
    try (MongoClient mongoClient = makeDbConnection(DATABASE_NAME, DB_USER_NAME, DB_PASSWORD, DB_CLUSTER_ENDPOINT, KEYSTORE_PASSWORD)) {
        List < String > databases = mongoClient.listDatabaseNames().into(new ArrayList < > ());
        System.out.println("Databases: " + databases);
    } catch (MongoException e) {
        System.err.println("MongoDB error: " + e.getMessage());
        throw new RuntimeException(e);
    }
}
```

## 接続のベストプラクティス
<a name="java-connect-best-practices"></a>

以下は、MongoDB Java ドライバーを使用して Amazon DocumentDB に接続するときに考慮すべきベストプラクティスです。
+ クライアントにリソースを解放してもらう必要がなくなった場合は、必ず [https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoClient.html](https://mongodb.github.io/mongo-java-driver/5.3/apidocs/mongodb-driver-sync/com/mongodb/client/MongoClient.html) を閉じてください。
+ 例外を適切に処理し、適切なエラーログ記録を実装します。
+ 環境変数または を使用して AWS Secrets Manager 、ユーザー名やパスワードなどの機密情報を保存します。