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 コンソール
-
Firebase コンソールで、[Firestore データベース] ページに移動します。
- 認証するデータベースをクリックします。
- [エクスプローラ] パネルで、 [詳細を表示] をクリックします。
- [MongoDB ツールを使用して接続] を選択します。
- 接続文字列をコピーします。
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 互換の Cloud Firestore データベースのユーザーを作成するには、次のいずれかの方法を使用します。
Google Cloud コンソール
-
Google Cloud コンソールで [データベース] ページに移動します。
- データベースのリストからデータベースを選択します。
- ナビゲーション メニューで [Auth] をクリックします。
- [ユーザーを追加] をクリックします。
- [Username] にユーザー名を入力します。
- 新しいユーザーの役割を選択します。
-
[追加] をクリックします。
新しいユーザーのパスワードが確認ダイアログに表示されます。
gcloud CLI
-
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
-
デフォルトでは、この新しいユーザー認証情報には権限がありません。データベースへの読み取り / 書き込みアクセス権を付与するには、この特定のデータベースに
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"'
- PROJECT_NAME: プロジェクトの名前。
- PROJECT_NUMBER: プロジェクト番号。
- DATABASE_ID: データベース ID。
- USERNAME: 前に作成したユーザー名。
- 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 のユーザー管理サービス アカウントを構成します。
- VM の作成時にサービス アカウントを構成するには、ユーザー管理のサービス アカウントを使用する VM を作成するをご覧ください。
- 既存の 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