Ce tutoriel explique comment utiliser Terraform pour créer et exécuter des jobs Batch à l'aide d'un 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 explique comment utiliser Terraform pour créer des jobs Batch. Plus précisément, vous pouvez utiliser Terraform pour planifier et exécuter un job Cron Cloud Scheduler qui cible l'API Batch afin de créer et d'exécuter des jobs Batch. Cloud Scheduler est un service Google Cloud qui vous permet de planifier automatiquement des tâches Cron et qui est compatible avec Terraform.
Ce tutoriel est destiné aux utilisateurs de Batch qui gèrent déjà l'infrastructure avec Terraform et qui souhaitent intégrer des jobs Batch à Terraform.
Créer le répertoire et le fichier de configuration Terraform
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 de ce tutoriel définit un job cron Cloud Scheduler nommé batch-job-invoker
.
Lorsqu'il est activé, le job cron batch-job-invoker
s'exécute toutes les cinq minutes pour créer une instance du job Batch défini.
Pour créer un répertoire et un fichier de configuration Terraform (
.tf
) dans ce répertoire, saisissez la commande suivante, puis appuyez surEnter
:mkdir terraform && cd terraform && cat > main.tf
Cette commande crée le répertoire
terraform
, vous y redirige et commence à définir un nouveau fichier de configurationmain.tf
sur la ligne suivante.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_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 } } }
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 le 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 jobs par lot.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 des variables d'entrée et un job cron qui contacte la méthode API pour créer un job Batch.
Pour enregistrer et fermer le fichier, appuyez sur
Ctrl+D
(ouCommand+D
sur 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 prévues 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éé le job Cron batch-job-invoker
.
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.
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 montre que le plan consiste à créer le 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_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.
Pour appliquer le plan afin de créer le job Cron
batch-job-invoker
, procédez comme suit :Saisissez la commande suivante :
terraform apply
Le résultat est semblable à celui de la commande
terraform plan
précédente, sauf qu'il se termine par une invite de confirmation.Pour confirmer et appliquer le forfait, 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.
Pour vérifier que le job Cron
batch-job-invoker
existe et est activé, décrivez-le :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_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: '...'
Dans le résultat, vérifiez que le champ
state
est défini surENABLED
.
Vérifier que le job Cron crée une tâche Batch
Vérifiez que le job Cron batch-job-invoker
crée correctement les jobs par lot.
Attendez cinq minutes que le job Cron s'exécute automatiquement ou déclenchez-le immédiatement :
gcloud scheduler jobs run batch-job-invoker --location us-central1
Répertoriez les jobs Batch créés par le job Cron
batch-job-invoker
:gcloud batch jobs list \ --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" \ --sort-by ~createTime
- L'indicateur
--filter labels.source=\"terraform_and_cloud_scheduler_tutorial\"
filtre la liste pour n'inclure que les jobs par lot qui ont un libellé avec la clésource
et la valeurterraform_and_cloud_scheduler_tutorial
. - L'indicateur
--sort-by ~createTime
trie la liste du plus récent au plus ancien.
- L'indicateur
Mettre à jour la configuration Terraform pour suspendre le job Cron
Une fois que vous avez le nombre souhaité de jobs Batch, mettez à jour et déployez la configuration Terraform pour suspendre le job cron batch-job-invoker
. Si vous souhaitez mettre à jour d'autres propriétés du job cron ou des futurs jobs Batch, la même procédure s'applique.
Mettez à jour le fichier de configuration Terraform pour suspendre le job Cron en définissant le champ
paused
surtrue
:sed -i 's/paused = false # this cron job is enabled/paused = true # this cron job is paused/g' main.tf
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, ce qui indique que le plan consiste à mettre à jour la valeur du champ
paused
defalse
à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.
Pour appliquer le plan afin de mettre à jour le job cron
batch-job-invoker
, procédez comme suit :Saisissez la commande suivante :
terraform apply
Le résultat est semblable à celui de la commande
terraform plan
précédente, sauf qu'il se termine par une invite de confirmation.Pour confirmer et appliquer le forfait, 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.
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_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: '...'
Dans le résultat, vérifiez que le champ
state
est défini surPAUSED
.