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.
Obwohl Terraform keine Ressourcen für Batch hat, Anleitung zum Erstellen von Batchjobs mit Terraform. 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 Google Cloud-Dienst, ermöglicht das automatische Planen von Cronjobs und unterstützt Terraform.
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, die ein Cloud Scheduler-Cronjob, der Batch jobs.
- 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 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. zeigt eine Eingabeaufforderung an. Das kann einige Sekunden dauern. zu initialisieren.
Lokale Shell
So verwenden Sie eine lokale Entwicklungsumgebung:
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Installieren Sie Terraform.
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
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 -
Stellen Sie sicher, dass Ihr Projekt mindestens ein Dienstkonto mit dem Berechtigungen, die für diese Anleitung erforderlich sind.
Insbesondere können Sie entweder demselben Dienstkonto oder zwei separaten Diensten Konten 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.
Um sicherzustellen, dass die Dienstkonten für diese Anleitung über die erforderlichen Berechtigungen zum Erstellen von Batchjobs mit Terraform über einen Cloud Scheduler-Cronjob Bitten Sie Ihren Administrator, den Dienstkonten für diese Anleitung die Berechtigung folgenden IAM-Rollen:
-
Dienstkonto für den Cloud Scheduler-Cronjob:
-
Batch-Job-Editor (
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)
-
Batch-Job-Editor (
-
Dienstkonto für die Batchjobs:
-
Batch-Agent-Melder (
roles/batch.agentReporter
) für das Projekt -
Logautor (
roles/logging.logWriter
) für das Projekt
-
Batch-Agent-Melder (
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.
-
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.
Um die Berechtigungen zu erhalten, die Sie zum Erstellen von Batchjobs mit Terraform benötigen über einen Cloud Scheduler-Cronjob bitten Sie Ihren Administrator, Ihnen folgenden IAM-Rollen:
-
Dienstkontonutzer (
roles/iam.serviceAccountUser
) für das Dienstkonto des Cloud Scheduler-Cronjobs -
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
Verzeichnis für Terraform und Konfigurationsdatei erstellen
der die Ressourcen definiert, die Sie mit Terraform erstellen oder aktualisieren möchten.
Die Beispielkonfigurationsdatei für dieses Tutorial definiert ein
Cloud Scheduler-Cronjob mit dem Namen batch-job-invoker
.
Wenn es aktiviert ist, wird der Cronjob batch-job-invoker
wird alle 5 Minuten ausgeführt, um eine neue Instanz der definierten
Batch job.
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 TasteEnter
:mkdir terraform && cd terraform && cat > main.tf
Mit diesem Befehl wird das Verzeichnis
terraform
erstellt und Sie gelangen dorthin und beginnt 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 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 sind einige Eingabevariablen und ein Cronjob definiert der die API-Methode zum Erstellen eines Batch-Jobs kontaktiert.
Drücken Sie
Ctrl+D
(oderCommand+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 und
Änderungen vornehmen und diese übernehmen. 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 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 basierend auf dem aktuellen Status Ihres Projekts und der Konfigurationsdatei:
terraform plan
Die Ausgabe sieht in etwa so aus:
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 an, um den
batch-job-invoker
-Cron-Job 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 Tarif 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.
So prüfen Sie, ob der Cronjob
batch-job-invoker
vorhanden und aktiviert ist: beschreiben: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 Batchjob erstellt
Prüfen, ob der Cronjob batch-job-invoker
korrekt erstellt wird
Batch jobs.
Warten Sie entweder 5 Minuten, bis der Cronjob ausgeführt wird automatisch oder lösen Sie den Cronjob aus, damit er sofort ausgeführt wird:
gcloud scheduler jobs run batch-job-invoker --location us-central1
Listen Sie die Batchjobs auf, die vom Cronjob
batch-job-invoker
:gcloud batch jobs list \ --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" \ --sort-by ~createTime
- Das
--filter labels.source=\"terraform_and_cloud_scheduler_tutorial\"
filtert die Liste so heraus, dass nur Batchjobs enthalten sind, die haben ein Label mit dem Schlüsselsource
und Wertterraform_and_cloud_scheduler_tutorial
- Das Flag
--sort-by ~createTime
sortiert die Liste von neu nach alt.
- Das
Terraform-Konfiguration aktualisieren, um den Cronjob anzuhalten
Nachdem Sie die gewünschte Anzahl
von Batchjobs festgelegt haben,
Aktualisieren Sie die Terraform-Konfiguration und stellen Sie sie bereit, um die
Cronjob batch-job-invoker
. Wenn Sie andere Eigenschaften der
Cronjobs oder zukünftige Batchjobs
gilt das gleiche Verfahren.
Aktualisieren Sie die Terraform-Konfigurationsdatei, um den Cronjob zu pausieren. Legen Sie dazu im Feld
paused
den Werttrue
fest: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: Der Wert des Felds
paused
soll vonfalse
auftrue
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.
Um den Plan anzuwenden,
batch-job-invoker
-Cronjob ausführen, führen Sie die folgenden Schritte aus: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 Tarif 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 Cronjob
batch-job-invoker
, 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
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
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
Löschen Sie den Cronjob
batch-job-invoker
.terraform destroy
So löschen Sie alle Batch-Jobs aus dieser Anleitung:
Alle Batchjobs auflisten, die vom Cronjob
batch-job-invoker
: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 Batchjob aus dieser Anleitung:
gcloud batch jobs delete JOB_NAME --location us-central1
Ersetzen Sie
JOB_NAME
durch den Namen eines Batch job.Wiederholen Sie diesen Schritt für alle Batchjobs.
Wenn Sie ein Dienstkonto für diese Anleitung erstellt haben, löschen Sie den Dienstkonto:
gcloud iam service-accounts delete SERVICE_ACCOUNT_EMAIL
Ersetzen Sie
SERVICE_ACCOUNT_EMAIL
durch die E-Mail-Adresse. die 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 Scheduler.BATCH_SERVICE_ACCOUNT_EMAIL
: das Dienstkonto für Batch
Wenn Sie zwei separate Dienstkonten erstellt haben, wiederholen Sie diesen Schritt.
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
- Weitere Informationen zur Verwendung von Terraform mit Google Cloud:
- Weitere Informationen zu Cloud Scheduler-Cronjobs
- Weitere Informationen zu Batchjobs