Java クライアント ライブラリを使用して Spanner Omni に接続する

Spanner 用の Java クライアント ライブラリは、Spanner と同様に Spanner Omni と連携します。このドキュメントでは、Java クライアント ライブラリを構成して Spanner Omni への安全な接続を確立する方法について説明します。これらの接続は、データベース管理クライアントまたはデータベース クライアントを作成するときにクライアント オプションを設定することで確立します。

Java クライアント ライブラリは、書式なしテキスト、TLS、認証情報付き TLS、mTLS 接続をサポートしています。

詳細については、Spanner ドキュメントの Java で Spanner を使ってみる をご覧ください。

始める前に

Java で Spanner Omni を使用するには、Java クライアント ライブラリ バージョン 6.119.0 以降を使用します。

部品構成表(BOM)なしで Maven を使用する場合は、次のものを pom.xml ファイルの依存関係に追加します。

<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-spanner</artifactId>
  <version>6.119.0</version>
</dependency>

セキュリティ構成

Spanner Java クライアント ライブラリは、クライアントと Spanner Omni 間の通信を暗号化して認証する方法を定義する 4 つのセキュリティ構成をサポートしています。次の表に、各構成について説明します。

セキュリティ構成 説明
書式なしテキスト 通信は暗号化されません。
TLS 通信は Transport Layer Security(TLS)を使用して暗号化されます。この構成では、Java トラストストアの構成の説明に従って、Spanner Omni CA 証明書を Java トラストストアに追加する必要があります。
認証情報付き TLS 通信は TLS を使用して暗号化され、認証はユーザー名とパスワードを使用して行われます。
mTLS 通信は相互 TLS(mTLS)を使用して暗号化されます。この構成 では、クライアント証明書とクライアントの秘密鍵の両方を指定する必要があります。

Java トラストストアを構成する

暗号化された接続タイプ(TLS、認証情報付き TLS、mTLS)では、クライアントがサーバーの証明書を検証できるように、Spanner Omni CA 証明書を Java トラストストアに追加する必要があります。

CA 証明書をデフォルトの Java トラストストアに追加するには、次のコマンドを実行します。

sudo keytool -import -trustcacerts -file ~/.spanner/certs/ca.crt -alias spanner-ca -keystore $JAVA_HOME/lib/security/cacerts

または、アプリケーションの実行時にカスタム トラストストアを指定することもできます。

  1. 標準の認証局(CA)を使用する他のサービスとの互換性を維持するには、デフォルトの Java トラストストアをコピーします。

    cp $JAVA_HOME/lib/security/cacerts /PATH_TO_CUSTOM_CACERTS
    
  2. CA 証明書をカスタム トラストストアにインポートします。

    keytool -import -trustcacerts -file ~/.spanner/certs/ca.crt -alias spanner-ca -keystore /PATH_TO_CUSTOM_CACERTS
    
  3. アプリケーションの実行時に JVM システム プロパティを使用してカスタム トラストストアを指定します。

    java -Djavax.net.ssl.trustStore=/PATH_TO_CUSTOM_CACERTS -Djavax.net.ssl.trustStorePassword=changeit app
    

SpannerOptions オブジェクトを構成する

`SpannerOptions` オブジェクトを構成して `DatabaseClient` または `DatabaseAdminClient` を作成する場合は、`setHost()` の後に `setType(SpannerOptions.InstanceType.OMNI)` を使用して Spanner Omni エンドポイントを指定します。SpannerOptionsDatabaseClientDatabaseAdminClientsetHost()setType(SpannerOptions.InstanceType.OMNI)

次の例は、サポートされているセキュリティ構成ごとに SpannerOptions オブジェクトを構成する方法を示しています。

書式なしテキスト

書式なしテキスト接続を確立するには、http:// を使用して Spanner Omni エンドポイントを指定し、usePlainText() メソッドを使用します。

SpannerOptions options =
    SpannerOptions.newBuilder()
        .setHost("http://ENDPOINT") // Replace with your Spanner Omni endpoint
        .setType(SpannerOptions.InstanceType.OMNI)
        .usePlainText()
        .build();
Spanner spanner = options.getService();

TLS

TLS 接続用に SpannerOptions オブジェクトを構成する場合は、ユーザー名とパスワードの認証情報を指定する必要はありません。https:// を使用して Spanner Omni エンドポイントを指定します。

SpannerOptions options =
    SpannerOptions.newBuilder()
        .setHost("https://ENDPOINT") // Replace with your Spanner Omni endpoint
        .setType(SpannerOptions.InstanceType.OMNI)
        .build();
Spanner spanner = options.getService();

認証情報付き TLS

ユーザー名とパスワードの認証を使用して TLS 接続を確立するには、https:// を使用して Spanner Omni エンドポイントを指定し、login() メソッドを使用してユーザー名とパスワードを指定します。

SpannerOptions options =
    SpannerOptions.newBuilder()
        .setHost("https://ENDPOINT") // Replace with your Spanner Omni endpoint
        .setType(SpannerOptions.InstanceType.OMNI)
        .login("USERNAME", "PASSWORD".toCharArray())
        .build();
Spanner spanner = options.getService();

mTLS

mTLS 接続を使用するには、次のコマンドを使用して、Spanner Omni によって生成された鍵を Java に準拠した形式に変換します。

openssl pkcs8 -topk8 -in ~/.spanner/certs/client.key -out ~/.spanner/certs/java-client.key -nocrypt

次の例は、クライアント証明書を使用するように SpannerOptions オブジェクトを構成する方法を示しています。

SpannerOptions options =
    SpannerOptions.newBuilder()
        .setHost("https://ENDPOINT") // Replace with your Spanner Omni endpoint
        .setType(SpannerOptions.InstanceType.OMNI)
        .useClientCert(
            "PATH_TO_CLIENT_CERT",
            "PATH_TO_CLIENT_CERT_KEY")
        .build();
Spanner spanner = options.getService();

データベース クライアントを取得する

SpannerOptions オブジェクトを構成したら、データベース クライアントを取得できます。Spanner Omni は Google Cloud プロジェクト ID またはインスタンス ID を使用しないため、DatabaseId を作成するときにプロジェクト ID とインスタンス ID に default を指定します。

DatabaseId dbId = DatabaseId.of("default", "default", "DATABASE_ID");
DatabaseClient client = spanner.getDatabaseClient(dbId);