Comece com Terraform e Firebase

O Firebase está começando a oferecer suporte ao Terraform . Se você faz parte de uma equipe que deseja automatizar e padronizar a criação de projetos do Firebase com recursos específicos provisionados e serviços habilitados, usar o Terraform com Firebase pode ser uma boa opção para você.

O fluxo de trabalho básico para usar o Terraform com Firebase inclui o seguinte:

  • Criar e customizar um arquivo de configuração do Terraform (um arquivo .tf ) que especifica a infraestrutura que você deseja provisionar (ou seja, os recursos que você deseja provisionar e os serviços que deseja habilitar).

  • Usando comandos gCloud CLI que fazem interface com o Terraform para provisionar a infraestrutura especificada no arquivo .tf .

O que você pode fazer com Terraform e Firebase?

O exemplo de fluxo de trabalho generalizado neste guia é a criação de um novo projeto do Firebase com um aplicativo Android. Mas você pode fazer muito mais com o Terraform, como:

  • Exclua e modifique a infraestrutura existente usando Terraform.

  • Gerencie configurações e tarefas específicas do produto usando o Terraform, como:

    • Ativar provedores de login do Firebase Authentication.
    • Criação de buckets do Cloud Storage ou instâncias de banco de dados e implantação de regras de segurança do Firebase para eles.

Você pode usar arquivos de configuração e comandos padrão do Terraform para realizar todas essas tarefas. E para ajudá-lo com isso, fornecemos exemplos de arquivos de configuração do Terraform para vários casos de uso comuns.



Fluxo de trabalho generalizado para usar Terraform com Firebase

Pré-requisitos

Este guia é uma introdução ao uso do Terraform com Firebase, portanto, pressupõe proficiência básica com Terraform. Certifique-se de ter concluído os seguintes pré-requisitos antes de iniciar este fluxo de trabalho.

  • Instale o Terraform e familiarize-se com o Terraform usando seus tutoriais oficiais.

  • Instale a Google Cloud CLI (gCloud CLI). Faça login usando uma conta de usuário ou uma conta de serviço .

    • Se estiver usando uma conta de usuário, você deverá ter aceitado os Termos de Serviço do Firebase (Firebase ToS). Você aceitou os ToS do Firebase se puder visualizar um projeto do Firebase no Console do Firebase
    • Para que o Terraform execute determinadas ações (por exemplo, criar projetos), o seguinte deve ser verdadeiro:
      • O usuário ou conta de serviço deve ter o acesso IAM aplicável para essas ações.
      • Se o usuário ou a conta de serviço fizer parte de uma organização do Google Cloud, as políticas da organização deverão permitir que a conta execute essas ações.


Etapa 1: criar e personalizar um arquivo de configuração do Terraform

Um arquivo de configuração do Terraform precisa de duas seções principais (que são descritas em detalhes abaixo):

Configure seu provider

É necessária uma configuração provider , independentemente dos produtos ou serviços do Firebase envolvidos.

  1. Crie um arquivo de configuração do Terraform (como o arquivo main.tf ) em seu diretório local.

    Neste guia, você usará este arquivo de configuração para especificar a configuração do provider e toda a infraestrutura que deseja que o Terraform crie. Observe, porém, que você tem opções sobre como incluir a configuração do provedor.

    Você tem as seguintes opções sobre como incluir uma configuração provider no restante da configuração do Terraform:

    • Opção 1: inclua-o na parte superior de um único arquivo de configuração .tf do Terraform (conforme mostrado neste guia).

      • Use esta opção se você estiver apenas começando com o Terraform ou apenas testando o Terraform com Firebase.
    • Opção 2: inclua-o em um arquivo .tf separado (como um arquivo provider.tf ), além do arquivo .tf onde você especifica a infraestrutura a ser criada (como um arquivo main.tf ).

      • Use esta opção se você fizer parte de uma equipe maior que precisa padronizar a configuração.
      • Ao executar comandos do Terraform, o arquivo provider.tf e o arquivo main.tf devem estar no mesmo diretório.

  2. Inclua a seguinte configuração provider na parte superior do arquivo main.tf

    Você deve usar o provedor google-beta porque esta é uma versão beta do uso do Firebase com Terraform. Tenha cuidado ao usar na produção.

    # 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
    }

    Saiba mais sobre os diferentes tipos de atributos relacionados ao projeto (incluindo o que este guia chama de "projeto de verificação de cota") ao usar o Terraform com Firebase.

  3. Continue na próxima seção para concluir seu arquivo de configuração e especificar qual infraestrutura criar.

Especifique qual infraestrutura criar usando blocos resource

Em seu arquivo de configuração do Terraform (para este guia, seu arquivo main.tf ), você precisa especificar toda a infraestrutura que deseja que o Terraform crie (ou seja, todos os recursos que deseja provisionar e todos os serviços que deseja habilitar). Neste guia, encontre uma lista completa de todos os recursos do Firebase compatíveis com o Terraform .

  1. Abra seu arquivo main.tf

  2. Na configuração provider , inclua a seguinte configuração de blocos resource .

    Este exemplo básico cria um novo projeto do Firebase e, em seguida, cria um aplicativo Firebase para Android nesse projeto.

    # 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,
     
    ]
    }

Se você não estiver familiarizado com a infraestrutura de projetos e aplicativos como recursos, revise a seguinte documentação:

# 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,
 
]
}


Etapa 2: execute comandos do Terraform para criar a infraestrutura especificada

Para provisionar os recursos e ativar os serviços especificados no arquivo main.tf , execute os comandos a seguir no mesmo diretório do arquivo main.tf Para obter informações detalhadas sobre esses comandos, consulte a documentação do Terraform .

  1. Se esta for a primeira vez que você executa comandos do Terraform no diretório, será necessário inicializar o diretório de configuração e instalar o provedor Google Terraform. Faça isso executando o seguinte comando:

    terraform init
  2. Crie a infraestrutura especificada em seu arquivo main.tf executando o seguinte comando:

    terraform apply
  3. Confirme se tudo foi provisionado ou habilitado conforme esperado:

    • Opção 1: Veja a configuração impressa em seu terminal executando o seguinte comando:

      terraform show
    • Opção 2: visualize seu projeto do Firebase no console do Firebase .



Recursos do Firebase com suporte Terraform

Os seguintes recursos do Firebase e do Google têm suporte para Terraform. E estamos adicionando mais recursos o tempo todo! Portanto, se você não encontrar o recurso que deseja gerenciar com o Terraform, verifique novamente em breve para ver se ele está disponível ou solicite-o registrando um problema no repositório GitHub .


Gerenciamento de projetos e aplicativos do Firebase

  • google_firebase_project – habilite os serviços do Firebase em um projeto existente do Google Cloud

  • google_firebase_project_location – defina o local para os recursos padrão do Google Cloud do projeto

  • Aplicativos Firebase


Autenticação Firebase

Ainda não suportado:

  • Configurando a autenticação multifator (MFA) via Terraform

Banco de dados em tempo real do Firebase

Ainda não suportado:

  • Implantando regras de segurança do Firebase Realtime Database via Terraform (saiba como implantar essas regras usando outras ferramentas, incluindo opções programáticas)

Cloud Fire Store

  • google_firestore_database – crie uma instância do Cloud Firestore

  • google_firestore_index – permite consultas eficientes para Cloud Firestore

  • google_firestore_document – ​​propaga uma instância do Cloud Firestore com um documento específico em uma coleção

    Importante: Não use dados reais do usuário final ou de produção neste documento inicial.


Armazenamento em nuvem para Firebase


Regras de segurança do Firebase (para Cloud Firestore e Cloud Storage)

Observe que o Firebase Realtime Database usa um sistema de provisionamento diferente para suas regras de segurança do Firebase.

  • google_firebaserules_ruleset – defina regras de segurança do Firebase que se aplicam à instância do Cloud Firestore ou a um bucket do Cloud Storage

  • google_firebaserules_release – implantar conjuntos de regras específicos na instância do Cloud Firestore ou em um bucket do Cloud Storage


Verificação do aplicativo Firebase


Extensões do Firebase



Exemplos de arquivos de configuração do Terraform para casos de uso comuns

Esta configuração cria um novo projeto do Google Cloud, associa o projeto a uma conta do Cloud Billing (o plano de preços Blaze é necessário para o Firebase Authentication com GCIP), ativa os serviços do Firebase para o projeto, configura o Firebase Authentication com GCIP e registra três aplicativos diferentes tipos com o projeto.

Observe que é necessário ativar o GCIP para configurar o Firebase Authentication via 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,
 
]
}

Essa configuração cria um novo projeto do Google Cloud, ativa os serviços do Firebase para o projeto, provisiona a instância padrão do Realtime Database do projeto e registra três tipos de aplicativos diferentes no projeto.

# 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,
 
]
}

Esta configuração cria um novo projeto do Google Cloud, associa o projeto a uma conta do Cloud Billing (o plano de preços Blaze é necessário para várias instâncias do Realtime Database), ativa os serviços do Firebase para o projeto, provisiona várias instâncias do Realtime Database (incluindo o Realtime Database padrão do projeto). instância) e registra três tipos de aplicativos diferentes no projeto.

# 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,
 
]
}

Essa configuração cria um novo projeto do Google Cloud, ativa os serviços do Firebase para o projeto, provisiona a instância do Cloud Firestore do projeto e registra três tipos de aplicativos diferentes no projeto.

Ele também provisiona regras de segurança do Firebase para a instância do Cloud Firestore, cria um índice do Cloud Firestore e adiciona um documento do Cloud Firestore com dados iniciais.

# 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 é o conjunto de regras de segurança do Cloud Firestore que deve estar em um arquivo local chamado 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;
 
}
}

Essa configuração cria um novo projeto do Google Cloud, ativa os serviços do Firebase para o projeto, provisiona o bucket padrão do Cloud Storage do projeto e registra três tipos de aplicativos diferentes no projeto.

Ele também provisiona regras de segurança do Firebase para o bucket do Cloud Storage e faz upload de um arquivo para o bucket.

# 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 é o conjunto de regras de segurança do Cloud Storage que deve estar em um arquivo local chamado storage.rules .

rules_version = '2';
service firebase
.storage {
  match
/b/{bucket}/o {
    match
/{allPaths=**} {
      allow read
, write: if request.auth != null;
   
}
 
}
}

Esta configuração cria um novo projeto do Google Cloud, associa o projeto a uma conta do Cloud Billing (o plano de preços Blaze é necessário para vários buckets), ativa serviços do Firebase para o projeto, provisiona vários buckets do Cloud Storage (incluindo o bucket padrão do Cloud Storage do projeto) e registra três tipos de aplicativos diferentes no projeto.

Ele também provisiona regras de segurança do Firebase para os buckets do Cloud Storage e faz upload de um arquivo para o bucket padrão do 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 é o conjunto de regras de segurança do Cloud Storage que deve estar em um arquivo local chamado storage.rules .

rules_version = '2';
service firebase
.storage {
  match
/b/{bucket}/o {
    match
/{allPaths=**} {
      allow read
, write: if request.auth != null;
   
}
 
}
}

Essa configuração cria um novo projeto do Google Cloud, ativa os serviços do Firebase para o projeto, provisiona a instância do Cloud Firestore e, em seguida, provisiona o bucket padrão do Cloud Storage.

Ele também provisiona regras de segurança do Firebase para a instância do Cloud Firestore e o bucket padrão do 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 é o conjunto de regras de segurança do Cloud Firestore que deve estar em um arquivo local chamado 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 é o conjunto de regras de segurança do Cloud Storage que deve estar em um arquivo local chamado storage.rules .

rules_version = '2';
service firebase
.storage {
  match
/b/{bucket}/o {
    match
/{allPaths=**} {
      allow read
, write: if request.auth != null;
   
}
 
}
}

Esta configuração cria um novo projeto do Google Cloud, ativa os serviços do Firebase para o projeto e configura e permite a aplicação do Firebase App Check para Cloud Firestore para que ele só possa ser acessado no seu aplicativo 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]
}

Esta configuração cria um novo projeto do Google Cloud, ativa os serviços do Firebase para o projeto e instala uma nova instância de uma extensão do Firebase no projeto. Se a instância já existir, seus parâmetros serão atualizados com base nos valores fornecidos na configuração.

# 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"
   
}
 
}
}



Solução de problemas e perguntas frequentes

Este guia usa os seguintes atributos do Terraform ao trabalhar com "projetos".

project dentro de um bloco resource

Recomendado: sempre que possível, inclua o atributo project em cada bloco resource

Ao incluir um atributo de projeto, o Terraform criará a infraestrutura especificada no bloco de recursos dentro do projeto especificado. Este guia e nossos arquivos de configuração de amostra usam essa prática.

Consulte a documentação oficial do Terraform sobre project .

user_project_override dentro do bloco provider

Para provisionar a maioria dos recursos, você deve usar user_project_override = true , o que significa verificar a cota em seu próprio projeto do Firebase. No entanto, para configurar seu novo projeto para que ele possa aceitar verificações de cota, primeiro você precisa usar user_project_override = false .

Consulte a documentação oficial do Terraform sobre user_project_override .

Verifique se a conta de usuário que você está usando para executar os comandos da CLI do gCloud aceitou os Termos de Serviço do Firebase (Firebase ToS).

  • Você pode fazer essa verificação usando um navegador conectado à conta do usuário e tentando visualizar um projeto existente do Firebase no console do Firebase . Se você puder visualizar um projeto existente do Firebase, a conta do usuário aceitou os ToS do Firebase.

  • Se você não conseguir visualizar nenhum projeto existente do Firebase, provavelmente a conta do usuário não aceitou os ToS do Firebase. Para corrigir isso, crie um novo projeto do Firebase por meio do console do Firebase e aceite os ToS do Firebase como parte da criação do projeto. Você pode excluir este projeto imediatamente através das Configurações do Projeto no console.

Aguarde alguns minutos e tente executar terraform apply novamente.

Isto pode ser devido a um atraso de propagação em vários sistemas. Tente resolver esse problema importando o recurso para o estado do Terraform executando terraform import . Em seguida, tente executar terraform apply novamente.

Você pode aprender como importar cada recurso na seção "Importar" da documentação do Terraform (por exemplo, a documentação "Importar" do Cloud Firestore ).

Como o erro sugere, o Terraform pode estar tentando provisionar vários índices e/ou criar um documento ao mesmo tempo e encontrou um erro de simultaneidade. Tente executar terraform apply novamente.

Este erro significa que o Terraform não sabe em qual projeto verificar a cota. Para solucionar problemas, verifique o seguinte no bloco resource :

  • Certifique-se de ter especificado um valor para o atributo project .
  • Verifique se você está usando o provedor com user_project_override = true (sem alias), que nos exemplos do Firebase é google-beta .

Aqui estão os possíveis motivos pelos quais o ID do projeto já pode existir:

  • O projeto associado a esse ID pertence a outra pessoa.

    • Para resolver: Escolha outro ID de projeto.
  • O projeto associado a esse ID foi excluído recentemente (em estado de exclusão reversível).

    • Para resolver: Se você acha que o projeto associado ao ID pertence a você, verifique o estado do projeto usando a API REST projects.get .
  • O projeto associado a esse ID existe corretamente no usuário atual. Uma possível causa para o erro pode ser a interrupção de uma terraform apply anterior.

    • Para resolver: Execute os seguintes comandos:
      terraform import google_project.default PROJECT_ID e então
      terraform import google_firebase_project.default PROJECT_ID

Um aplicativo do App Engine requer uma instância do Cloud Firestore, mas você só pode ter uma instância do Cloud Firestore por projeto. Portanto, como sugere a mensagem de erro, se você já provisionou a instância do Cloud Firestore do projeto em um local, o App Engine apresentará um erro se você tentar provisionar uma instância do Cloud Firestore em um local diferente. O App Engine acredita que você está tentando "provisionar novamente" a instância já existente do Cloud Firestore.

Para resolver esse erro, use o mesmo local para o Cloud Firestore e o aplicativo App Engine. Se você precisar de um bucket do Cloud Storage em um local diferente do Cloud Firestore, poderá provisionar buckets adicionais (consulte o exemplo de configuração para criar vários buckets do Cloud Storage ).

Quando você provisiona o bucket padrão do Cloud Storage de um projeto (por meio de google_app_engine_application ) e o projeto ainda não tem uma instância do Cloud Firestore, o google_app_engine_application provisiona automaticamente a instância do Cloud Firestore do projeto.

Portanto, se a instância do Cloud Firestore do seu projeto já estiver provisionada, google_firestore_database apresentará um erro se você tentar provisionar explicitamente uma instância do Cloud Firestore.

Depois que a instância do Cloud Firestore do projeto for provisionada, não será possível "provisioná-la novamente" ou alterar seu local. Para impedir que o erro aconteça, remova o bloco de recursos google_firestore_database do seu arquivo de configuração. Observe, porém, que recomendamos provisionar o Cloud Firestore antes do bucket padrão do Cloud Storage do projeto (veja o motivo abaixo).