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

このページでは、MongoDB 互換の Firestore データベースの認証と接続を行う方法について説明します。

接続要件

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

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

接続文字列を取得する

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

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

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

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

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

    [データベース] に移動

  2. データベースのリストで、関連するデータベースのデータベース ID をクリックします。
  3. [エクスプローラ] パネルにベース接続文字列が表示されます。この接続文字列をコピーして、データベースに接続します。
gcloud

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

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

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

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

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

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

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

始める前に

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

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

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

MongoDB 互換の 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(
    connectIgnite(
      "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 Whether to try and fetch an auth credential from the GCE VM metadata service or whether to call gcloud.
 */
private static MongoClientSettings.Builder connectIgnite(
  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));
}

次のように置き換えます。

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

Compute Engine VM から接続する

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

始める前に

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

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

認証情報の構成

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