In dieser Anleitung wird erläutert, wie Sie mit Terraform Batchjobs mithilfe eines Cloud Scheduler-Cronjobs erstellen und ausführen können.
Terraform ist ein Open-Source-Tool, mit dem Sie Infrastruktur bereitstellen und verwalten können. Dazu geben Sie den gewünschten Status in den Konfigurationsdateien an. Diese Dateien können als Code behandelt und in Versionsverwaltungssystemen wie GitHub gespeichert werden.
Obwohl Terraform keine Ressourcen für Batch hat, zeigt diese Anleitung, wie Sie Terraform zum Erstellen von Batch-Jobs verwenden können. Insbesondere können Sie mit Terraform einen Cloud Scheduler-Cronjob planen und ausführen, der auf die Batch API ausgerichtet ist, um Batch-Jobs zu erstellen und auszuführen. Cloud Scheduler ist ein Google Cloud-Dienst, mit dem Sie Cronjobs automatisch planen können. Er unterstützt Terraform.
Diese Anleitung richtet sich an Batch-Nutzer, die die Infrastruktur bereits mit Terraform verwalten und Batchjobs in Terraform einbinden möchten.
Lernziele
- Erstellen Sie ein Terraform-Verzeichnis und eine Konfigurationsdatei, die einen Cloud Scheduler-Cronjob definiert, 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.
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
-
Bereiten Sie Ihre Entwicklungsumgebung vor, entweder Cloud Shell oder eine lokale Shell:
Cloud Shell
Wenn Sie ein Online-Terminal verwenden möchten, bei dem die gcloud CLI und Terraform bereits eingerichtet sind, 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:
- Installieren Sie die Google Cloud CLI.
-
Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:
gcloud init
- Installieren Sie Terraform.
-
Google Cloud-Projekt erstellen oder auswählen.
-
Erstellen Sie ein Google Cloud-Projekt:
gcloud projects create PROJECT_ID
Ersetzen Sie
PROJECT_ID
durch einen Namen für das Google Cloud-Projekt, das Sie erstellen. -
Wählen Sie das von Ihnen erstellte Google Cloud-Projekt aus:
gcloud config set project PROJECT_ID
Ersetzen Sie
PROJECT_ID
durch den Namen Ihres Google Cloud-Projekts.
-
-
Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.
-
Aktivieren Sie die 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 -
Achten Sie darauf, dass Ihr Projekt mindestens ein Dienstkonto mit den für diese Anleitung erforderlichen Berechtigungen hat.
Insbesondere können Sie entweder dasselbe Dienstkonto oder zwei separate Dienstkonten verwenden, um die folgenden Berechtigungen zu erteilen:
- Erlauben Sie dem Cronjob, Batch-Jobs zu erstellen und das Dienstkonto für die Batch-Jobs anzuhängen.
- Erlauben Sie den Batchjobs, die für die Ausführung erforderlichen Ressourcen zu erstellen und auf sie zuzugreifen.
Bitten Sie Ihren Administrator, den Dienstkonten für diese Anleitung die folgenden IAM-Rollen zu gewähren, damit die Dienstkonten für diese Anleitung die erforderlichen Berechtigungen zum Erstellen von Batchjobs über einen Cloud Scheduler-Cronjob mit Terraform haben:
-
Dienstkonto für den Cloud Scheduler-Cronjob:
-
Batch Job Editor (
roles/batch.jobsEditor
) für das Projekt -
Dienstkontonutzer (
roles/iam.serviceAccountUser
) des Dienstkontos für die Batchjobs (auch wenn es sich um ihn selbst handelt)
-
Batch Job Editor (
-
Dienstkonto für die Batch-Jobs:
-
Batch Agent Reporter (
roles/batch.agentReporter
) für das Projekt -
Logautor (
roles/logging.logWriter
) für das Projekt
-
Batch Agent Reporter (
Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff verwalten.
Möglicherweise kann Ihr Administrator den Dienstkonten für diese Anleitung auch die erforderlichen Berechtigungen über benutzerdefinierte Rollen oder andere vordefinierte Rollen erteilen.
-
Prüfen Sie, ob Sie die für diese Anleitung erforderlichen Berechtigungen haben.
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 zu gewähren, um die Berechtigungen zu erhalten, die Sie zum Erstellen von Batchjobs über einen Cloud Scheduler-Cronjob mit Terraform benötigen:
-
Dienstkontonutzer (
roles/iam.serviceAccountUser
) des Dienstkontos für den Cloud Scheduler-Cronjob -
Cloud Scheduler-Administrator (
roles/cloudscheduler.admin
) für das Projekt -
Batch Job Editor (
roles/batch.jobsEditor
) für das Projekt -
Loganzeige (
roles/logging.viewer
) für das Projekt
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 diese Anleitung wird ein Cloud Scheduler-Cronjob mit dem Namen batch-job-invoker
definiert.
Wenn der Cronjob batch-job-invoker
aktiviert ist, wird er alle 5 Minuten ausgeführt, um eine neue Instanz des definierten Batch-Jobs zu erstellen.
Geben Sie den folgenden Befehl ein und drücken Sie
Enter
, um ein Verzeichnis und eine neue Terraform-Konfigurationsdatei (.tf
) in diesem Verzeichnis zu erstellen:mkdir terraform && cd terraform && cat > main.tf
Mit diesem Befehl wird das Verzeichnis
terraform
erstellt, Sie gelangen zum Verzeichnis und beginnen in der nächsten Zeile mit der Definition einer neuenmain.tf
-Konfigurationsdatei.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_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 } } }
Ersetzen Sie Folgendes:
PROJECT_ID
: die Projekt-ID Ihres Projekts.PROJECT_NUMBER
: die Projektnummer Ihres ProjektsCLOUD_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 Batch-Jobs vorbereitet habenWenn 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 Cronjob definiert, der die API-Methode kontaktiert, um einen Batch-Job zu erstellen.
Um die Datei zu speichern und zu schließen, drücken Sie
Ctrl+D
(oderCommand+D
unter macOS).
Terraform-Konfiguration bereitstellen, um den Cronjob zu erstellen
Stellen Sie die Terraform-Konfiguration bereit, indem Sie Terraform initialisieren, die geplanten Änderungen generieren und diese Änderungen anwenden. Nach dem Bereitstellen der Terraform-Konfiguration können Sie die Ressourcen in Ihrem Projekt beschreiben, um zu prüfen, ob Terraform den Cronjob batch-job-invoker
erfolgreich erstellt hat.
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.
Generieren Sie den Terraform-Ausführungsplan anhand des aktuellen Status Ihres Projekts und der Konfigurationsdatei:
terraform plan
Die Ausgabe sieht in etwa so aus, dass der Cronjob
batch-job-invoker
erstellt werden soll: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.
So wenden Sie den Plan zum Erstellen des Cronjobs
batch-job-invoker
an:Geben Sie den folgenden Befehl ein:
terraform apply
Die Ausgabe ähnelt dem vorherigen
terraform plan
-Befehl, außer dass sie mit einer Bestätigungsaufforderung endet.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.
Beschreiben Sie, ob der Cronjob
batch-job-invoker
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_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: '...'
Prüfen Sie in der Ausgabe, ob das Feld
state
aufENABLED
gesetzt ist.
Prüfen, ob der Cronjob einen Batch-Job erstellt
Prüfen Sie, ob der Cronjob batch-job-invoker
Batchjobs korrekt erstellt.
Warten Sie entweder 5 Minuten, bis der Cronjob automatisch ausgeführt wird, oder lösen Sie die sofortige Ausführung aus:
gcloud scheduler jobs run batch-job-invoker --location us-central1
Listen Sie die Batch-Jobs auf, die vom Cronjob
batch-job-invoker
erstellt wurden:gcloud batch jobs list \ --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" \ --sort-by ~createTime
- Das Flag
--filter labels.source=\"terraform_and_cloud_scheduler_tutorial\"
filtert die Liste so, dass nur Batchjobs mit einem Label mit dem Schlüsselsource
und dem Wertterraform_and_cloud_scheduler_tutorial
enthalten sind. - Das Flag
--sort-by ~createTime
sortiert die Liste von neu nach alt.
- Das Flag
Terraform-Konfiguration aktualisieren, um den Cronjob zu pausieren
Wenn Sie die gewünschte Anzahl von Batchjobs festgelegt haben, aktualisieren Sie die Terraform-Konfiguration und stellen Sie sie bereit, um den Cronjob batch-job-invoker
anzuhalten. Wenn Sie andere Attribute des Cronjobs oder zukünftiger Batch-Jobs aktualisieren möchten, gilt der gleiche Prozess.
Aktualisieren Sie die Terraform-Konfigurationsdatei, um den Cronjob anzuhalten. Setzen Sie dazu das Feld
paused
auftrue
:sed -i 's/paused = false # this cron job is enabled/paused = true # this cron job is paused/g' main.tf
Generieren Sie den Terraform-Ausführungsplan anhand des aktuellen Status Ihres Projekts und der Konfigurationsdatei:
terraform plan
Die Ausgabe sieht in etwa so aus, als ob der Wert des Felds
paused
vonfalse
auftrue
aktualisiert werden soll: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.
So wenden Sie den Plan zum Aktualisieren des Cronjobs
batch-job-invoker
an:Geben Sie den folgenden Befehl ein:
terraform apply
Die Ausgabe ähnelt dem vorherigen
terraform plan
-Befehl, außer dass sie mit einer Bestätigungsaufforderung endet.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.
Beschreiben Sie den
batch-job-invoker
-Cronjob, um zu prüfen, ob er pausiert wurde: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_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: '...'
Prüfen Sie in der Ausgabe, ob das Feld
state
aufPAUSED
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
Google Cloud-Projekt löschen:
gcloud projects delete PROJECT_ID
Wechseln Sie zum übergeordneten Verzeichnis und löschen Sie das Terraform-Verzeichnis und alle zugehörigen Dateien.
cd .. && rm -r terraform
Einzelne Ressourcen löschen
Löschen Sie den Cronjob
batch-job-invoker
.terraform destroy
So löschen Sie alle Batchjobs aus dieser Anleitung:
Listen Sie alle Batch-Jobs auf, 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.
So löschen Sie einen Batch-Job aus dieser Anleitung:
gcloud batch jobs delete JOB_NAME --location us-central1
Ersetzen Sie
JOB_NAME
durch den Namen eines Batch-Jobs.Wiederholen Sie diesen Schritt für alle Batchjobs.
Wenn Sie ein Dienstkonto für diese Anleitung 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 die folgenden Dienstkonten verwendet:CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL
: das Dienstkonto für Cloud SchedulerBATCH_SERVICE_ACCOUNT_EMAIL
ist das Dienstkonto für Batch.
Wenn Sie zwei separate Dienstkonten erstellt haben, wiederholen Sie diesen Schritt.
Wechseln Sie zum übergeordneten Verzeichnis und löschen Sie das Terraform-Verzeichnis und alle zugehörigen Dateien.
cd .. && rm -r terraform
Nächste Schritte
- Weitere Informationen zur Verwendung von Terraform mit Google Cloud:
- Weitere Informationen zu Cronjobs in Cloud Scheduler
- Weitere Informationen zu Batchjobs.