Créer et exécuter des jobs par lot à l'aide de Terraform et de Cloud Scheduler


Ce tutoriel explique comment utiliser Terraform pour créer et exécuter des jobs par lot à l'aide d'une job Cron Cloud Scheduler.

Terraform est un outil Open Source qui vous permet de provisionner et de gérer l'infrastructure en spécifiant l'état souhaité dans les fichiers de configuration. Ces fichiers peuvent être traités comme du code et stockés dans des systèmes de contrôle des versions tels que GitHub.

Bien que Terraform ne dispose pas de ressources pour Batch, ce tutoriel vous explique comment utiliser Terraform pour créer des jobs par lot. Plus précisément, vous pouvez utiliser Terraform pour planifier et exécuter une job Cron Cloud Scheduler qui cible l'API Batch afin de créer et d'exécuter des tâches par lot. Cloud Scheduler est un service Google Cloud qui vous permet de programmer automatiquement des tâches Cron et est compatible avec Terraform.

Ce tutoriel est destiné aux utilisateurs de Batch qui gèrent déjà une infrastructure avec Terraform et qui souhaitent incorporer des jobs par lots dans Terraform.

Objectifs

  • Créer un répertoire Terraform et un fichier de configuration qui définit une job Cron Cloud Scheduler permettant de créer des tâches par lot
  • Déployez la configuration Terraform pour exécuter le job Cron.
  • Vérifiez que le job Cron crée des jobs par lot.
  • Mettez à jour la configuration Terraform pour suspendre la job Cron afin qu'elle arrête de créer des tâches par lot.

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.

Avant de commencer

  1. Préparez votre environnement de développement (Cloud Shell ou une interface système locale) :

    Cloud Shell

    Pour utiliser un terminal en ligne avec gcloud CLI et Terraform déjà configurés, activez Cloud Shell.

    En bas de cette page, une session Cloud Shell démarre et affiche une invite de ligne de commande. L'initialisation de la session peut prendre quelques secondes.

    Shell local

    Pour utiliser un environnement de développement local, procédez comme suit :

    1. Installez Google Cloud CLI.
    2. Pour initialiser gcloudCLI, exécutez la commande suivante :

      gcloud init
    3. Installez Terraform.
  2. Créez ou sélectionnez un projet Google Cloud.

    • Créez un projet Google Cloud :

      gcloud projects create PROJECT_ID

      Remplacez PROJECT_ID par le nom du projet Google Cloud que vous créez.

    • Sélectionnez le projet Google Cloud que vous avez créé :

      gcloud config set project PROJECT_ID

      Remplacez PROJECT_ID par le nom de votre projet Google Cloud.

  3. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  4. Activer les API Batch, Compute Engine, Cloud Logging, Cloud Scheduler, and Resource Manager :

    gcloud services enable batch.googleapis.com compute.googleapis.com logging.googleapis.com  cloudscheduler.googleapis.com cloudresourcemanager.googleapis.com
  5. Assurez-vous que votre projet comporte au moins un compte de service disposant des autorisations requises pour ce tutoriel.

    Plus précisément, vous pouvez utiliser le même compte de service ou deux comptes de service distincts pour accorder les autorisations suivantes:

    • Autorisez le job Cron à créer des jobs Batch et associez le compte de service à ces jobs.
    • Autorisez les jobs Batch à créer des ressources et à y accéder.

    Pour vous assurer que les comptes de service de ce tutoriel disposent des autorisations nécessaires pour utiliser Terraform afin de créer des jobs par lot via une job Cron Cloud Scheduler, demandez à votre administrateur d'attribuer les rôles IAM suivants au(x) compte(s) de service pour ce tutoriel:

    Pour en savoir plus sur l'attribution de rôles, consultez la section Gérer les accès.

    Votre administrateur peut également accorder aux comptes de service pour ce tutoriel les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

  6. Assurez-vous de disposer des autorisations nécessaires pour ce tutoriel.

    Plus précisément, vous devez disposer des autorisations nécessaires pour effectuer les opérations suivantes:

    • Créez une job Cron et associez-y le compte de service.
    • Affichez et supprimez les job Cron et les jobs Batch.

    Afin d'obtenir les autorisations dont vous avez besoin pour utiliser Terraform afin de créer des jobs Batch via une job Cron Cloud Scheduler, demandez à votre administrateur de vous attribuer les rôles IAM suivants:

Créer le répertoire Terraform et le fichier de configuration

Créez un répertoire pour Terraform et un fichier de configuration qui définit les ressources que vous souhaitez créer ou mettre à jour à l'aide de Terraform. L'exemple de fichier de configuration utilisé pour ce tutoriel définit une job Cron Cloud Scheduler nommée batch-job-invoker. Lorsque cette option est activée, la tâche Cron batch-job-invoker s'exécute toutes les cinq minutes pour créer une instance du job Batch défini.

  1. Pour créer un répertoire et un fichier de configuration Terraform (.tf) dans ce répertoire, saisissez la commande suivante, puis appuyez sur Enter:

    mkdir terraform && cd terraform && cat > main.tf
    

    Cette commande crée le répertoire terraform, vous y accède et commence à définir un nouveau fichier de configuration main.tf sur la ligne suivante.

  2. Copiez et collez la configuration Terraform suivante:

    # define variables
    variable "project_id" {
      type        = string
      description = "The project name to use."
      default = "PROJECT_ID"
    }
    
    variable "project_number" {
      type        = string
      description = "The project number to use."
      default = "PROJECT_NUMBER"
    }
    
    variable "region" {
      type        = string
      description = "The region where resources are created."
      default = "us-central1"
    }
    
    variable "cloud_scheduler_service_account_email" {
      type        = string
      description = "The service account email."
      default = "CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL"
    }
    
    variable "batch_service_account_email" {
      type        = string
      description = "The service account email."
      default = "BATCH_SERVICE_ACCOUNT_EMAIL"
    }
    
    # define a Cloud Scheduler cron job which triggers Batch jobs
    resource "google_cloud_scheduler_job" "batch-job-invoker" {
      paused           = false # this cron job is enabled
      name             = "batch-job-invoker"
      project          = var.project_id
      region           = var.region
      schedule         = "*/5 * * * *" # when enabled, run every 5 minutes
      time_zone        = "America/Los_Angeles"
      attempt_deadline = "180s"
    
      retry_config {
        max_doublings        = 5
        max_retry_duration   = "0s"
        max_backoff_duration = "3600s"
        min_backoff_duration = "5s"
      }
    
      # when this cron job runs, create and run a Batch job
      http_target {
        http_method = "POST"
        uri = "https://batch.googleapis.com/v1/projects/${var.project_number}/locations/${var.region}/jobs"
        headers = {
          "Content-Type" = "application/json"
          "User-Agent"   = "Google-Cloud-Scheduler"
        }
        # Batch job definition
        body = base64encode(<<EOT
        {
          "taskGroups":[
            {
              "taskSpec": {
                "runnables":{
                  "script": {
                    "text": "echo Hello world! This job was created using Terraform and Cloud Scheduler."
                  }
                }
              }
            }
          ],
          "allocationPolicy": {
            "serviceAccount": {
              "email": "${var.batch_service_account_email}"
            }
          },
          "labels": {
            "source": "terraform_and_cloud_scheduler_tutorial"
          },
          "logsPolicy": {
            "destination": "CLOUD_LOGGING"
          }
        }
        EOT
        )
        oauth_token {
          scope                 = "https://www.googleapis.com/auth/cloud-platform"
          service_account_email = var.cloud_scheduler_service_account_email
        }
      }
    }
    
    

    Remplacez les éléments suivants :

    • PROJECT_ID: ID de projet de votre projet.
    • PROJECT_NUMBER: numéro de votre projet
    • CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL: adresse e-mail du compte de service que vous avez préparé pour la job Cron Cloud Scheduler.

      Par exemple, pour utiliser le compte de service Compute Engine par défaut, spécifiez les éléments suivants:

      PROJECT_NUMBER-compute@developer.gserviceaccount.com
      
    • BATCH_SERVICE_ACCOUNT_EMAIL: adresse e-mail du compte de service que vous avez préparé pour les tâches Batch.

      Par exemple, pour utiliser le compte de service Compute Engine par défaut, spécifiez les éléments suivants:

      PROJECT_NUMBER-compute@developer.gserviceaccount.com
      

    Cette configuration Terraform définit certaines variables d'entrée et une job Cron qui contacte la méthode API permettant de créer un job par lot.

  3. Pour enregistrer et fermer le fichier, appuyez sur Ctrl+D (ou Command+D sous macOS).

Déployer la configuration Terraform pour créer le job Cron

Déployez la configuration Terraform en initialisant Terraform, en générant les modifications planifiées et en appliquant ces modifications. Après avoir déployé la configuration Terraform, vous pouvez décrire les ressources de votre projet pour vérifier que Terraform a bien créé la job Cron batch-job-invoker.

  1. Initialisez Terraform dans le répertoire:

    terraform init
    

    Le résultat ressemble à ce qui suit :

    ...
    Terraform has been successfully initialized!
    
    You may now begin working with Terraform. Try running "terraform plan" to see
    any changes that are required for your infrastructure. All Terraform commands
    should now work.
    
    If you ever set or change modules or backend configuration for Terraform,
    rerun this command to reinitialize your working directory. If you forget, other
    commands will detect it and remind you to do so if necessary.
    
  2. Générez le plan d'exécution Terraform en fonction de l'état actuel de votre projet et du fichier de configuration:

    terraform plan
    

    Le résultat ressemble à ce qui suit, qui indique que l'objectif est de créer la job Cron batch-job-invoker:

    Terraform 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_cloud_scheduler_job.batch-job-invoker will be created
      + resource "google_cloud_scheduler_job" "batch-job-invoker" {
          + id        = (known after apply)
          + name      = "batch-job-invoker"
          + paused    = false
          + project   = "PROJECT_ID"
          + region    = "us-central1"
          + schedule  = "*/5 * * * *"
          + state     = (known after apply)
          + time_zone = "America/Los_Angeles"
    
          + http_target {
              + body        = "..."
              + headers     = {
                  + "Content-Type" = "application/json"
                  + "User-Agent"   = "Google-Cloud-Scheduler"
                }
              + http_method = "POST"
              + uri         = "https://batch.googleapis.com/v1/projects/PROJECT_NUMBER/locations/us-central1/jobs"
    
              + oauth_token {
                  + scope                 = "https://www.googleapis.com/auth/cloud-platform"
                  + service_account_email = "CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL"
                }
            }
    
          + retry_config {
              + max_backoff_duration = "3600s"
              + max_doublings        = 5
              + max_retry_duration   = "0s"
              + min_backoff_duration = "5s"
              + retry_count          = (known after apply)
            }
        }
    
    Plan: 1 to add, 0 to change, 0 to destroy.
    
    ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    
    Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.
    
  3. Pour appliquer le plan permettant de créer la job Cron batch-job-invoker, procédez comme suit:

    1. Saisissez la commande suivante :

      terraform apply
      

      Le résultat est semblable à la commande terraform plan précédente, sauf qu'elle se termine par une invite de confirmation.

    2. Pour confirmer et appliquer le plan, saisissez yes.

      Le résultat ressemble à ce qui suit :

      google_cloud_scheduler_job.batch-job-invoker: Creating...
      google_cloud_scheduler_job.batch-job-invoker: Creation complete after 0s [id=projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker]
      
      Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
      
  4. Pour vérifier que la job Cron batch-job-invoker existe et qu'elle est activée, décrivez-la:

    gcloud scheduler jobs describe batch-job-invoker --location us-central1
    

    Le résultat ressemble à ce qui suit :

    attemptDeadline: 180s
    httpTarget:
      body: ...
      headers:
        Content-Type: application/json
        User-Agent: Google-Cloud-Scheduler
      httpMethod: POST
      oauthToken:
        scope: https://www.googleapis.com/auth/cloud-platform
        serviceAccountEmail: CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL
      uri: https://batch.googleapis.com/v1/projects/PROJECT_NUMBER/locations/us-central1/jobs
    lastAttemptTime: '...'
    name: projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker
    retryConfig:
      maxBackoffDuration: 3600s
      maxDoublings: 5
      maxRetryDuration: 0s
      minBackoffDuration: 5s
    schedule: '*/5 * * * *'
    scheduleTime: '...'
    state: ENABLED
    status: {}
    timeZone: America/Los_Angeles
    userUpdateTime: '...'
    

    Dans la sortie, vérifiez que le champ state est défini sur ENABLED.

Vérifier que le job Cron crée un job par lot

Vérifiez que la job Cron batch-job-invoker crée correctement des tâches par lot.

  1. Attendez cinq minutes que la job Cron'exécute automatiquement ou déclenchez-job Cron immédiatement:

    gcloud scheduler jobs run batch-job-invoker --location us-central1
    
  2. Répertoriez les jobs Batch créés par la job Cron batch-job-invoker:

    gcloud batch jobs list \
    --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" \
    --sort-by ~createTime
    
    • L'option --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" filtre la liste pour n'inclure que les tâches par lot portant un libellé avec la clé source et la valeur terraform_and_cloud_scheduler_tutorial.
    • L'option --sort-by ~createTime trie la liste de la plus récente à la plus ancienne.

Mettre à jour la configuration Terraform pour suspendre la job Cron

Une fois que vous avez atteint le nombre souhaité de jobs par lot, mettez à jour et déployez la configuration Terraform pour suspendre la job Cron batch-job-invoker. Si vous souhaitez mettre à jour d'autres propriétés de la job Cron ou de futures tâches par lot, ce même processus s'applique.

  1. Mettez à jour le fichier de configuration Terraform pour suspendre la job Cron en définissant le champ paused sur true:

    sed -i 's/paused           = false # this cron job is enabled/paused           = true # this cron job is paused/g' main.tf
    
  2. Générez le plan d'exécution Terraform en fonction de l'état actuel de votre projet et du fichier de configuration:

    terraform plan
    

    Le résultat ressemble à ce qui suit, qui indique que l'objectif est de remplacer la valeur false du champ paused par true:

    google_cloud_scheduler_job.batch-job-invoker: Refreshing state... [id=projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker]
    
    Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
      ~ update in-place
    
    Terraform will perform the following actions:
    
      # google_cloud_scheduler_job.batch-job-invoker will be updated in-place
      ~ resource "google_cloud_scheduler_job" "batch-job-invoker" {
            id               = "projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker"
            name             = "batch-job-invoker"
          ~ paused           = false -> true
            # (6 unchanged attributes hidden)
    
          ~ http_target {
              ~ headers     = {
                  + "User-Agent"   = "Google-Cloud-Scheduler"
                    # (1 unchanged element hidden)
                }
                # (3 unchanged attributes hidden)
    
                # (1 unchanged block hidden)
            }
    
            # (1 unchanged block hidden)
        }
    
    Plan: 0 to add, 1 to change, 0 to destroy.
    
    ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
    
    Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.
    
  3. Pour appliquer le plan permettant de mettre à jour la job Cron batch-job-invoker, procédez comme suit:

    1. Saisissez la commande suivante :

      terraform apply
      

      Le résultat est semblable à la commande terraform plan précédente, sauf qu'elle se termine par une invite de confirmation.

    2. Pour confirmer et appliquer le plan, saisissez yes.

      Le résultat ressemble à ce qui suit :

      google_cloud_scheduler_job.batch-job-invoker: Modifying... [id=projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker]
      google_cloud_scheduler_job.batch-job-invoker: Modifications complete after 1s [id=projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker]
      
      Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
      
  4. Pour vérifier que la job Cron batch-job-invoker est suspendue, décrivez-la:

    gcloud scheduler jobs describe batch-job-invoker --location us-central1
    

    Le résultat ressemble à ce qui suit :

    attemptDeadline: 180s
    httpTarget:
      body: ...
      headers:
        Content-Type: application/json
        User-Agent: Google-Cloud-Scheduler
      httpMethod: POST
      oauthToken:
        scope: https://www.googleapis.com/auth/cloud-platform
        serviceAccountEmail: CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL
      uri: https://batch.googleapis.com/v1/projects/PROJECT_NUMBER/locations/us-central1/jobs
    lastAttemptTime: '...'
    name: projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker
    retryConfig:
      maxBackoffDuration: 3600s
      maxDoublings: 5
      maxRetryDuration: 0s
      minBackoffDuration: 5s
    schedule: '*/5 * * * *'
    scheduleTime: '...'
    state: PAUSED
    status: {}
    timeZone: America/Los_Angeles
    userUpdateTime: '...'
    

    Dans la sortie, vérifiez que le champ state est défini sur PAUSED.

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

Supprimer le projet

  1. Supprimez un projet Google Cloud :

    gcloud projects delete PROJECT_ID

  2. Accédez au répertoire parent, puis supprimez le répertoire Terraform et tous ses fichiers.

    cd .. && rm -r terraform
    

Supprimer des ressources individuelles

  1. Supprimez la job Cron batch-job-invoker.

    terraform destroy
    
  2. Pour supprimer tous les jobs Batch de ce tutoriel, procédez comme suit:

    1. Répertoriez tous les jobs Batch créés par la job Cron batch-job-invoker:

      gcloud batch jobs list \
      --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" \
      --sort-by ~createTime
      

      Notez le nom de chaque job que vous devez supprimer.

    2. Supprimez un job par lot de ce tutoriel:

      gcloud batch jobs delete JOB_NAME --location us-central1
      

      Remplacez JOB_NAME par le nom d'un job par lot.

      Répétez cette étape pour tous les jobs par lot.

  3. Si vous avez créé un compte de service pour ce tutoriel, supprimez-le:

    gcloud iam service-accounts delete SERVICE_ACCOUNT_EMAIL
    

    Remplacez SERVICE_ACCOUNT_EMAIL par l'adresse e-mail d'un compte de service que vous avez créé pour ce tutoriel. Plus précisément, vous avez utilisé les comptes de service suivants:

    • CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL : compte de service pour Cloud Scheduler.
    • BATCH_SERVICE_ACCOUNT_EMAIL : compte de service pour Batch.

    Si vous avez créé deux comptes de service distincts, répétez cette étape.

  4. Accédez au répertoire parent, puis supprimez le répertoire Terraform et tous ses fichiers.

    cd .. && rm -r terraform
    

Étapes suivantes