Firebase está comenzando a admitir Terraform . Si estás en un equipo que desea automatizar y estandarizar la creación de proyectos de Firebase con recursos específicos aprovisionados y servicios habilitados, entonces usar Terraform con Firebase puede ser una buena opción para ti.
El flujo de trabajo básico para usar Terraform con Firebase incluye lo siguiente:
Crear y personalizar un archivo de configuración de Terraform (un archivo
.tf
) que especifica la infraestructura que desea aprovisionar (es decir, los recursos que desea aprovisionar y los servicios que desea habilitar).Usar comandos de la CLI de gCloud que interactúen con Terraform para aprovisionar la infraestructura especificada en el archivo
.tf
.
¿Qué puedes hacer con Terraform y Firebase?
El flujo de trabajo generalizado de ejemplo en esta guía es la creación de un nuevo proyecto de Firebase con una aplicación de Android. Pero puedes hacer mucho más con Terraform, como por ejemplo:
Elimine y modifique la infraestructura existente utilizando Terraform.
Administre la configuración y las tareas específicas del producto utilizando Terraform, como:
- Habilitar proveedores de inicio de sesión de Firebase Authentication.
- Crear depósitos de Cloud Storage o instancias de bases de datos e implementar reglas de seguridad de Firebase para ellos.
Puede utilizar archivos de configuración y comandos estándar de Terraform para realizar todas estas tareas. Y para ayudarle con esto, proporcionamos archivos de configuración de Terraform de muestra para varios casos de uso comunes.
Flujo de trabajo generalizado para usar Terraform con Firebase
Requisitos previos
Esta guía es una introducción al uso de Terraform con Firebase, por lo que supone un dominio básico de Terraform. Asegúrese de haber completado los siguientes requisitos previos antes de iniciar este flujo de trabajo.
Instale Terraform y familiarícese con Terraform utilizando sus tutoriales oficiales.
Instale la CLI de Google Cloud (gCloud CLI). Inicie sesión utilizando una cuenta de usuario o una cuenta de servicio .
Ver requisitos para cuentas de usuario y cuentas de servicio
- Si utiliza una cuenta de usuario, debe haber aceptado los Términos de servicio de Firebase (Firebase ToS). Ha aceptado los términos de servicio de Firebase si puede ver un proyecto de Firebase en Firebase console.
- Para que Terraform realice determinadas acciones (por ejemplo, crear proyectos), debe cumplirse lo siguiente:
- El usuario o la cuenta de servicio debe tener el acceso IAM aplicable para esas acciones.
- Si el usuario o la cuenta de servicio es parte de una organización de Google Cloud, entonces las políticas de la organización deben permitir que la cuenta realice esas acciones.
Paso 1: crear y personalizar un archivo de configuración de Terraform
Un archivo de configuración de Terraform necesita dos secciones principales (que se describen en detalle a continuación):
- Una sección de configuración
provider
que dicta a qué recursos de Terraform se puede acceder - Una sección de bloques
resource
individuales que especifican qué infraestructura crear.
Configura tu provider
Se requiere la configuración de un provider
sin importar qué productos o servicios de Firebase estén involucrados.
Cree un archivo de configuración de Terraform (como el archivo
main.tf
) en su directorio local.En esta guía, utilizará este archivo de configuración para especificar tanto la configuración del
provider
como toda la infraestructura que desea que cree Terraform. Sin embargo, tenga en cuenta que tiene opciones sobre cómo incluir la configuración del proveedor.Ver opciones sobre cómo incluir la configuración del
provider
Tiene las siguientes opciones sobre cómo incluir una configuración
provider
en el resto de su configuración de Terraform:Opción 1: incluirlo en la parte superior de un único archivo de configuración Terraform
.tf
(como se muestra en esta guía).- Utilice esta opción si recién está comenzando con Terraform o simplemente está probando Terraform con Firebase.
Opción 2: Inclúyalo en un archivo
.tf
separado (como un archivoprovider.tf
), además del archivo.tf
donde especifica la infraestructura para crear (como un archivomain.tf
).- Utilice esta opción si forma parte de un equipo más grande que necesita estandarizar la configuración.
- Al ejecutar comandos de Terraform, tanto el archivo
provider.tf
como el archivomain.tf
deben estar en el mismo directorio.
Incluya la siguiente configuración
provider
en la parte superior del archivomain.tf
Debe utilizar el proveedor
google-beta
porque esta es una versión beta del uso de Firebase con Terraform. Tenga cuidado al utilizarlo en producción.# Terraform configuration to set up providers by version.
terraform {
required_providers {
google-beta = {
source = "hashicorp/google-beta"
version = "~> 4.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
}Obtenga más información sobre los diferentes tipos de atributos relacionados con el proyecto (incluido lo que esta guía llama "proyecto de verificación de cuotas") cuando utilice Terraform con Firebase.
Continúe con la siguiente sección para completar su archivo de configuración y especificar qué infraestructura crear.
Especificar qué infraestructura crear utilizando bloques resource
En su archivo de configuración de Terraform (para esta guía, su archivo main.tf
), debe especificar toda la infraestructura que desea que Terraform cree (es decir, todos los recursos que desea aprovisionar y todos los servicios que desea habilitar). En esta guía, encontrará una lista completa de todos los recursos de Firebase que admiten Terraform .
Abra su archivo
main.tf
En la configuración del
provider
, incluya la siguiente configuración de bloquesresource
.Este ejemplo básico crea un nuevo proyecto de Firebase y luego crea una aplicación Firebase para Android dentro de ese proyecto.
# 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,
]
}
Vea una versión con muchas anotaciones de este archivo de configuración de ejemplo
Si no está familiarizado con la infraestructura de proyectos y aplicaciones como recursos, revise la siguiente documentación:
- Comprender los proyectos de Firebase
- Documentación de referencia para la gestión de proyectos de 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,
]
}
Paso 2: Ejecute los comandos de Terraform para crear la infraestructura especificada
Para aprovisionar los recursos y habilitar los servicios especificados en su archivo main.tf
, ejecute los siguientes comandos desde el mismo directorio que su archivo main.tf
Para obtener información detallada sobre estos comandos, consulte la documentación de Terraform .
Si es la primera vez que ejecuta comandos de Terraform en el directorio, debe inicializar el directorio de configuración e instalar el proveedor de Google Terraform. Haga esto ejecutando el siguiente comando:
terraform init
Cree la infraestructura especificada en su archivo
main.tf
ejecutando el siguiente comando:terraform apply
Confirme que todo fue aprovisionado o habilitado como se esperaba:
Opción 1: Vea la configuración impresa en su terminal ejecutando el siguiente comando:
terraform show
Opción 2: ver tu proyecto de Firebase en Firebase console .
Recursos de Firebase con soporte Terraform
Los siguientes recursos de Firebase y Google son compatibles con Terraform. ¡Y estamos agregando más recursos todo el tiempo! Entonces, si no ve el recurso que desea administrar con Terraform, vuelva pronto para ver si está disponible o solicítelo presentando un problema en el repositorio de GitHub .
Gestión de proyectos y aplicaciones de Firebase
google_firebase_project
: habilita los servicios de Firebase en un proyecto de Google Cloud existentegoogle_firebase_project_location
: establece la ubicación de los recursos predeterminados de Google Cloud del proyecto.Aplicaciones de base de fuego
-
google_firebase_apple_app
: crea o administra una aplicación de plataformas Firebase Apple -
google_firebase_android_app
: crea o administra una aplicación Firebase para Android -
google_firebase_web_app
: crea o administra una aplicación web de Firebase
-
Autenticación de base de fuego
google_identity_platform_config
: habilita Google Cloud Identity Platform (GCIP) (que es el backend para Firebase Authentication) y proporciona configuraciones de autenticación a nivel de proyecto.Para configurar la autenticación de Firebase a través de Terraform es necesario habilitar GCIP. Asegúrese de revisar el archivo
.tf
de muestra para saber cómo configurar la autenticación de Firebase .El proyecto en el que Terraform habilitará GCIP y/o Firebase Authentication debe estar en el plan de precios de Blaze (es decir, el proyecto debe tener una cuenta de facturación en la nube asociada). Puede hacer esto mediante programación configurando el atributo
billing_account
en el recursogoogle_project
.Este recurso también permite más configuraciones, como métodos de inicio de sesión locales, como autenticación anónima, correo electrónico/contraseña y teléfono, así como funciones de bloqueo y dominios autorizados.
google_identity_platform_default_supported_idp_config
: configura proveedores de identidades federados comunes, como Google, Facebook o Apple.identity_platform_oauth_idp_config
: configura fuentes arbitrarias de proveedor de identidad (IdP) OAuthgoogle_identity_platform_inbound_saml_config
: configurar integraciones SAML
Aún no compatible:
- Configuración de la autenticación multifactor (MFA) a través de Terraform
Base de datos en tiempo real de Firebase
-
google_firebase_database_instance
: crea una instancia de base de datos en tiempo real
Aún no compatible:
- Implementación de reglas de seguridad de bases de datos en tiempo real de Firebase a través de Terraform (aprenda cómo implementar estas reglas utilizando otras herramientas, incluidas opciones programáticas)
Tienda de fuego en la nube
google_firestore_database
: crea una instancia de Cloud Firestoregoogle_firestore_index
: habilita consultas eficientes para Cloud Firestoregoogle_firestore_document
: genera una instancia de Cloud Firestore con un documento específico en una colecciónImportante: No utilice datos reales del usuario final o de producción en este documento inicial.
Almacenamiento en la nube para Firebase
google_firebase_storage_bucket
: hace que un depósito de Cloud Storage existente sea accesible para los SDK de Firebase, la autenticación y las reglas de seguridad de Firebase.- Configurar un depósito de Cloud Storage predeterminado para un proyecto de Firebase requiere primero aprovisionar
google_app_engine_application
. Asegúrese de revisar el archivo.tf
de muestra para saber cómo aprovisionar depósitos de Cloud Storage .
- Configurar un depósito de Cloud Storage predeterminado para un proyecto de Firebase requiere primero aprovisionar
google_storage_bucket_object
: agrega un objeto a un depósito de Cloud StorageImportante: No utilice datos reales de producción o de usuario final en este archivo.
Reglas de seguridad de Firebase (para Cloud Firestore y Cloud Storage)
Tenga en cuenta que Firebase Realtime Database utiliza un sistema de aprovisionamiento diferente para sus reglas de seguridad de Firebase.
google_firebaserules_ruleset
: define las reglas de seguridad de Firebase que se aplican a la instancia de Cloud Firestore o a un depósito de Cloud Storage.google_firebaserules_release
: implementa conjuntos de reglas específicos en la instancia de Cloud Firestore o en un depósito de Cloud Storage
Verificación de la aplicación Firebase
-
google_firebase_app_check_service_config
: habilita la aplicación de verificación de aplicaciones para un servicio -
google_firebase_app_check_app_attest_config
: registra una aplicación de plataformas Apple con el proveedor de App Attest -
google_firebase_app_check_device_check_config
: registra una aplicación de plataformas Apple con el proveedor DeviceCheck -
google_firebase_app_check_play_integrity_config
: registra una aplicación de Android con el proveedor de Play Integrity -
google_firebase_app_check_recaptcha_enterprise_config
: registra una aplicación web con el proveedor de reCAPTCHA Enterprise -
google_firebase_app_check_recaptcha_v3_config
: registra una aplicación web con el proveedor reCAPTCHA v3 -
google_firebase_app_check_debug_token
: utiliza tokens de depuración para realizar pruebas
Extensiones de base de fuego
-
google_firebase_extensions_instance
: instala o actualiza una instancia de una extensión de Firebase
Archivos de configuración de Terraform de muestra para casos de uso comunes
Configurar la autenticación de Firebase con GCIP
Esta configuración crea un nuevo proyecto de Google Cloud, asocia el proyecto con una cuenta de facturación de Cloud (se requiere el plan de precios de Blaze para la autenticación de Firebase con GCIP), habilita los servicios de Firebase para el proyecto, configura la autenticación de Firebase con GCIP y registra tres aplicaciones diferentes. tipos con el proyecto.
Tenga en cuenta que es necesario habilitar GCIP para configurar la autenticación de Firebase a través de Terraform.
# 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"
# Required for the project to display in a list of Firebase projects.
labels = {
"firebase" = "enabled"
}
}
# 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_project.auth.project_id
# 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",
]
# Wait for identitytoolkit.googleapis.com to be enabled before initializing Authentication.
depends_on = [
google_project_service.auth,
]
}
# Creates a Firebase Android App in the new project created above.
resource "google_firebase_android_app" "auth" {
provider = google-beta
project = google_project.auth.project_id
display_name = "My Android app"
package_name = "android.package.name"
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.auth,
]
}
# Creates a Firebase Apple-platforms App in the new project created above.
resource "google_firebase_apple_app" "auth" {
provider = google-beta
project = google_project.auth.project_id
display_name = "My Apple app"
bundle_id = "apple.app.12345"
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.auth,
]
}
# Creates a Firebase Web App in the new project created above.
resource "google_firebase_web_app" "auth" {
provider = google-beta
project = google_project.auth.project_id
display_name = "My Web app"
# The other App types (Android and Apple) use "DELETE" by default.
# Web apps don't use "DELETE" by default due to backward-compatibility.
deletion_policy = "DELETE"
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.auth,
]
}
Aprovisionar la instancia predeterminada de Firebase Realtime Database
Esta configuración crea un nuevo proyecto de Google Cloud, habilita los servicios de Firebase para el proyecto, aprovisiona la instancia de Realtime Database predeterminada del proyecto y registra tres tipos de aplicaciones diferentes con el proyecto.
# 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"
# Required for the project to display in a list of Firebase projects.
labels = {
"firebase" = "enabled"
}
}
# 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
}
# Provisions the default Realtime Database default instance.
resource "google_firebase_database_instance" "database" {
provider = google-beta
project = google_project.rtdb.project_id
# See available locations: https://firebase.google.com/docs/projects/locations#rtdb-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"
# Wait for Firebase to be enabled in the Google Cloud project before initializing Realtime Database.
depends_on = [
google_firebase_project.rtdb,
]
}
# Creates a Firebase Android App in the new project created above.
resource "google_firebase_android_app" "rtdb" {
provider = google-beta
project = google_project.rtdb.project_id
display_name = "My Android app"
package_name = "android.package.name"
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.rtdb,
]
}
# Creates a Firebase Apple-platforms App in the new project created above.
resource "google_firebase_apple_app" "rtdb" {
provider = google-beta
project = google_project.rtdb.project_id
display_name = "My Apple app"
bundle_id = "apple.app.12345"
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.rtdb,
]
}
# Creates a Firebase Web App in the new project created above.
resource "google_firebase_web_app" "rtdb" {
provider = google-beta
project = google_project.rtdb.project_id
display_name = "My Web app"
# The other App types (Android and Apple) use "DELETE" by default.
# Web apps don't use "DELETE" by default due to backward-compatibility.
deletion_policy = "DELETE"
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.rtdb,
]
}
Aprovisione varias instancias de Firebase Realtime Database
Esta configuración crea un nuevo proyecto de Google Cloud, asocia el proyecto con una cuenta de facturación de Cloud (se requiere el plan de precios de Blaze para múltiples instancias de Realtime Database), habilita los servicios de Firebase para el proyecto, aprovisiona múltiples instancias de Realtime Database (incluida la Realtime Database predeterminada del proyecto). instancia) y registra tres tipos de aplicaciones diferentes con el proyecto.
# 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"
# Required for the project to display in a list of Firebase projects.
labels = {
"firebase" = "enabled"
}
}
# 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
}
# Provisions the default Realtime Database default instance.
resource "google_firebase_database_instance" "database-default" {
provider = google-beta
project = google_project.rtdb-multi.project_id
# See available locations: https://firebase.google.com/docs/projects/locations#rtdb-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"
# Wait for Firebase to be enabled in the Google Cloud project before initializing Realtime Database.
depends_on = [
google_firebase_project.rtdb-multi,
]
}
# Provisions an additional Realtime Database instance.
resource "google_firebase_database_instance" "database-additional" {
provider = google-beta
project = google_project.rtdb-multi.project_id
# 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"
# Wait for Firebase to be enabled in the Google Cloud project before initializing Realtime Database.
depends_on = [
google_firebase_project.rtdb-multi,
]
}
# Creates a Firebase Android App in the new project created above.
resource "google_firebase_android_app" "rtdb-multi" {
provider = google-beta
project = google_project.rtdb-multi.project_id
display_name = "My Android app"
package_name = "android.package.name"
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.rtdb-multi,
]
}
# Creates a Firebase Apple-platforms App in the new project created above.
resource "google_firebase_apple_app" "rtdb-multi" {
provider = google-beta
project = google_project.rtdb-multi.project_id
display_name = "My Apple app"
bundle_id = "apple.app.12345"
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.rtdb-multi,
]
}
# Creates a Firebase Web App in the new project created above.
resource "google_firebase_web_app" "rtdb-multi" {
provider = google-beta
project = google_project.rtdb-multi.project_id
display_name = "My Web app"
# The other App types (Android and Apple) use "DELETE" by default.
# Web apps don't use "DELETE" by default due to backward-compatibility.
deletion_policy = "DELETE"
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.rtdb-multi,
]
}
Aprovisionar la instancia de Cloud Firestore
Esta configuración crea un nuevo proyecto de Google Cloud, habilita los servicios de Firebase para el proyecto, aprovisiona la instancia de Cloud Firestore del proyecto y registra tres tipos de aplicaciones diferentes con el proyecto.
También proporciona reglas de seguridad de Firebase para la instancia de Cloud Firestore, crea un índice de Cloud Firestore y agrega un documento de Cloud Firestore con datos iniciales.
# 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"
# Required for the project to display in a list of Firebase projects.
labels = {
"firebase" = "enabled"
}
}
# 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
}
# Provisions the Firestore database instance.
resource "google_firestore_database" "firestore" {
provider = google-beta
project = google_project.firestore.project_id
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"
# Wait for Firebase to be enabled in the Google Cloud project before initializing Firestore.
depends_on = [
google_firebase_project.firestore,
]
}
# Creates a ruleset of Firestore Security Rules from a local file.
resource "google_firebaserules_ruleset" "firestore" {
provider = google-beta
project = google_project.firestore.project_id
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")
}
}
# Wait for Firestore to be provisioned before creating this ruleset.
depends_on = [
google_firestore_database.firestore,
]
}
# 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_project.firestore.project_id
# Wait for Firestore to be provisioned before releasing the ruleset.
depends_on = [
google_firestore_database.firestore,
]
}
# Adds a new Firestore index.
resource "google_firestore_index" "indexes" {
provider = google-beta
project = google_project.firestore.project_id
collection = "quiz"
query_scope = "COLLECTION"
fields {
field_path = "question"
order = "ASCENDING"
}
fields {
field_path = "answer"
order = "ASCENDING"
}
# Wait for Firestore to be provisioned before adding this index.
depends_on = [
google_firestore_database.firestore,
]
}
# 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_project.firestore.project_id
collection = "quiz"
document_id = "question-1"
fields = "{\"question\":{\"stringValue\":\"Favorite Database\"},\"answer\":{\"stringValue\":\"Firestore\"}}"
# Wait for Firestore to be provisioned before adding this document.
depends_on = [
google_firestore_database.firestore,
]
}
# Creates a Firebase Android App in the new project created above.
resource "google_firebase_android_app" "firestore" {
provider = google-beta
project = google_project.firestore.project_id
display_name = "My Android app"
package_name = "android.package.name"
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.firestore,
]
}
# Creates a Firebase Apple-platforms App in the new project created above.
resource "google_firebase_apple_app" "firestore" {
provider = google-beta
project = google_project.firestore.project_id
display_name = "My Apple app"
bundle_id = "apple.app.12345"
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.firestore,
]
}
# Creates a Firebase Web App in the new project created above.
resource "google_firebase_web_app" "firestore" {
provider = google-beta
project = google_project.firestore.project_id
display_name = "My Web app"
# The other App types (Android and Apple) use "DELETE" by default.
# Web apps don't use "DELETE" by default due to backward-compatibility.
deletion_policy = "DELETE"
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.firestore,
]
}
Este es el conjunto de reglas de seguridad de Cloud Firestore que debe estar en un archivo local llamado firestore.rules
.
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
allow read: if request.auth != null;
allow create: if request.auth != null;
allow update: if request.auth != null;
}
}
Aprovisionar el depósito predeterminado de Cloud Storage
Esta configuración crea un nuevo proyecto de Google Cloud, habilita los servicios de Firebase para el proyecto, aprovisiona el depósito de Cloud Storage predeterminado del proyecto y registra tres tipos de aplicaciones diferentes con el proyecto.
También proporciona reglas de seguridad de Firebase para el depósito de Cloud Storage y carga un archivo en el depósito.
# Creates a new Google Cloud project.
resource "google_project" "storage" {
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"
# Required for the project to display in a list of Firebase projects.
labels = {
"firebase" = "enabled"
}
}
# Enables required APIs.
resource "google_project_service" "storage" {
provider = google-beta.no_user_project_override
project = google_project.storage.project_id
for_each = toset([
"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" {
provider = google-beta
project = google_project.storage.project_id
}
# Provisions the default Cloud Storage bucket for the project via Google App Engine.
resource "google_app_engine_application" "default" {
provider = google-beta
project = google_project.storage.project_id
# See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location
# This will set the location for the default Storage bucket and the App Engine App.
location_id = "name-of-region-for-default-bucket"
# If you use Firestore, uncomment this to make sure Firestore is provisioned first.
# depends_on = [
# google_firestore_database.firestore
# ]
}
# Makes the default Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.
resource "google_firebase_storage_bucket" "default-bucket" {
provider = google-beta
project = google_project.storage.project_id
bucket_id = google_app_engine_application.default.default_bucket
}
# Creates a ruleset of Cloud Storage Security Rules from a local file.
resource "google_firebaserules_ruleset" "storage" {
provider = google-beta
project = google_project.storage.project_id
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")
}
}
# Wait for the default Storage bucket to be provisioned before creating this ruleset.
depends_on = [
google_firebase_project.storage,
]
}
# Releases the ruleset to the default Storage bucket.
resource "google_firebaserules_release" "default-bucket" {
provider = google-beta
name = "firebase.storage/${google_app_engine_application.default.default_bucket}"
ruleset_name = "projects/${google_project.storage.project_id}/rulesets/${google_firebaserules_ruleset.storage.name}"
project = google_project.storage.project_id
}
# Uploads a new file to the default Storage bucket.
# Don't use real end-user or production data in this file.
resource "google_storage_bucket_object" "cat-picture" {
provider = google-beta
name = "cat.png"
source = "path/to/cat.png"
bucket = google_app_engine_application.default.default_bucket
}
# Creates a Firebase Android App in the new project created above.
resource "google_firebase_android_app" "storage" {
provider = google-beta
project = google_project.storage.project_id
display_name = "My Android app"
package_name = "android.package.name"
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.storage,
]
}
# Creates a Firebase Apple-platforms App in the new project created above.
resource "google_firebase_apple_app" "storage" {
provider = google-beta
project = google_project.storage.project_id
display_name = "My Apple app"
bundle_id = "apple.app.12345"
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.storage,
]
}
# Creates a Firebase Web App in the new project created above.
resource "google_firebase_web_app" "storage" {
provider = google-beta
project = google_project.storage.project_id
display_name = "My Web app"
# The other App types (Android and Apple) use "DELETE" by default.
# Web apps don't use "DELETE" by default due to backward-compatibility.
deletion_policy = "DELETE"
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.storage,
]
}
Este es el conjunto de reglas de seguridad de Cloud Storage que debe estar en un archivo local llamado storage.rules
.
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
Aprovisione varios depósitos de Cloud Storage
Esta configuración crea un nuevo proyecto de Google Cloud, asocia el proyecto con una cuenta de facturación de Cloud (se requiere el plan de precios de Blaze para varios depósitos), habilita los servicios de Firebase para el proyecto y aprovisiona varios depósitos de Cloud Storage (incluido el depósito de Cloud Storage predeterminado del proyecto). y registra tres tipos de aplicaciones diferentes con el proyecto.
También proporciona reglas de seguridad de Firebase para los depósitos de Cloud Storage y carga un archivo en el depósito predeterminado de 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"
# Required for the project to display in a list of Firebase projects.
labels = {
"firebase" = "enabled"
}
}
# 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
}
# Provisions the default Cloud Storage bucket for the project via Google App Engine.
resource "google_app_engine_application" "default-multi" {
provider = google-beta
project = google_project.storage-multi.project_id
# See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location
# This will set the location for the default Storage bucket and the App Engine App.
location_id = "name-of-region-for-default-bucket"
# If you use Firestore, uncomment this to make sure Firestore is provisioned first.
# depends_on = [
# google_firestore_database.firestore
# ]
}
# Provisions an additional Cloud Storage bucket.
# Additional Cloud Storage buckets are not provisioned via App Engine.
resource "google_storage_bucket" "bucket-multi" {
provider = google-beta
project = google_project.storage-multi.project_id
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 default Storage bucket.
location = "name-of-region-for-additional-bucket"
}
# Makes the default Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.
resource "google_firebase_storage_bucket" "default-bucket-multi" {
provider = google-beta
project = google_project.storage-multi.project_id
bucket_id = google_app_engine_application.default-multi.default_bucket
}
# Makes the additional Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.
resource "google_firebase_storage_bucket" "bucket-multi" {
provider = google-beta
project = google_project.storage-multi.project_id
bucket_id = google_storage_bucket.bucket-multi.name
}
# Creates a ruleset of Firebase Security Rules from a local file.
resource "google_firebaserules_ruleset" "storage-multi" {
provider = google-beta
project = google_project.storage-multi.project_id
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")
}
}
# Wait for the Storage buckets to be provisioned before creating this ruleset.
depends_on = [
google_firebase_project.storage-multi,
]
}
# Releases the ruleset to the default Storage bucket.
resource "google_firebaserules_release" "default-bucket-multi" {
provider = google-beta
name = "firebase.storage/${google_app_engine_application.default-multi.default_bucket}"
ruleset_name = "projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}"
project = google_project.storage-multi.project_id
}
# Releases the ruleset to the additional Storage bucket.
resource "google_firebaserules_release" "bucket-multi" {
provider = google-beta
name = "firebase.storage/${google_storage_bucket.bucket-multi.name}"
ruleset_name = "projects/${google_project.storage-multi.project_id}/rulesets/${google_firebaserules_ruleset.storage-multi.name}"
project = google_project.storage-multi.project_id
}
# Uploads a new file to the default 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_app_engine_application.default-multi.default_bucket
}
# Creates a Firebase Android App in the new project created above.
resource "google_firebase_android_app" "storage-multi" {
provider = google-beta
project = google_project.storage-multi.project_id
display_name = "My Android app"
package_name = "android.package.name"
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.storage-multi,
]
}
# Creates a Firebase Apple-platforms App in the new project created above.
resource "google_firebase_apple_app" "storage-multi" {
provider = google-beta
project = google_project.storage-multi.project_id
display_name = "My Apple app"
bundle_id = "apple.app.12345"
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.storage-multi,
]
}
# Creates a Firebase Web App in the new project created above.
resource "google_firebase_web_app" "storage-multi" {
provider = google-beta
project = google_project.storage-multi.project_id
display_name = "My Web app"
# The other App types (Android and Apple) use "DELETE" by default.
# Web apps don't use "DELETE" by default due to backward-compatibility.
deletion_policy = "DELETE"
# Wait for Firebase to be enabled in the Google Cloud project before creating this App.
depends_on = [
google_firebase_project.storage-multi,
]
}
Este es el conjunto de reglas de seguridad de Cloud Storage que debe estar en un archivo local llamado storage.rules
.
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
Aprovisiona la instancia de Cloud Firestore y el depósito predeterminado de Cloud Storage
Esta configuración crea un nuevo proyecto de Google Cloud, habilita los servicios de Firebase para el proyecto, aprovisiona la instancia de Cloud Firestore y luego aprovisiona el depósito predeterminado de Cloud Storage.
También proporciona reglas de seguridad de Firebase para la instancia de Cloud Firestore y el depósito predeterminado de Cloud Storage.
# Creates a new Google Cloud project.
resource "google_project" "fs" { # fs = Firestore + Storage
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"
# Required for the project to display in a list of Firebase projects.
labels = {
"firebase" = "enabled"
}
}
# Enables required APIs.
resource "google_project_service" "fs" {
provider = google-beta.no_user_project_override
project = google_project.fs.project_id
for_each = toset([
"serviceusage.googleapis.com",
"cloudresourcemanager.googleapis.com",
"firebaserules.googleapis.com",
"firebasestorage.googleapis.com",
"storage.googleapis.com",
"firestore.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" "fs" {
provider = google-beta
project = google_project.fs.project_id
}
#### Set up Firestore before default Cloud Storage bucket ####
# Provisions the Firestore database instance.
resource "google_firestore_database" "firestore-fs" {
provider = google-beta
project = google_project.fs.project_id
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"
# Wait for Firebase to be enabled in the Google Cloud project before initializing Firestore.
depends_on = [
google_firebase_project.fs,
]
}
# Creates a ruleset of Firestore Security Rules from a local file.
resource "google_firebaserules_ruleset" "firestore-fs" {
provider = google-beta
project = google_project.fs.project_id
source {
files {
# Write security rules in a local file named "firestore.rules".
# Learn more: https://firebase.google.com/docs/firestore/security/get-started
name = "firestore.rules"
content = file("firestore.rules")
}
}
# Wait for Firestore to be provisioned before creating this ruleset.
depends_on = [
google_firestore_database.firestore-fs
]
}
# Releases the ruleset for the Firestore instance.
resource "google_firebaserules_release" "firestore-fs" {
provider = google-beta
name = "cloud.firestore" # must be cloud.firestore
ruleset_name = google_firebaserules_ruleset.firestore-fs.name
project = google_project.fs.project_id
# Wait for Firestore to be provisioned before releasing the ruleset.
depends_on = [
google_firestore_database.firestore-fs,
]
}
#### Set up default Cloud Storage default bucket after Firestore ####
# Provisions the default Cloud Storage bucket for the project via Google App Engine.
resource "google_app_engine_application" "default-bucket-fs" {
provider = google-beta
project = google_project.fs.project_id
# See available locations: https://firebase.google.com/docs/projects/locations#default-cloud-location
# This will set the location for the default Storage bucket and the App Engine App.
location_id = "name-of-region" # Must be in the same location as Firestore (above)
# Wait for Firestore to be provisioned first.
# Otherwise, the Firestore instance will be provisioned in Datastore mode (unusable by Firebase).
depends_on = [
google_firestore_database.firestore-fs,
]
}
# Makes the default Storage bucket accessible for Firebase SDKs, authentication, and Firebase Security Rules.
resource "google_firebase_storage_bucket" "default-bucket-fs" {
provider = google-beta
project = google_project.fs.project_id
bucket_id = google_app_engine_application.default-bucket-fs.default_bucket
}
# Creates a ruleset of Cloud Storage Security Rules from a local file.
resource "google_firebaserules_ruleset" "default-bucket-fs" {
provider = google-beta
project = google_project.fs.project_id
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")
}
}
# Wait for the Cloud Storage bucket to be provisioned before creating this ruleset.
depends_on = [
google_firebase_project.fs,
]
}
# Releases the ruleset to the default Storage bucket.
resource "google_firebaserules_release" "default-bucket-fs" {
provider = google-beta
name = "firebase.storage/${google_app_engine_application.default-bucket-fs.default_bucket}"
ruleset_name = "projects/${google_project.fs.project_id}/rulesets/${google_firebaserules_ruleset.default-bucket-fs.name}"
project = google_project.fs.project_id
}
Este es el conjunto de reglas de seguridad de Cloud Firestore que debe estar en un archivo local llamado firestore.rules
.
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
allow read: if request.auth != null;
allow create: if request.auth != null;
allow update: if request.auth != null;
}
}
Este es el conjunto de reglas de seguridad de Cloud Storage que debe estar en un archivo local llamado storage.rules
.
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
Proteja un recurso API con Firebase App Check
Esta configuración crea un nuevo proyecto de Google Cloud, habilita los servicios de Firebase para el proyecto y configura y habilita la aplicación de Firebase App Check para Cloud Firestore para que solo se pueda acceder a ella desde su aplicación de 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"
# 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.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"
# Wait for Firebase to be enabled in the Google Cloud project before initializing Firestore.
depends_on = [
google_firebase_project.appcheck,
]
}
# 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
]
}
# It takes a while for App Check to recognize the new app
# If your app already exists, you don't have to wait 30 seconds.
resource "time_sleep" "wait_30s" {
depends_on = [google_firebase_android_app.appcheck]
create_duration = "30s"
}
# 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 = [time_sleep.wait_30s, 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]
}
Instalar una instancia de una extensión de Firebase
Esta configuración crea un nuevo proyecto de Google Cloud, habilita los servicios de Firebase para el proyecto e instala una nueva instancia de una extensión de Firebase en el proyecto. Si la instancia ya existe, sus parámetros se actualizan según los valores proporcionados en la configuración.
# 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"
# Required for the project to display in a list of Firebase projects.
labels = {
"firebase" = "enabled"
}
}
# 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_project.extensions.project_id
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"
}
}
}
Solución de problemas y preguntas frecuentes
Desea obtener más información sobre los diferentes atributos relacionados con el proyecto (como project
y user_project_override
).
Esta guía utiliza los siguientes atributos de Terraform cuando trabaja con "proyectos".
-
project
dentro de un bloqueresource
Recomendado: siempre que sea posible, incluya el atributo
project
dentro de cada bloqueresource
.Al incluir un atributo de proyecto, Terraform creará la infraestructura especificada en el bloque de recursos dentro del proyecto especificado. Esta guía y nuestros archivos de configuración de muestra utilizan esta práctica.
Consulte la documentación oficial de Terraform sobre
project
.-
user_project_override
dentro del bloqueprovider
Para aprovisionar la mayoría de los recursos, debe usar
user_project_override = true
, lo que significa comparar la cuota con su propio proyecto de Firebase. Sin embargo, para configurar su nuevo proyecto de modo que pueda aceptar controles de cuota, primero debe usaruser_project_override = false
.Consulte la documentación oficial de Terraform sobre
user_project_override
.
Aparece este error: generic::permission_denied: Firebase Tos Not Accepted
.
Asegúrate de que la cuenta de usuario que estás usando para ejecutar los comandos de gCloud CLI haya aceptado los Términos de servicio de Firebase (Firebase ToS).
Puede realizar esta verificación utilizando un navegador que haya iniciado sesión en la cuenta de usuario e intentando ver un proyecto de Firebase existente en Firebase console . Si puede ver un proyecto de Firebase existente, entonces la cuenta de usuario aceptó los ToS de Firebase.
Si no puede ver ningún proyecto de Firebase existente, entonces la cuenta de usuario probablemente no haya aceptado los ToS de Firebase. Para solucionar este problema, cree un nuevo proyecto de Firebase a través de Firebase console y acepte los ToS de Firebase como parte de la creación del proyecto. Puede eliminar este proyecto inmediatamente a través de Configuración del proyecto en la consola.
Después de ejecutar terraform apply
, aparece este error: generic::permission_denied: IAM authority does not have the permission
.
Espere unos minutos y luego intente ejecutar terraform apply
nuevamente.
La creación de un recurso falló, pero cuando ejecuta terraform apply
nuevamente, dice ALREADY_EXISTS
.
Esto podría deberse a un retraso en la propagación en varios sistemas. Intente resolver este problema importando el recurso al estado Terraform ejecutando terraform import
. Luego intente ejecutar terraform apply
nuevamente.
Puede aprender cómo importar cada recurso en la sección "Importar" de su documentación de Terraform (por ejemplo, la documentación "Importar" de Cloud Firestore ).
Cuando trabaja con Cloud Firestore, aparece este error: Error creating Index: googleapi: Error 409;...Concurrent access -- try again
Como sugiere el error, Terraform puede estar intentando aprovisionar varios índices y/o crear un documento al mismo tiempo y se encontró con un error de concurrencia. Intente ejecutar terraform apply
nuevamente.
Aparece este error: "you may need to specify 'X-Goog-User-Project' HTTP header for quota and billing purposes"
.
Este error significa que Terraform no sabe con qué proyecto verificar la cuota. Para solucionar problemas, verifique lo siguiente en el bloque resource
:
- Asegúrese de haber especificado un valor para el atributo
project
. - Asegúrate de estar usando el proveedor con
user_project_override = true
(sin alias), que en los ejemplos de Firebase esgoogle-beta
.
Al crear un nuevo proyecto de Google Cloud, aparece el error de que el ID del proyecto especificado para el nuevo proyecto ya existe.
Estas son las posibles razones por las que es posible que el ID del proyecto ya exista:
El proyecto asociado con ese ID pertenece a otra persona.
- Para resolverlo: elija otro ID de proyecto.
El proyecto asociado con ese ID se eliminó recientemente (en estado de eliminación temporal).
- Para resolverlo: si cree que el proyecto asociado con el ID le pertenece, verifique el estado del proyecto usando la API REST de
projects.get
.
- Para resolverlo: si cree que el proyecto asociado con el ID le pertenece, verifique el estado del proyecto usando la API REST de
El proyecto asociado con ese ID existe correctamente bajo el usuario actual. Una posible causa del error podría ser que se haya interrumpido una
terraform apply
anterior.- Para resolver: ejecute los siguientes comandos:
terraform import google_project.default PROJECT_ID
y luego
terraform import google_firebase_project.default PROJECT_ID
- Para resolver: ejecute los siguientes comandos:
Al intentar aprovisionar Cloud Firestore y luego Cloud Storage (a través de google_app_engine_application
), aparece este error: Error: Error creating App Engine application: googleapi: Error 409: Cannot create Firestore database resource <resource-name> since it already exists at location <location-id>, alreadyExists
.
Una aplicación de App Engine requiere una instancia de Cloud Firestore, pero solo puedes tener una instancia de Cloud Firestore por proyecto. Entonces, como sugiere el mensaje de error, si ya aprovisionó la instancia de Cloud Firestore del proyecto en una ubicación, App Engine generará un error si intenta aprovisionar una instancia de Cloud Firestore en una ubicación diferente. App Engine cree que estás intentando "reaprovisionar" la instancia de Cloud Firestore ya existente.
Para resolver este error, use la misma ubicación para Cloud Firestore y la aplicación App Engine. Si necesita un depósito de Cloud Storage en una ubicación diferente a la de Cloud Firestore, puede aprovisionar depósitos adicionales (consulte la configuración de ejemplo para crear varios depósitos de Cloud Storage ).
Al intentar aprovisionar Cloud Storage (a través de google_app_engine_application
) y luego Cloud Firestore, aparece este error: Error: Error creating Database: googleapi: Error 409: Database already exists. Please use another database_id
.
Cuando aprovisionas el depósito de Cloud Storage predeterminado de un proyecto (a través de google_app_engine_application
) y el proyecto aún no tiene una instancia de Cloud Firestore, google_app_engine_application
aprovisiona automáticamente la instancia de Cloud Firestore del proyecto.
Por lo tanto, si la instancia de Cloud Firestore de su proyecto ya está aprovisionada, google_firestore_database
generará un error si intenta aprovisionar explícitamente una instancia de Cloud Firestore.
Una vez que se aprovisiona la instancia de Cloud Firestore del proyecto, no puedes "reaprovisionarla" ni cambiar su ubicación. Para evitar que ocurra el error, elimine el bloque de recursos google_firestore_database
de su archivo de configuración. Sin embargo, tenga en cuenta que recomendamos aprovisionar Cloud Firestore antes del depósito de Cloud Storage predeterminado del proyecto (consulte el apartado a continuación para saber por qué).