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 и ознакомьтесь с его возможностями, используя официальные руководства.
Установите Google Cloud CLI ( gcloud CLI ). Войдите в систему, используя учетную запись пользователя или учетную запись службы .
- Если вы используете учетную запись пользователя, вы должны принять Условия использования Firebase (Firebase ToS). Вы приняли Firebase ToS, если можете просматривать проект 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должны находиться в одной директории.
В начало файла
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 }
Узнайте больше о различных типах атрибутов, связанных с проектом (включая то, что в этом руководстве называется «проект для проверки квот»), при использовании 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 будет включать GCIP и/или Firebase Authentication должен использовать тарифный план Blaze (то есть у проекта должна быть связанная учетная запись Cloud Billing ). Это можно сделать программно, установив атрибут
billing_accountв ресурсеgoogle_project.Этот ресурс также позволяет настраивать дополнительные параметры, такие как локальные методы входа в систему, например, анонимный вход, аутентификация по электронной почте/паролю и телефону, а также функции блокировки и авторизованные домены.
google_identity_platform_default_supported_idp_config— настройка общих федеративных поставщиков идентификации, таких как Google, Facebook или Apple.identity_platform_oauth_idp_config— настройка произвольных источников поставщика идентификации OAuth (IdP).google_identity_platform_inbound_saml_config— настройка интеграций SAML
Пока не поддерживается:
- Настройка многофакторной аутентификации (МФА) с помощью 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 SQL Connect
-
google_firebase_data_connect_service— создание службы SQL Connect
Firebase Realtime Database
-
google_firebase_database_instance— создание экземпляра Realtime Database
Пока не поддерживается:
- Развертывание Firebase Realtime Database Security Rules с помощью Terraform (узнайте, как развернуть эти Security 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 доступным для SDK Firebase, аутентификации и 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 Platforms в поставщике App Attest. -
google_firebase_app_check_device_check_config— регистрация приложения Apple Platforms у поставщика DeviceCheck -
google_firebase_app_check_play_integrity_config— регистрация Android-приложения в Play Integrity Provider -
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 для проекта и инициализирует службу SQL 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"
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"
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
Проект, связанный с этим ID, корректно существует под текущим пользователем. Возможной причиной ошибки может быть прерывание предыдущего
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 уже создан. Обратите внимание, что созданный экземпляр базы данных находится в режиме Datastore, что означает, что он недоступен для SDK Firebase, аутентификации или 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 по умолчанию, вы не сможете его «пересоздать» или изменить его местоположение. Обратите внимание, что созданный экземпляр базы данных находится в режиме хранилища данных, что означает, что он недоступен для SDK Firebase, аутентификации или Firebase Security Rules . Если вы хотите использовать Cloud Firestore с этими сервисами Firebase, вам потребуется очистить базу данных, а затем изменить ее тип в консоли Google Cloud .