データベースの認証と接続
このページでは、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
-
Google Cloud コンソールで [データベース] ページに移動します。
- データベースのリストで、関連するデータベースのデータベース ID をクリックします。
- [エクスプローラ] パネルにベース接続文字列が表示されます。この接続文字列をコピーして、データベースに接続します。
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 コンソール
-
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( 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 にユーザー管理のサービス アカウントを構成します。
- VM の作成時にサービス アカウントを構成するには、ユーザー管理のサービス アカウントを使用する VM を作成するをご覧ください。
- 既存の 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