App Engine の要件
これまで、すべての Firestore データベースは App Engine アプリにリンクされていました。データベースは、リンクされている場合、同じプロジェクト内のアクティブな App Engine アプリが必要です。アクティブな App Engine アプリがないと、データベースへの読み取りおよび書き込みアクセスは無効になります。
Firestore データベースは、デフォルトで、App Engine からリンク解除されるようにプロビジョニングされるようになりました。
データベースが App Engine にリンクされている場合は、データベースのリンクを解除できます。
アクティブな App Engine
アクティブな App Engine アプリとは、アプリが同じプロジェクトに存在し、このアプリが無効になっていないことを意味します。アプリの使用は必要ありません。リンク済みアプリとデータベースが同じリージョン内に存在している必要があります。
App Engine アプリを無効にすると、そのアプリにリンクされている Firestore データベースへのアクセスも無効になります。
App Engine のリンク ステータスを表示する
REST API を使用すると、App Engine のリンク解除状態を確認できます。
curl --header "Authorization: Bearer $(gcloud auth print-access-token)" \
--header "Content-type: application/json" \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases/(default)"
レスポンスに含まれる appEngineIntegrationMode
の値を調べます。値が DISABLED
の場合、データベースは App Engine アプリにリンクされていません。
データベースと App Engine のリンク解除
リンク済み App Engine アプリを無効にすると、データベースに対する読み取り / 書き込みアクセスも無効になります。その場合、Google Cloud コンソールの [Firestore のデータ] ページに、データベースを App Engine アプリからリンクを解除するオプションが表示されます。[データベースのリンクを解除] をクリックしてプロセスを開始します。REST API を使用してデータベースのリンクを解除することもできます。
curl -X PATCH \
--header "Authorization: Bearer $(gcloud auth print-access-token)" \
--header "Content-type: application/json" \
--data '{"app_engine_integration_mode": "DISABLED"}' \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases/(default)?updateMask=appEngineIntegrationMode"
データベースのリンクを解除すると、データベースへのアクセスに影響を与えることなく App Engine を無効にできます。リンクを解除すると、取り消すことはできません。リンク解除のオペレーションが有効になるまでに最長で 5 分かかることがあります。
Terraform App Engine リソースの移行
以前に google_app_engine_application
Terraform リソースを使用して Firestore データベースを管理していた場合は、代わりに google_firestore_database
Terraform リソースを使用できます。
Terraform を介して Firestore データベースを管理する一般的な手順については、データベース作成の自動化をご覧ください。
google_firestore_database リソースを作成する
Terraform 構成ファイルで、新しい google_firestore_database
リソースを作成します。
firestore.tf
resource "google_firestore_database" "database" { project = "project" name = "(default)" location_id = "location" type = "database_type" // either "FIRESTORE_NATIVE" or "DATASTORE_MODE" app_engine_integration_mode = "DISABLED" // Optional, but recommended for safety delete_protection_state = "DELETE_PROTECTION_ENABLED" }
使用可能なロケーションのリストについては、Firestore のロケーションをご覧ください。既存のデータベースの場所に対応するロケーションを選択します。
既存の Firestore データベースをインポートする
まず、Firestore API が有効になっていることを確認します。
次に、既存の Firestore データベースを Terraform の状態にインポートします。
terraform import google_firestore_database.database "(default)"
続いて、次のコマンドを実行します。
terraform plan
出力を調べて、インポートが正常に完了したことを確認します。出力にフィールドの変更が示されている場合は、これらの変更が意図したとおりであることを確認してください。出力には次のような行が含まれます。
google_firestore_database.database must be replaced
次に、Terraform 構成ファイルを調べて、特に project、location、name フィールドなどに誤りがないかを確認し、terraform plan
を再度実行します。Terraform でデータベースを置き換える必要があるフィールドは、プランの出力で # forces replacement
とマークされます。
Terraform プランの出力に問題がなければ、次のコマンドを実行します。
terraform apply
google_app_engine_application リソースの削除
Terraform 構成ファイルに既存の google_app_engine_application
リソースがある場合は、ここでそのファイルから削除します。
その後、次のコマンドを再度実行します。
terraform plan
出力は次のようになります。
Terraform will perform the following actions: # google_app_engine_application.app will be destroyed # (because google_app_engine_application.app is not in configuration)
プランの出力に満足したら、次の内容を実行します。
terraform apply
現在、Terraform では App Engine リソースの削除はサポートされていません。Terraform ではリソースが破棄済みとして表示されますが、実際に App Engine アプリケーションが削除されることはありません。ただし、App Engine アプリケーションは Terraform によって管理されなくなります。
Firestore API の要件
これまで、すべての Firestore データベースは App Engine アプリにリンクされていましたが、デフォルトで Firestore データベースは App Engine からリンク解除された状態でプロビジョニングされるようになりました。また、すべてのデータベース(既存と新規作成の両方)に次の要件があります。
- Google Cloud コンソールと gcloud CLI からデータベースを管理するには、プロジェクトで Firestore API を有効にする必要があります。これは、ネイティブ モードの Firestore データベースと Datastore モードの Firestore データベースの両方で必要です。
Google Cloud コンソールまたは gcloud CLI から実行する場合、以下の管理オペレーションには次の IAM 権限が必要です。
- データベースの作成:
datastore.databases.create
- データベース メタデータの表示:
datastore.databases.getMetadata
- データベース メタデータの編集:
datastore.databases.update
- データベースの作成:
必要な権限が含まれているのは、Datastore ユーザーや Datastore 閲覧者などの事前定義ロールです。カスタム IAM ロールを作成した場合は、上述の権限を含むように更新する必要がある場合があります。
以前に Datastore 用のカスタムロールを定義している場合は、datastore.databases.getMetadata
権限がない可能性があります。datastore.databases.getMetadata
でカスタムロールを更新するか、事前定義ロールを使用して、継続的なアクセスを確保してください。
Terraform を使用した API の有効化
必要に応じて、Terraform を使用して Firestore API を有効にすることもできます。
resource "google_project_service" "firestore" { project = "project" service = "firestore.googleapis.com" }
google_firestore_database
リソースがある場合は、Terraform がデータベースの作成を試行する前に API が有効になるように、google_project_service
リソースへの依存関係を追加できます。
resource "google_firestore_database" "database" { // ... depends_on = [google_project_service.firestore] }