Firebase начинает поддерживать Terraform . Если вы работаете в команде, которая хочет автоматизировать и стандартизировать создание проектов Firebase с предоставлением определённых ресурсов и поддержкой сервисов, то использование Terraform с Firebase может вам подойти.
Базовый рабочий процесс использования Terraform с Firebase включает следующее:
Создание и настройка файла конфигурации Terraform (файла
.tf
), в котором указана инфраструктура, которую вы хотите предоставить (т. е. ресурсы, которые вы хотите предоставить, и службы, которые вы хотите включить).Использование команд gcloud CLI , которые взаимодействуют с Terraform для предоставления инфраструктуры, указанной в файле
.tf
.
Что можно сделать с помощью Terraform и Firebase?
В качестве примера обобщённого рабочего процесса в этом руководстве рассматривается создание нового проекта Firebase с приложением для Android. Но с Terraform вы можете делать гораздо больше, например:
Удаляйте и изменяйте существующую инфраструктуру с помощью Terraform.
Управляйте конфигурацией и задачами, связанными с конкретным продуктом, с помощью Terraform, например:
- Включение поставщиков входа в систему Firebase Authentication .
- Создание контейнеров Cloud Storage или экземпляров базы данных и развертывание для них Firebase Security Rules .
- Создание бэкэндов, сборок и других связанных ресурсов Firebase App Hosting .
Для выполнения всех этих задач можно использовать стандартные файлы конфигурации и команды Terraform. Чтобы помочь вам, мы предоставили примеры файлов конфигурации Terraform для нескольких распространённых случаев использования.
Обобщенный рабочий процесс использования Terraform с Firebase
Предпосылки
Это руководство представляет собой введение в использование Terraform с Firebase, поэтому предполагается наличие базовых навыков работы с Terraform. Перед началом работы убедитесь, что вы выполнили следующие предварительные требования.
Установите Terraform и ознакомьтесь с Terraform, используя их официальные руководства.
Установите Google Cloud CLI ( gcloud CLI ). Войдите в систему, используя учетную запись пользователя или учетную запись сервиса .
- При использовании учётной записи пользователя необходимо принять Условия обслуживания Firebase (Firebase ToS). Вы принимаете Условия обслуживания Firebase, если можете просматривать проект Firebase в консоли Firebase
- Чтобы Terraform мог выполнять определенные действия (например, создавать проекты), должно выполняться следующее:
- Учетная запись пользователя или службы должна иметь соответствующий доступ IAM для этих действий.
- Если учетная запись пользователя или службы является частью организации Google Cloud , то политики организации должны разрешать учетной записи выполнять эти действия.
Шаг 1: Создайте и настройте файл конфигурации Terraform
Файл конфигурации Terraform должен состоять из двух основных разделов (которые подробно описаны ниже):
- Раздел настроек
provider
, который определяет, к каким ресурсам Terraform можно получить доступ - Раздел отдельных блоков
resource
, которые определяют, какую инфраструктуру необходимо создать
Настройте своего provider
Настройка provider
требуется независимо от того, какие продукты или службы Firebase используются.
Создайте файл конфигурации Terraform (например, файл
main.tf
) в локальном каталоге.В этом руководстве вы будете использовать этот файл конфигурации для настройки как
provider
, так и всей инфраструктуры, которую вы хотите создать с помощью Terraform. Обратите внимание, что у вас есть варианты настройки поставщика.У вас есть следующие варианты включения настройки
provider
в остальную часть конфигурации Terraform:Вариант 1: включить его в начало одного файла конфигурации Terraform
.tf
(как показано в этом руководстве).- Используйте эту опцию, если вы только начинаете работать с Terraform или просто пробуете Terraform с Firebase.
Вариант 2: включить его в отдельный файл
.tf
(например, файлprovider.tf
), отдельно от файла.tf
, в котором указывается создаваемая инфраструктура (например, файлmain.tf
).- Используйте этот вариант, если вы являетесь частью большой команды, которой необходимо стандартизировать настройку.
- При запуске команд Terraform файлы
provider.tf
иmain.tf
должны находиться в одном каталоге.
Включите следующую настройку
provider
в начало файлаmain.tf
Вам необходимо использовать провайдер
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 }
Узнайте больше о различных типах атрибутов, связанных с проектом (включая то, что в этом руководстве называется «проектом проверки квот») при использовании Terraform с Firebase.
Перейдите к следующему разделу, чтобы завершить создание файла конфигурации и указать, какую инфраструктуру необходимо создать.
Укажите, какую инфраструктуру создать с использованием resource
блоков.
В файле конфигурации Terraform (в данном руководстве — файл main.tf
) необходимо указать всю инфраструктуру, которую Terraform должен создать (то есть все ресурсы, которые вы хотите предоставить, и все сервисы, которые вы хотите включить). В этом руководстве вы найдете полный список всех ресурсов Firebase, поддерживающих Terraform .
Откройте файл
main.tf
В настройках
provider
включите следующую конфигурацию блоковresource
.В этом простом примере создается новый проект Firebase, а затем в рамках этого проекта создается приложение Firebase для Android.
# 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_override name = "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_override project = google_project.default.project_id for_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-beta project = 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-beta project = google_project.default.project_id display_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, ] }
Если вы не знакомы с инфраструктурой проектов и приложений как ресурсов, ознакомьтесь со следующей документацией:
- Понимание проектов Firebase
- Справочная документация по управлению проектами 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" { # Use the provider that enables the setup of quota checks for a new project provider = google-beta.no_user_project_override name = "Project Display Name" // learn more about the project name project_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 APIS provider = google-beta.no_user_project_override project = google_project.default.project_id for_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 on provider = google-beta project = 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-beta project = google_project.default.project_id display_name = "My Awesome Android app" # learn more about an app's display name package_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 show
Вариант 2: просмотр проекта Firebase в консоли Firebase .
Ресурсы Firebase с поддержкой Terraform
Следующие ресурсы Firebase и Google поддерживают Terraform. И мы постоянно добавляем новые ресурсы! Если вы не видите ресурс, которым хотите управлять с помощью Terraform, проверьте его наличие в ближайшее время или запросите его , отправив запрос в репозиторий GitHub .
Управление проектами и приложениями Firebase
google_firebase_project
— включение служб Firebase в существующем проекте Google CloudПриложения Firebase
-
google_firebase_apple_app
— создание или управление приложением Firebase для платформ Apple -
google_firebase_android_app
— создание или управление приложением Firebase для Android -
google_firebase_web_app
— создание или управление веб-приложением Firebase
-
Firebase Authentication
google_identity_platform_config
— включить Google Cloud Identity Platform (GCIP) (являющуюся бэкэндом для Firebase Authentication ) и указать параметры аутентификации на уровне проекта.Для настройки Firebase Authentication через Terraform требуется включить GCIP. Ознакомьтесь с примером
.tf
файла, чтобы узнать, как настроить Firebase Authentication .Проект, в котором Terraform включит Firebase Authentication должен быть на тарифном плане Blaze (то есть у проекта должен быть связанный аккаунт Cloud Billing ). Это можно сделать программно, установив атрибут
billing_account
в ресурсеgoogle_project
.Этот ресурс также позволяет настраивать больше параметров, например, локальные методы входа, такие как анонимный вход, аутентификация по электронной почте/паролю и телефону, а также блокировать функции и авторизованные домены.
google_identity_platform_default_supported_idp_config
— настройка общих федеративных поставщиков удостоверений, таких как Google, Facebook или Appleidentity_platform_oauth_idp_config
— настройка произвольных источников OAuth Identity Provider (IdP)google_identity_platform_inbound_saml_config
— настройка интеграции SAML
Пока не поддерживается:
- Настройка многофакторной аутентификации (MFA) через Terraform
Firebase App Hosting
google_firebase_app_hosting_backend
— создание и управление бэкэндом Firebase App Hosting , включая подключение к репозиторию GitHub и живую ветку для непрерывного развертывания.google_firebase_app_hosting_build
— создать сборку для бэкэнда в определенной точке тега ссылки на кодовую базу и в определенный момент времени.google_firebase_app_hosting_traffic
— разверните сборку или настройте непрерывное развертывание GitHub.
Firebase Data Connect
-
google_firebase_data_connect_service
— создание службы Data Connect
Firebase Realtime Database
-
google_firebase_database_instance
— создать экземпляр Realtime Database
Пока не поддерживается:
- Развертывание Firebase Realtime Database Security Rules через Terraform (узнайте, как развернуть эти Rules с помощью других инструментов, включая программные возможности)
Cloud Firestore
google_firestore_database
— создание экземпляра Cloud Firestoregoogle_firestore_index
— включить эффективные запросы для Cloud Firestoregoogle_firestore_document
— заполнение экземпляра Cloud Firestore определенным документом из коллекцииВажно: не используйте в этом исходном документе реальные данные конечного пользователя или производства.
Cloud Storage for Firebase
google_firebase_storage_bucket
— делает существующий контейнер Cloud Storage доступным для Firebase SDK, аутентификации и Firebase Security Rulesgoogle_storage_bucket_object
— добавить объект в контейнер Cloud StorageВажно: не используйте в этом файле реальные данные конечного пользователя или производственные данные.
Firebase Security Rules (для Cloud Firestore и Cloud Storage )
Обратите внимание, что Firebase Realtime Database использует другую систему подготовки для Firebase Security Rules .
google_firebaserules_ruleset
— определяет Firebase Security Rules , которые применяются к экземпляру Cloud Firestore или контейнеру Cloud Storagegoogle_firebaserules_release
— развертывание определенных наборов правил в экземпляре Cloud Firestore или контейнере Cloud Storage
Firebase App Check
-
google_firebase_app_check_service_config
— включить принудительное применение App Check для службы -
google_firebase_app_check_app_attest_config
— регистрация приложения платформы Apple у поставщика App Attest -
google_firebase_app_check_device_check_config
— регистрация приложения платформы Apple у поставщика DeviceCheck -
google_firebase_app_check_play_integrity_config
— регистрация приложения Android у поставщика Play Integrity -
google_firebase_app_check_recaptcha_enterprise_config
— регистрация веб-приложения у поставщика reCAPTCHA Enterprise -
google_firebase_app_check_recaptcha_v3_config
— регистрация веб-приложения у провайдера reCAPTCHA v3 -
google_firebase_app_check_debug_token
— использовать отладочные токены для тестирования
Firebase Extensions
-
google_firebase_extensions_instance
— установка или обновление экземпляра Firebase Extension
Примеры файлов конфигурации Terraform для распространенных случаев использования
Эта конфигурация создает новый проект 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_override folder_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_override project = google_project.auth.project_id for_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-beta project = google_project.auth.project_id depends_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-beta project = google_firebase_project.auth.project # Auto-deletes anonymous users autodelete_anonymous_users = true # Configures local sign-in methods, like anonymous, email/password, and phone authentication. sign_in { allow_duplicate_emails = true anonymous { enabled = true } email { enabled = true password_required = false } phone_number { enabled = true test_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 = true access_token = true id_token = true } } # Configures a temporary quota for new signups for anonymous, email/password, and phone number. quota { sign_up_quota_config { quota = 1000 start_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-beta project = google_firebase_project.auth.project display_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-beta project = google_firebase_project.auth.project display_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-beta project = google_firebase_project.auth.project display_name = "My Web app" }
Эта конфигурация создает новый проект Google Cloud , включает службы Firebase для проекта и предоставляет службу Data Connect .
# Creates a new Google Cloud project. resource "google_project" "dataconnect" { provider = google-beta.no_user_project_override folder_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_override project = google_project.dataconnect.project_id for_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-beta project = google_project.dataconnect.project_id depends_on = [google_project_service.services] } # Create a Firebase Data Connect service resource "google_firebase_data_connect_service" "dataconnect-default" { project = google_firebase_project.dataconnect.project location = "name-of-region-for-service" service_id = "${google_firebase_project.dataconnect.project}-default-fdc" deletion_policy = "DEFAULT" }
Эта конфигурация создает новый проект Google Cloud , включает службы Firebase для проекта, подготавливает экземпляр Realtime Database по умолчанию для проекта и регистрирует три различных типа приложений в проекте.
# Creates a new Google Cloud project. resource "google_project" "rtdb" { provider = google-beta.no_user_project_override folder_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_override project = google_project.rtdb.project_id for_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-beta project = google_project.rtdb.project_id depends_on = [google_project_service.rtdb] } # Provisions the default Realtime Database default instance. resource "google_firebase_database_instance" "database" { provider = google-beta project = google_firebase_project.rtdb.project # See available locations: https://firebase.google.com/docs/database/locations region = "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-beta project = google_firebase_project.rtdb.project display_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-beta project = google_firebase_project.rtdb.project display_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-beta project = google_firebase_project.rtdb.project display_name = "My Web app" }
Эта конфигурация создает новый проект 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_override folder_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_override project = google_project.rtdb-multi.project_id for_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-beta project = google_project.rtdb-multi.project_id depends_on = [google_project_service.rtdb-multi] } # Provisions the default Realtime Database default instance. resource "google_firebase_database_instance" "database-default" { provider = google-beta project = google_firebase_project.rtdb-multi.project # See available locations: https://firebase.google.com/docs/database/locations region = "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-beta project = 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-beta project = google_firebase_project.rtdb-multi.project display_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-beta project = google_firebase_project.rtdb-multi.project display_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-beta project = google_firebase_project.rtdb-multi.project display_name = "My Web app" }
Эта конфигурация создает новый проект 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_override folder_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_override project = google_project.firestore.project_id for_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-beta project = google_project.firestore.project_id depends_on = [google_project_service.firestore] } # Provisions the Firestore database instance. resource "google_firestore_database" "firestore" { provider = google-beta project = google_firebase_project.firestore.project name = "(default)" # See available locations: https://firebase.google.com/docs/firestore/locations location_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-beta project = google_firestore_database.firestore.project source { files { name = "firestore.rules" # Write security rules in a local file named "firestore.rules". # Learn more: https://firebase.google.com/docs/firestore/security/get-started content = file("firestore.rules") } } } # Releases the ruleset for the Firestore instance. resource "google_firebaserules_release" "firestore" { provider = google-beta name = "cloud.firestore" # must be cloud.firestore ruleset_name = google_firebaserules_ruleset.firestore.name project = google_firestore_database.firestore.project } # Adds a new Firestore index. resource "google_firestore_index" "indexes" { provider = google-beta project = google_firestore_database.firestore.project collection = "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-beta project = google_firestore_database.firestore.project collection = "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-beta project = google_firebase_project.firestore.project display_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-beta project = google_firebase_project.firestore.project display_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-beta project = google_firebase_project.firestore.project display_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; } } }
Эта конфигурация создает новый проект 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_override folder_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_override project = google_project.storage-multi.project_id for_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-beta project = google_project.storage-multi.project_id depends_on = [google_project_service.storage-multi] } # Provisions a Cloud Storage bucket. resource "google_storage_bucket" "bucket-1" { provider = google-beta project = google_firebase_project.storage-multi.project name = "name-of-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locations location = "name-of-region-for-bucket" } # Provisions an additional Cloud Storage bucket. resource "google_storage_bucket" "bucket-2" { provider = google-beta project = google_firebase_project.storage-multi.project name = "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-beta project = google_firebase_project.storage-multi.project bucket_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-beta project = google_firebase_project.storage-multi.project bucket_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-beta project = google_firebase_project.storage-multi.project source { files { # Write security rules in a local file named "storage.rules" # Learn more: https://firebase.google.com/docs/storage/security/get-started name = "storage.rules" content = file("storage.rules") } } } # Releases the ruleset to the first Storage bucket. resource "google_firebaserules_release" "bucket-1" { provider = google-beta name = "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-beta name = "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-beta name = "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-beta project = google_firebase_project.storage-multi.project display_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-beta project = google_firebase_project.storage-multi.project display_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-beta project = google_firebase_project.storage-multi.project display_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; } } }
Эта конфигурация создает новый проект 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_override folder_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_override project = google_project.appcheck.project_id for_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-beta project = google_project.appcheck.project_id depends_on = [google_project_service.services] } # Provisions the Firestore database instance. resource "google_firestore_database" "database" { provider = google-beta project = google_firebase_project.appcheck.project name = "(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location location_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-beta project = google_firebase_project.appcheck.project display_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 provider resource "google_firebase_app_check_play_integrity_config" "appcheck" { provider = google-beta project = google_firebase_project.appcheck.project app_id = google_firebase_android_app.appcheck.app_id depends_on = [google_firestore_database.database] lifecycle { precondition { condition = length(google_firebase_android_app.appcheck.sha256_hashes) > 0 error_message = "Provide a SHA-256 certificate on the Android App to use App Check" } } } # Enable enforcement of App Check for Firestore resource "google_firebase_app_check_service_config" "firestore" { provider = google-beta project = google_firebase_project.appcheck.project service_id = "firestore.googleapis.com" depends_on = [google_project_service.services] }
Эта конфигурация создаёт новый проект Google Cloud , включает сервисы Firebase для проекта и устанавливает в проект новый экземпляр Firebase Extension . Если экземпляр уже существует, его параметры обновляются в соответствии со значениями, указанными в конфигурации.
# Creates a new Google Cloud project. resource "google_project" "extensions" { provider = google-beta.no_user_project_override folder_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_override project = google_project.extensions.project_id for_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-beta project = google_project.extensions.project_id depends_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-beta project = google_firebase_project.extensions.project instance_id = "translate-text-in-firestore" config { extension_ref = "firebase/firestore-translate-text" params = { COLLECTION_PATH = "posts/comments/translations" DO_BACKFILL = true LANGUAGES = "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" } } }
Эта конфигурация создает новый проект 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_override folder_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_override project = google_project.vertex.project_id for_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-beta project = google_project.vertex.project_id depends_on = [google_project_service.services] } # Creates a Firebase Web App in the new project created earlier. resource "google_firebase_web_app" "app" { provider = google-beta project = google_firebase_project.vertex.project display_name = "My Web App" } # Creates a Firebase Android App in the new project created earlier. resource "google_firebase_android_app" "app" { provider = google-beta project = google_firebase_project.vertex.project display_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-beta project = google_firebase_project.vertex.project display_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 Firebase resource "google_firebase_app_check_service_config" "vertex" { provider = google-beta project = google_firebase_project.vertex.project service_id = "firebaseml.googleapis.com" enforcement_mode = "ENFORCED" } # Enables the reCAPTCHA Enterprise API resource "google_project_service" "recaptcha_enterprise" { provider = google-beta project = google_firebase_project.vertex.project service = "recaptchaenterprise.googleapis.com" # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enables the Play Integrity API resource "google_project_service" "play_integrity" { provider = google-beta project = google_firebase_project.vertex.project service = "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 Check resource "google_firebase_app_check_recaptcha_enterprise_config" "appcheck" { provider = google-beta project = google_firebase_project.vertex.project app_id = google_firebase_web_app.app.app_id site_key = "your site key" token_ttl = "7200s" # Optional depends_on = [google_project_service.recaptcha_enterprise] } # Registers the Android app with the Play Integrity provider resource "google_firebase_app_check_play_integrity_config" "appcheck" { provider = google-beta project = google_firebase_project.vertex.project app_id = google_firebase_android_app.app.app_id token_ttl = "7200s" # Optional lifecycle { precondition { condition = length(google_firebase_android_app.app.sha256_hashes) > 0 error_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 provider resource "google_firebase_app_check_app_attest_config" "appcheck" { provider = google-beta project = google_firebase_project.vertex.project app_id = google_firebase_apple_app.app.app_id token_ttl = "7200s" # Optional lifecycle { 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 с помощью Terraform. Такой подход обеспечивает детальный контроль над создаваемыми ресурсами, но требует индивидуального определения каждого ресурса. Это полезно, когда требуется настроить серверную часть в соответствии с параметрами, выходящими за рамки стандартных.
# Creates a new Google Cloud project. resource "google_project" "apphosting" { provider = google-beta.no_user_project_override folder_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_override project = google_project.apphosting.project_id for_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-beta project = google_project.apphosting.project_id depends_on = [google_project_service.services] } # Creates a Firebase Web App in the new project created earlier. resource "google_firebase_web_app" "apphosting" { provider = google-beta project = google_firebase_project.apphosting.project display_name = "My web app" } # Creates a Firebase App Hosting Backend resource "google_firebase_app_hosting_backend" "example" { provider = google-beta project = google_firebase_project.apphosting.project # Choose the region closest to your users location = "name-of-region-for-service" backend_id = "name-of-backend-for-service" app_id = google_firebase_web_app.apphosting.app_id display_name = "My Backend" serving_locality = "GLOBAL_ACCESS" # or "REGIONAL_STRICT" service_account = google_service_account.service_account.email } # Creates the service account for Firebase App Hosting resource "google_service_account" "service_account" { provider = google-beta project = google_firebase_project.apphosting.project # Must be firebase-app-hosting-compute account_id = "firebase-app-hosting-compute" display_name = "Firebase App Hosting compute service account" # Do not throw if already exists create_ignore_already_exists = true } # Adds permission to the App Hosting service account resource "google_project_iam_member" "app_hosting_sa" { provider = google-beta project = google_firebase_project.apphosting.project for_each = toset([ "roles/firebase.sdkAdminServiceAgent", "roles/firebaseapphosting.computeRunner" ]) role = each.key member = google_service_account.service_account.member } # Creates a Build resource "google_firebase_app_hosting_build" "example" { provider = google-beta project = google_firebase_app_hosting_backend.example.project location = google_firebase_app_hosting_backend.example.location backend = google_firebase_app_hosting_backend.example.backend_id build_id = "my-build" source { container { # TODO: use your own image image = "us-docker.pkg.dev/cloudrun/container/hello" } } } # Rolls out the Build resource "google_firebase_app_hosting_traffic" "example" { provider = google-beta project = google_firebase_app_hosting_backend.example.project location = google_firebase_app_hosting_backend.example.location backend = google_firebase_app_hosting_backend.example.backend_id target { splits { build = google_firebase_app_hosting_build.example.name percent = 100 } } }
Эта конфигурация демонстрирует, как подготовить серверную часть App Hosting используя код приложения, хранящийся в репозитории GitHub. Такой подход позволяет управлять инфраструктурой и обновлять её с помощью запросов на извлечение GitHub и конвейеров непрерывной интеграции и непрерывной доставки (CI/CD) в соответствии с типичной моделью развёртывания App Hosting .
# Creates a new Google Cloud project. resource "google_project" "apphosting" { provider = google-beta.no_user_project_override folder_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_override project = google_project.apphosting.project_id for_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-beta project = google_project.apphosting.project_id depends_on = [google_project_service.services] } # Creates a Firebase Web App in the new project created earlier. resource "google_firebase_web_app" "apphosting" { provider = google-beta project = google_firebase_project.apphosting.project display_name = "My web app" } ### Setting up Firebase App Hosting ### # Creates a Firebase App Hosting Backend resource "google_firebase_app_hosting_backend" "example" { provider = google-beta project = google_firebase_project.apphosting.project # Choose the region closest to your users location = "name-of-region-for-service" backend_id = "name-of-backend-for-service" app_id = google_firebase_web_app.apphosting.app_id display_name = "My Backend" serving_locality = "GLOBAL_ACCESS" # or "REGIONAL_STRICT" service_account = google_service_account.service_account.email codebase { repository = google_developer_connect_git_repository_link.my-repository.name root_directory = "/" } } # Creates the service account for Firebase App Hosting resource "google_service_account" "service_account" { provider = google-beta project = google_firebase_project.apphosting.project # Must be firebase-app-hosting-compute account_id = "firebase-app-hosting-compute" display_name = "Firebase App Hosting compute service account" # Do not throw if already exists create_ignore_already_exists = true } # Adds permission to the App Hosting service account resource "google_project_iam_member" "app_hosting_sa" { provider = google-beta project = google_firebase_project.apphosting.project for_each = toset([ "roles/developerconnect.readTokenAccessor", "roles/firebase.sdkAdminServiceAgent", "roles/firebaseapphosting.computeRunner" ]) role = each.key member = google_service_account.service_account.member } # Configures auto rollout from GitHub resource "google_firebase_app_hosting_traffic" "example" { provider = google-beta project = google_firebase_app_hosting_backend.example.project location = google_firebase_app_hosting_backend.example.location backend = google_firebase_app_hosting_backend.example.backend_id rollout_policy { codebase_branch = "main" # Or another branch } } ### ### Setting up a connection to GitHub ### # Provisions Service Agent for Developer Connect resource "google_project_service_identity" "devconnect-p4sa" { provider = google-beta project = google_firebase_project.apphosting.project service = "developerconnect.googleapis.com" } # Adds permission to Developer Connect Service Agent to manager GitHub tokens resource "google_project_iam_member" "devconnect-secret" { provider = google-beta project = google_firebase_project.apphosting.project role = "roles/secretmanager.admin" member = google_project_service_identity.devconnect-p4sa.member } # Connects to a GitHub account resource "google_developer_connect_connection" "my-connection" { provider = google-beta project = google_firebase_project.apphosting.project # Must match the google_firebase_app_hosting_backend's location location = "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 output output "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 project resource "google_developer_connect_git_repository_link" "my-repository" { provider = google-beta project = google_firebase_project.apphosting.project location = google_developer_connect_connection.my-connection.location git_repository_link_id = "my-repo-id" parent_connection = google_developer_connect_connection.my-connection.connection_id clone_uri = "https://github.com/myuser/myrepo.git" } ###
Устранение неполадок и часто задаваемые вопросы
В этом руководстве при работе с «проектами» используются следующие атрибуты Terraform.
-
project
вresource
блоке Рекомендуется: по возможности включайте атрибут
project
в каждый блокresource
При добавлении атрибута проекта Terraform создаст инфраструктуру, указанную в блоке ресурсов, в рамках указанного проекта. Данное руководство и наши примеры файлов конфигурации используют именно этот подход.
Ознакомьтесь с официальной документацией Terraform о
project
.-
user_project_override
в блокеprovider
Для предоставления большинства ресурсов следует использовать
user_project_override = true
, что означает проверку квоты по вашему собственному проекту Firebase. Однако, чтобы настроить новый проект для проверки квот, сначала необходимо использоватьuser_project_override = false
.См. официальную документацию Terraform о
user_project_override
.
Убедитесь, что учетная запись пользователя, которую вы используете для запуска команд gcloud CLI приняла Условия обслуживания Firebase (Firebase ToS).
Вы можете выполнить эту проверку, войдя в учётную запись пользователя в браузере и попытавшись просмотреть существующий проект Firebase в консоли Firebase . Если вы можете просмотреть существующий проект Firebase, значит, учётная запись пользователя приняла условия использования Firebase.
Если вы не видите ни одного существующего проекта Firebase, вероятно, учётная запись пользователя не приняла условия использования Firebase. Чтобы исправить это, создайте новый проект Firebase через консоль Firebase и примите условия использования Firebase при создании проекта. Вы можете немедленно удалить этот проект через настройки проекта в консоли.
Подождите несколько минут, а затем попробуйте снова запустить terraform apply
.
Это может быть связано с задержкой распространения в различных системах. Попробуйте решить эту проблему, импортировав ресурс в состояние Terraform с помощью команды terraform import
. Затем попробуйте снова выполнить terraform apply
.
Информацию о том, как импортировать каждый ресурс, можно найти в разделе «Импорт» документации Terraform (например, в документации «Импорт» для Cloud Firestore ).
Как следует из сообщения об ошибке, Terraform, возможно, пытается подготовить несколько индексов и/или создать документ одновременно и столкнулся с ошибкой параллельной обработки. Попробуйте выполнить terraform apply
ещё раз.
Эта ошибка означает, что Terraform не знает, для какого проекта проверять квоту. Для устранения проблемы проверьте следующее в блоке resource
:
- Убедитесь, что вы указали значение для атрибута
project
. - Убедитесь, что вы используете провайдера с
user_project_override = true
(без псевдонима), которым в примерах Firebase являетсяgoogle-beta
.
Вот возможные причины, по которым идентификатор проекта может уже существовать:
Проект, связанный с этим идентификатором, принадлежит кому-то другому.
- Чтобы решить эту проблему: выберите другой идентификатор проекта.
Проект, связанный с этим идентификатором, был недавно удален (в состоянии мягкого удаления).
- Чтобы решить: Если вы считаете, что проект, связанный с идентификатором, принадлежит вам, проверьте состояние проекта с помощью REST API
projects.get
.
- Чтобы решить: Если вы считаете, что проект, связанный с идентификатором, принадлежит вам, проверьте состояние проекта с помощью REST API
Проект, связанный с этим идентификатором, корректно существует под текущим пользователем. Возможной причиной ошибки может быть прерывание предыдущего
terraform apply
.- Для решения: выполните следующие команды:
terraform import google_project.default PROJECT_ID
а потом
terraform import google_firebase_project.default PROJECT_ID
- Для решения: выполните следующие команды:
Если вы подготовили контейнер Cloud Storage по умолчанию (через google_app_engine_application
) до того, как попытаетесь подготовить экземпляр Cloud Firestore по умолчанию, то вы обнаружите, что экземпляр Cloud Firestore по умолчанию уже подготовлен. Обратите внимание, что подготовленный экземпляр базы данных находится в режиме хранилища данных, что означает его недоступность для Firebase SDK, аутентификации и Firebase Security Rules . Если вы хотите использовать Cloud Firestore с этими службами Firebase, вам необходимо очистить базу данных и изменить её тип в консоли Google Cloud .
Если вы подготавливаете контейнер 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 .