Automatiza la administración de recursos

Puedes automatizar la creación de bases de datos de Firestore con el siguiente proceso:

  1. Crea un proyecto de Google Cloud nuevo. Cada proyecto está limitado a una base de datos de Firestore.
  2. Crea una aplicación de App Engine. Firestore depende de App Engine. Debes activar App Engine para usar Firestore.
  3. Crea una base de datos de Firestore.

En esta página se describe cómo completar este proceso con las API de REST, la herramienta de línea de comandos de gcloud y Terraform.

Crea una base de datos con las API de REST

Puedes aprovisionar una base de datos de Firestore mediante la API de Resource Manager y la API de administrador de App Engine.

Autenticación y autorización

Para acceder a las API de Resource Manager y de App Engine Admin, debes autenticar la solicitud con un token de acceso. El token de acceso requiere el siguiente permiso de OAuth 2.0:

https://www.googleapis.com/auth/cloud-platform

Si quieres configurar la autenticación de una app, consulta cómo configurar la autenticación para aplicaciones de producción de servidor a servidor.

Mientras desarrollas y pruebas tu aplicación, puedes obtener un token de acceso mediante el siguiente comando:

gcloud auth application-default print-access-token.

Autorización

La cuenta de usuario o de servicio autenticada requiere el permiso resourcemanager.projects.create para crear un proyecto nuevo. Por ejemplo, la función de IAM Creador de proyectos otorga este permiso.

Para otorgar esta función, consulta Cómo otorgar, cambiar y revocar el acceso a los recursos.

Crea un proyecto y una base de datos nuevos

  1. Usa el método projects.create para iniciar una operación de creación de proyecto. En el cuerpo de la solicitud, define un recurso Project, por ejemplo:

    HTTP

    POST https://cloudresourcemanager.googleapis.com/v1/projects HTTP/1.1
    
    Authorization: Bearer access-token
    Accept: application/json
    Content-Type: application/json
    
    {
      "projectId": "project-id"
    }
          

    Reemplaza lo siguiente:

    Si se realiza de forma correcta, la solicitud muestra un nombre de operación:

    200:
    
    {
      "name": "operations/cp.6311184959990822268"
    }
        
  2. Usa el nombre de la operación del paso anterior y el método operations.get de Resource Manager para confirmar la creación del proyecto:

    HTTP

    GET https://cloudresourcemanager.googleapis.com/v1/operations/operation-name HTTP/1.1
    
    Authorization: Bearer access-token
    Accept: application/json

    Cuando la creación del proyecto se realiza correctamente, la respuesta incluye el siguiente campo:

    "done": true,
          
  3. Usa el método apps.create de la API de Administrador de App Engine para crear una aplicación de App Engine y una base de datos de Firestore. En el cuerpo de la solicitud, define un recurso de aplicación y, luego, incluye el campo databaseType, por ejemplo:

    HTTP

    POST https://appengine.googleapis.com/v1/apps HTTP/1.1
    
    Authorization: Bearer access_token
    Accept: application/json
    Content-Type: application/json
    
    {
      "databaseType": "CLOUD_FIRESTORE",
      "id": "project-id",
      "locationId": "location"
    }
          

    Reemplaza lo siguiente:

    • project-id es el ID del proyecto que creaste.
    • location establece la ubicación de la aplicación de App Engine y la base de datos de Firestore. Una vez establecida, no puedes cambiar la ubicación. Para obtener una lista completa de las ubicaciones compatibles, consulta Ubicaciones de App Engine.

      App Engine y Firestore admiten las mismas ubicaciones, pero las siguientes regiones de App Engine se asignan a multirregiones de Firestore:

      • us-central (Iowa) crea una base de datos de Firestore en la multirregión nam5 (Estados Unidos).
      • europe-west (Bélgica) crea una base de datos de Firestore en la multirregión eur3 (Europa).

    La solicitud muestra un nombre de operación:

    200:
    
    {
      "name": "apps/project-id/operations/8612e502-4aeb-4f12-9e41-bbac0a0b819c",
      "metadata": {
        "@type": "type.googleapis.com/google.appengine.v1.OperationMetadataV1",
        "method": "google.appengine.v1.Applications.CreateApplication",
        "insertTime": "2020-06-05T23:34:32.587Z",
        "user": "username",
        "target": "apps/project-id"
      }
    }
            
  4. Usa el nombre de la operación del paso anterior y apps.operations.get para confirmar la creación de la base de datos:

    HTTP

    GET https://appengine.googleapis.com/v1/operation-name HTTP/1.1
    
    Authorization: Bearer access-token
    Accept: application/json
        

    Cuando la operación se realiza correctamente, la respuesta incluye el siguiente campo:

    "done": true,
          

Agrega una cuenta de facturación y los servicios de Firebase

Para asociar de manera programática una cuenta de facturación con tu proyecto, usa el método projects.updateBillingInfo.

Para habilitar de manera programática los servicios de Firebase en tu proyecto, consulta cómo configurar y administrar un proyecto de Firebase con la API de REST de administración.

Crea una base de datos con gcloud

Puedes usar la herramienta de línea de comandos de gcloud para automatizar la creación de bases de datos en una secuencia de comandos de Bash o PowerShell. En la secuencia de comandos, completa los siguientes pasos:

  1. Crea un proyecto nuevo con gcloud projects create:

    gcloud projects create project-id
  2. Activa App Engine con gcloud app create:

    gcloud app create --region=region --project=project-id

    En el ejemplo anterior, region es la ubicación de la aplicación de App Engine y la base de datos de Firestore. Una vez establecida, no puedes cambiar la ubicación. Para obtener una lista completa de las ubicaciones compatibles, consulta Ubicaciones de App Engine.

    App Engine y Firestore admiten las mismas ubicaciones, pero las siguientes regiones de App Engine se asignan a las multirregiones de Firestore:

    • us-central (Iowa) crea una base de datos de Firestore en la multirregión nam5 (Estados Unidos).
    • europe-west (Bélgica) crea una base de datos de Firestore en la multirregión eur3 (Europa).
  3. Habilita la API de Administrador de App Engine con gcloud services enable:

    gcloud services enable appengine.googleapis.com --project=project-id
  4. Crea una base de datos de Firestore con gcloud alpha firestore databases create o gcloud alpha datastore databases create:

    gcloud alpha firestore databases create --project=project-id --region=region

    Para crear una base de datos de Firestore en modo Datastore, usa el siguiente comando:

    gcloud alpha datastore databases create --project=project-id --region=region

    Para region, debes usar el mismo valor que usaste para activar App Engine.

Crea una base de datos con Terraform

Para aprovisionar una base de datos de Firestore con Terraform, usa el recurso google_firestore_database.

Por ejemplo, el siguiente archivo de configuración de Terraform crea un proyecto nuevo y aprovisiona una base de datos de Firestore:

firestore.tf

provider "google" {
  credentials = file("credentials-file")
}

resource "google_project" "my_project" {
  name       = "My Project"
  project_id = "project-id"
}

resource "google_project_service" "firestore" {
  project = google_project.my_project.project_id
  service = "firestore.googleapis.com"
}

resource "google_firestore_database" "database" {
  project     = google_project.my_project.project_id
  name        = "(default)"
  location_id = "location"
  type        = "FIRESTORE_NATIVE"

  depends_on = [google_project_service.firestore]
}

Reemplaza lo siguiente:

  • credentials-file es la ruta de acceso al archivo de claves de tu cuenta de servicio.
  • project-id es el ID del proyecto. Los IDs de proyecto deben ser únicos.
  • location es la ubicación de tus bases de datos de Firestore. Una vez que establezcas la ubicación, no podrás cambiarla. Para obtener una lista completa de las ubicaciones admitidas, consulta Ubicaciones de Firestore.

Si deseas usar App Engine, usa el recurso google_app_engine_application en su lugar. Configura database_type como CLOUD_FIRESTORE o CLOUD_DATASTORE_COMPATIBILITY.

provider "google" {
  credentials = file("credentials-file")
}

resource "google_project" "my_project" {
  name = "My Project"
  project_id = "project-id"
}

resource "google_app_engine_application" "app" {
  project     = google_project.my_project.project_id
  location_id = "location"
  database_type = "CLOUD_FIRESTORE"
}
  • us-central (Iowa) crea una base de datos de Firestore en la multirregión nam5 (Estados Unidos).
  • europe-west (Bélgica) crea una base de datos de Firestore en la multirregión eur3 (Europa).

Además, Firestore está disponible en algunas regiones en las que App Engine no lo está.

Crea índices en la base de datos

La base de datos de Firestore puede incluir un índice de campo único o uno compuesto. Puedes editar el archivo de configuración de Terraform para crear un índice para tu base de datos.

Índice de campo único

En el siguiente ejemplo de archivo de configuración de Terraform, se crea un índice de campo único en el campo name de la colección chatrooms:

firestore.tf

resource "random_id" "variable"{
  byte_length = 8
}

resource "google_firestore_field" "single-index" {
  project = "project-id"
  database = "(default)"
  collection = "chatrooms_${random_id.variable.hex}"
  field = "name"

  index_config {
    indexes {
        order = "ASCENDING"
        query_scope = "COLLECTION_GROUP"
    }
    indexes {
        array_config = "CONTAINS"
    }
  }

  ttl_config {}
}
  • Reemplaza project-id con el ID del proyecto. Los IDs de proyecto deben ser únicos.

Índice compuesto

En el siguiente ejemplo de archivo de configuración de Terraform, se crea un índice compuesto para una combinación del campo name y description de la colección chatrooms:

firestore.tf

resource "google_firestore_index" "composite-index" {
  project = "project-id"

  collection = "chatrooms"

  fields {
    field_path = "name"
    order      = "ASCENDING"
  }

  fields {
    field_path = "description"
    order      = "DESCENDING"
  }

}
  • Reemplaza project-id con el ID del proyecto. Los IDs de proyecto deben ser únicos.