Tutorial ini menjelaskan cara menggunakan Terraform untuk membuat dan menjalankan tugas Batch menggunakan tugas cron Cloud Scheduler.
Terraform adalah alat open source yang memungkinkan Anda menyediakan dan mengelola infrastruktur dengan menentukan status yang diinginkan dalam file konfigurasi. File ini dapat diperlakukan sebagai kode dan disimpan dalam sistem kontrol versi seperti GitHub.
Meskipun Terraform tidak memiliki resource untuk Batch, tutorial ini menunjukkan cara menggunakan Terraform untuk membuat tugas Batch. Secara khusus, Anda dapat menggunakan Terraform untuk menjadwalkan dan menjalankan cron job Cloud Scheduler yang menargetkan Batch API untuk membuat dan menjalankan tugas Batch. Cloud Scheduler adalah Google Cloud layanan yang memungkinkan Anda menjadwalkan cron job secara otomatis dan mendukung Terraform.
Tutorial ini ditujukan bagi pengguna Batch yang sudah mengelola infrastruktur dengan Terraform dan ingin menyertakan tugas Batch ke dalam Terraform.
Membuat direktori dan file konfigurasi Terraform
Buat direktori untuk Terraform dan file konfigurasi yang menentukan resource yang ingin Anda buat atau perbarui menggunakan Terraform.
Contoh file konfigurasi untuk tutorial ini menentukan tugas cron Cloud Scheduler bernama batch-job-invoker
.
Jika diaktifkan, cron job batch-job-invoker
akan berjalan setiap 5 menit untuk membuat instance baru dari tugas Batch yang ditentukan.
Untuk membuat direktori dan file konfigurasi Terraform (
.tf
) baru dalam direktori tersebut, ketik perintah berikut, lalu tekanEnter
:mkdir terraform && cd terraform && cat > main.tf
Perintah ini akan membuat direktori
terraform
, mengarahkan Anda ke direktori tersebut, dan mulai menentukan file konfigurasimain.tf
baru di baris berikutnya.Salin dan tempel konfigurasi Terraform berikut:
# 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 } } }
Ganti kode berikut:
PROJECT_ID
: Project ID project Anda.PROJECT_NUMBER
: nomor project project Anda.CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL
: alamat email akun layanan yang Anda siapkan untuk tugas cron Cloud Scheduler.Misalnya, untuk menggunakan akun layanan default Compute Engine, tentukan hal berikut:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
BATCH_SERVICE_ACCOUNT_EMAIL
: alamat email akun layanan yang Anda siapkan untuk tugas Batch.Misalnya, untuk menggunakan akun layanan default Compute Engine, tentukan hal berikut:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
Konfigurasi Terraform ini menentukan beberapa variabel input dan tugas cron yang menghubungi metode API untuk membuat tugas Batch.
Untuk menyimpan dan menutup file, tekan
Ctrl+D
(atauCommand+D
di macOS).
Deploy konfigurasi Terraform untuk membuat cron job
Deploy konfigurasi Terraform dengan melakukan inisialisasi Terraform, membuat perubahan yang direncanakan, dan menerapkan perubahan ini. Setelah men-deploy konfigurasi Terraform, Anda dapat mendeskripsikan resource di project untuk memverifikasi bahwa Terraform berhasil membuat tugas cron batch-job-invoker
.
Lakukan inisialisasi Terraform di direktori:
terraform init
Outputnya mirip dengan hal berikut ini:
... 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.
Buat rencana eksekusi Terraform berdasarkan status project Anda saat ini dan file konfigurasi:
terraform plan
Outputnya mirip dengan berikut ini, yang menunjukkan bahwa rencananya adalah membuat tugas 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.
Untuk menerapkan rencana guna membuat tugas cron
batch-job-invoker
, ikuti langkah-langkah berikut:Masukkan perintah berikut:
terraform apply
Outputnya mirip dengan perintah
terraform plan
sebelumnya, kecuali diakhiri dengan perintah konfirmasi.Untuk mengonfirmasi dan menerapkan paket, masukkan
yes
.Outputnya mirip dengan hal berikut ini:
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.
Untuk memverifikasi bahwa tugas cron
batch-job-invoker
ada dan diaktifkan, jelaskan tugas tersebut:gcloud scheduler jobs describe batch-job-invoker --location us-central1
Outputnya mirip dengan hal berikut ini:
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: '...'
Pada output, verifikasi bahwa kolom
state
disetel keENABLED
.
Pastikan bahwa tugas cron membuat tugas Batch
Pastikan tugas cron batch-job-invoker
membuat tugas Batch dengan benar.
Tunggu 5 menit hingga tugas cron berjalan secara otomatis atau picu tugas cron agar berjalan langsung:
gcloud scheduler jobs run batch-job-invoker --location us-central1
Mencantumkan tugas Batch yang telah dibuat oleh
batch-job-invoker
cron job:gcloud batch jobs list \ --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" \ --sort-by ~createTime
- Flag
--filter labels.source=\"terraform_and_cloud_scheduler_tutorial\"
memfilter daftar agar hanya menyertakan tugas Batch yang memiliki label dengan kuncisource
dan nilaiterraform_and_cloud_scheduler_tutorial
. - Bendera
--sort-by ~createTime
mengurutkan daftar dari yang terbaru hingga terlama.
- Flag
Perbarui konfigurasi Terraform untuk menjeda cron job
Setelah Anda memiliki jumlah tugas Batch yang diinginkan, perbarui dan deploy konfigurasi Terraform untuk menjeda tugas cron batch-job-invoker
. Jika Anda ingin memperbarui properti lain dari
tugas cron atau tugas Batch mendatang,
proses yang sama berlaku.
Perbarui file konfigurasi Terraform untuk menjeda cron job dengan menyetel kolom
paused
ketrue
:sed -i 's/paused = false # this cron job is enabled/paused = true # this cron job is paused/g' main.tf
Buat rencana eksekusi Terraform berdasarkan status project Anda saat ini dan file konfigurasi:
terraform plan
Output-nya mirip dengan berikut ini, yang menunjukkan bahwa rencana untuk memperbarui nilai kolom
paused
darifalse
menjaditrue
: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.
Untuk menerapkan rencana untuk memperbarui tugas cron
batch-job-invoker
, ikuti langkah-langkah berikut:Masukkan perintah berikut:
terraform apply
Outputnya mirip dengan perintah
terraform plan
sebelumnya, kecuali diakhiri dengan perintah konfirmasi.Untuk mengonfirmasi dan menerapkan paket, masukkan
yes
.Outputnya mirip dengan hal berikut ini:
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.
Untuk memverifikasi bahwa cron job
batch-job-invoker
dijeda, jelaskan:gcloud scheduler jobs describe batch-job-invoker --location us-central1
Outputnya mirip dengan hal berikut ini:
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: '...'
Pada output, verifikasi bahwa kolom
state
disetel kePAUSED
.