Batch-Jobs mit Terraform und Cloud Scheduler erstellen und ausführen


In dieser Anleitung erfahren Sie, wie Sie mit Terraform Batch-Jobs mit einem Cloud Scheduler-Cronjob erstellen und ausführen.

Terraform ist ein Open-Source-Tool, mit dem Sie die Infrastruktur bereitstellen und verwalten können, indem Sie den gewünschten Zustand in Konfigurationsdateien angeben. Diese Dateien können als Code behandelt und in Versionskontrollsystemen wie GitHub gespeichert werden.

Terraform bietet zwar keine Ressourcen für Batch, in dieser Anleitung wird jedoch gezeigt, wie Sie mit Terraform Batch-Jobs erstellen können. Insbesondere können Sie mit Terraform einen Cloud Scheduler-Cronjob planen und ausführen, der auf die Batch API ausgerichtet ist, um Batchjobs zu erstellen und auszuführen. Cloud Scheduler ist ein Dienst von Google Cloud , mit dem Sie Cronjobs automatisch planen und Terraform unterstützen können.

Diese Anleitung richtet sich an Batch-Nutzer, die bereits Infrastruktur mit Terraform verwalten und Batch-Jobs in Terraform einbinden möchten.

Lernziele

  • Erstellen Sie ein Terraform-Verzeichnis und eine Konfigurationsdatei, in der ein Cloud Scheduler-Cronjob definiert ist, der Batchjobs erstellt.
  • Stellen Sie die Terraform-Konfiguration bereit, um den Cronjob auszuführen.
  • Prüfen Sie, ob der Cronjob Batchjobs erstellt.
  • Aktualisieren Sie die Terraform-Konfiguration, um den Cronjob anzuhalten, damit keine Batchjobs mehr erstellt werden.

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Hinweise

  1. Bereiten Sie Ihre Entwicklungsumgebung vor, entweder Cloud Shell oder eine lokale Shell:

    Cloud Shell

    Wenn Sie ein Onlineterminal mit bereits eingerichteter gcloud CLI und Terraform verwenden möchten, aktivieren Sie Cloud Shell.

    Unten auf dieser Seite wird eine Cloud Shell-Sitzung gestartet und eine Eingabeaufforderung angezeigt. Das Initialisieren der Sitzung kann einige Sekunden dauern.

    Lokale Shell

    So verwenden Sie eine lokale Entwicklungsumgebung:

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. Installieren Sie Terraform.
  2. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Batch, Compute Engine, Cloud Logging, Cloud Scheduler, and Resource Manager APIs:

    gcloud services enable batch.googleapis.com compute.googleapis.com logging.googleapis.com  cloudscheduler.googleapis.com cloudresourcemanager.googleapis.com
  5. Achten Sie darauf, dass Ihr Projekt mindestens ein Dienstkonto mit den für diese Anleitung erforderlichen Berechtigungen hat.

    Sie können entweder dasselbe Dienstkonto oder zwei separate Dienstkonten verwenden, um die folgenden Berechtigungen zu gewähren:

    • Erlauben Sie dem Cron-Job, Batch-Jobs zu erstellen, und hängen Sie das Dienstkonto für die Batch-Jobs an.
    • Gewähren Sie den Batchjobs die Berechtigung, die zum Ausführen erforderlichen Ressourcen zu erstellen und darauf zuzugreifen.

    Damit das Dienstkonto bzw. die Dienstkonten für diese Anleitung die erforderlichen Berechtigungen haben, um mit Terraform Batch-Jobs über einen Cloud Scheduler-Cron-Job zu erstellen, bitten Sie Ihren Administrator, dem Dienstkonto bzw. den Dienstkonten für diese Anleitung die folgenden IAM-Rollen zuzuweisen:

    • Dienstkonto für den Cloud Scheduler-Cronjob:
      • Batch-Job-Bearbeiter (roles/batch.jobsEditor) für das Projekt
      • Dienstkontonutzer (roles/iam.serviceAccountUser) für das Dienstkonto der Batch-Jobs (auch wenn es sich um dasselbe Konto handelt)
    • Dienstkonto für die Batchjobs:

    Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

    Ihr Administrator kann den Dienstkonten für dieses Tutorial möglicherweise auch die erforderlichen Berechtigungen über benutzerdefinierte Rollen oder andere vordefinierte Rollen erteilen.

  6. Sie benötigen die für diese Anleitung erforderlichen Berechtigungen.

    Insbesondere benötigen Sie Berechtigungen für Folgendes:

    • Erstellen Sie einen Cronjob und hängen Sie das Dienstkonto für den Cronjob an.
    • Rufen Sie den Cronjob und die Batchjobs auf und löschen Sie sie.

    Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen zuzuweisen, um die Berechtigungen zu erhalten, die Sie benötigen, um mit Terraform Batch-Jobs über einen Cloud Scheduler-Cronjob zu erstellen:

Terraform-Verzeichnis und -Konfigurationsdatei erstellen

Erstellen Sie ein Verzeichnis für Terraform und eine Konfigurationsdatei, in der die Ressourcen definiert sind, die Sie mit Terraform erstellen oder aktualisieren möchten. In der Beispielkonfigurationsdatei für dieses Tutorial wird ein Cloud Scheduler-Cronjob mit dem Namen batch-job-invoker definiert. Wenn diese Option aktiviert ist, wird der batch-job-invoker-Cronjob alle 5 Minuten ausgeführt, um eine neue Instanz des definierten Batchjobs zu erstellen.

  1. Wenn Sie ein Verzeichnis und eine neue Terraform-Konfigurationsdatei (.tf) in diesem Verzeichnis erstellen möchten, geben Sie den folgenden Befehl ein und drücken Sie dann die Taste Enter:

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

    Mit diesem Befehl wird das Verzeichnis terraform erstellt, Sie werden dorthin verschoben und in der nächsten Zeile beginnt die Definition einer neuen Konfigurationsdatei main.tf.

  2. Kopieren Sie die folgende Terraform-Konfiguration und fügen Sie sie ein:

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

    Ersetzen Sie Folgendes:

    • PROJECT_ID: die Projekt-ID Ihres Projekts.
    • PROJECT_NUMBER: die Projektnummer Ihres Projekts.
    • CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL: die E-Mail-Adresse des Dienstkontos, das Sie für den Cloud Scheduler-Cronjob vorbereitet haben.

      Wenn Sie beispielsweise das Compute Engine-Standarddienstkonto verwenden möchten, geben Sie Folgendes an:

      PROJECT_NUMBER-compute@developer.gserviceaccount.com
      
    • BATCH_SERVICE_ACCOUNT_EMAIL: die E-Mail-Adresse des Dienstkontos, das Sie für Batchjobs vorbereitet haben.

      Wenn Sie beispielsweise das Compute Engine-Standarddienstkonto verwenden möchten, geben Sie Folgendes an:

      PROJECT_NUMBER-compute@developer.gserviceaccount.com
      

    In dieser Terraform-Konfiguration werden einige Eingabevariablen und ein Cron-Job definiert, der die API-Methode zum Erstellen eines Batchjobs aufruft.

  3. Drücken Sie Ctrl+D (oder Command+D unter macOS), um die Datei zu speichern und zu schließen.

Terraform-Konfiguration bereitstellen, um den Cronjob zu erstellen

Stellen Sie die Terraform-Konfiguration bereit, indem Sie Terraform initialisieren, die geplanten Änderungen generieren und anwenden. Nachdem Sie die Terraform-Konfiguration bereitgestellt haben, können Sie die Ressourcen in Ihrem Projekt beschreiben, um zu prüfen, ob Terraform den batch-job-invoker-Cronjob erfolgreich erstellt hat.

  1. Initialisieren Sie Terraform im Verzeichnis:

    terraform init
    

    Die Ausgabe sieht in etwa so aus:

    ...
    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. Generieren Sie den Terraform-Ausführungsplan basierend auf dem aktuellen Status Ihres Projekts und der Konfigurationsdatei:

    terraform plan
    

    Die Ausgabe sieht in etwa so aus: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_ID/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. So wenden Sie den Plan an, um den batch-job-invoker-Cron-Job zu erstellen:

    1. Geben Sie den folgenden Befehl ein:

      terraform apply
      

      Die Ausgabe ähnelt der des vorherigen terraform plan-Befehls, endet jedoch mit einer Bestätigungsaufforderung.

    2. Geben Sie yes ein, um den Plan zu bestätigen und anzuwenden.

      Die Ausgabe sieht in etwa so aus:

      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. Prüfen Sie, ob der batch-job-invoker-Cronjob vorhanden und aktiviert ist:

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

    Die Ausgabe sieht in etwa so aus:

    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_ID/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: '...'
    

    Prüfen Sie in der Ausgabe, ob das Feld state auf ENABLED gesetzt ist.

Prüfen, ob der Cronjob einen Batchjob erstellt

Prüfen Sie, ob der batch-job-invoker-Cron-Job Batch-Jobs korrekt erstellt.

  1. Warten Sie entweder 5 Minuten, bis der Cron-Job automatisch ausgeführt wird, oder lösen Sie die sofortige Ausführung des Cron-Jobs aus:

    gcloud scheduler jobs run batch-job-invoker --location us-central1
    
  2. Liste der Batchjobs, die vom Cronjob batch-job-invoker erstellt wurden:

    gcloud batch jobs list \
    --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" \
    --sort-by ~createTime
    
    • Mit dem Flag --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" wird die Liste so gefiltert, dass nur Batch-Jobs enthalten sind, die ein Label mit dem Schlüssel source und dem Wert terraform_and_cloud_scheduler_tutorial haben.
    • Mit dem Flag --sort-by ~createTime wird die Liste von neu nach alt sortiert.

Terraform-Konfiguration aktualisieren, um den Cronjob anzuhalten

Sobald Sie die gewünschte Anzahl von Batchjobs haben, aktualisieren und implementieren Sie die Terraform-Konfiguration, um den batch-job-invoker-CRON-Job anzuhalten. Wenn Sie andere Eigenschaften des Cron-Jobs oder zukünftiger Batch-Jobs aktualisieren möchten, gehen Sie so vor.

  1. Aktualisieren Sie die Terraform-Konfigurationsdatei, um den Cronjob zu pausieren. Legen Sie dazu im Feld paused den Wert true fest:

    sed -i 's/paused           = false # this cron job is enabled/paused           = true # this cron job is paused/g' main.tf
    
  2. Generieren Sie den Terraform-Ausführungsplan basierend auf dem aktuellen Status Ihres Projekts und der Konfigurationsdatei:

    terraform plan
    

    Die Ausgabe sieht in etwa so aus: Der Wert des Felds paused soll von false auf true aktualisiert werden.

    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. So wenden Sie den Plan an, um den batch-job-invoker-Cron-Job zu aktualisieren:

    1. Geben Sie den folgenden Befehl ein:

      terraform apply
      

      Die Ausgabe ähnelt der des vorherigen terraform plan-Befehls, endet jedoch mit einer Bestätigungsaufforderung.

    2. Geben Sie yes ein, um den Plan zu bestätigen und anzuwenden.

      Die Ausgabe sieht in etwa so aus:

      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. Um zu prüfen, ob der Cronjob batch-job-invoker pausiert ist, beschreibe ihn:

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

    Die Ausgabe sieht in etwa so aus:

    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_ID/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: '...'
    

    Prüfen Sie in der Ausgabe, ob das Feld state auf PAUSED gesetzt ist.

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

Projekt löschen

  1. Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

  2. Rufen Sie das übergeordnete Verzeichnis auf und löschen Sie das Terraform-Verzeichnis und alle darin enthaltenen Dateien.

    cd .. && rm -r terraform
    

Einzelne Ressourcen löschen

  1. Löschen Sie den Cronjob batch-job-invoker.

    terraform destroy
    
  2. So löschen Sie alle Batch-Jobs aus dieser Anleitung:

    1. Liste aller Batchjobs, die vom Cronjob batch-job-invoker erstellt wurden:

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

      Notieren Sie sich den Namen jedes Jobs, den Sie löschen möchten.

    2. So löschen Sie einen Batchjob aus dieser Anleitung:

      gcloud batch jobs delete JOB_NAME --location us-central1
      

      Ersetzen Sie JOB_NAME durch den Namen eines Batchjobs.

      Wiederholen Sie diesen Schritt für alle Batch-Jobs.

  3. Wenn Sie für diese Anleitung ein Dienstkonto erstellt haben, löschen Sie es:

    gcloud iam service-accounts delete SERVICE_ACCOUNT_EMAIL
    

    Ersetzen Sie SERVICE_ACCOUNT_EMAIL durch die E-Mail-Adresse eines Dienstkontos, das Sie für diese Anleitung erstellt haben. Sie haben dabei die folgenden Dienstkonten verwendet:

    • CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL: das Dienstkonto für Cloud Scheduler.
    • BATCH_SERVICE_ACCOUNT_EMAIL: das Dienstkonto für Batch

    Wenn Sie zwei separate Dienstkonten erstellt haben, wiederholen Sie diesen Schritt.

  4. Rufen Sie das übergeordnete Verzeichnis auf und löschen Sie das Terraform-Verzeichnis und alle darin enthaltenen Dateien.

    cd .. && rm -r terraform
    

Nächste Schritte