1. Introducción
Objetivos
Puede utilizar Terraform para configurar y administrar un proyecto de Firebase, incluida la configuración programática de la infraestructura y los productos de Firebase.
Este codelab primero describe cómo crear un archivo de configuración de Terraform para crear un nuevo proyecto de Firebase, seguido de cómo configurar las aplicaciones y los productos de Firebase que desea usar en ese proyecto. También cubrimos los conceptos básicos de la línea de comandos de Terraform, como obtener una vista previa de los cambios que se realizarán y luego implementarlos.
Si desea aprender cómo configurar y administrar proyectos y productos de Firebase con Terraform, ¡este codelab es para usted!
lo que aprenderás
- Cómo crear un archivo de configuración de Terraform (
*.tf
) - Cómo utilizar los comandos CLI de Terraform para gestionar su infraestructura
- Cómo modificar tu configuración para actualizar tus recursos y servicios
- Cómo aplicar su configuración en una aplicación web real (llamada Friendly Chat )
- Cómo definir configuraciones paralelas (y sincronizadas) en diferentes entornos (producción, puesta en escena, etc.)
Lo que necesitarás
- Un terminal/consola
- El IDE/editor de texto de su elección, como WebStorm , Atom , Sublime o VS Code
- El navegador de tu elección, como Chrome
- La CLI de Google Cloud (gCloud CLI): instale esta CLI e inicie sesión con una cuenta de usuario o una cuenta de servicio
Para tener éxito con este codelab, necesita conocimientos básicos de Terraform y su terminología, incluidos los siguientes requisitos previos:
- Instale Terraform y familiarícese con Terraform utilizando sus tutoriales oficiales.
Este codelab proporciona una aplicación de muestra real para que puedas probar e interactuar con lo que aprovisionas a través de Terraform. Para hacer esto, necesitará lo siguiente:
- El código de muestra para una aplicación web: descargue este código en el siguiente paso del codelab
- El administrador de paquetes npm (que normalmente viene con Node.js ): instale estas herramientas
- Firebase CLI : instale esta CLI e inicie sesión
2. Obtenga el código de inicio
En este codelab, puedes probar lo que aprovisionas a través de Terraform con una aplicación web real. Recomendamos hacer esto para comprender todos los pasos necesarios para utilizar los recursos proporcionados por Terraform.
Clona el repositorio GitHub del codelab desde la línea de comando:
git clone https://github.com/firebase/codelab-friendlychat-web
Alternativamente, si no tienes git instalado, puedes descargar el repositorio como un archivo ZIP .
3. Cree una configuración de Terraform
Configuración de Terraform
- En el código base de la aplicación de muestra descargada, navegue hasta la raíz del directorio
web
. - En la raíz de ese directorio, cree un archivo de configuración de Terraform llamado
main.tf
con la siguiente configuración inicial:
main.tf# Terraform configuration to set up providers by version. terraform { required_providers { google-beta = { source = "hashicorp/google-beta" version = "~> 4.0" } } } # Configure the provider not to use the specified project for quota check. # This provider should only be used during project creation and initializing services. provider "google-beta" { alias = "no_user_project_override" user_project_override = false } # Configure the provider that uses the new project's quota. provider "google-beta" { user_project_override = true }
Cada uno de los proveedores google-beta
tiene un atributo llamado user_project_override
que determina cómo se verificarán las cuotas de las operaciones de Terraform. 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 usar user_project_override=false
. La sintaxis alias
Terraform le permite distinguir entre las dos configuraciones de proveedores en los siguientes pasos de este codelab.
Inicialice Terraform en el directorio
Crear una nueva configuración por primera vez requiere descargar el proveedor especificado en la configuración.
Para realizar esta inicialización, ejecute el siguiente comando desde la raíz del mismo directorio que su archivo de configuración main.tf
:
terraform init
4. Cree un proyecto de Firebase a través de Terraform
Para "crear un proyecto de Firebase", es importante recordar que cada proyecto de Firebase es en realidad un proyecto de Google Cloud, solo que con los servicios de Firebase habilitados.
Agregar bloques para el proyecto subyacente de Google Cloud y las API
- Primero, aprovisione el proyecto subyacente de Google Cloud.
A su archivo de configuraciónmain.tf
, agregue el siguiente bloque de recursos.
Debe especificar su propio nombre de proyecto (como"Terraform FriendlyChat Codelab"
) y su propio ID de proyecto (como"terraform-codelab-your-initials"
). Tenga en cuenta que el valorname
solo se usa dentro de las interfaces de Firebase y no es visible para los usuarios finales. Sin embargo, el valorproject_id
identifica de forma única su proyecto ante Google, así que asegúrese de especificar un valor único. main.tf... # Create a new Google Cloud project. resource "google_project" "default" { provider = google-beta.no_user_project_override name = "<PROJECT_NAME_OF_YOUR_PROJECT>" project_id = "<PROJECT_ID_OF_YOUR_PROJECT>" # Required for the project to display in any list of Firebase projects. labels = { "firebase" = "enabled" } }
- A continuación, debe habilitar las API subyacentes requeridas: la API de uso de servicios y la API de administración de Firebase.
Esta habilitación de API generalmente se maneja detrás de escena cuando usa Firebase console para crear un proyecto de Firebase, pero se debe indicar explícitamente a Terraform que realice esta habilitación.
A su archivo de configuraciónmain.tf
(justo debajo del bloque que crea el nuevo proyecto de nube), agregue el siguiente bloque de recursos:
main.tf
Al habilitar la API de uso del servicio, su nuevo proyecto podrá aceptar comprobaciones de cuota. Por lo tanto, para todo el aprovisionamiento de recursos y habilitación de servicios posteriores, debe utilizar el proveedor con... # Enable the required underlying Service Usage API. resource "google_project_service" "serviceusage" { provider = google-beta.no_user_project_override project = google_project.default.project_id service = "serviceusage.googleapis.com" # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enable the required underlying Firebase Management API. resource "google_project_service" "firebase" { provider = google-beta.no_user_project_override project = google_project.default.project_id service = "firebase.googleapis.com" # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false }
user_project_override
(no se necesita alias).
Agregue un bloque para habilitar los servicios de Firebase
Lo último que se requiere para "crear un proyecto de Firebase" es habilitar los servicios de Firebase en el proyecto.
Continuando con su archivo de configuración main.tf
, agregue el siguiente bloque de recursos.
Como se mencionó anteriormente, tenga en cuenta que este bloque de recursos utiliza el proveedor con user_project_override
(no se necesita alias).
principal.tf
...
# Enable Firebase services for the new project created above.
resource "google_firebase_project" "default" {
provider = google-beta
project = google_project.default.project_id
# Wait until the required APIs are enabled.
depends_on = [
google_project_service.firebase,
google_project_service.serviceusage,
]
}
En el bloque de recursos anterior, es posible que observe la cláusula depends_on
, que le indica a Terraform que espere a que se habiliten las API subyacentes. Sin esta cláusula, Terraform no conoce la dependencia y puede sufrir errores al aprovisionar recursos en paralelo.
Aplicar la configuración
- Para aprovisionar los nuevos recursos y habilitar las API especificadas en su archivo de configuración, ejecute el siguiente comando desde la raíz del mismo directorio que su archivo
main.tf
(que debería serweb
):terraform apply
- En la terminal, Terraform imprime un plan de acciones que realizará.
Si todo se ve como se esperaba, apruebe las acciones ingresandoyes
.
main.tfTerraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # google_firebase_project.default will be created + resource "google_firebase_project" "default" { + display_name = (known after apply) + id = (known after apply) + project = "terraform-friendlychat-codelab" + project_number = (known after apply) } # google_project.default will be created + resource "google_project" "default" { + auto_create_network = true + id = (known after apply) + labels = { + "firebase" = "enabled" } + name = "Terraform FriendlyChat Codelab" + number = (known after apply) + project_id = "terraform-friendlychat-codelab" + skip_delete = (known after apply) } # google_project_service.firebase will be created + resource "google_project_service" "firebase" { + disable_on_destroy = false + id = (known after apply) + project = "terraform-friendlychat-codelab" + service = "firebase.googleapis.com" } # google_project_service.serviceusage will be created + resource "google_project_service" "serviceusage" { + disable_on_destroy = false + id = (known after apply) + project = "terraform-friendlychat-codelab" + service = "serviceusage.googleapis.com" } Plan: 4 to add, 0 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes # <----
Tenga en cuenta que si solo necesita obtener una vista previa de los cambios sin aplicarlos, puede usar el comando terraform plan
en su lugar.
Validar los cambios
Una vez que Terraform termine de ejecutarse, puede inspeccionar el estado de todos los recursos y servicios aprovisionados de Terraform habilitados ejecutando el siguiente comando:
terraform show
A continuación se muestra un ejemplo de lo que debería ver impreso. Su estado contendrá valores específicos de su proyecto.
# google_firebase_project.default:
resource "google_firebase_project" "default" {
display_name = "Terraform FriendlyChat Codelab"
id = "projects/terraform-friendlychat-codelab"
project = "terraform-friendlychat-codelab"
project_number = "000000000"
}
# google_project.default:
resource "google_project" "default" {
auto_create_network = true
id = "projects/terraform-friendlychat-codelab"
labels = {
"firebase" = "enabled"
}
name = "Terraform FriendlyChat Codelab"
number = "000000000"
project_id = "terraform-friendlychat-codelab"
}
# google_project_service.firebase:
resource "google_project_service" "firebase" {
disable_on_destroy = false
id = "terraform-friendlychat-codelab/firebase.googleapis.com"
project = "terraform-friendlychat-codelab"
service = "firebase.googleapis.com"
}
# google_project_service.serviceusage:
resource "google_project_service" "serviceusage" {
disable_on_destroy = false
id = "terraform-friendlychat-codelab/serviceusage.googleapis.com"
project = "terraform-friendlychat-codelab"
service = "serviceusage.googleapis.com"
}
Alternativamente, puedes verificar que el proyecto se haya creado visualizándolo en Firebase console .
5. Registre su aplicación Firebase a través de Terraform
Para usar Firebase, debes registrar cada variante de plataforma de tu aplicación en tu proyecto de Firebase. En este codelab, utilizará una aplicación real para probar e interactuar con lo que aprovisiona a través de Terraform. Esta aplicación es una aplicación web, por lo que debe indicarle a Terraform que registre una aplicación web Firebase en su proyecto Firebase recién creado.
Agregue un bloque para registrar la aplicación web
Para registrar su aplicación web en su proyecto de Firebase, agregue su archivo main.tf
con el siguiente bloque de recursos.
Debe especificar su propio display_name
para su aplicación web. Tenga en cuenta que este nombre solo se usa dentro de las interfaces de Firebase y no es visible para los usuarios finales.
principal.tf
...
# Create a Firebase Web App in the new project created above.
resource "google_firebase_web_app" "default" {
provider = google-beta
project = google_firebase_project.default.project
display_name = "<DISPLAY_NAME_OF_YOUR_WEB_APP>"
deletion_policy = "DELETE"
}
Aplicar la configuración
- Para aprovisionar el nuevo recurso, ejecute el siguiente comando desde la raíz del mismo directorio que su archivo
main.tf
(que debería serweb
).terraform apply
Tenga en cuenta que este comando no volverá a crear un nuevo proyecto de Google Cloud. Terraform detectará que ya existe un proyecto con el ID de proyecto especificado y comparará el estado actual del proyecto con lo que hay en el archivo.tf
y realizará los cambios que encuentre. - Revisar el plan de acciones impreso. Si todo se ve como se esperaba, escriba
yes
y presione Entrar para aprobar las acciones.
Validar los cambios
Puede inspeccionar el estado del recurso recién aprovisionado ejecutando el siguiente comando:
terraform show
Alternativamente, puedes verificar que la aplicación se registró correctamente en tu proyecto viéndola en Firebase console. Vaya a Configuración del proyecto y luego desplácese hacia abajo hasta la sección Sus aplicaciones .
6. Configurar la autenticación de Firebase
La autenticación es una parte importante de cualquier aplicación. Para permitir que los usuarios finales inicien sesión en su aplicación web con sus cuentas de Google, puede habilitar la autenticación de Firebase y configurar el método de inicio de sesión con Google.
Tenga en cuenta que en este codelab proporcionamos dos opciones diferentes para configurar la autenticación de Firebase:
- Opción 1 (recomendada) : configurar Firebase Authentication en la consola, que no requiere GCIP.
- Usar esta opción significa que no tienes que asociar tu nuevo proyecto con una cuenta de facturación de Cloud.
- Opción 2 : configurar la autenticación de Firebase a través de Terraform utilizando las API de Google Cloud Identity Platform (GCIP).
- Usar esta opción significa que debe asociar su nuevo proyecto con una cuenta de facturación en la nube, ya que GCIP requiere que el proyecto esté en el plan de precios Blaze.
Opción 1: configurar la autenticación mediante Firebase console
Para configurar Firebase Authentication usando Firebase console, no es necesario que tu proyecto esté en el plan de precios de Blaze.
A continuación se explica cómo configurar la autenticación de Firebase e iniciar sesión con Google:
- En Firebase console , ubica la sección Build en el panel izquierdo.
- Haga clic en Autenticación , haga clic en Comenzar y luego haga clic en la pestaña Método de inicio de sesión (o haga clic aquí para ir directamente allí).
- Haga clic en Agregar nuevo proveedor y, en la sección Proveedores adicionales , seleccione Google .
- Active la palanca Habilitar .
- Establezca el nombre público de su aplicación en algo como
FriendlyChat
(no es necesario que sea globalmente único). - Elija un correo electrónico de soporte del proyecto en el menú desplegable y luego haga clic en Guardar .
- Deberías ver a Google como un proveedor de inicio de sesión habilitado.
Opción 2: configurar la autenticación a través de Terraform utilizando las API de Google Cloud Identity Platform (GCIP)
Para configurar Firebase Authentication a través de Terraform, debe usar las API de GCIP, lo que significa que el proyecto debe estar en el plan de precios de Blaze. Actualizas tu proyecto de Firebase para usar el plan Blaze asociando una cuenta de facturación de Cloud con el proyecto.
Habilitar facturación a través de Terraform
- Si aún no tienes una cuenta de facturación de Cloud, el primer paso es crear una nueva cuenta en Google Cloud Console . Cuando hagas esto, anota su ID de cuenta de facturación . El ID de la cuenta de facturación se puede ubicar en la página Facturación en el ID de la cuenta de facturación asociada con su proyecto.
- Para habilitar la facturación en su proyecto a través de Terraform, agregue un atributo
billing_account
al recursogoogle_project
existente en su archivomain.tf
:
main.tf... # Create a new Google Cloud project. resource "google_project" "default" { provider = google-beta.no_user_project_override name = "<PROJECT_NAME_OF_YOUR_PROJECT>" project_id = "<PROJECT_ID_OF_YOUR_PROJECT>" billing_account = "<YOUR_BILLING_ACCOUNT_ID>" # Add this line with your Cloud Billing account ID # Required for the project to display in any list of Firebase projects. labels = { "firebase" = "enabled" } } ...
Habilite la autenticación de Firebase e inicie sesión con Google a través de Terraform
- Para aprovisionar Firebase Authentication con GCIP, agregue su archivo
main.tf
con los siguientes bloques de recursos:
main.tf... # Enable the Identity Toolkit API. resource "google_project_service" "auth" { provider = google-beta project = google_firebase_project.default.project service = "identitytoolkit.googleapis.com" # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Create an Identity Platform config. # Also, enable Firebase Authentication using Identity Platform (if Authentication isn't yet enabled). resource "google_identity_platform_config" "auth" { provider = google-beta project = google_firebase_project.default.project # For example, you can configure to auto-delete anonymous users. autodelete_anonymous_users = true # Wait for identitytoolkit.googleapis.com to be enabled before initializing Authentication. depends_on = [ google_project_service.auth, ] }
- Para habilitar el inicio de sesión con Google es necesario tener un cliente OAuth . Vaya a la sección API y servicios de Google Cloud Console para realizar esta configuración.
- Dado que esta es la primera vez que crea una ID de cliente para este proyecto, debe configurar su pantalla de consentimiento de OAuth.
- Abra la página de la pantalla de consentimiento de OAuth y luego seleccione el proyecto que acaba de crear.
- Establezca el Tipo de usuario en Externo y luego haga clic en Crear .
- En la siguiente pantalla, complete lo siguiente y luego haga clic en Guardar y continuar .
- Establezca el nombre de la aplicación pública de su aplicación en algo como
FriendlyChat
(no es necesario que sea globalmente único). - Elija un correo electrónico de asistencia al usuario en el menú desplegable.
- Ingrese un correo electrónico para la información de contacto del desarrollador .
- Establezca el nombre de la aplicación pública de su aplicación en algo como
- En las siguientes pantallas, complete lo siguiente:
- Acepte los valores predeterminados en la página Ámbitos y luego haga clic en Guardar y continuar .
- Acepte los valores predeterminados en la página Probar usuarios y luego haga clic en Guardar y continuar .
- Revise el resumen y luego haga clic en Volver al panel .
- Configure un cliente OAuth en la página Credenciales haciendo lo siguiente:
- Haga clic en Crear credenciales y seleccione ID de cliente de OAuth .
- En el menú desplegable Tipo de aplicación , seleccione Aplicación web .
- En el campo Nombre , ingrese el nombre de su aplicación, por ejemplo
FriendlyChat
(no es necesario que sea globalmente único). - Permita que la URL de su aplicación utilice este cliente OAuth configurando lo siguiente:
- En Orígenes de JavaScript autorizados , haga clic en Agregar URI e ingrese
https://<PROJECT_ID>.firebaseapp.com
, donde<PROJECT_ID>
es el ID del proyecto que configuró enmain.tf
- En URI de redireccionamiento autorizados , haga clic en Agregar URI e ingrese
https://<PROJECT_ID>.firebaseapp.com/__/auth/handler
, donde<PROJECT_ID>
es el ID del proyecto que configuró enmain.tf
- En Orígenes de JavaScript autorizados , haga clic en Agregar URI e ingrese
- Clic en Guardar .
- Para habilitar el inicio de sesión con Google utilizando su ID de cliente de OAuth y su secreto de cliente, agregue su archivo
main.tf
con el siguiente bloque:
main.tf... variable "oauth_client_secret" { type = string description = "OAuth client secret. For this codelab, you can pass in this secret through the environment variable TF_VAR_oauth_client_secret. In a real app, you should use a secret manager service." sensitive = true } resource "google_identity_platform_default_supported_idp_config" "google_sign_in" { provider = google-beta project = google_firebase_project.default.project enabled = true idp_id = "google.com" client_id = "<YOUR_OAUTH_CLIENT_ID>" client_secret = var.oauth_client_secret depends_on = [ google_identity_platform_config.auth ] }
Aplicar la configuración
- Para configurar la autenticación de acuerdo con su configuración, ejecute los siguientes comandos desde la raíz del mismo directorio que su archivo
main.tf
(que debería serweb
):export TF_VAR_oauth_client_secret="<YOUR_OAUTH_CLIENT_SECRET>"
terraform apply
Tenga en cuenta que ejecutarterraform apply
no volverá a crear un nuevo proyecto de Google Cloud. Terraform detectará que ya existe un proyecto con el ID de proyecto especificado y comparará el estado actual del proyecto con lo que hay en el archivo.tf
. Luego realizará los cambios que encuentre. - Revisar el plan de acciones impreso. Si todo se ve como se esperaba, escriba
yes
y presione Entrar para aprobar las acciones.
Validar los cambios
- En Firebase console , ubica la sección Build en el panel izquierdo.
- Haga clic en Autenticación y luego haga clic en la pestaña Método de inicio de sesión (o haga clic aquí para ir directamente allí).
- Deberías ver a Google como un proveedor de inicio de sesión habilitado.
7. Configure una base de datos de Firestore y sus reglas de seguridad
Para la aplicación web de este codelab, almacenarás mensajes entre usuarios finales en una base de datos de Firestore.
- Para habilitar las API requeridas y aprovisionar la instancia de la base de datos, agregue su archivo
main.tf
con los siguientes bloques de recursos:
main.tf... # Enable required APIs for Cloud Firestore. resource "google_project_service" "firestore" { provider = google-beta project = google_firebase_project.default.project for_each = toset([ "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 } # Provision the Firestore database instance. resource "google_firestore_database" "default" { provider = google-beta project = google_firebase_project.default.project name = "(default)" # See available locations: # https://firebase.google.com/docs/firestore/locations location_id = "<NAME_OF_DESIRED_REGION>" # "FIRESTORE_NATIVE" is required to use Firestore with Firebase SDKs, # authentication, and Firebase Security Rules. type = "FIRESTORE_NATIVE" concurrency_mode = "OPTIMISTIC" depends_on = [ google_project_service.firestore ] }
- Cambie
<NAME_OF_DESIRED_REGION>
a la región donde desea que resida la base de datos.
Al desarrollar una aplicación de producción, querrás que esté en una región cercana a la mayoría de los usuarios y en común con otros servicios de Firebase, como Cloud Functions. Para este codelab, puedes usarus-east1
(Carolina del Sur) o usar la región más cercana a ti (consulta Ubicaciones de Cloud Firestore ). - Cada instancia de base de datos de Firestore a la que Firebase puede acceder debe estar protegida por las reglas de seguridad de Firebase .
El código de muestra de este codelab proporciona un conjunto de reglas seguras de Firestore en el archivofirestore.rules
, que puede encontrar en la raíz del directorioweb
. - Agregue su archivo
main.tf
con los siguientes bloques de recursos para hacer lo siguiente:- Cree un conjunto de reglas de reglas de seguridad de Firebase desde el archivo
firestore.rules
local. - Libere el conjunto de reglas para la instancia de Firestore.
firebase deploy --only firestore:rules
.
main.tf... # Create a ruleset of Firestore Security Rules from a local file. resource "google_firebaserules_ruleset" "firestore" { provider = google-beta project = google_firebase_project.default.project source { files { name = "firestore.rules" # Write security rules in a local file named "firestore.rules". # Learn more: https://firebase.google.com/docs/firestore/security/get-started content = file("firestore.rules") } } # Wait for Firestore to be provisioned before creating this ruleset. depends_on = [ google_firestore_database.default, ] } # Release 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_firebase_project.default.project # Wait for Firestore to be provisioned before releasing the ruleset. depends_on = [ google_firestore_database.default, ] lifecycle { replace_triggered_by = [ google_firebaserules_ruleset.firestore ] } }
- Cree un conjunto de reglas de reglas de seguridad de Firebase desde el archivo
- Ejecute
terraform apply
para aprovisionar la base de datos de Firestore e implementar sus reglas de seguridad. - Verifique que la base de datos esté aprovisionada y que sus reglas de seguridad estén implementadas:
- En Firebase console , ubica la sección Build en el panel izquierdo.
- Vaya a la sección Base de datos de Firestore y luego haga clic en la pestaña Reglas .
8. Configure un depósito de Cloud Storage y sus reglas de seguridad
Para la aplicación web de este codelab, almacenarás imágenes compartidas entre usuarios finales en un depósito de Cloud Storage.
- Para habilitar las API requeridas y aprovisionar su depósito predeterminado de Cloud Storage, agregue su archivo
main.tf
con los siguientes bloques de recursos.
Tenga en cuenta que el depósito de Cloud Storage predeterminado para su proyecto se aprovisiona a través de Google App Engine y debe tener la misma ubicación que su base de datos de Firestore. Consulte Ubicaciones de App Engine para obtener más información.
Si desea varios depósitos en su proyecto, aprovisionelos utilizando el recursogoogle_storage_bucket
(no se muestra en este codelab).
main.tf... # Enable required APIs for Cloud Storage for Firebase. resource "google_project_service" "storage" { provider = google-beta project = google_firebase_project.default.project for_each = toset([ "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 } # Provision the default Cloud Storage bucket for the project via Google App Engine. resource "google_app_engine_application" "default" { provider = google-beta project = google_firebase_project.default.project # 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_DESIRED_REGION_FOR_DEFAULT_BUCKET>" # Must be in the same location as Firestore (above) # Wait until Firestore is provisioned first. depends_on = [ google_firestore_database.default ] } # Make 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_firebase_project.default.project bucket_id = google_app_engine_application.default.default_bucket }
- Cada depósito de Cloud Storage al que puede acceder Firebase debe estar protegido por las reglas de seguridad de Firebase .
El código de muestra de este codelab proporciona un conjunto de reglas seguras de Firestore en el archivostorage.rules
, que puede encontrar en la raíz del directorioweb
. - Agregue su archivo
main.tf
con los siguientes bloques de recursos para hacer lo siguiente:- Cree un conjunto de reglas de reglas de seguridad de Firebase a partir del archivo local.
- Libere el conjunto de reglas para el depósito de almacenamiento.
firebase deploy --only storage
.
main.tf... # Create a ruleset of Cloud Storage Security Rules from a local file. resource "google_firebaserules_ruleset" "storage" { provider = google-beta project = google_firebase_project.default.project source { files { # Write security rules in a local file named "storage.rules". # Learn more: https://firebase.google.com/docs/storage/security/get-started name = "storage.rules" content = file("storage.rules") } } # Wait for the default Storage bucket to be provisioned before creating this ruleset. depends_on = [ google_firebase_storage_bucket.default-bucket, ] } # Release 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_firebase_project.default.project}/rulesets/${google_firebaserules_ruleset.storage.name}" project = google_firebase_project.default.project lifecycle { replace_triggered_by = [ google_firebaserules_ruleset.storage ] } }
- Ejecute
terraform apply
para aprovisionar el depósito predeterminado de Cloud Storage e implementar sus reglas de seguridad. - Verifique que el depósito esté aprovisionado y que sus reglas de seguridad estén implementadas:
- En Firebase console , ubica la sección Build en el panel izquierdo.
- Vaya a la sección Almacenamiento y luego haga clic en la pestaña Reglas .
9. Ejecute su aplicación localmente
¡Ya está listo para ejecutar su aplicación web por primera vez! Utilizará el emulador de Firebase Hosting para ofrecer su aplicación localmente.
- Abra una nueva ventana de terminal y, desde el directorio
web
, ejecute el siguiente comando de Firebase CLI para iniciar el emulador:firebase emulators:start --project=<PROJECT_ID>
- En su navegador, abra su aplicación web en la URL local devuelta por la CLI (normalmente
http://localhost:5000
).
Deberías ver la interfaz de usuario de tu aplicación FriendlyChat, que (¡todavía!) no funciona. La aplicación aún no está conectada a Firebase, pero al completar los siguientes pasos de este codelab, ¡lo estará!
Tenga en cuenta que cada vez que realice cambios en su aplicación web (como lo hará en los siguientes pasos de este codelab), actualice su navegador para actualizar la URL local con esos cambios.
10. Instalar, configurar e inicializar Firebase
Para que una aplicación funcione con Firebase, su aplicación necesita el SDK de Firebase y la configuración de Firebase para su proyecto de Firebase.
El código de muestra para este codelab ya es una aplicación funcional con todas las dependencias y funciones necesarias para usar varios productos de Firebase en la aplicación. Puede buscar en web/package.json
y web/src/index.js
si desea ver lo que ya se ha hecho.
Aunque el código de muestra está casi completo, aún necesita hacer algunas cosas para que su aplicación se ejecute, que incluyen: instalar el SDK de Firebase, iniciar su compilación, agregar la configuración de Firebase a su aplicación y, finalmente, inicializar Firebase.
Instale el SDK de Firebase y comience la compilación de su paquete web
Debes ejecutar algunos comandos para iniciar la compilación de tu aplicación.
- Abra una nueva ventana de terminal.
- Asegúrate de estar en la raíz del directorio
web
. - Ejecute
npm install
para descargar el SDK de Firebase. - Ejecute
npm update
para actualizar cualquier dependencia. - Ejecute
npm run start
para iniciar el paquete web.
Para el resto del codelab, webpack ahora reconstruirá continuamente su código fuente.
Agrega tu configuración de Firebase a tu aplicación
También debes agregar tu configuración de Firebase a tu aplicación para que los SDK de Firebase sepan qué proyecto de Firebase quieres que usen.
Para este codelab, tienes dos opciones diferentes para obtener tu configuración de Firebase:
- Opción 1 : obtenga su configuración de Firebase desde la consola de Firebase.
- Opción 2 : obtenga su configuración de Firebase a través de Terraform.
Opción 1: obtenga la configuración de Firebase console y agréguela a su código base
- En Firebase console, ve a la configuración de tu proyecto .
- Desplácese hacia abajo hasta la tarjeta Sus aplicaciones y luego seleccione su aplicación web.
- Seleccione Configuración en el panel de fragmentos del SDK de Firebase y luego copie el fragmento de configuración.
- Pega tu configuración en el archivo
web/src/firebase-config.js
de tu aplicación, así:
firebase-config.js... const config = { apiKey: "<API_KEY>", authDomain: "<PROJECT_ID>.firebaseapp.com", projectId: "<PROJECT_ID>", storageBucket: "<PROJECT_ID>.appspot.com", messagingSenderId: "<SENDER_ID>", appId: "<APP_ID>", measurementId: "<G-MEASUREMENT_ID>", }; ...
Opción 2: obtenga la configuración a través de Terraform y agréguela a su código base
Alternativamente, puede obtener su configuración de Firebase a través de Terraform como valor de salida en la CLI.
- En su archivo
main.tf
, busque su bloque de recursosgoogle_firebase_web_app
(el bloque que registró una aplicación web con su proyecto). - Inmediatamente después de ese bloque, agregue los siguientes bloques:
main.tf... data "google_firebase_web_app_config" "default" { provider = google-beta project = google_firebase_project.default.project web_app_id = google_firebase_web_app.default.app_id } output "friendlychat_web_app_config" { value = { projectId = google_firebase_project.default.project appId = google_firebase_web_app.default.app_id apiKey = data.google_firebase_web_app_config.default.api_key authDomain = data.google_firebase_web_app_config.default.auth_domain storageBucket = lookup(data.google_firebase_web_app_config.default, "storage_bucket", "") messagingSenderId = lookup(data.google_firebase_web_app_config.default, "messaging_sender_id", "") measurementId = lookup(data.google_firebase_web_app_config.default, "measurement_id", "") } } ...
- Dado que el bloque
data
y el bloqueoutput
no están destinados a modificar la infraestructura de ninguna manera, solo necesita ejecutar los siguientes comandos.- Para cargar la configuración de Firebase de su aplicación web en el estado Terraform de su directorio, ejecute este comando:
terraform refresh
- Para imprimir los valores de configuración de Firebase, ejecute este comando:
terraform output –json
El siguiente es un ejemplo de resultado de una configuración. Su salida impresa contendrá los valores de su proyecto y aplicación.{ "friendlychat_web_app_config": { "sensitive": false, "type": [ "object", { "apiKey": "string", "appId": "string", "authDomain": "string", "measurementId": "string", "messagingSenderId": "string", "projectId": "string", "storageBucket": "string" } ], "value": { "apiKey": "<API_KEY>", "appId": "<APP_ID>", "authDomain": "<PROJECT_ID>.firebaseapp.com", "measurementId": "<G-MEASUREMENT_ID>", "messagingSenderId": "<SENDER_ID>", "projectId": "<PROJECT_ID>", "storageBucket": "<PROJECT_ID>.appspot.com" } } }
- Para cargar la configuración de Firebase de su aplicación web en el estado Terraform de su directorio, ejecute este comando:
- Copie los valores desde dentro del mapa
value
. - Pegue estos valores (su configuración) en el archivo
web/src/firebase-config.js
de su aplicación, así:
firebase-config.js... const config = { apiKey: "<API_KEY>", appId: "<APP_ID>", authDomain: "<PROJECT_ID>.firebaseapp.com", measurementId: "<G-MEASUREMENT_ID>", messagingSenderId: "<SENDER_ID>", projectId: "<PROJECT_ID>", storageBucket: "<PROJECT_ID>.appspot.com", }; ...
Inicializa Firebase en tu aplicación
Finalmente, para inicializar Firebase, agregue el archivo web/src/index.js
de su aplicación con lo siguiente:
...
const firebaseAppConfig = getFirebaseConfig();
initializeApp(firebaseAppConfig);
Prueba tu aplicación
Ahora que todo está configurado para Firebase, puedes probar tu aplicación web funcional.
- Actualiza el navegador que sirve tu aplicación.
- Ahora debería poder iniciar sesión en Google y comenzar a publicar mensajes en el chat. Si tienes archivos de imágenes, ¡incluso puedes subirlos!
11. Replica tu configuración en todos los entornos
Terraform se destaca en la administración de múltiples infraestructuras configuradas de manera similar (por ejemplo, configurando un proyecto provisional de Firebase que es similar a un proyecto de producción).
En este codelab, crearás un segundo proyecto de Firebase como entorno de prueba.
Para replicar una configuración existente para crear este proyecto provisional, tiene dos opciones:
- Opción 1 : hacer una copia de la configuración de Terraform.
Esta opción ofrece la mayor flexibilidad en cuanto a cuánto puede diferir el proyecto replicado del proyecto de origen. - Opción 2 : reutilizar configuraciones con
for_each
.
Esta opción ofrece más reutilización de código si cada proyecto no debe diferir de manera significativa y desea propagar los cambios a todos los proyectos a la vez.
Opción 1: hacer una copia de la configuración de Terraform
Esta opción ofrece la mayor flexibilidad en cuanto a cuánto puede diferir el proyecto replicado del proyecto de origen, como tener aplicaciones con diferentes nombres para mostrar e implementaciones por etapas.
- En la raíz de su directorio
web
, cree un nuevo archivo de configuración de Terraform llamadomain_staging.tf
. - Copie todos los bloques de recursos de su archivo
main.tf
(excepto los bloquesterraform
yprovider
) y luego péguelos en su archivomain_staging.tf
. - Luego deberá modificar cada uno de sus bloques de recursos replicados en
main_staging.tf
para que funcionen con su proyecto de prueba:- Etiquetas de recursos: utilice un nombre nuevo para evitar conflictos. Por ejemplo, cambie el nombre
resource "google_project" "default"
aresource "google_project" "staging"
. - Referencias de recursos: actualice cada una. Por ejemplo, actualice
google_firebase_project.default.project
agoogle_firebase_project.staging.project
.
main_staging.tf
en el repositorio GitHub de este codelab:
web/terraform-checkpoints/replicate-config/main_staging-copypaste.tf
Si desea utilizar esta configuración, asegúrese de hacer lo siguiente:- Copie la configuración de
main_staging-copypaste.tf
y luego péguela en su archivomain_staging.tf
. - En su archivo
main_staging.tf
, haga lo siguiente:- En el bloque de recursos
google_project
, actualice el atributoname
, el atributoproject-id
y (si configura la autenticación a través de Terraform) el atributobilling_account
con sus propios valores. - En el bloque de recursos
google_firebase_web_app
, actualice el atributodisplay_name
con su propio valor. - En los bloques de recursos
google_firestore_database
ygoogle_app_engine_application
, actualice los atributoslocation_id
con su propio valor.
- En el bloque de recursos
# Create a new Google Cloud project. resource "google_project" "staging" { provider = google-beta.no_user_project_override name = "<PROJECT_NAME_OF_STAGING_PROJECT>" project_id = "<PROJECT_ID_OF_STAGING_PROJECT" # Required if you want to set up Authentication via Terraform billing_account = "<YOUR_BILLING_ACCOUNT_ID>" # Required for the project to display in any list of Firebase projects. labels = { "firebase" = "enabled" } } # Enable the required underlying Service Usage API. resource "google_project_service" "staging_serviceusage" { provider = google-beta.no_user_project_override project = google_project.staging.project_id service = "serviceusage.googleapis.com" # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enable the required underlying Firebase Management API. resource "google_project_service" "staging_firebase" { provider = google-beta.no_user_project_override project = google_project.staging.project_id service = "firebase.googleapis.com" # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enable Firebase services for the new project created above. resource "google_firebase_project" "staging" { provider = google-beta project = google_project.staging.project_id # Wait until the required APIs are enabled. depends_on = [ google_project_service.staging_serviceusage, google_project_service.staging_firebase, ] } # Create a Firebase Web App in the new project created above. resource "google_firebase_web_app" "staging" { provider = google-beta project = google_firebase_project.staging.project display_name = "<DISPLAY_NAME_OF_YOUR_WEB_APP>" deletion_policy = "DELETE" }
- Etiquetas de recursos: utilice un nombre nuevo para evitar conflictos. Por ejemplo, cambie el nombre
- Ejecute
terraform apply
para aprovisionar su nuevo proyecto "ensayo" de Firebase y todos sus recursos y habilitar sus servicios. - Verifique que todo esté aprovisionado y habilitado como se esperaba revisándolos en Firebase console como antes.
Opción 2: reutilizar configuraciones con for_each
Esta opción ofrece más reutilización de código si cada proyecto no debe diferir de manera significativa y desea propagar los cambios a todos los proyectos a la vez. Utiliza el metaargumento for_each
en el lenguaje Terraform.
- Abra su archivo
main.tf
- En cada bloque de recursos que desee replicar, agregue un metaargumento
for_each
, así:
main.tf
Puedes encontrar la configuración completa de un archivo# Create new Google Cloud projects. resource "google_project" "default" { provider = google-beta.no_user_project_override name = each.value # Create a unique project ID for each project, with each ID starting with <PROJECT_ID>. project_id = "<PROJECT_ID>-${each.key}" # Required if you want to set up Authentication via Terraform billing_account = "<YOUR_BILLING_ACCOUNT_ID>" # Required for the projects to display in any list of Firebase projects. labels = { "firebase" = "enabled" } for_each = { prod = "<PROJECT_NAME_OF_PROD_PROJECT>" staging = "<PROJECT_NAME_OF_STAGING_PROJECT>" } } # Enable the required underlying Service Usage API. resource "google_project_service" "serviceusage" { provider = google-beta.no_user_project_override for_each = google_project.default project = each.value.project_id service = "serviceusage.googleapis.com" # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enable the required underlying Firebase Management API. resource "google_project_service" "firebase" { provider = google-beta.no_user_project_override for_each = google_project.default project = each.value.project_id service = "firebase.googleapis.com" # Don't disable the service if the resource block is removed by accident. disable_on_destroy = false } # Enable Firebase services for each of the new projects created above. resource "google_firebase_project" "default" { provider = google-beta for_each = google_project.default project = each.value.project_id depends_on = [ google_project_service.serviceusage, google_project_service.firebase, ] } # Create a Firebase Web App in each of the new projects created above. resource "google_firebase_web_app" "default" { provider = google-beta for_each = google_firebase_project.default project = each.value.project # The Firebase Web App created in each project will have the same display name. display_name = "<DISPLAY_NAME_OF_YOUR_WEB_APP>" deletion_policy = "DELETE" } # NOTE: For this codelab, we recommend setting up Firebase Authentication # using the Firebase console. However, if you set up Firebase Authentication # using Terraform, copy-paste from your main.tf the applicable blocks. # Make sure to add the `for_each` meta-argument into each block. # Copy-paste from your main.tf file the applicable resource blocks # for setting up Cloud Firestore (including rules) and # for setting up Cloud Storage for Firebase (including rules). # Make sure to add the `for_each` meta-argument into each block.
main.tf
que utiliza el metaargumentofor_each
en el repositorio GitHub de este codelab:
web/terraform-checkpoints/replicate-config/main-foreach.tf
Si desea utilizar esta configuración, asegúrese de hacer lo siguiente:- Copie la configuración de
main-foreach.tf
y luego péguela en su archivomain.tf
- En su archivo
main.tf
, haga lo siguiente:- En el bloque de recursos
google_project
, actualice el atributoname
, el atributoproject-id
y (si configura la autenticación a través de Terraform) el atributobilling_account
con sus propios valores. - En el bloque de recursos
google_firebase_web_app
, actualice el atributodisplay_name
con su propio valor. - En
google_firestore_database
ygoogle_app_engine_application
Bloques de recursos, actualice los atributoslocation_id
con su propio valor.
- En el bloque de recursos
- Copie la configuración de
- En lugar de aplicar esta configuración de inmediato, es importante comprender y arreglar algunas cosas sobre cómo Terraform interpreta esta configuración en comparación con la infraestructura existente.
- En este momento, si aplicó esta configuración que usa
for_each
, las direcciones de recursos se verían como las siguientes:
Sin embargo, el proyecto existente que creó en la primera parte de este Codelab se sabe que Terraform como el siguiente:google_project.default["prod"] google_project.default["staging"] google_firebase_project.default["prod"] google_firebase_project.default["staging"] google_firebase_web_app.default["prod"] google_firebase_web_app.default["staging"]
google_project.default google_firebase_project.default google_firebase_android_app.default
- Ejecute
terraform plan
para ver qué acciones tomarían Terraform dado el estado actual.
La salida debe mostrar que Terraform eliminaría el proyecto que creó en la primera parte de este Codelab y crearía dos proyectos nuevos. Esto se debe a que Terraform no sabe que el proyecto en la direccióngoogle_project.default
se ha trasladado a la nueva direccióngoogle_project.default["prod"]
. - Para solucionar esto, ejecute el comando
terraform state mv
:terraform state mv "google_project.default" "google_project.default[\"prod\"]"
- Del mismo modo, para corregir todos los otros bloques de recursos, ejecute
terraform state mv
paragoogle_firebase_project
,google_firebase_web_app
y todos los demás bloques de recursos en su archivomain.tf
- Ahora, si vuelve a ejecutar
terraform plan
, no debería demostrar que Terraform eliminaría el proyecto que creó en la primera parte de este Codelab.
- En este momento, si aplicó esta configuración que usa
- Ejecute
terraform apply
para aprovisionar su nuevo proyecto de Firebase de "puesta en escena" y todos sus recursos y habilitar sus servicios. - Verifique que todo fue aprovisionado y habilitado como se esperaba al verificarlos en la consola Firebase como antes.
12. Paso de bonificación: implementa sus aplicaciones de puesta en escena y prod
- En la base de código de su aplicación, cambie el
firebase-config.js
para usar la configuración de Firebase de su proyecto de estadificación.
Para recordar cómo obtener su configuración de Firebase y agregarla a su aplicación, consulte el paso anterior de este CodeLab, agregue su configuración de Firebase a su aplicación. - En la raíz de su directorio
web
, ejecute el siguiente comando para implementar su aplicación en su proyecto Firebase de puesta en escena.firebase deploy --only hosting --project=<STAGING_PROJECT_ID>
- Abra su aplicación de estadificación en el navegador a través de la URL que está impresa en la salida del
firebase deploy
. Intente iniciar sesión, enviar mensajes y cargar imágenes.
Cuando implementa una aplicación en un proyecto Firebase, utiliza recursos reales de Firebase, no recursos emulados. A medida que interactúa con su aplicación de puesta en escena, debe ver que los datos y las imágenes aparezcan en su proyecto de puesta en escena en la consola Firebase. - Después de probar su aplicación en la puesta en escena, cambie el
firebase-config.js
de nuevo a usar la configuración Firebase del Proyecto Prod (el primer proyecto que creó en este CodeLab). - En la raíz de su directorio
web
, ejecute el siguiente comando para implementar su aplicación en su proyecto Firebase de producción.firebase deploy --only hosting --project=<PRODUCTION_PROJECT_ID>
- Abra su aplicación de producción en el navegador a través de la URL que está impresa en la salida del
firebase deploy
. Intente iniciar sesión, enviar mensajes y cargar imágenes.
Debería ver que los datos y las imágenes aparecen en su proyecto de producción en la consola Firebase. - Cuando haya terminado de interactuar con las dos aplicaciones para este Codelab, puede evitar que Firebase las sirva. Ejecute el siguiente comando para cada uno de sus proyectos:
firebase hosting:disable --project=<STAGING_PROJECT_ID>
firebase hosting:disable --project=<PRODUCTION_PROJECT_ID>
13. ¡Felicitaciones!
¡Has usado Terraform para configurar una aplicación web de chat en tiempo real! Y ha seguido las mejores prácticas para entornos de desarrollo mediante la creación de proyectos de Firebase separados para la puesta en escena y la producción.
Lo que hemos cubierto
- Uso de la CLI de Terraform para administrar los recursos en la nube
- Uso de Terraform para configurar los productos Firebase (autenticación, firestore, almacenamiento en la nube y reglas de seguridad)
- Ejecución y prueba de una aplicación web localmente utilizando la suite de emulador local de Firebase
- Importar Firebase en una aplicación web
- Uso de Terraform para replicar una configuración en múltiples entornos
Para obtener más información sobre Firebase y Terraform, visite nuestra documentación . Puede encontrar una lista de todos los productos de Firebase con soporte de Terraform, muestras de configuraciones de Terraform para casos de uso comunes y resolución útil y preguntas frecuentes.