Ce tutoriel explique comment utiliser Terraform pour créer et exécuter des tâches de traitement par lot à l'aide d'une tâche 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 des 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 tâches Batch. Plus précisément, vous pouvez utiliser Terraform pour planifier et exécuter un job cron Cloud Scheduler qui cible l'API Batch pour créer et exécuter des jobs Batch. Cloud Scheduler est un Google Cloud service qui vous permet de planifier automatiquement des tâches Cron et 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 tâches Batch à Terraform.
Objectifs
- Créez un répertoire Terraform et un fichier de configuration qui définit une tâche cron Cloud Scheduler qui crée des tâches par lot.
- Déployez la configuration Terraform pour exécuter la tâche cron.
- Vérifiez que la tâche cron crée des tâches par lot.
- Mettez à jour la configuration Terraform pour suspendre la tâche Cron afin qu'elle cesse de créer des tâches de traitement par lot.
Coûts
Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :
Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.
Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.
Avant de commencer
-
Préparez votre environnement de développement, Cloud Shell ou un shell local:
Cloud Shell
Pour utiliser un terminal en ligne avec la gcloud CLI et Terraform déjà configurés, activez Cloud Shell.
En bas de cette page, une session Cloud Shell démarre et affiche une invite de ligne de commande. L'initialisation de la session peut prendre quelques secondes.
Interface système locale
Pour utiliser un environnement de développement local, procédez comme suit :
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Installez 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 -
Assurez-vous que votre projet dispose d'au moins un compte de service disposant des autorisations requises pour ce tutoriel.
Plus précisément, vous pouvez utiliser le même compte de service ou deux comptes de service distincts pour accorder les autorisations suivantes:
- Autorisez la tâche cron à créer des tâches par lot et à associer le compte de service aux tâches par lot.
- Autorisez les tâches Batch à créer et à accéder aux ressources requises pour leur exécution.
Pour vous assurer que le ou les comptes de service de ce tutoriel disposent des autorisations nécessaires pour utiliser Terraform afin de créer des jobs Batch via un job cron Cloud Scheduler, demandez à votre administrateur d'accorder les rôles IAM suivants au ou aux comptes de service de ce tutoriel:
-
Compte de service pour la tâche cron Cloud Scheduler :
-
Éditeur de tâches par lot (
roles/batch.jobsEditor
) sur le projet -
Utilisateur du compte de service (
roles/iam.serviceAccountUser
) sur le compte de service pour les jobs de traitement par lot (même s'il s'agit de lui-même)
-
Éditeur de tâches par lot (
-
Compte de service pour les jobs par lots :
-
Responsable du signalement d'agent par lot (
roles/batch.agentReporter
) sur le projet -
Rédacteur de journaux (
roles/logging.logWriter
) sur le projet
-
Responsable du signalement d'agent par lot (
Pour en savoir plus sur l'attribution de rôles, consultez la page Gérer l'accès aux projets, aux dossiers et aux organisations.
Votre administrateur peut également attribuer au ou aux comptes de service de ce tutoriel les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.
-
Assurez-vous de disposer des autorisations requises pour suivre ce tutoriel.
Plus précisément, vous devez disposer des autorisations suivantes:
- Créez une tâche cron et joignez-y le compte de service.
- Affichez et supprimez la tâche Cron et les tâches par lot.
Pour obtenir les autorisations nécessaires pour utiliser Terraform afin de créer des jobs Batch via un job cron Cloud Scheduler, demandez à votre administrateur de vous accorder les rôles IAM suivants:
-
Utilisateur du compte de service (
roles/iam.serviceAccountUser
) sur le compte de service de la tâche cron Cloud Scheduler -
Administrateur Cloud Scheduler (
roles/cloudscheduler.admin
) sur le projet -
Éditeur de tâches par lot (
roles/batch.jobsEditor
) sur le projet -
Visionneuse de journaux (
roles/logging.viewer
) sur le projet
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 une tâche cron Cloud Scheduler nommée batch-job-invoker
.
Lorsqu'elle est activée, la tâche cron batch-job-invoker
s'exécute toutes les cinq minutes pour créer une instance de la tâche de traitement par lot définie.
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 projet de votre projet.CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL
: adresse e-mail du compte de service que vous avez préparé pour la tâche 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 tâches 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 certaines variables d'entrée et une tâche cron qui contacte la méthode API pour créer une tâche de traitement par lot.
Pour enregistrer et fermer le fichier, appuyez sur
Ctrl+D
(ouCommand+D
sous macOS).
Déployer la configuration Terraform pour créer la tâche cron
Déployez la configuration Terraform en initialisant Terraform, en générant les modifications planifiées et en les appliquant. 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éé la tâche 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, ce qui montre que le plan consiste à créer la tâche 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 la tâche cron
batch-job-invoker
, procédez comme suit:Saisissez la commande suivante :
terraform apply
La sortie est semblable à celle de la commande
terraform plan
précédente, sauf qu'elle se termine par une invite de confirmation.Pour confirmer et appliquer le plan, 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 la sortie, vérifiez que le champ
state
est défini surENABLED
.
Vérifier que la tâche cron crée une tâche de traitement par lot
Vérifiez que le job cron batch-job-invoker
crée correctement des tâches par lot.
Attendez cinq minutes pour que la tâche cron s'exécute automatiquement ou déclenchez-la pour qu'elle s'exécute immédiatement:
gcloud scheduler jobs run batch-job-invoker --location us-central1
Répertoriez les tâches Batch créées par la tâche 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 tâches par lot associées à 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 la tâche Cron
Une fois que vous avez le nombre de tâches de traitement par lot souhaité, mettez à jour et déployez la configuration Terraform pour suspendre la tâche cron batch-job-invoker
. Si vous souhaitez mettre à jour d'autres propriétés de la tâche cron ou des futures tâches Batch, le même processus s'applique.
Mettez à jour le fichier de configuration Terraform pour suspendre la tâche 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 montre 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 la tâche cron
batch-job-invoker
, procédez comme suit:Saisissez la commande suivante :
terraform apply
La sortie est semblable à celle de la commande
terraform plan
précédente, sauf qu'elle se termine par une invite de confirmation.Pour confirmer et appliquer le plan, 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 tâche 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 la sortie, vérifiez que le champ
state
est défini surPAUSED
.
Effectuer un nettoyage
Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.
Supprimer le projet
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Accédez au répertoire parent, puis supprimez le répertoire Terraform et tous ses fichiers.
cd .. && rm -r terraform
Supprimer des ressources individuelles
Supprimez la tâche Cron
batch-job-invoker
.terraform destroy
Pour supprimer toutes les tâches par lot de ce tutoriel, procédez comme suit:
Répertoriez toutes les tâches Batch créées par la tâche Cron
batch-job-invoker
:gcloud batch jobs list \ --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" \ --sort-by ~createTime
Notez le nom de chaque tâche que vous devez supprimer.
Supprimez une tâche par lot de ce tutoriel:
gcloud batch jobs delete JOB_NAME --location us-central1
Remplacez
JOB_NAME
par le nom d'une tâche de traitement par lot.Répétez cette étape pour toutes les tâches par lot.
Si vous avez créé un compte de service pour ce tutoriel, supprimez-le:
gcloud iam service-accounts delete SERVICE_ACCOUNT_EMAIL
Remplacez
SERVICE_ACCOUNT_EMAIL
par l'adresse e-mail d'un compte de service que vous avez créé pour ce tutoriel. Vous avez utilisé les comptes de service suivants:CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL
: compte de service pour Cloud Scheduler.BATCH_SERVICE_ACCOUNT_EMAIL
: compte de service pour le lot.
Si vous avez créé deux comptes de service distincts, répétez cette étape.
Accédez au répertoire parent, puis supprimez le répertoire Terraform et tous ses fichiers.
cd .. && rm -r terraform
Étape suivante
- En savoir plus sur l'utilisation de Terraform avec Google Cloud :
- En savoir plus sur les tâches Cron Cloud Scheduler
- En savoir plus sur les jobs Batch