データベースの認証と接続

Cloud Firestore Enterprise エディションにのみ関連します。

接続に関する要件

MongoDB 互換の Cloud Firestore クライアントには、次のものが必要です。

  • ドライバは load balanced モードで接続する必要があります。これにより、ドライバが接続先のサーバー トポロジを正確に把握しようとするのを防ぐことができます。
  • ドライバは SSL を有効にして接続する必要があります。
  • ドライバは再試行可能な書き込みを無効にする必要があります。現在、MongoDB 互換の Cloud Firestore は再試行可能な書き込みをサポートしていません。

接続文字列を取得する

データベース接続文字列は、データベースの UID、データベースの場所、認証メカニズムによって異なります。次の手順では、接続文字列の作成方法について説明します。

正確な接続文字列は認証メカニズムによって異なりますが、基本接続文字列は次の形式を使用します。

mongodb://UID.LOCATION.firestore.goog:443/DATABASE_ID?loadBalanced=true&tls=true&retryWrites=false

基本接続文字列は、次のいずれかの方法で取得できます。

Firebase コンソール
  1. Firebase コンソールで、[Firestore データベース] ページに移動します。

    [Firestore データベース] に移動

  2. 認証するデータベースをクリックします。
  3. [エクスプローラ] パネルで、 [詳細を表示] をクリックします。
  4. [MongoDB ツールを使用して接続] を選択します。
  5. 接続文字列をコピーします。
gcloud

gcloud firestore database describe を使用して UID と位置情報を取得します。

gcloud firestore databases describe \
--database=DATABASE_ID \
--format='yaml(locationId, uid)'

DATABASE_ID をデータベース ID に置き換えます。

出力には、データベースの場所と UID が含まれます。この情報を使用して、基本接続文字列を作成します。

ベース接続文字列と次のいずれかの方法を使用して、データベースに対する認証を行い、接続します。

ユーザー名とパスワード(SCRAM)で接続する

データベースのユーザー認証情報を作成してデータベースに接続する手順は次のとおりです。

始める前に

ユーザーの作成に必要な権限を取得するには、データベースに対する userCredsAdminroles/datastore.userCredsAdmin)IAM ロールの付与を管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織に対するアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

ユーザーを作成してデータベースに接続する

MongoDB 互換の Cloud Firestore データベースのユーザーを作成するには、次のいずれかの方法を使用します。

Google Cloud コンソール
  1. Google Cloud コンソールで [データベース] ページに移動します。

    [データベース] に移動

  2. データベースのリストからデータベースを選択します。
  3. ナビゲーション メニューで [Auth] をクリックします。
  4. [ユーザーを追加] をクリックします。
  5. [Username] にユーザー名を入力します。
  6. 新しいユーザーの役割を選択します。
  7. [追加] をクリックします。

    新しいユーザーのパスワードが確認ダイアログに表示されます。

gcloud CLI
  1. SCRAM で認証するには、まずユーザー認証情報を作成する必要があります。gcloud alpha firestore user-creds コマンドを実行します。
    gcloud alpha firestore user-creds create USERNAME --database=DATABASE_ID
    次のように置き換えます。
    • USERNAME: 作成するユーザー名。
    • DATABASE_ID: データベース ID。

    このコマンドの出力には、ユーザーのパスワードが含まれます。

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

    name: projects/PROJECT_NAME/databases/DATABASE_ID/userCreds/USERNAME
    resourceIdentity:
      principal: principal://firestore.googleapis.com/projects/PROJECT_NUMBER/name/databases/DATABASE_ID/userCreds/USERNAME
    securePassword: PASSWORD
  2. デフォルトでは、この新しいユーザー認証情報には権限がありません。データベースへの読み取り / 書き込みアクセス権を付与するには、この特定のデータベースに roles/datastore.user ロールを追加します。

    gcloud projects add-iam-policy-binding PROJECT_NAME \
    --member='principal://firestore.googleapis.com/projects/PROJECT_NUMBER/name/databases/DATABASE_ID/userCreds/USERNAME' \
    --role=roles/datastore.user \
    --condition='expression=resource.name == "projects/PROJECT_NAME/databases/DATABASE_ID",title="CONDITION_TITLE"'
    次のように置き換えます。

次の接続文字列を使用して、SCRAM でデータベースに接続します。

mongodb://USERNAME:PASSWORD@UID.LOCATION.firestore.goog:443/DATABASE_ID?loadBalanced=true&authMechanism=SCRAM-SHA-256&tls=true&retryWrites=false

以下を置き換えます。

  • USERNAME: ユーザー名。
  • PASSWORD: このユーザー用に生成したパスワード。
  • UID: データベースの UID。
  • LOCATION: データベースのロケーション。
  • DATABASE_ID: データベース ID。

Google Auth ライブラリに接続する

次のコードサンプルは、Google Cloud 標準の OAuth ライブラリを使用して OIDC コールバック ハンドラを登録します。

このライブラリを使用すると、さまざまなタイプの認証(アプリケーションのデフォルト認証情報、Workload Identity 連携)を使用できます。

これには、認証ライブラリを依存関係として追加する必要があります。

// Maven
<dependency>
  <groupId>com.google.auth</groupId>
  <artifactId>google-auth-library-oauth2-http</artifactId>
  <version>1.19.0</version>
</dependency>

// Gradle
implementation 'com.google.auth:google-auth-library-oauth2-http:1.19.0'

次のコードサンプルは、接続方法を示しています。

val db = MongoClients.create(
    clientSettings(
      "DATABASE_UID",
      "LOCATION"
    ).build()
  ).getDatabase("DATABASE_ID")


/**
 * Creates a connection to a Firestore with MongoDB Compatibility database.
 * @param databaseUid The uid of the database to connect to as a string. For example: f116f93a-519c-208a-9a72-3ef6c9a1f081
 * @param locationId The location of the database to connect to, for example: nam5, us-central1, us-east4 etc...
 * @param environment Determines whether to try and fetch an authentication credential from the
 * Compute Engine VM metadata service or whether to call gcloud.
 */
private static MongoClientSettings.Builder clientSettings(
  String databaseUid: String
  String locationId:String
): MongoClientSettings.Builder {
  MongoCredential credential =
    MongoCredential.createOidcCredential(null)
      .withMechanismProperty(
        MongoCredential.OIDC_CALLBACK_KEY,
        new MongoCredential.OidcCallback() {
          @Override
          MongoCredential.OidcCallbackResult onRequest(
MongoCredential.OidcCallbackContext context) {
     // Customize this credential builder for additional credential types.
     GoogleCredentials credentials = GoogleCredentials.getApplicationDefault();
            return new MongoCredential.OidcCallbackResult(
         credentials.getAccessToken().getTokenValue(),
         Duration.between(Instant.now(),
credentials.getAccessToken().getExpirationTime().toInstant()));
          }
        },
      );
  return MongoClientSettings.builder()
    .hosts(listOf(ServerAddress(
        "$databaseUid.$locationId.firestore.goog", 443)))
    .credential(credential)
    .applyToClusterSettings(builder ->
         builder.mode(ClusterConnectionMode.LOAD_BALANCED))
    ).applyToSslSettings(ssl -> ssl.enabled(true)).retryWrites(false);
}

以下を置き換えます。

  • DATABASE_UID: プロジェクトの名前。
  • LOCATION: データベースのロケーション。
  • DATABASE_ID: データベース ID。

Compute Engine VM から接続する

Compute Engine サービス アカウントを使用して、データベースを認証して接続できます。これを行うには、データベースを含む Google Cloud プロジェクトの IAM ポリシーを作成します。

始める前に

VM のユーザー管理サービス アカウントを構成します。

サービス アカウントのメールアドレスをメモします。

認証情報の構成

Cloud Firestore の読み取りと書き込みを行う roles/datastore.user ロールをサービス アカウントに付与するには、次のコマンドを実行します。

gcloud projects add-iam-policy-binding PROJECT_NAME --member="SERVICE_ACCOUNT_EMAIL" --role=roles/datastore.user

以下を置き換えます。

  • PROJECT_NAME: プロジェクトの名前。
  • SERVICE_ACCOUNT_EMAIL: 作成したサービス アカウントのメールアドレス。

接続文字列を構築する

次の形式で接続文字列を作成します。

mongodb://DATABASE_UID.LOCATION.firestore.goog:443/DATABASE_ID?loadBalanced=true&tls=true&retryWrites=false&authMechanism=MONGODB-OIDC&authMechanismProperties=ENVIRONMENT:gcp,TOKEN_RESOURCE:FIRESTORE

以下を置き換えます。

  • DATABASE_UID: プロジェクトの名前。
  • LOCATION: データベースのロケーション。
  • DATABASE_ID: データベース ID。

UID とロケーションの取得について詳しくは、接続文字列を取得するをご覧ください。

一時アクセス トークンを使用して接続する

一時的な Google Cloud アクセス トークンを使用して、mongosh などの診断ツールを実行できます。gcloud auth print-access-token を使用して、短期間のアクセス トークンで認証できます。トークンは 1 時間有効です。

たとえば、次のコマンドを使用して、mongosh でデータベースに接続します。

mongosh --tls \
      --username access_token --password $(gcloud auth print-access-token) \
      'mongodb://UID.LOCATION.firestore.goog:443/DATABASE_ID?loadBalanced=true&authMechanism=PLAIN&authSource=$external&retryWrites=false'

以下を置き換えます。

  • DATABASE_UID: データベースの UID
  • LOCATION: データベースのロケーション
  • DATABASE_ID: データベース ID