Чтобы переводить контент на ваш предпочитаемый язык, Google использует технологии на основе искусственного интеллекта. Переводы от ИИ могут содержать ошибки.
Начало работы с Terraform и Firebase
Оптимизируйте свои подборки
Сохраняйте и классифицируйте контент в соответствии со своими настройками.
Firebase начинает поддерживать Terraform.
Если вы хотите автоматизировать и стандартизировать создание проектов Firebase с определенными ресурсами и включенными сервисами, то вам подойдет Terraform с Firebase.
Базовый рабочий процесс использования Terraform с Firebase включает в себя следующее:
Создание и настройка файла конфигурации Terraform (файл .tf), в котором указывается инфраструктура, которую вы хотите подготовить (то есть ресурсы, которые вы хотите подготовить, и сервисы, которые вы хотите включить).
Использование команд gcloud CLI, которые взаимодействуют с Terraform для инициализации инфраструктуры, указанной в файле .tf.
Удалять и изменять существующую инфраструктуру с помощью Terraform.
Управляйте конфигурацией и задачами для конкретных продуктов с помощью Terraform, например:
Включение поставщиков идентификационной информации (Firebase Authentication).
Создание сегментов Cloud Storage или экземпляров баз данных и развертывание для них Firebase Security Rules.
Создание Firebase App Hosting бэкендов, сборок и других связанных ресурсов.
Для выполнения всех этих задач можно использовать стандартные файлы конфигурации и команды Terraform. Чтобы помочь вам в этом, мы подготовили примеры файлов конфигурации Terraform для нескольких распространенных сценариев использования.
Общий рабочий процесс использования Terraform с Firebase
Требования
Это руководство представляет собой введение в использование Terraform с Firebase, поэтому предполагается базовое знание Terraform. Прежде чем начать, убедитесь, что вы выполнили следующие требования:
Установите Terraform и ознакомьтесь с официальными руководствами по работе с этим инструментом.
Требования к аккаунтам пользователей и сервисным аккаунтам
Если вы используете аккаунт пользователя, вы должны принять Условия использования Firebase. Если вы можете просматривать проект Firebase в консоли Firebase, значит вы приняли Условия использования Firebase.
Чтобы Terraform мог выполнять определенные действия (например, создавать проекты), должны выполняться следующие условия:
У пользователя или сервисного аккаунта должен быть соответствующий доступ IAM для этих действий.
Если аккаунт пользователя или сервисный аккаунт входит в организацию Google Cloud, то правила организации должны разрешать аккаунту выполнять эти действия.
Шаг 1. Создайте и настройте файл конфигурации Terraform
Файл конфигурации Terraform должен содержать два основных раздела (подробно описаны ниже):
Настройка provider требуется независимо от того, какие продукты или сервисы Firebase используются.
Создайте файл конфигурации Terraform (например, файл main.tf) в локальном каталоге.
В этом руководстве вы будете использовать файл конфигурации, чтобы задать настройки provider и всей инфраструктуры, которую должен создать Terraform. Однако у вас есть несколько вариантов того, как включить настройки поставщика.
Посмотреть варианты настройки provider
Вы можете включить настройку provider в остальную конфигурацию Terraform следующими способами:
Вариант 1. Добавьте его в начало одного файла конфигурации Terraform .tf (как показано в этом руководстве).
Используйте этот вариант, если вы только начинаете работать с Terraform или пробуете использовать Terraform с Firebase.
Вариант 2. Добавьте его в отдельный файл .tf (например, provider.tf), а не в файл .tf, в котором вы указываете инфраструктуру для создания (например, main.tf).
Этот вариант подходит для больших команд, которым нужно стандартизировать настройку.
При выполнении команд Terraform файлы provider.tf и main.tf должны находиться в одном каталоге.
Добавьте в начало файла main.tf следующий код provider.
Вы должны использовать поставщика google-beta, поскольку это бета-версия использования Firebase с Terraform. Будьте осторожны при использовании в рабочей среде.
# Terraform configuration to set up providers by version.terraform{required_providers{google-beta={source="hashicorp/google-beta"version="~> 6.0"}}}# Configures the provider to use the resource block's specified project for quota checks.provider"google-beta"{user_project_override=true}# Configures the provider to not use the resource block's specified project for quota checks.# This provider should only be used during project creation and initializing services.provider"google-beta"{alias="no_user_project_override"user_project_override=false}
Перейдите к следующему разделу, чтобы завершить настройку файла конфигурации и указать, какую инфраструктуру нужно создать.
Укажите, какую инфраструктуру нужно создать, используя блоки resource
В файле конфигурации Terraform (в этом руководстве – файл main.tf) необходимо указать всю инфраструктуру, которую должен создать Terraform (то есть все ресурсы, которые вы хотите подготовить, и все сервисы, которые вы хотите включить). В этом руководстве вы найдете полный список ресурсов Firebase, поддерживающих Terraform.
Откройте файл main.tf.
В настройках provider добавьте следующую конфигурацию блоков resource.
В этом простом примере создается проект Firebase, а затем в нем создается приложение Android для Firebase.
# Terraform configuration to set up providers by version....# Configures the provider to use the resource block's specified project for quota checks....# Configures the provider to not use the resource block's specified project for quota checks....# Creates a new Google Cloud project.resource"google_project""default"{provider=google-beta.no_user_project_overridename="Project Display Name"project_id="project-id-for-new-project" # Required for any service that requires the Blaze pricing plan # (like Firebase Authentication with GCIP)billing_account="000000-000000-000000" # Required for the project to display in any list of Firebase projects.labels={"firebase"="enabled"}}# Enables required APIs.resource"google_project_service""default"{provider=google-beta.no_user_project_overrideproject=google_project.default.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","firebase.googleapis.com", # Enabling the ServiceUsage API allows the new project to be quota checked from now on."serviceusage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""default"{provider=google-betaproject=google_project.default.project_id # Waits for the required APIs to be enabled.depends_on=[google_project_service.default]}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""default"{provider=google-betaproject=google_project.default.project_iddisplay_name="My Awesome Android app"package_name="awesome.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App.depends_on=[google_firebase_project.default,]}
Посмотреть версию этого файла конфигурации с подробными комментариями
Если вы не знакомы с инфраструктурой проектов и приложений как ресурсов, ознакомьтесь со следующей документацией:
# Terraform configuration to set up providers by version....# Configures the provider to use the resource block's specified project for quota checks....# Configures the provider to not use the resource block's specified project for quota checks....# Creates a new Google Cloud project.resource"google_project""default"{ # Use the provider that enables the setup of quota checks for a new projectprovider=google-beta.no_user_project_overridename="Project Display Name" // learn more about the project nameproject_id="project-id-for-new-project" // learn more about the project ID # Required for any service that requires the Blaze pricing plan # (like Firebase Authentication with GCIP)billing_account="000000-000000-000000" # Required for the project to display in any list of Firebase projects.labels={"firebase"="enabled" // learn more about the Firebase-enabled label}}# Enables required APIs.resource"google_project_service""default"{ # Use the provider without quota checks for enabling APISprovider=google-beta.no_user_project_overrideproject=google_project.default.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","firebase.googleapis.com", # Enabling the ServiceUsage API allows the new project to be quota checked from now on."serviceusage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.# This action essentially "creates a Firebase project" and allows the project to use# Firebase services (like Firebase Authentication) and# Firebase tooling (like the Firebase console).# Learn more about the relationship between Firebase projects and Google Cloud.resource"google_firebase_project""default"{ # Use the provider that performs quota checks from now onprovider=google-betaproject=google_project.default.project_id # Waits for the required APIs to be enabled.depends_on=[google_project_service.default]}# Creates a Firebase Android App in the new project created above.# Learn more about the relationship between Firebase Apps and Firebase projects.resource"google_firebase_android_app""default"{provider=google-betaproject=google_project.default.project_iddisplay_name="My Awesome Android app" # learn more about an app's display namepackage_name="awesome.package.name" # learn more about an app's package name # Wait for Firebase to be enabled in the Google Cloud project before creating this App.depends_on=[google_firebase_project.default,]}
Шаг 2. Выполните команды Terraform, чтобы создать указанную инфраструктуру
Чтобы подготовить ресурсы и включить сервисы, указанные в файле main.tf, выполните следующие команды из того же каталога, где находится файл main.tf.
Подробную информацию об этих командах можно найти в документации Terraform.
Если вы впервые выполняете команды Terraform в каталоге, вам нужно инициализировать каталог конфигурации и установить поставщика Google Terraform. Для этого выполните следующую команду:
terraform init
Создайте инфраструктуру, указанную в файле main.tf, выполнив следующую команду:
terraform apply
Убедитесь, что все ресурсы были подготовлены или включены правильно.
Вариант 1. Посмотрите конфигурацию, напечатанную в терминале, выполнив следующую команду:
Terraform поддерживает следующие ресурсы Firebase и Google: И мы постоянно добавляем новые ресурсы! Если вы не видите ресурс, которым хотите управлять с помощью Terraform, проверьте его доступность позже или запросите его, создав обращение в репозитории GitHub.
google_identity_platform_config – включите Google Cloud Identity Platform (GCIP), который является серверной частью для Firebase Authentication, и задайте настройки аутентификации на уровне проекта.
Чтобы настроить Firebase Authentication через Terraform, необходимо включить GCIP. Чтобы узнать, как настроить Firebase Authentication, изучите пример файла .tf.
Проект, в котором Terraform включит GCIP и/или Firebase Authentication, должен использовать тарифный план Blaze (то есть с проектом должен быть связан аккаунт Cloud Billing). Это можно сделать программно, задав атрибут billing_account в ресурсе google_project.
Этот ресурс также позволяет использовать дополнительные конфигурации, например локальные способы входа, такие как анонимный вход, вход с помощью адреса электронной почты и пароля, а также аутентификация по номеру телефона, а также функции блокировки и авторизованные домены.
Как настроить многофакторную аутентификацию (MFA) с помощью Terraform
Firebase App Hosting
google_firebase_app_hosting_backend – создание серверной части Firebase App Hosting и управление ею, включая подключение к хранилищу GitHub и активную ветвь для непрерывного развертывания.
google_firebase_app_hosting_build – создать сборку для бэкенда с определенным тегом ссылки на базу кода и в определенный момент времени.
Развертывание Firebase Realtime Database Security Rules с помощью Terraform (узнайте, как развернуть эти Security Rules с помощью других инструментов, включая программные варианты)
Примеры файлов конфигурации Terraform для распространенных сценариев использования
Как настроить Firebase Authentication с помощью GCIP
Эта конфигурация создает новый проект Google Cloud, связывает его с аккаунтом Cloud Billing (для Firebase Authentication с GCIP требуется тарифный план Blaze), включает сервисы Firebase для проекта, настраивает Firebase Authentication с GCIP и регистрирует в проекте три разных типа приложений.
Обратите внимание, что для настройки Firebase Authentication с помощью Terraform необходимо включить GCIP.
# Creates a new Google Cloud project.resource"google_project""auth"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for Firebase Authentication with GCIP).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""auth"{provider=google-beta.no_user_project_overrideproject=google_project.auth.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","serviceusage.googleapis.com","identitytoolkit.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""auth"{provider=google-betaproject=google_project.auth.project_iddepends_on=[google_project_service.auth,]}# Creates an Identity Platform config.# Also enables Firebase Authentication with Identity Platform in the project if not.resource"google_identity_platform_config""auth"{provider=google-betaproject=google_firebase_project.auth.project # Auto-deletes anonymous usersautodelete_anonymous_users=true # Configures local sign-in methods, like anonymous, email/password, and phone authentication.sign_in{allow_duplicate_emails=trueanonymous{enabled=true}email{enabled=truepassword_required=false}phone_number{enabled=truetest_phone_numbers={"+11231231234"="000000"}}} # Sets an SMS region policy.sms_region_config{allowlist_only{allowed_regions=["US","CA",]}} # Configures blocking functions.blocking_functions{triggers{event_type="beforeSignIn"function_uri="https://us-east1-${google_project.auth.project_id}.cloudfunctions.net/before-sign-in"}forward_inbound_credentials{refresh_token=trueaccess_token=trueid_token=true}} # Configures a temporary quota for new signups for anonymous, email/password, and phone number.quota{sign_up_quota_config{quota=1000start_time=""quota_duration="7200s"}} # Configures authorized domains.authorized_domains=["localhost","${google_project.auth.project_id}.firebaseapp.com","${google_project.auth.project_id}.web.app",]}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""auth"{provider=google-betaproject=google_firebase_project.auth.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""auth"{provider=google-betaproject=google_firebase_project.auth.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""auth"{provider=google-betaproject=google_firebase_project.auth.projectdisplay_name="My Web app"}
Инициализация сервиса Firebase SQL Connect
Эта конфигурация создает новый проект Google Cloud, включает для него сервисы Firebase и предоставляет сервис SQL Connect.
# Creates a new Google Cloud project.resource"google_project""dataconnect"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase Data Connect).billing_account="000000-000000-000000" # Required for the project to display in a list of Firebase projects.labels={"firebase"="enabled"}}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.dataconnect.project_idfor_each=toset(["serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebasedataconnect.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created earlier.resource"google_firebase_project""dataconnect"{provider=google-betaproject=google_project.dataconnect.project_iddepends_on=[google_project_service.services]}# Create a Firebase Data Connect serviceresource"google_firebase_data_connect_service""dataconnect-default"{project=google_firebase_project.dataconnect.projectlocation="name-of-region-for-service"service_id="${google_firebase_project.dataconnect.project}-default-fdc"deletion_policy="DEFAULT"}
Подготовка экземпляра Firebase Realtime Database по умолчанию
Эта конфигурация создает новый проект Google Cloud, включает для него сервисы Firebase, подготавливает экземпляр Realtime Database по умолчанию и регистрирует в проекте три разных типа приложений.
# Creates a new Google Cloud project.resource"google_project""rtdb"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project"}# Enables required APIs.resource"google_project_service""rtdb"{provider=google-beta.no_user_project_overrideproject=google_project.rtdb.project_idfor_each=toset(["serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebasedatabase.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""rtdb"{provider=google-betaproject=google_project.rtdb.project_iddepends_on=[google_project_service.rtdb]}# Provisions the default Realtime Database default instance.resource"google_firebase_database_instance""database"{provider=google-betaproject=google_firebase_project.rtdb.project # See available locations: https://firebase.google.com/docs/database/locationsregion="name-of-region" # This value will become the first segment of the database's URL.instance_id="${google_project.rtdb.project_id}-default-rtdb"type="DEFAULT_DATABASE"}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""rtdb"{provider=google-betaproject=google_firebase_project.rtdb.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""rtdb"{provider=google-betaproject=google_firebase_project.rtdb.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""rtdb"{provider=google-betaproject=google_firebase_project.rtdb.projectdisplay_name="My Web app"}
Подготовка нескольких экземпляров Firebase Realtime Database
Эта конфигурация создает новый проект Google Cloud, связывает его с аккаунтом Cloud Billing (для нескольких экземпляров Realtime Database требуется тарифный план Blaze), включает сервисы Firebase для проекта, подготавливает несколько экземпляров Realtime Database (включая экземпляр Realtime Database по умолчанию) и регистрирует в проекте три разных типа приложений.
# Creates a new Google Cloud project.resource"google_project""rtdb-multi"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associate the project with a Cloud Billing account # (required for multiple Realtime Database instances).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""rtdb-multi"{provider=google-beta.no_user_project_overrideproject=google_project.rtdb-multi.project_idfor_each=toset(["cloudbilling.googleapis.com","serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebasedatabase.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""rtdb-multi"{provider=google-betaproject=google_project.rtdb-multi.project_iddepends_on=[google_project_service.rtdb-multi]}# Provisions the default Realtime Database default instance.resource"google_firebase_database_instance""database-default"{provider=google-betaproject=google_firebase_project.rtdb-multi.project # See available locations: https://firebase.google.com/docs/database/locationsregion="name-of-region" # This value will become the first segment of the database's URL.instance_id="${google_project.rtdb-multi.project_id}-default-rtdb"type="DEFAULT_DATABASE"}# Provisions an additional Realtime Database instance.resource"google_firebase_database_instance""database-additional"{provider=google-betaproject=google_firebase_project.rtdb-multi.project # See available locations: https://firebase.google.com/docs/projects/locations#rtdb-locations # This location doesn't need to be the same as the default database instance.region="name-of-region" # This value will become the first segment of the database's URL.instance_id="name-of-additional-database-instance"type="USER_DATABASE"}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""rtdb-multi"{provider=google-betaproject=google_firebase_project.rtdb-multi.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""rtdb-multi"{provider=google-betaproject=google_firebase_project.rtdb-multi.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""rtdb-multi"{provider=google-betaproject=google_firebase_project.rtdb-multi.projectdisplay_name="My Web app"}
Как настроить экземпляр Cloud Firestore по умолчанию
Эта конфигурация создает новый проект Google Cloud, включает для него сервисы Firebase, подготавливает экземпляр Cloud Firestore по умолчанию и регистрирует в проекте три разных типа приложений.
Он также подготавливает Firebase Security Rules для экземпляра Cloud Firestore по умолчанию, создает индекс Cloud Firestore и добавляет документ Cloud Firestore с исходными данными.
# Creates a new Google Cloud project.resource"google_project""firestore"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project"}# Enables required APIs.resource"google_project_service""firestore"{provider=google-beta.no_user_project_overrideproject=google_project.firestore.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","serviceusage.googleapis.com","firestore.googleapis.com","firebaserules.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""firestore"{provider=google-betaproject=google_project.firestore.project_iddepends_on=[google_project_service.firestore]}# Provisions the Firestore database instance.resource"google_firestore_database""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectname="(default)" # See available locations: https://firebase.google.com/docs/firestore/locationslocation_id="name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules.type="FIRESTORE_NATIVE"concurrency_mode="OPTIMISTIC"}# Creates a ruleset of Firestore Security Rules from a local file.resource"google_firebaserules_ruleset""firestore"{provider=google-betaproject=google_firestore_database.firestore.projectsource{files{name="firestore.rules" # Write security rules in a local file named "firestore.rules". # Learn more: https://firebase.google.com/docs/firestore/security/get-startedcontent=file("firestore.rules")}}}# Releases the ruleset for the Firestore instance.resource"google_firebaserules_release""firestore"{provider=google-betaname="cloud.firestore" # must be cloud.firestoreruleset_name=google_firebaserules_ruleset.firestore.nameproject=google_firestore_database.firestore.project}# Adds a new Firestore index.resource"google_firestore_index""indexes"{provider=google-betaproject=google_firestore_database.firestore.projectcollection="quiz"query_scope="COLLECTION"fields{field_path="question"order="ASCENDING"}fields{field_path="answer"order="ASCENDING"}}# Adds a new Firestore document with seed data.# Don't use real end-user or production data in this seed document.resource"google_firestore_document""doc"{provider=google-betaproject=google_firestore_database.firestore.projectcollection="quiz"document_id="question-1"fields="{\"question\":{\"stringValue\":\"Favorite Database\"},\"answer\":{\"stringValue\":\"Firestore\"}}"}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectdisplay_name="My Web app"}
Это набор правил Cloud Firestore Security Rules, который должен находиться в локальном файле с названием firestore.rules.
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /some_collection/{document} {
allow read, create, update: if request.auth != null;
}
}
}
Подготовка сегмента Cloud Storage по умолчанию
Предоставить дополнительные сегменты Cloud Storage
Эта конфигурация создает новый проект Google Cloud, связывает его с аккаунтом Cloud Billing (для дополнительных сегментов требуется тарифный план Blaze), включает сервисы Firebase для проекта, предоставляет дополнительные сегменты Cloud Storage, не используемые по умолчанию, и регистрирует в проекте три разных типа приложений.
Он также создает Firebase Security Rules для каждого сегмента Cloud Storage и загружает файл в один из сегментов Cloud Storage.
# Creates a new Google Cloud project.resource"google_project""storage-multi"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for multiple Cloud Storage buckets).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""storage-multi"{provider=google-beta.no_user_project_overrideproject=google_project.storage-multi.project_idfor_each=toset(["cloudbilling.googleapis.com","serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebaserules.googleapis.com","firebasestorage.googleapis.com","storage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""storage-multi"{provider=google-betaproject=google_project.storage-multi.project_iddepends_on=[google_project_service.storage-multi]}# Provisions a Cloud Storage bucket.resource"google_storage_bucket""bucket-1"{provider=google-betaproject=google_firebase_project.storage-multi.projectname="name-of-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locationslocation="name-of-region-for-bucket"}# Provisions an additional Cloud Storage bucket.resource"google_storage_bucket""bucket-2"{provider=google-betaproject=google_firebase_project.storage-multi.projectname="name-of-additional-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locations # This location does not need to be the same as the existing Storage bucket.location="name-of-region-for-additional-bucket"}# Makes the first Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.resource"google_firebase_storage_bucket""bucket-1"{provider=google-betaproject=google_firebase_project.storage-multi.projectbucket_id=google_storage_bucket.bucket-1.name}# Makes the additional Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.resource"google_firebase_storage_bucket""bucket-2"{provider=google-betaproject=google_firebase_project.storage-multi.projectbucket_id=google_storage_bucket.bucket-2.name}# Creates a ruleset of Firebase Security Rules from a local file.resource"google_firebaserules_ruleset""storage-multi"{provider=google-betaproject=google_firebase_project.storage-multi.projectsource{files{ # Write security rules in a local file named "storage.rules" # Learn more: https://firebase.google.com/docs/storage/security/get-startedname="storage.rules"content=file("storage.rules")}}}# Releases the ruleset to the first Storage bucket.resource"google_firebaserules_release""bucket-1"{provider=google-betaname="firebase.storage/${google_storage_bucket.bucket-1.name}"ruleset_name="projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}"project=google_firebase_project.storage-multi.project}# Releases the ruleset to the additional Storage bucket.resource"google_firebaserules_release""bucket-2"{provider=google-betaname="firebase.storage/${google_storage_bucket.bucket-2.name}"ruleset_name="projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}"project=google_firebase_project.storage-multi.project}# Uploads a new file to the first Storage bucket.# Do not use real end-user or production data in this file.resource"google_storage_bucket_object""cat-picture-multi"{provider=google-betaname="cat.png"source="path/to/cat.png"bucket=google_storage_bucket.bucket-1.name}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""storage-multi"{provider=google-betaproject=google_firebase_project.storage-multi.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""storage-multi"{provider=google-betaproject=google_firebase_project.storage-multi.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""storage-multi"{provider=google-betaproject=google_firebase_project.storage-multi.projectdisplay_name="My Web app"}
Это набор правил Cloud Storage Security Rules, который должен находиться в локальном файле с названием storage.rules.
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /some_folder/{fileName} {
allow read, write: if request.auth != null;
}
}
}
Защитите ресурс API с помощью Firebase App Check
Эта конфигурация создает новый проект Google Cloud,
включает сервисы Firebase для проекта, а также
настраивает и включает принудительное применение Firebase App Check для Cloud Firestore,
чтобы доступ к нему можно было получить только из вашего приложения для Android.
# Creates a new Google Cloud project.resource"google_project""appcheck"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project"}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.appcheck.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","firebase.googleapis.com","firebaseappcheck.googleapis.com","firestore.googleapis.com","serviceusage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created earlier.resource"google_firebase_project""appcheck"{provider=google-betaproject=google_project.appcheck.project_iddepends_on=[google_project_service.services]}# Provisions the Firestore database instance.resource"google_firestore_database""database"{provider=google-betaproject=google_firebase_project.appcheck.projectname="(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-locationlocation_id="name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules.type="FIRESTORE_NATIVE"concurrency_mode="OPTIMISTIC"}# Creates a Firebase Android App in the new project created earlier.resource"google_firebase_android_app""appcheck"{provider=google-betaproject=google_firebase_project.appcheck.projectdisplay_name="Play Integrity app"package_name="package.name.playintegrity"sha256_hashes=[ # TODO: insert your Android app's SHA256 certificate]}# Register the Android app with the Play Integrity providerresource"google_firebase_app_check_play_integrity_config""appcheck"{provider=google-betaproject=google_firebase_project.appcheck.projectapp_id=google_firebase_android_app.appcheck.app_iddepends_on=[google_firestore_database.database]lifecycle{precondition{condition=length(google_firebase_android_app.appcheck.sha256_hashes) > 0error_message="Provide a SHA-256 certificate on the Android App to use App Check"}}}# Enable enforcement of App Check for Firestoreresource"google_firebase_app_check_service_config""firestore"{provider=google-betaproject=google_firebase_project.appcheck.projectservice_id="firestore.googleapis.com"depends_on=[google_project_service.services]}
Установите экземпляр Firebase Extension.
Эта конфигурация создает новый проект Google Cloud, включает для него сервисы Firebase и устанавливает в нем новый экземпляр Firebase Extension. Если экземпляр уже существует, его параметры обновляются на основе значений, указанных в конфигурации.
# Creates a new Google Cloud project.resource"google_project""extensions"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase Extensions).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""extensions"{provider=google-beta.no_user_project_overrideproject=google_project.extensions.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","serviceusage.googleapis.com","firebase.googleapis.com","firebaseextensions.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""extensions"{provider=google-betaproject=google_project.extensions.project_iddepends_on=[google_project_service.extensions,]}# Installs an instance of the "Translate Text in Firestore" extension.# Or updates the extension if the specified instance already exists.resource"google_firebase_extensions_instance""translation"{provider=google-betaproject=google_firebase_project.extensions.projectinstance_id="translate-text-in-firestore"config{extension_ref="firebase/firestore-translate-text"params={COLLECTION_PATH="posts/comments/translations"DO_BACKFILL=trueLANGUAGES="ar,en,es,de,fr"INPUT_FIELD_NAME="input"LANGUAGES_FIELD_NAME="languages"OUTPUT_FIELD_NAME="translated"}system_params={"firebaseextensions.v1beta.function/location"="us-central1""firebaseextensions.v1beta.function/memory"="256""firebaseextensions.v1beta.function/minInstances"="0""firebaseextensions.v1beta.function/vpcConnectorEgressSettings"="VPC_CONNECTOR_EGRESS_SETTINGS_UNSPECIFIED"}}}
Включить и защитить Firebase AI Logic
Эта конфигурация создает новый проект Google Cloud, включает для него сервисы Firebase, в том числе Firebase AI Logic, а также настраивает и включает принудительное применение Firebase App Check для Firebase AI Logic, чтобы доступ к нему можно было получить только из ваших приложений.
# Creates a new Google Cloud project.resource"google_project""vertex"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associate the project with a Cloud Billing account # (required for Vertex AI in Firebase).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.vertex.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","firebase.googleapis.com","serviceusage.googleapis.com", # Required APIs for Vertex AI in Firebase"aiplatform.googleapis.com","firebasevertexai.googleapis.com", # App Check is recommended to protect Vertex AI in Firebase from abuse"firebaseappcheck.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created earlier.resource"google_firebase_project""vertex"{provider=google-betaproject=google_project.vertex.project_iddepends_on=[google_project_service.services]}# Creates a Firebase Web App in the new project created earlier.resource"google_firebase_web_app""app"{provider=google-betaproject=google_firebase_project.vertex.projectdisplay_name="My Web App"}# Creates a Firebase Android App in the new project created earlier.resource"google_firebase_android_app""app"{provider=google-betaproject=google_firebase_project.vertex.projectdisplay_name="My Android App"package_name="package.name.playintegrity"sha256_hashes=[ # TODO: insert your Android app's SHA256 certificate]}# Creates a Firebase Apple App in the new project created earlier.resource"google_firebase_apple_app""app"{provider=google-betaproject=google_firebase_project.vertex.projectdisplay_name="My Apple App"bundle_id="bundle.id"team_id="1234567890"}### Protects Vertex AI in Firebase with App Check.# Turns on enforcement for Vertex AI in Firebaseresource"google_firebase_app_check_service_config""vertex"{provider=google-betaproject=google_firebase_project.vertex.projectservice_id="firebaseml.googleapis.com"enforcement_mode="ENFORCED"}# Enables the reCAPTCHA Enterprise APIresource"google_project_service""recaptcha_enterprise"{provider=google-betaproject=google_firebase_project.vertex.projectservice="recaptchaenterprise.googleapis.com" # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables the Play Integrity APIresource"google_project_service""play_integrity"{provider=google-betaproject=google_firebase_project.vertex.projectservice="playintegrity.googleapis.com" # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Allows the web app to use reCAPTCHA Enterprise with App Checkresource"google_firebase_app_check_recaptcha_enterprise_config""appcheck"{provider=google-betaproject=google_firebase_project.vertex.projectapp_id=google_firebase_web_app.app.app_idsite_key="your site key"token_ttl="7200s" # Optionaldepends_on=[google_project_service.recaptcha_enterprise]}# Registers the Android app with the Play Integrity providerresource"google_firebase_app_check_play_integrity_config""appcheck"{provider=google-betaproject=google_firebase_project.vertex.projectapp_id=google_firebase_android_app.app.app_idtoken_ttl="7200s" # Optionallifecycle{precondition{condition=length(google_firebase_android_app.app.sha256_hashes) > 0error_message="Provide a SHA-256 certificate on the Android App to use App Check"}}depends_on=[google_project_service.play_integrity]}# Registers the Apple app with the AppAttest providerresource"google_firebase_app_check_app_attest_config""appcheck"{provider=google-betaproject=google_firebase_project.vertex.projectapp_id=google_firebase_apple_app.app.app_idtoken_ttl="7200s" # Optionallifecycle{precondition{condition=google_firebase_apple_app.app.team_id!=""error_message="Provide a Team ID on the Apple App to use App Check"}}}
Как вручную инициализировать серверную часть App Hosting
В этой конфигурации показано, как вручную подготовить серверную часть App Hosting с помощью Terraform. Этот подход позволяет точно контролировать создаваемые ресурсы, но требует, чтобы вы определяли каждый ресурс по отдельности. Это полезно, если вам нужно настроить серверную часть за пределами параметров по умолчанию.
# Creates a new Google Cloud project.resource"google_project""apphosting"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase App Hosting).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.apphosting.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","firebase.googleapis.com","firebaseapphosting.googleapis.com","serviceusage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created earlier.resource"google_firebase_project""apphosting"{provider=google-betaproject=google_project.apphosting.project_iddepends_on=[google_project_service.services]}# Creates a Firebase Web App in the new project created earlier.resource"google_firebase_web_app""apphosting"{provider=google-betaproject=google_firebase_project.apphosting.projectdisplay_name="My web app"}# Creates a Firebase App Hosting Backendresource"google_firebase_app_hosting_backend""example"{provider=google-betaproject=google_firebase_project.apphosting.project # Choose the region closest to your userslocation="name-of-region-for-service"backend_id="name-of-backend-for-service"app_id=google_firebase_web_app.apphosting.app_iddisplay_name="My Backend"serving_locality="GLOBAL_ACCESS"service_account=google_service_account.service_account.email}# Creates the service account for Firebase App Hostingresource"google_service_account""service_account"{provider=google-betaproject=google_firebase_project.apphosting.project # Must be firebase-app-hosting-computeaccount_id="firebase-app-hosting-compute"display_name="Firebase App Hosting compute service account" # Do not throw if already existscreate_ignore_already_exists=true}# Adds permission to the App Hosting service accountresource"google_project_iam_member""app_hosting_sa"{provider=google-betaproject=google_firebase_project.apphosting.projectfor_each=toset(["roles/firebase.sdkAdminServiceAgent","roles/firebaseapphosting.computeRunner"])role=each.keymember=google_service_account.service_account.member}# Creates a Buildresource"google_firebase_app_hosting_build""example"{provider=google-betaproject=google_firebase_app_hosting_backend.example.projectlocation=google_firebase_app_hosting_backend.example.locationbackend=google_firebase_app_hosting_backend.example.backend_idbuild_id="my-build"source{container{ # TODO: use your own imageimage="us-docker.pkg.dev/cloudrun/container/hello"}}}# Rolls out the Buildresource"google_firebase_app_hosting_traffic""example"{provider=google-betaproject=google_firebase_app_hosting_backend.example.projectlocation=google_firebase_app_hosting_backend.example.locationbackend=google_firebase_app_hosting_backend.example.backend_idtarget{splits{build=google_firebase_app_hosting_build.example.namepercent=100}}}
Как подготовить серверную часть App Hosting с помощью GitHub
Эта конфигурация демонстрирует, как подготовить серверную часть App Hosting, используя код приложения, хранящийся в репозитории GitHub. Этот подход позволяет вам управлять и обновлять вашу инфраструктуру через pull-запросы GitHub и конвейеры CI/CD в соответствии с типичной моделью для развертываний App Hosting.
# Creates a new Google Cloud project.resource"google_project""apphosting"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase App Hosting).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.apphosting.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","firebase.googleapis.com","firebaseapphosting.googleapis.com","serviceusage.googleapis.com","developerconnect.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created earlier.resource"google_firebase_project""apphosting"{provider=google-betaproject=google_project.apphosting.project_iddepends_on=[google_project_service.services]}# Creates a Firebase Web App in the new project created earlier.resource"google_firebase_web_app""apphosting"{provider=google-betaproject=google_firebase_project.apphosting.projectdisplay_name="My web app"}### Setting up Firebase App Hosting #### Creates a Firebase App Hosting Backendresource"google_firebase_app_hosting_backend""example"{provider=google-betaproject=google_firebase_project.apphosting.project # Choose the region closest to your userslocation="name-of-region-for-service"backend_id="name-of-backend-for-service"app_id=google_firebase_web_app.apphosting.app_iddisplay_name="My Backend"serving_locality="GLOBAL_ACCESS"service_account=google_service_account.service_account.emailcodebase{repository=google_developer_connect_git_repository_link.my-repository.nameroot_directory="/"}}# Creates the service account for Firebase App Hostingresource"google_service_account""service_account"{provider=google-betaproject=google_firebase_project.apphosting.project # Must be firebase-app-hosting-computeaccount_id="firebase-app-hosting-compute"display_name="Firebase App Hosting compute service account" # Do not throw if already existscreate_ignore_already_exists=true}# Adds permission to the App Hosting service accountresource"google_project_iam_member""app_hosting_sa"{provider=google-betaproject=google_firebase_project.apphosting.projectfor_each=toset(["roles/developerconnect.readTokenAccessor","roles/firebase.sdkAdminServiceAgent","roles/firebaseapphosting.computeRunner"])role=each.keymember=google_service_account.service_account.member}# Configures auto rollout from GitHubresource"google_firebase_app_hosting_traffic""example"{provider=google-betaproject=google_firebase_app_hosting_backend.example.projectlocation=google_firebase_app_hosting_backend.example.locationbackend=google_firebase_app_hosting_backend.example.backend_idrollout_policy{codebase_branch="main" # Or another branch}}###### Setting up a connection to GitHub #### Provisions Service Agent for Developer Connectresource"google_project_service_identity""devconnect-p4sa"{provider=google-betaproject=google_firebase_project.apphosting.projectservice="developerconnect.googleapis.com"}# Adds permission to Developer Connect Service Agent to manager GitHub tokensresource"google_project_iam_member""devconnect-secret"{provider=google-betaproject=google_firebase_project.apphosting.projectrole="roles/secretmanager.admin"member=google_project_service_identity.devconnect-p4sa.member}# Connects to a GitHub accountresource"google_developer_connect_connection""my-connection"{provider=google-betaproject=google_firebase_project.apphosting.project # Must match the google_firebase_app_hosting_backend's locationlocation="name-of-region-for-service" # Must be `firebase-app-hosting-github-oauth`connection_id="firebase-app-hosting-github-oauth"github_config{github_app="FIREBASE"}depends_on=[google_project_iam_member.devconnect-secret]}# Follow the next steps to set up the GitHub connection# Tip: Run terraform refresh to obtain the outputoutput"next_steps"{description="Follow the action_uri if present to continue setup"value=google_developer_connect_connection.my-connection.installation_state}# Links a GitHub repo to the projectresource"google_developer_connect_git_repository_link""my-repository"{provider=google-betaproject=google_firebase_project.apphosting.projectlocation=google_developer_connect_connection.my-connection.locationgit_repository_link_id="my-repo-id"parent_connection=google_developer_connect_connection.my-connection.connection_idclone_uri="https://github.com/myuser/myrepo.git"}###
Устранение неполадок и часто задаваемые вопросы
Вы хотите узнать больше о различных атрибутах, связанных с проектом (например, project и user_project_override).
В этом руководстве при работе с проектами используются следующие атрибуты Terraform.
project в блоке resource
Рекомендуем по возможности добавлять атрибут project в каждый блок resource.
Если вы добавите атрибут проекта, Terraform создаст инфраструктуру, указанную в блоке ресурсов, в рамках заданного проекта. В этом руководстве и в наших примерах файлов конфигурации используется именно такой подход.
Ознакомьтесь с официальной документацией Terraform по project.
user_project_override в блоке provider
Для инициализации большинства ресурсов следует использовать user_project_override = true, то есть проверять квоту в своем проекте Firebase. Однако, чтобы настроить новый проект так, чтобы он мог принимать проверки квот, сначала необходимо использовать user_project_override = false.
Вы видите следующее сообщение об ошибке:
generic::permission_denied: Firebase Tos Not Accepted.
Убедитесь, что в аккаунте пользователя, который вы используете для выполнения команд gcloud CLI, приняты Условия использования Firebase.
Для этого войдите в аккаунт пользователя в браузере и попробуйте открыть существующий проект Firebase в консоли Firebase. Если вы можете просматривать существующий проект Firebase, значит аккаунт пользователя принял Условия использования Firebase.
Если вы не видите ни одного проекта Firebase, возможно, вы не приняли Условия использования Firebase. Чтобы устранить эту проблему, создайте новый проект Firebase в консоли Firebase и примите Условия использования Firebase. Вы можете немедленно удалить этот проект в настройках проекта в консоли.
После запуска terraform apply вы получаете ошибку generic::permission_denied: IAM authority does not have the
permission.
Подождите несколько минут и попробуйте запустить terraform apply снова.
Не удалось создать ресурс, но при повторном запуске terraform apply появляется сообщение ALREADY_EXISTS.
Это может быть связано с задержкой распространения в различных системах. Попробуйте решить эту проблему, импортировав ресурс в состояние Terraform с помощью команды terraform import. Затем попробуйте снова запустить terraform apply.
При работе с Cloud Firestore вы получаете следующую ошибку: Error creating Index: googleapi:
Error 409;...Concurrent access -- try again.
Как следует из сообщения об ошибке, Terraform, возможно, пытается одновременно создать несколько индексов и/или документ и сталкивается с ошибкой параллелизма.
Попробуйте запустить terraform apply ещё раз.
Вы получаете сообщение об ошибке: "you may need to specify 'X-Goog-User-Project' HTTP header for quota and
billing purposes".
Эта ошибка означает, что Terraform не знает, в каком проекте нужно проверить квоту. Чтобы устранить неполадку, проверьте следующее в блоке resource:
Убедитесь, что вы указали значение атрибута project.
Убедитесь, что вы используете поставщика с user_project_override = true (без псевдонима), который в примерах Firebase называется google-beta.
При создании нового проекта Google Cloud вы получаете сообщение о том, что указанный идентификатор проекта уже существует.
Вот возможные причины, по которым идентификатор проекта уже может существовать:
Проект, связанный с этим идентификатором, принадлежит другому пользователю.
Решение. Выберите другой идентификатор проекта.
Проект, связанный с этим идентификатором, был недавно удален (находится в состоянии обратимого удаления).
Решение. Если вы считаете, что проект, связанный с идентификатором, принадлежит вам, проверьте состояние проекта с помощью REST API projects.get.
Проект, связанный с этим идентификатором, существует и принадлежит текущему пользователю. Возможная причина ошибки – прерывание предыдущего процесса terraform apply.
Решение. Выполните следующие команды: terraform import google_project.default PROJECT_ID
Затем выполните следующую команду: terraform import google_firebase_project.default PROJECT_ID
Почему нужно инициализировать экземпляр Cloud Firestore по умолчанию до сегмента Cloud Storage по умолчанию?
Если вы подготовили стандартный сегмент Cloud Storage (с помощью google_app_engine_application) до того, как попытались подготовить стандартный экземпляр Cloud Firestore, то обнаружите, что стандартный экземпляр Cloud Firestore уже подготовлен. Обратите внимание, что подготовленный экземпляр базы данных находится в режиме Datastore, а это значит, что он не доступен для Firebase SDK, аутентификации и Firebase Security Rules. Если вы хотите использовать Cloud Firestore с этими сервисами Firebase, вам нужно очистить базу данных, а затем изменить ее тип в консоли Google Cloud.
При попытке инициализировать Cloud Storage (через google_app_engine_application), а затем экземпляр Cloud Firestore по умолчанию вы получаете следующую ошибку: Error: Error creating Database: googleapi: Error 409: Database already
exists. Please use another database_id.
Если вы создаете для проекта стандартный сегмент Cloud Storage (с помощью google_app_engine_application), а стандартного экземпляра Cloud Firestore у проекта ещё нет, то google_app_engine_application автоматически создаст стандартный экземпляр Cloud Firestore.
Поскольку экземпляр Cloud Firestore по умолчанию для вашего проекта уже подготовлен, google_firestore_database выдаст ошибку, если вы попытаетесь явно подготовить этот экземпляр по умолчанию снова.
После того как экземпляр Cloud Firestore по умолчанию будет подготовлен, вы не сможете подготовить его повторно или изменить его местоположение. Обратите внимание, что подготовленный экземпляр базы данных находится в режиме хранилища данных, а это значит, что он не доступен для Firebase SDK, аутентификации или Firebase Security Rules. Если вы хотите использовать Cloud Firestore с этими сервисами Firebase, вам нужно очистить базу данных, а затем изменить ее тип в консоли Google Cloud.