Automatisez la gestion des ressources

Vous pouvez automatiser la création de bases de données Firestore en procédant comme suit :

  1. Créez un projet Google Cloud. Pour chaque projet, vous ne pouvez définir qu'une base de données Firestore.
  2. Créez une application App Engine. Firestore dépend d'App Engine. Vous devez donc activer App Engine pour utiliser Firestore.
  3. Créez une base de données Firestore.

Cette page décrit comment effectuer ce processus à l'aide des API REST, de l'outil de ligne de commande gcloud et de Terraform.

Créer une base de données avec les API REST

Vous pouvez provisionner une base de données Firestore à l'aide de l'API Resource Manager et de l'API App Engine Admin.

Authentification et autorisation

Pour accéder aux API Resource Manager et App Engine Admin, vous devez authentifier votre requête avec un jeton d'accès. Votre jeton d'accès nécessite le champ d'application OAuth 2.0 suivant :

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

Pour configurer l'authentification pour une application, consultez la section Configurer l'authentification pour les applications de production serveur à serveur.

Lorsque vous développez et testez votre application, vous pouvez obtenir un jeton d'accès en utilisant :

gcloud auth application-default print-access-token.

Autorisation

Le compte utilisateur ou compte de service authentifié nécessite l'autorisation resourcemanager.projects.create pour créer un projet. Le rôle IAM de créateur de projet, par exemple, accorde cette autorisation.

Pour accorder ce rôle, consultez la page Accorder, modifier et révoquer l'accès à des ressources.

Créer un projet et une base de données

  1. Utilisez la méthode projects.create pour démarrer une opération de création de projet. Dans le corps de la requête, définissez une ressource Project, par exemple :

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

    Remplacez les éléments suivants :

    En cas de réussite, la requête renvoie un nom d'opération:

    200:
    
    {
      "name": "operations/cp.6311184959990822268"
    }
        
  2. Utilisez le nom d'opération de l'étape précédente et la méthode operations.get de Resource Manager pour confirmer la création du projet:

    HTTP

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

    Lorsque la création du projet aboutit, la réponse inclut le champ suivant:

    "done": true,
          
  3. Utilisez la méthode apps.create de l'API App Engine Admin pour créer une application App Engine et une base de données Firestore. Dans le corps de la requête, définissez une ressource Application et incluez le champ databaseType. Exemple:

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

    Remplacez les éléments suivants :

    • project-id correspond à l'ID du projet que vous avez créé.
    • location définit l'emplacement de votre application App Engine et de votre base de données Firestore. Une fois qu'il a été défini, vous ne pouvez plus modifier l'emplacement. Pour obtenir la liste complète des emplacements compatibles, consultez la page Emplacements App Engine.

      App Engine et Firestore acceptent les mêmes emplacements, mais les régions App Engine suivantes sont mappées avec les emplacements multirégionaux de Firestore:

      • us-central (Iowa) crée une base de données Firestore dans la zone multirégionale nam5 (États-Unis).
      • europe-west (Belgique) crée une base de données Firestore dans la zone multirégionale eur3 (Europe).

    La requête renvoie un nom d'opération:

    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. Utilisez le nom d'opération de l'étape précédente et le fichier apps.operations.get pour confirmer la création de la base de données:

    HTTP

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

    Lorsque l'opération réussit, la réponse inclut le champ suivant:

    "done": true,
          

Ajouter un compte de facturation et des services Firebase

Pour associer de manière automatisée un compte de facturation à votre projet, utilisez la méthode projects.updateBillingInfo.

Pour activer les services Firebase de manière automatisée pour votre projet, consultez la page Configurer et gérer un projet Firebase à l'aide de l'API REST de gestion.

Créer une base de données avec gcloud

Vous pouvez automatiser la création de bases de données dans un script Bash ou PowerShell à l'aide de l'outil de ligne de commande gcloud. Dans votre script, procédez comme suit :

  1. Créez un projet avec gcloud projects create :

    gcloud projects create project-id
  2. Activez App Engine avec gcloud app create :

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

    region est l'emplacement de votre application App Engine et de votre base de données Firestore. Une fois qu'il a été défini, vous ne pouvez plus modifier l'emplacement. Pour obtenir la liste complète des emplacements acceptés, consultez la page Emplacements App Engine.

    App Engine et Firestore acceptent les mêmes emplacements, mais les régions App Engine suivantes sont mappées vers des emplacements Firestore multirégionaux :

    • us-central (Iowa) crée une base de données Firestore dans la zone multirégionale nam5 (États-Unis).
    • europe-west (Belgique) crée une base de données Firestore dans la zone multirégionale eur3 (Europe).
  3. Activez l'API App Engine Admin avec gcloud services enable :

    gcloud services enable appengine.googleapis.com --project=project-id
  4. Créez une base de données Firestore avec gcloud alpha firestore databases create ou gcloud alpha datastore databases create :

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

    Pour créer une base de données Firestore en mode Datastore, utilisez :

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

    Pour region, vous devez utiliser la même valeur que celle utilisée pour activer App Engine.

Créer une base de données avec Terraform

Pour provisionner une base de données Firestore avec Terraform, utilisez la ressource google_firestore_database.

Par exemple, le fichier de configuration Terraform suivant crée un projet et provisionne une base de données 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]
}

Remplacez les éléments suivants :

  • credentials-file est le chemin d'accès au fichier de clé de votre compte de service.
  • project-id est l'ID de votre projet. Les ID de projet doivent être uniques.
  • location est l'emplacement de votre base de données Firestore. Une fois qu'il a été défini, vous ne pouvez plus modifier l'emplacement. Pour obtenir la liste complète des emplacements compatibles, consultez la section Emplacements Firestore.

Si vous souhaitez utiliser App Engine, utilisez plutôt la ressource google_app_engine_application. Définissez database_type sur CLOUD_FIRESTORE ou 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) crée une base de données Firestore dans la zone multirégionale nam5 (États-Unis).
  • europe-west (Belgique) crée une base de données Firestore dans la zone multirégionale eur3 (Europe).

De plus, Firestore est disponible dans certaines régions où App Engine ne l'est pas.

Créer des index dans la base de données

La base de données Firestore peut inclure un index à champ unique ou un index composite. Vous pouvez modifier le fichier de configuration Terraform afin de créer un index pour votre base de données.

Index à champ unique

L'exemple de fichier de configuration Terraform suivant crée un index à champ unique au niveau du champ name de la collection 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 {}
}
  • Remplacez project-id par l'ID du projet. Les ID de projet doivent être uniques.

Index composite

L'exemple de fichier de configuration Terraform suivant crée un index composite pour une combinaison du champ name et du champ description dans la collection 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"
  }

}
  • Remplacez project-id par l'ID du projet. Les ID de projet doivent être uniques.