In dieser Anleitung wird beschrieben, wie Sie mit Terraform Batch-Jobs mithilfe eines Cloud Scheduler-Cronjobs erstellen und ausführen.
Terraform ist ein Open-Source-Tool, mit dem Sie Infrastruktur bereitstellen und verwalten können, indem Sie den gewünschten Zustand in Konfigurationsdateien angeben. Diese Dateien können als Code behandelt und in Versionsverwaltungssystemen wie GitHub gespeichert werden.
Obwohl Terraform keine Ressourcen für Batch hat, wird in dieser Anleitung gezeigt, wie Sie mit Terraform Batch-Jobs erstellen können. Sie können Terraform verwenden, um einen Cloud Scheduler-Cron-Job zu planen und auszufü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.
Dieses Tutorial richtet sich an Batch-Nutzer, die bereits Infrastruktur mit Terraform verwalten und Batch-Jobs in Terraform einbinden möchten.
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-Cron-Job mit dem Namen batch-job-invoker
definiert.
Wenn er aktiviert ist, wird der batch-job-invoker
-Cron-Job alle 5 Minuten ausgeführt, um eine neue Instanz des definierten Batchjobs zu erstellen.
Geben Sie den folgenden Befehl ein und drücken Sie dann
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 werden dorthin weitergeleitet und in der nächsten Zeile wird mit der Definition einer neuenmain.tf
-Konfigurationsdatei begonnen.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 Batch-Jobs vorbereitet haben.Wenn Sie beispielsweise das Compute Engine-Standarddienstkonto verwenden möchten, geben Sie Folgendes an:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
Diese Terraform-Konfiguration definiert einige Eingabevariablen und einen Cron-Job, der die API-Methode zum Erstellen eines Batch-Jobs aufruft.
Drücken Sie zum Speichern und Schließen der Datei
Ctrl+D
(oderCommand+D
auf 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. 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.
Initialisieren Sie Terraform im Verzeichnis:
terraform init
Die Ausgabe sieht 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 basierend auf dem aktuellen Status Ihres Projekts und der Konfigurationsdatei:
terraform plan
Die Ausgabe sieht etwa so aus, was darauf hinweist, dass der Cron-Job
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_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.
So wenden Sie den Plan an, um den Cron-Job
batch-job-invoker
zu erstellen:Geben Sie den folgenden Befehl ein:
terraform apply
Die Ausgabe ähnelt der des vorherigen
terraform plan
-Befehls, endet jedoch mit einer Bestätigungsaufforderung.Geben Sie
yes
ein, um den Plan zu bestätigen und anzuwenden.Die Ausgabe sieht 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.
So prüfen Sie, ob der Cronjob
batch-job-invoker
vorhanden und aktiviert ist:gcloud scheduler jobs describe batch-job-invoker --location us-central1
Die Ausgabe sieht 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
aufENABLED
gesetzt ist.
Prüfen, ob durch den Cron-Job ein Batch-Job erstellt wird
Prüfen Sie, ob durch den batch-job-invoker
-Cron-Job Batch-Jobs korrekt erstellt werden.
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
Listen Sie die Batchjobs auf, 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 mit einem Label mit dem Schlüsselsource
und dem Wertterraform_and_cloud_scheduler_tutorial
enthalten sind. - Mit dem Flag
--sort-by ~createTime
wird die Liste vom neuesten zum ältesten sortiert.
- Mit dem Flag
Terraform-Konfiguration aktualisieren, um den Cronjob zu pausieren
Wenn Sie die gewünschte Anzahl von Batch-Jobs haben, aktualisieren und stellen Sie die Terraform-Konfiguration bereit, um den batch-job-invoker
-Cron-Job zu pausieren. Wenn Sie andere Eigenschaften des Cron-Jobs oder zukünftiger Batch-Jobs aktualisieren möchten, gilt dasselbe Verfahren.
Aktualisieren Sie die Terraform-Konfigurationsdatei, um den Cronjob zu pausieren, indem Sie das Feld
paused
auftrue
setzen: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 basierend auf dem aktuellen Status Ihres Projekts und der Konfigurationsdatei:
terraform plan
Die Ausgabe sieht in etwa so aus. Sie zeigt, dass der Wert des Felds
paused
vonfalse
zutrue
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 an, um den
batch-job-invoker
-Cron-Job zu aktualisieren:Geben Sie den folgenden Befehl ein:
terraform apply
Die Ausgabe ähnelt der des vorherigen
terraform plan
-Befehls, endet jedoch mit einer Bestätigungsaufforderung.Geben Sie
yes
ein, um den Plan zu bestätigen und anzuwenden.Die Ausgabe sieht 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.
So prüfen Sie, ob der Cronjob
batch-job-invoker
pausiert ist:gcloud scheduler jobs describe batch-job-invoker --location us-central1
Die Ausgabe sieht 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
aufPAUSED
gesetzt ist.