Оптимизируйте свои подборки
Сохраняйте и классифицируйте контент в соответствии со своими настройками.
Firebase начинает поддерживать Terraform . Если вы входите в команду, которая хочет автоматизировать и стандартизировать создание проектов Firebase с предоставлением определенных ресурсов и включенных сервисов, то использование Terraform с Firebase может вам подойти.
Базовый рабочий процесс использования Terraform с Firebase включает следующее:
Создание и настройка файла конфигурации Terraform (файл .tf ), в котором указывается инфраструктура, которую вы хотите предоставить (то есть ресурсы, которые вы хотите предоставить, и службы, которые вы хотите включить).
Использование команд gcloud CLI , взаимодействующих с Terraform, для подготовки инфраструктуры, указанной в файле .tf .
Удалите и измените существующую инфраструктуру с помощью Terraform.
Управляйте конфигурацией и задачами конкретного продукта с помощью Terraform, например:
Включение поставщиков Firebase Authentication .
Создание сегментов Cloud Storage или экземпляров базы данных и развертывание для них Firebase Security Rules .
Для выполнения всех этих задач вы можете использовать стандартные файлы конфигурации и команды Terraform. И чтобы помочь вам в этом, мы предоставили примеры файлов конфигурации Terraform для нескольких распространенных случаев использования.
Общий рабочий процесс использования Terraform с Firebase
Предварительные условия
Это руководство представляет собой введение в использование Terraform с Firebase, поэтому оно предполагает базовые навыки работы с Terraform. Перед запуском этого рабочего процесса убедитесь, что вы выполнили следующие предварительные условия.
Установите Terraform и ознакомьтесь с Terraform, используя официальные руководства.
Просмотр требований к учетным записям пользователей и учетным записям служб
Если вы используете учетную запись пользователя, вы должны принять Условия использования Firebase (Firebase ToS). Вы приняли условия обслуживания Firebase, если можете просматривать проект Firebase в консоли Firebase
Чтобы Terraform мог выполнять определенные действия (например, создавать проекты), должно выполняться следующее:
Для этих действий учетная запись пользователя или службы должна иметь соответствующий доступ IAM.
Если учетная запись пользователя или службы является частью организации Google Cloud , то политики организации должны разрешать учетной записи выполнять эти действия.
Шаг 1. Создайте и настройте файл конфигурации Terraform.
Конфигурационный файл Terraform состоит из двух основных разделов (которые подробно описаны ниже):
Настройка provider требуется независимо от того, какие продукты или услуги Firebase задействованы.
Создайте файл конфигурации Terraform (например, файл main.tf ) в своем локальном каталоге.
В этом руководстве вы будете использовать этот файл конфигурации, чтобы указать как настройку provider , так и всю инфраструктуру, которую вы хотите создать Terraform. Однако обратите внимание, что у вас есть варианты включения настройки провайдера.
Просмотр вариантов включения настройки provider
У вас есть следующие варианты включения настройки provider в остальную часть вашей конфигурации Terraform:
Вариант 1. Включите его в начало одного файла конфигурации Terraform .tf (как показано в этом руководстве).
Используйте этот вариант, если вы только начинаете работать с Terraform или просто пробуете Terraform с Firebase.
Вариант 2. Включите его в отдельный файл .tf (например, файл provider.tf ), отдельно от файла .tf , в котором вы указываете создаваемую инфраструктуру (например, файл main.tf ).
Используйте этот вариант, если вы являетесь частью большой команды, которой необходимо стандартизировать настройку.
При запуске команд Terraform файл provider.tf и файл main.tf должны находиться в одном каталоге.
Включите следующую настройку 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}
Перейдите к следующему разделу, чтобы завершить создание файла конфигурации и указать, какую инфраструктуру нужно создать.
Укажите, какую инфраструктуру создавать с использованием блоков resource
В файле конфигурации Terraform (в данном руководстве это файл main.tf ) вам необходимо указать всю инфраструктуру, которую вы хотите создать Terraform (то есть все ресурсы, которые вы хотите предоставить, и все службы, которые вы хотите включить). В этом руководстве вы найдете полный список всех ресурсов Firebase, поддерживающих Terraform .
Откройте файл main.tf
В настройках provider включите следующую конфигурацию блоков resource .
В этом базовом примере создается новый проект Firebase, а затем в этом проекте создается Android-приложение Firebase.
# Terraform configuration to set up providers by version....# Configures the provider to use the resource block's specified project for quota checks....# Configures the provider to not use the resource block's specified project for quota checks....# Creates a new Google Cloud project.resource"google_project""default"{provider=google-beta.no_user_project_overridename="Project Display Name"project_id="project-id-for-new-project" # Required for any service that requires the Blaze pricing plan # (like Firebase Authentication with GCIP)billing_account="000000-000000-000000" # Required for the project to display in any list of Firebase projects.labels={"firebase"="enabled"}}# Enables required APIs.resource"google_project_service""default"{provider=google-beta.no_user_project_overrideproject=google_project.default.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","firebase.googleapis.com", # Enabling the ServiceUsage API allows the new project to be quota checked from now on."serviceusage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""default"{provider=google-betaproject=google_project.default.project_id # Waits for the required APIs to be enabled.depends_on=[google_project_service.default]}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""default"{provider=google-betaproject=google_project.default.project_iddisplay_name="My Awesome Android app"package_name="awesome.package.name" # Wait for Firebase to be enabled in the Google Cloud project before creating this App.depends_on=[google_firebase_project.default,]}
Просмотрите подробно аннотированную версию этого примера файла конфигурации.
Если вы не знакомы с инфраструктурой проектов и приложений как ресурсов, просмотрите следующую документацию:
# Terraform configuration to set up providers by version....# Configures the provider to use the resource block's specified project for quota checks....# Configures the provider to not use the resource block's specified project for quota checks....# Creates a new Google Cloud project.resource"google_project""default"{ # Use the provider that enables the setup of quota checks for a new projectprovider=google-beta.no_user_project_overridename="Project Display Name" // learn more about the project nameproject_id="project-id-for-new-project" // learn more about the project ID # Required for any service that requires the Blaze pricing plan # (like Firebase Authentication with GCIP)billing_account="000000-000000-000000" # Required for the project to display in any list of Firebase projects.labels={"firebase"="enabled" // learn more about the Firebase-enabled label}}# Enables required APIs.resource"google_project_service""default"{ # Use the provider without quota checks for enabling APISprovider=google-beta.no_user_project_overrideproject=google_project.default.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","firebase.googleapis.com", # Enabling the ServiceUsage API allows the new project to be quota checked from now on."serviceusage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.# This action essentially "creates a Firebase project" and allows the project to use# Firebase services (like Firebase Authentication) and# Firebase tooling (like the Firebase console).# Learn more about the relationship between Firebase projects and Google Cloud.resource"google_firebase_project""default"{ # Use the provider that performs quota checks from now onprovider=google-betaproject=google_project.default.project_id # Waits for the required APIs to be enabled.depends_on=[google_project_service.default]}# Creates a Firebase Android App in the new project created above.# Learn more about the relationship between Firebase Apps and Firebase projects.resource"google_firebase_android_app""default"{provider=google-betaproject=google_project.default.project_iddisplay_name="My Awesome Android app" # learn more about an app's display namepackage_name="awesome.package.name" # learn more about an app's package name # Wait for Firebase to be enabled in the Google Cloud project before creating this App.depends_on=[google_firebase_project.default,]}
Шаг 2. Запустите команды Terraform для создания указанной инфраструктуры.
Чтобы предоставить ресурсы и включить службы, указанные в файле main.tf , выполните следующие команды из того же каталога, что и файл main.tf Подробную информацию об этих командах смотрите в документации Terraform .
Если вы впервые запускаете команды Terraform в каталоге, вам необходимо инициализировать каталог конфигурации и установить поставщика Google Terraform. Сделайте это, выполнив следующую команду:
terraform init
Создайте инфраструктуру, указанную в файле main.tf , выполнив следующую команду:
terraform apply
Убедитесь, что все было подготовлено или включено, как ожидалось:
Вариант 1. Посмотрите конфигурацию, напечатанную на вашем терминале, выполнив следующую команду:
Следующие ресурсы Firebase и Google поддерживают Terraform. И мы постоянно добавляем больше ресурсов! Поэтому, если вы не видите ресурс, которым хотите управлять с помощью Terraform, зайдите позже, чтобы узнать, доступен ли он, или запросите его , зарегистрировав проблему в репозитории GitHub .
google_identity_platform_config — включите Google Cloud Identity Platform (GCIP) (которая является серверной частью Firebase Authentication ) и укажите настройки аутентификации на уровне проекта.
Проект, в котором Terraform будет включать GCIP и/или Firebase Authentication должен находиться в тарифном плане Blaze (то есть проект должен иметь связанную учетную запись Cloud Billing ). Вы можете сделать это программно, установив атрибут billing_account в ресурсе google_project .
Этот ресурс также обеспечивает дополнительные настройки, такие как методы локального входа, такие как анонимность, аутентификация по электронной почте/паролю и телефону, а также функции блокировки и авторизованные домены.
Развертывание Firebase Realtime Database Security Rules через Terraform (узнайте, как развернуть эти Rules с помощью других инструментов, включая программные варианты)
Примеры файлов конфигурации Terraform для распространенных случаев использования
Настройте Firebase Authentication с помощью GCIP
Эта конфигурация создает новый проект Google Cloud , связывает проект с учетной записью Cloud Billing (для Firebase Authentication с GCIP требуется тарифный план Blaze), включает службы Firebase для проекта, настраивает Firebase Authentication с GCIP и регистрирует три разных типа приложений в проекте.
Обратите внимание, что включение GCIP необходимо для настройки Firebase Authentication через Terraform.
# Creates a new Google Cloud project.resource"google_project""auth"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for Firebase Authentication with GCIP).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""auth"{provider=google-beta.no_user_project_overrideproject=google_project.auth.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","serviceusage.googleapis.com","identitytoolkit.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""auth"{provider=google-betaproject=google_project.auth.project_iddepends_on=[google_project_service.auth,]}# Creates an Identity Platform config.# Also enables Firebase Authentication with Identity Platform in the project if not.resource"google_identity_platform_config""auth"{provider=google-betaproject=google_firebase_project.auth.project # Auto-deletes anonymous usersautodelete_anonymous_users=true # Configures local sign-in methods, like anonymous, email/password, and phone authentication.sign_in{allow_duplicate_emails=trueanonymous{enabled=true}email{enabled=truepassword_required=false}phone_number{enabled=truetest_phone_numbers={"+11231231234"="000000"}}} # Sets an SMS region policy.sms_region_config{allowlist_only{allowed_regions=["US","CA",]}} # Configures blocking functions.blocking_functions{triggers{event_type="beforeSignIn"function_uri="https://us-east1-${google_project.auth.project_id}.cloudfunctions.net/before-sign-in"}forward_inbound_credentials{refresh_token=trueaccess_token=trueid_token=true}} # Configures a temporary quota for new signups for anonymous, email/password, and phone number.quota{sign_up_quota_config{quota=1000start_time=""quota_duration="7200s"}} # Configures authorized domains.authorized_domains=["localhost","${google_project.auth.project_id}.firebaseapp.com","${google_project.auth.project_id}.web.app",]}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""auth"{provider=google-betaproject=google_firebase_project.auth.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""auth"{provider=google-betaproject=google_firebase_project.auth.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""auth"{provider=google-betaproject=google_firebase_project.auth.projectdisplay_name="My Web app"}
Предоставление службы Firebase Data Connect
Эта конфигурация создает новый проект Google Cloud , включает службы Firebase для проекта и предоставляет службу Data Connect .
# Creates a new Google Cloud project.resource"google_project""dataconnect"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase Data Connect).billing_account="000000-000000-000000" # Required for the project to display in a list of Firebase projects.labels={"firebase"="enabled"}}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.dataconnect.project_idfor_each=toset(["serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebasedataconnect.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created earlier.resource"google_firebase_project""dataconnect"{provider=google-betaproject=google_project.dataconnect.project_iddepends_on=[google_project_service.services]}# Create a Firebase Data Connect serviceresource"google_firebase_data_connect_service""dataconnect-default"{project=google_firebase_project.dataconnect.projectlocation="name-of-region-for-service"service_id="${google_firebase_project.dataconnect.project}-default-fdc"deletion_policy="DEFAULT"}
Предоставьте экземпляр Firebase Realtime Database по умолчанию.
Эта конфигурация создает новый проект Google Cloud , включает службы Firebase для проекта, подготавливает экземпляр Realtime Database по умолчанию и регистрирует в проекте три разных типа приложений.
# Creates a new Google Cloud project.resource"google_project""rtdb"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project"}# Enables required APIs.resource"google_project_service""rtdb"{provider=google-beta.no_user_project_overrideproject=google_project.rtdb.project_idfor_each=toset(["serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebasedatabase.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""rtdb"{provider=google-betaproject=google_project.rtdb.project_iddepends_on=[google_project_service.rtdb]}# Provisions the default Realtime Database default instance.resource"google_firebase_database_instance""database"{provider=google-betaproject=google_firebase_project.rtdb.project # See available locations: https://firebase.google.com/docs/database/locationsregion="name-of-region" # This value will become the first segment of the database's URL.instance_id="${google_project.rtdb.project_id}-default-rtdb"type="DEFAULT_DATABASE"}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""rtdb"{provider=google-betaproject=google_firebase_project.rtdb.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""rtdb"{provider=google-betaproject=google_firebase_project.rtdb.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""rtdb"{provider=google-betaproject=google_firebase_project.rtdb.projectdisplay_name="My Web app"}
Предоставление нескольких экземпляров Firebase Realtime Database
Эта конфигурация создает новый проект Google Cloud , связывает проект с учетной записью Cloud Billing (для нескольких экземпляров Realtime Database требуется тарифный план Blaze), включает службы Firebase для проекта, подготавливает несколько экземпляров Realtime Database (включая экземпляр Realtime Database проекта по умолчанию) и регистрирует в проекте три разных типа приложений.
# Creates a new Google Cloud project.resource"google_project""rtdb-multi"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associate the project with a Cloud Billing account # (required for multiple Realtime Database instances).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""rtdb-multi"{provider=google-beta.no_user_project_overrideproject=google_project.rtdb-multi.project_idfor_each=toset(["cloudbilling.googleapis.com","serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebasedatabase.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""rtdb-multi"{provider=google-betaproject=google_project.rtdb-multi.project_iddepends_on=[google_project_service.rtdb-multi]}# Provisions the default Realtime Database default instance.resource"google_firebase_database_instance""database-default"{provider=google-betaproject=google_firebase_project.rtdb-multi.project # See available locations: https://firebase.google.com/docs/database/locationsregion="name-of-region" # This value will become the first segment of the database's URL.instance_id="${google_project.rtdb-multi.project_id}-default-rtdb"type="DEFAULT_DATABASE"}# Provisions an additional Realtime Database instance.resource"google_firebase_database_instance""database-additional"{provider=google-betaproject=google_firebase_project.rtdb-multi.project # See available locations: https://firebase.google.com/docs/projects/locations#rtdb-locations # This location doesn't need to be the same as the default database instance.region="name-of-region" # This value will become the first segment of the database's URL.instance_id="name-of-additional-database-instance"type="USER_DATABASE"}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""rtdb-multi"{provider=google-betaproject=google_firebase_project.rtdb-multi.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""rtdb-multi"{provider=google-betaproject=google_firebase_project.rtdb-multi.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""rtdb-multi"{provider=google-betaproject=google_firebase_project.rtdb-multi.projectdisplay_name="My Web app"}
Предоставьте экземпляр Cloud Firestore по умолчанию.
Эта конфигурация создает новый проект Google Cloud , включает службы Firebase для проекта, подготавливает экземпляр Cloud Firestore по умолчанию для проекта и регистрирует в проекте три разных типа приложений.
Он также предоставляет Firebase Security Rules для экземпляра Cloud Firestore по умолчанию, создает индекс Cloud Firestore и добавляет документ Cloud Firestore с исходными данными.
# Creates a new Google Cloud project.resource"google_project""firestore"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project"}# Enables required APIs.resource"google_project_service""firestore"{provider=google-beta.no_user_project_overrideproject=google_project.firestore.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","serviceusage.googleapis.com","firestore.googleapis.com","firebaserules.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""firestore"{provider=google-betaproject=google_project.firestore.project_iddepends_on=[google_project_service.firestore]}# Provisions the Firestore database instance.resource"google_firestore_database""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectname="(default)" # See available locations: https://firebase.google.com/docs/firestore/locationslocation_id="name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules.type="FIRESTORE_NATIVE"concurrency_mode="OPTIMISTIC"}# Creates a ruleset of Firestore Security Rules from a local file.resource"google_firebaserules_ruleset""firestore"{provider=google-betaproject=google_firestore_database.firestore.projectsource{files{name="firestore.rules" # Write security rules in a local file named "firestore.rules". # Learn more: https://firebase.google.com/docs/firestore/security/get-startedcontent=file("firestore.rules")}}}# Releases the ruleset for the Firestore instance.resource"google_firebaserules_release""firestore"{provider=google-betaname="cloud.firestore" # must be cloud.firestoreruleset_name=google_firebaserules_ruleset.firestore.nameproject=google_firestore_database.firestore.project}# Adds a new Firestore index.resource"google_firestore_index""indexes"{provider=google-betaproject=google_firestore_database.firestore.projectcollection="quiz"query_scope="COLLECTION"fields{field_path="question"order="ASCENDING"}fields{field_path="answer"order="ASCENDING"}}# Adds a new Firestore document with seed data.# Don't use real end-user or production data in this seed document.resource"google_firestore_document""doc"{provider=google-betaproject=google_firestore_database.firestore.projectcollection="quiz"document_id="question-1"fields="{\"question\":{\"stringValue\":\"Favorite Database\"},\"answer\":{\"stringValue\":\"Firestore\"}}"}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""firestore"{provider=google-betaproject=google_firebase_project.firestore.projectdisplay_name="My Web app"}
Это набор Cloud Firestore Security Rules , который должен находиться в локальном файле с именем firestore.rules .
Предоставление дополнительных сегментов Cloud Storage
Эта конфигурация создает новый проект Google Cloud , связывает проект с Cloud Billing (для дополнительных сегментов требуется тарифный план Blaze), включает службы Firebase для проекта, предоставляет дополнительные сегменты Cloud Storage , отличные от стандартных, и регистрирует три разных типа приложений в проекте.
Он также предоставляет Firebase Security Rules для каждого сегмента Cloud Storage и загружает файл в один из сегментов Cloud Storage .
# Creates a new Google Cloud project.resource"google_project""storage-multi"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required for multiple Cloud Storage buckets).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""storage-multi"{provider=google-beta.no_user_project_overrideproject=google_project.storage-multi.project_idfor_each=toset(["cloudbilling.googleapis.com","serviceusage.googleapis.com","cloudresourcemanager.googleapis.com","firebaserules.googleapis.com","firebasestorage.googleapis.com","storage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""storage-multi"{provider=google-betaproject=google_project.storage-multi.project_iddepends_on=[google_project_service.storage-multi]}# Provisions a Cloud Storage bucket.resource"google_storage_bucket""bucket-1"{provider=google-betaproject=google_firebase_project.storage-multi.projectname="name-of-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locationslocation="name-of-region-for-bucket"}# Provisions an additional Cloud Storage bucket.resource"google_storage_bucket""bucket-2"{provider=google-betaproject=google_firebase_project.storage-multi.projectname="name-of-additional-storage-bucket" # See available locations: https://cloud.google.com/storage/docs/locations#available-locations # This location does not need to be the same as the existing Storage bucket.location="name-of-region-for-additional-bucket"}# Makes the first Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.resource"google_firebase_storage_bucket""bucket-1"{provider=google-betaproject=google_firebase_project.storage-multi.projectbucket_id=google_storage_bucket.bucket-1.name}# Makes the additional Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.resource"google_firebase_storage_bucket""bucket-2"{provider=google-betaproject=google_firebase_project.storage-multi.projectbucket_id=google_storage_bucket.bucket-2.name}# Creates a ruleset of Firebase Security Rules from a local file.resource"google_firebaserules_ruleset""storage-multi"{provider=google-betaproject=google_firebase_project.storage-multi.projectsource{files{ # Write security rules in a local file named "storage.rules" # Learn more: https://firebase.google.com/docs/storage/security/get-startedname="storage.rules"content=file("storage.rules")}}}# Releases the ruleset to the first Storage bucket.resource"google_firebaserules_release""bucket-1"{provider=google-betaname="firebase.storage/${google_storage_bucket.bucket-1.name}"ruleset_name="projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}"project=google_firebase_project.storage-multi.project}# Releases the ruleset to the additional Storage bucket.resource"google_firebaserules_release""bucket-2"{provider=google-betaname="firebase.storage/${google_storage_bucket.bucket-2.name}"ruleset_name="projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}"project=google_firebase_project.storage-multi.project}# Uploads a new file to the first Storage bucket.# Do not use real end-user or production data in this file.resource"google_storage_bucket_object""cat-picture-multi"{provider=google-betaname="cat.png"source="path/to/cat.png"bucket=google_storage_bucket.bucket-1.name}# Creates a Firebase Android App in the new project created above.resource"google_firebase_android_app""storage-multi"{provider=google-betaproject=google_firebase_project.storage-multi.projectdisplay_name="My Android app"package_name="android.package.name"}# Creates a Firebase Apple-platforms App in the new project created above.resource"google_firebase_apple_app""storage-multi"{provider=google-betaproject=google_firebase_project.storage-multi.projectdisplay_name="My Apple app"bundle_id="apple.app.12345"}# Creates a Firebase Web App in the new project created above.resource"google_firebase_web_app""storage-multi"{provider=google-betaproject=google_firebase_project.storage-multi.projectdisplay_name="My Web app"}
Это набор Cloud Storage Security Rules , который должен находиться в локальном файле с именем storage.rules .
Эта конфигурация создает новый проект Google Cloud , включает службы Firebase для проекта, а также настраивает и включает Firebase App Check для Cloud Firestore , чтобы доступ к нему можно было получить только из вашего приложения Android.
# Creates a new Google Cloud project.resource"google_project""appcheck"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project"}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.appcheck.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","firebase.googleapis.com","firebaseappcheck.googleapis.com","firestore.googleapis.com","serviceusage.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created earlier.resource"google_firebase_project""appcheck"{provider=google-betaproject=google_project.appcheck.project_iddepends_on=[google_project_service.services]}# Provisions the Firestore database instance.resource"google_firestore_database""database"{provider=google-betaproject=google_firebase_project.appcheck.projectname="(default)" # See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-locationlocation_id="name-of-region" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, authentication, and Firebase Security Rules.type="FIRESTORE_NATIVE"concurrency_mode="OPTIMISTIC"}# Creates a Firebase Android App in the new project created earlier.resource"google_firebase_android_app""appcheck"{provider=google-betaproject=google_firebase_project.appcheck.projectdisplay_name="Play Integrity app"package_name="package.name.playintegrity"sha256_hashes=[ # TODO: insert your Android app's SHA256 certificate]}# Register the Android app with the Play Integrity providerresource"google_firebase_app_check_play_integrity_config""appcheck"{provider=google-betaproject=google_firebase_project.appcheck.projectapp_id=google_firebase_android_app.appcheck.app_iddepends_on=[google_firestore_database.database]lifecycle{precondition{condition=length(google_firebase_android_app.appcheck.sha256_hashes)>0error_message="Provide a SHA-256 certificate on the Android App to use App Check"}}}# Enable enforcement of App Check for Firestoreresource"google_firebase_app_check_service_config""firestore"{provider=google-betaproject=google_firebase_project.appcheck.projectservice_id="firestore.googleapis.com"depends_on=[google_project_service.services]}
Установите экземпляр Firebase Extension
Эта конфигурация создает новый проект Google Cloud , включает службы Firebase для проекта и устанавливает в проект новый экземпляр Firebase Extension . Если экземпляр уже существует, его параметры обновляются на основе значений, указанных в конфиге.
# Creates a new Google Cloud project.resource"google_project""extensions"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associates the project with a Cloud Billing account # (required to use Firebase Extensions).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""extensions"{provider=google-beta.no_user_project_overrideproject=google_project.extensions.project_idfor_each=toset(["cloudbilling.googleapis.com","cloudresourcemanager.googleapis.com","serviceusage.googleapis.com","firebase.googleapis.com","firebaseextensions.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created above.resource"google_firebase_project""extensions"{provider=google-betaproject=google_project.extensions.project_iddepends_on=[google_project_service.extensions,]}# Installs an instance of the "Translate Text in Firestore" extension.# Or updates the extension if the specified instance already exists.resource"google_firebase_extensions_instance""translation"{provider=google-betaproject=google_firebase_project.extensions.projectinstance_id="translate-text-in-firestore"config{extension_ref="firebase/firestore-translate-text"params={COLLECTION_PATH="posts/comments/translations"DO_BACKFILL=trueLANGUAGES="ar,en,es,de,fr"INPUT_FIELD_NAME="input"LANGUAGES_FIELD_NAME="languages"OUTPUT_FIELD_NAME="translated"}system_params={"firebaseextensions.v1beta.function/location"="us-central1""firebaseextensions.v1beta.function/memory"="256""firebaseextensions.v1beta.function/minInstances"="0""firebaseextensions.v1beta.function/vpcConnectorEgressSettings"="VPC_CONNECTOR_EGRESS_SETTINGS_UNSPECIFIED"}}}
Включите и защитите Vertex AI в Firebase
Эта конфигурация создает новый проект Google Cloud , включает службы Firebase для проекта, включая Vertex AI в Firebase, а также настраивает и включает Firebase App Check для Vertex AI в Firebase , чтобы к ней можно было получить доступ только из ваших приложений.
# Creates a new Google Cloud project.resource"google_project""vertex"{provider=google-beta.no_user_project_overridefolder_id="folder-id-for-new-project"name="Project Display Name"project_id="project-id-for-new-project" # Associate the project with a Cloud Billing account # (required for Vertex AI in Firebase).billing_account="000000-000000-000000"}# Enables required APIs.resource"google_project_service""services"{provider=google-beta.no_user_project_overrideproject=google_project.vertex.project_idfor_each=toset(["cloudresourcemanager.googleapis.com","firebase.googleapis.com","serviceusage.googleapis.com", # Required APIs for Vertex AI in Firebase"aiplatform.googleapis.com","firebasevertexai.googleapis.com", # App Check is recommended to protect Vertex AI in Firebase from abuse"firebaseappcheck.googleapis.com",])service=each.key # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables Firebase services for the new project created earlier.resource"google_firebase_project""vertex"{provider=google-betaproject=google_project.vertex.project_iddepends_on=[google_project_service.services]}# Creates a Firebase Web App in the new project created earlier.resource"google_firebase_web_app""app"{provider=google-betaproject=google_firebase_project.vertex.projectdisplay_name="My Web App"}# Creates a Firebase Android App in the new project created earlier.resource"google_firebase_android_app""app"{provider=google-betaproject=google_firebase_project.vertex.projectdisplay_name="My Android App"package_name="package.name.playintegrity"sha256_hashes=[ # TODO: insert your Android app's SHA256 certificate]}# Creates a Firebase Apple App in the new project created earlier.resource"google_firebase_apple_app""app"{provider=google-betaproject=google_firebase_project.vertex.projectdisplay_name="My Apple App"bundle_id="bundle.id"team_id="1234567890"}### Protects Vertex AI in Firebase with App Check.# Turns on enforcement for Vertex AI in Firebaseresource"google_firebase_app_check_service_config""vertex"{provider=google-betaproject=google_firebase_project.vertex.projectservice_id="firebaseml.googleapis.com"enforcement_mode="ENFORCED"}# Enables the reCAPTCHA Enterprise APIresource"google_project_service""recaptcha_enterprise"{provider=google-betaproject=google_firebase_project.vertex.projectservice="recaptchaenterprise.googleapis.com" # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Enables the Play Integrity APIresource"google_project_service""play_integrity"{provider=google-betaproject=google_firebase_project.vertex.projectservice="playintegrity.googleapis.com" # Don't disable the service if the resource block is removed by accident.disable_on_destroy=false}# Allows the web app to use reCAPTCHA Enterprise with App Checkresource"google_firebase_app_check_recaptcha_enterprise_config""appcheck"{provider=google-betaproject=google_firebase_project.vertex.projectapp_id=google_firebase_web_app.app.app_idsite_key="your site key"token_ttl="7200s" # Optionaldepends_on=[google_project_service.recaptcha_enterprise]}# Registers the Android app with the Play Integrity providerresource"google_firebase_app_check_play_integrity_config""appcheck"{provider=google-betaproject=google_firebase_project.vertex.projectapp_id=google_firebase_android_app.app.app_idtoken_ttl="7200s" # Optionallifecycle{precondition{condition=length(google_firebase_android_app.app.sha256_hashes)>0error_message="Provide a SHA-256 certificate on the Android App to use App Check"}}depends_on=[google_project_service.play_integrity]}# Registers the Apple app with the AppAttest providerresource"google_firebase_app_check_app_attest_config""appcheck"{provider=google-betaproject=google_firebase_project.vertex.projectapp_id=google_firebase_apple_app.app.app_idtoken_ttl="7200s" # Optionallifecycle{precondition{condition=google_firebase_apple_app.app.team_id!=""error_message="Provide a Team ID on the Apple App to use App Check"}}}
Устранение неполадок и часто задаваемые вопросы
Вы хотите узнать больше обо всех различных атрибутах, связанных с проектом (например, project и user_project_override ).
В этом руководстве при работе с «проектами» используются следующие атрибуты Terraform.
project в блоке resource
Рекомендуется: по возможности включать атрибут project в каждый блок resource
Включив атрибут проекта, Terraform создаст инфраструктуру, указанную в блоке ресурсов, внутри указанного проекта. Это руководство и наши примеры файлов конфигурации используют эту практику.
См. официальную документацию Terraform о project .
user_project_override в блоке provider
Для предоставления большинства ресурсов вам следует использовать user_project_override = true , что означает проверку квоты на соответствие вашему собственному проекту Firebase. Однако чтобы настроить новый проект так, чтобы он мог принимать проверки квот, сначала необходимо использовать user_project_override = false .
Вы получаете эту ошибку: generic::permission_denied: Firebase Tos Not Accepted .
Убедитесь, что учетная запись пользователя, которую вы используете для запуска команд gcloud CLI приняла Условия обслуживания Firebase (Firebase ToS).
Вы можете выполнить эту проверку, используя браузер, войдя в учетную запись пользователя, и попытавшись просмотреть существующий проект Firebase в консоли Firebase . Если вы можете просмотреть существующий проект Firebase, значит, учетная запись пользователя приняла условия обслуживания Firebase.
Если вы не можете просмотреть ни один существующий проект Firebase, возможно, учетная запись пользователя не приняла условия обслуживания Firebase. Чтобы это исправить, создайте новый проект Firebase через консоль Firebase и примите условия обслуживания Firebase как часть создания проекта. Вы можете немедленно удалить этот проект через настройки проекта в консоли.
После запуска terraform apply вы получаете следующую ошибку: generic::permission_denied: IAM authority does not have the permission .
Подождите несколько минут, а затем попробуйте снова запустить terraform apply .
Не удалось создать ресурс, но при повторном запуске terraform apply появляется сообщение ALREADY_EXISTS .
Это может быть связано с задержкой распространения в различных системах. Попробуйте решить эту проблему, импортировав ресурс в состояние Terraform, запустив terraform import . Затем попробуйте снова запустить terraform apply .
При работе с Cloud Firestore вы получаете следующую ошибку: Error creating Index: googleapi: Error 409;...Concurrent access -- try again
Как следует из ошибки, Terraform, возможно, пытается предоставить несколько индексов и/или создать документ одновременно и столкнулся с ошибкой параллелизма. Попробуйте запустить terraform apply еще раз.
Вы получаете эту ошибку: "you may need to specify 'X-Goog-User-Project' HTTP header for quota and billing purposes" .
Эта ошибка означает, что Terraform не знает, по какому проекту проверять квоту. Для устранения неполадок проверьте в блоке resource следующее:
Убедитесь, что вы указали значение атрибута project .
Убедитесь, что вы используете поставщика с user_project_override = true (без псевдонима), который в примерах Firebase — google-beta .
При создании нового проекта Google Cloud вы получаете сообщение об ошибке, что идентификатор проекта, указанный для нового проекта, уже существует.
Вот возможные причины, по которым идентификатор проекта может уже существовать:
Проект, связанный с этим идентификатором, принадлежит кому-то другому.
Решение: выберите другой идентификатор проекта.
Проект, связанный с этим идентификатором, был недавно удален (в состоянии обратимого удаления).
Решение: если вы считаете, что проект, связанный с идентификатором, принадлежит вам, проверьте состояние проекта с помощью REST API projects.get .
Проект, связанный с этим идентификатором, правильно существует под текущим пользователем. Возможная причина ошибки может заключаться в том, что предыдущее terraform apply было прервано.
Решение: выполните следующие команды: terraform import google_project.default PROJECT_ID а потом terraform import google_firebase_project.default PROJECT_ID
Почему вам нужно подготовить экземпляр Cloud Firestore по умолчанию перед сегментом Cloud Storage по умолчанию?
Если вы подготовили корзину Cloud Storage по умолчанию (через google_app_engine_application ) до того, как попытаетесь подготовить экземпляр Cloud Firestore по умолчанию, вы обнаружите, что ваш экземпляр Cloud Firestore по умолчанию уже подготовлен. Обратите внимание, что подготовленный экземпляр базы данных находится в режиме хранилища данных, а это означает, что он недоступен для Firebase SDK, аутентификации или Firebase Security Rules . Если вы хотите использовать Cloud Firestore с этими сервисами Firebase, вам необходимо очистить базу данных, а затем изменить ее тип базы данных в консоли Google Cloud .
При попытке предоставить Cloud Storage (через google_app_engine_application ), а затем экземпляр Cloud Firestore по умолчанию, вы получаете следующую ошибку: Error: Error creating Database: googleapi: Error 409: Database already exists. Please use another database_id .
Когда вы подготавливаете корзину Cloud Storage по умолчанию для проекта (через google_app_engine_application ), а у проекта еще нет экземпляра Cloud Firestore по умолчанию, google_app_engine_application автоматически подготавливает экземпляр Cloud Firestore по умолчанию для проекта.
Итак, поскольку экземпляр Cloud Firestore по умолчанию для вашего проекта уже подготовлен, google_firestore_database выдаст ошибку, если вы попытаетесь снова явно предоставить этот экземпляр по умолчанию.
После того как экземпляр Cloud Firestore проекта по умолчанию будет подготовлен, вы не сможете «повторно подготовить» его или изменить его местоположение. Обратите внимание, что подготовленный экземпляр базы данных находится в режиме хранилища данных, а это означает, что он недоступен для Firebase SDK, аутентификации или Firebase Security Rules . Если вы хотите использовать Cloud Firestore с этими сервисами Firebase, вам необходимо очистить базу данных, а затем изменить ее тип базы данных в консоли Google Cloud .
[[["Прост для понимания","easyToUnderstand","thumb-up"],["Помог мне решить мою проблему","solvedMyProblem","thumb-up"],["Другое","otherUp","thumb-up"]],[["Отсутствует нужная мне информация","missingTheInformationINeed","thumb-down"],["Слишком сложен/слишком много шагов","tooComplicatedTooManySteps","thumb-down"],["Устарел","outOfDate","thumb-down"],["Проблема с переводом текста","translationIssue","thumb-down"],["Проблемы образцов/кода","samplesCodeIssue","thumb-down"],["Другое","otherDown","thumb-down"]],["Последнее обновление: 2025-05-08 UTC."],[],[]]