Questo tutorial spiega come utilizzare Terraform per creare ed eseguire Job batch mediante un cron job di Cloud Scheduler.
Terraform è uno strumento open source che consente di eseguire il provisioning e gestire l'infrastruttura specificando lo stato desiderato nei file di configurazione. Questi file possono essere trattati come codice e archiviati in sistemi di controllo della versione come GitHub.
Anche se Terraform non dispone di risorse per Batch, questo tutorial mostra come utilizzare Terraform per creare job Batch. In particolare, puoi utilizzare Terraform per pianificare ed eseguire un cron job Cloud Scheduler che abbia come target l'API Batch per creare ed eseguire job batch. Cloud Scheduler è un servizio Google Cloud che consente di pianificare automaticamente cron job e supporta Terraform.
Questo tutorial è rivolto agli utenti di Batch che gestiscono già l'infrastruttura con Terraform e vogliono incorporare i job Batch in Terraform.
Obiettivi
- Crea una directory Terraform e un file di configurazione che definisce un cron job Cloud Scheduler che crea job Batch.
- Esegui il deployment della configurazione Terraform per eseguire il cron job.
- Verifica che il job cron crei job batch.
- Aggiorna la configurazione Terraform per mettere in pausa il cron job in modo che smetta di creare job batch.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.
Prima di iniziare
-
Prepara l'ambiente di sviluppo, Cloud Shell o una shell locale:
Cloud Shell
Per utilizzare un terminale online con l'interfaccia a riga di comando gcloud e Terraform già configurati, attiva Cloud Shell.
In fondo a questa pagina, viene avviata una sessione di Cloud Shell mostra un prompt della riga di comando. L'inizializzazione della sessione può richiedere alcuni secondi.
Shell locale
Per utilizzare un ambiente di sviluppo locale:
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Installa 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 -
Assicurati che il tuo progetto ne abbia almeno uno account di servizio con le autorizzazioni necessarie per questo tutorial.
Nello specifico, puoi utilizzare lo stesso account di servizio o due account di servizio distinti per concedere le seguenti autorizzazioni:
- Consenti al job cron di creare job batch e allega l'account di servizio per i job batch.
- Consenti ai job Batch di creare e accedere alle risorse necessarie per l'esecuzione.
Per assicurarti che gli account di servizio per questo tutorial dispongano delle autorizzazioni necessarie per utilizzare Terraform per creare job batch tramite un job cron di Cloud Scheduler, chiedi all'amministratore di concedere agli account di servizio per questo tutorial i seguenti ruoli IAM:
-
Account di servizio per il cron job di Cloud Scheduler:
-
Batch Job Editor (
roles/batch.jobsEditor
) nel progetto -
Utente account di servizio (
roles/iam.serviceAccountUser
) nell'account di servizio per i job batch (anche se si tratta dell'account stesso)
-
Batch Job Editor (
-
Account di servizio per i job batch:
-
Batch Agent Reporter (
roles/batch.agentReporter
) nel progetto -
Logs Writer (
roles/logging.logWriter
) nel progetto
-
Batch Agent Reporter (
Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.
L'amministratore potrebbe anche essere in grado di fornire gli account di servizio per questo tutorial le autorizzazioni richieste tramite la ruoli o altri ruoli predefiniti ruoli.
-
Assicurati di disporre delle autorizzazioni richieste per questo tutorial.
Nello specifico, devi disporre delle autorizzazioni necessarie per:
- Crea un cron job e collega il service account per il cron job.
- Visualizza ed elimina il cron job e i job batch.
Per ottenere le autorizzazioni necessarie per utilizzare Terraform per creare job batch mediante un cron job di Cloud Scheduler, chiedi all'amministratore di concederti seguenti ruoli IAM:
-
Utente account di servizio (
roles/iam.serviceAccountUser
) nell'account di servizio per il job cron Cloud Scheduler -
Amministratore Cloud Scheduler (
roles/cloudscheduler.admin
) del progetto -
Editor job batch (
roles/batch.jobsEditor
) del progetto -
Visualizzatore log (
roles/logging.viewer
) del progetto
Crea la directory e il file di configurazione Terraform
Crea una directory per Terraform e un file di configurazione
che definisce le risorse da creare o aggiornare utilizzando Terraform.
Il file di configurazione di esempio per questo tutorial definisce un cron job Cloud Scheduler denominato batch-job-invoker
.
Quando è abilitato, il cron job batch-job-invoker
viene eseguita ogni 5 minuti per creare una nuova istanza
Job batch.
Per creare una directory e un nuovo file di configurazione Terraform (
.tf
) al suo interno, digita il seguente comando e premiEnter
:mkdir terraform && cd terraform && cat > main.tf
Questo comando crea la directory
terraform
, ti consente di accedervi e inizia a definire un nuovo file di configurazionemain.tf
nella riga successiva.Copia e incolla la seguente configurazione Terraform:
# 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 } } }
Sostituisci quanto segue:
PROJECT_ID
: il ID progetto del tuo progetto.PROJECT_NUMBER
: il numero progetto del tuo progetto.CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL
: l'indirizzo email dell'account di servizio che hai preparato per il job cron di Cloud Scheduler.Ad esempio, per utilizzare l'account di servizio predefinito di Compute Engine, specifica quanto segue:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
BATCH_SERVICE_ACCOUNT_EMAIL
: l'indirizzo email dell'account di servizio che hai preparato per i job batch.Ad esempio, per utilizzare l'account di servizio predefinito di Compute Engine, specifica quanto segue:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
Questa configurazione Terraform definisce alcune variabili di input e un job cron che contatta il metodo dell'API per la creazione di un job batch.
Per salvare e chiudere il file, premi
Ctrl+D
(oCommand+D
su macOS).
Esegui il deployment della configurazione Terraform per creare il cron job
Esegui il deployment della configurazione Terraform inizializzando Terraform, generando le modifiche pianificate e applicandole. Dopo il deployment
configurazione, puoi descrivere le risorse del progetto per verificare
Terraform ha creato il cron job batch-job-invoker
.
Inizializza Terraform nella directory:
terraform init
L'output è simile al seguente:
... 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.
Genera il piano di esecuzione di Terraform in base allo stato attuale del progetto e al file di configurazione:
terraform plan
L'output è simile al seguente, che mostra che il piano è creare il 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_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.
Per applicare il piano per creare il job cron
batch-job-invoker
:Inserisci questo comando:
terraform apply
L'output è simile al comando
terraform plan
precedente tranne che termina con un messaggio di conferma.Per confermare e applicare il piano, inserisci
yes
.L'output è simile al seguente:
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.
Per verificare che il job cron
batch-job-invoker
esista e sia abilitato, descriverlo:gcloud scheduler jobs describe batch-job-invoker --location us-central1
L'output è simile al seguente:
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: '...'
Nell'output, verifica che il campo
state
sia impostato suENABLED
.
Verifica che il cron job crei un job batch
Verifica che il job cron batch-job-invoker
stia creando correttamente i job batch.
Attendi 5 minuti per l'esecuzione del cron job automaticamente o attiva l'esecuzione immediata del cron job:
gcloud scheduler jobs run batch-job-invoker --location us-central1
Elenca i job batch creati dal
batch-job-invoker
cron job:gcloud batch jobs list \ --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" \ --sort-by ~createTime
--filter labels.source=\"terraform_and_cloud_scheduler_tutorial\"
flag filtra l'elenco includendo solo i job batch che hanno un'etichetta con la chiavesource
il valoreterraform_and_cloud_scheduler_tutorial
.- Il flag
--sort-by ~createTime
ordina l'elenco dal più recente al meno recente.
Aggiorna la configurazione di Terraform per mettere in pausa il cron job
Dopo aver ottenuto il numero desiderato di job batch, aggiornate e dipiazzate la configurazione Terraform per mettere in pausa il cron job batch-job-invoker
. Se vuoi aggiornare altre proprietà del job cron o dei job batch futuri, si applica la stessa procedura.
Aggiorna il file di configurazione Terraform per mettere in pausa il cron job impostando il campo
paused
sutrue
:sed -i 's/paused = false # this cron job is enabled/paused = true # this cron job is paused/g' main.tf
Genera il piano di esecuzione di Terraform in base allo stato attuale del tuo progetto e il file di configurazione:
terraform plan
L'output è simile al seguente, per indicare che il piano prevede aggiorna il valore del campo
paused
dafalse
atrue
: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.
Per applicare il piano per aggiornare il job cron
batch-job-invoker
:Inserisci questo comando:
terraform apply
L'output è simile al comando
terraform plan
precedente tranne che termina con un messaggio di conferma.Per confermare e applicare il piano, inserisci
yes
.L'output è simile al seguente:
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.
Per verificare che il job cron
batch-job-invoker
sia in pausa, descrivilo:gcloud scheduler jobs describe batch-job-invoker --location us-central1
L'output è simile al seguente:
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: '...'
Nell'output, verifica che il campo
state
sia impostato suPAUSED
.
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
Elimina il progetto
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Vai alla directory padre, quindi elimina la directory Terraform e tutti i relativi file.
cd .. && rm -r terraform
Elimina singole risorse
Elimina il cron job
batch-job-invoker
.terraform destroy
Per eliminare tutti i job batch da questo tutorial: segui questi passaggi:
Elenca tutti i job Batch creati dal cron job
batch-job-invoker
:gcloud batch jobs list \ --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" \ --sort-by ~createTime
Registra il nome di ogni job da eliminare.
Elimina un job batch da questo tutorial:
gcloud batch jobs delete JOB_NAME --location us-central1
Sostituisci
JOB_NAME
con il nome di un Job batch.Ripeti questo passaggio per tutti i job batch.
Se hai creato un account di servizio per questo tutorial, elimina il account di servizio:
gcloud iam service-accounts delete SERVICE_ACCOUNT_EMAIL
Sostituisci
SERVICE_ACCOUNT_EMAIL
con l'indirizzo email di un account di servizio che hai creato per questo tutorial. Nello specifico, hai utilizzato i seguenti account di servizio:CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL
: l'account di servizio per Cloud Scheduler.BATCH_SERVICE_ACCOUNT_EMAIL
: l'account di servizio per Batch.
Se hai creato due account di servizio separati, ripeti questo passaggio.
Vai alla directory principale ed elimina la directory Terraform e tutti i relativi file.
cd .. && rm -r terraform
Passaggi successivi
- Scopri di più sull'utilizzo di Terraform con Google Cloud:
- Scopri di più sui cron job di Cloud Scheduler.
- Scopri di più sui job di batch.