Tutorial ini menjelaskan cara menggunakan Terraform untuk membuat dan menjalankan tugas Batch menggunakan cron job 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 di 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 layanan Google Cloud yang memungkinkan Anda menjadwalkan cron job secara otomatis dan mendukung Terraform.
Tutorial ini ditujukan untuk pengguna Batch yang sudah mengelola infrastruktur dengan Terraform dan ingin menggabungkan tugas Batch ke dalam Terraform.
Tujuan
- Buat direktori Terraform dan file konfigurasi yang menentukan cron job Cloud Scheduler yang membuat tugas Batch.
- Deploy konfigurasi Terraform untuk menjalankan cron job.
- Pastikan cron job membuat Batch job.
- Perbarui konfigurasi Terraform untuk menjeda cron job agar berhenti membuat tugas Batch.
Biaya
Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.
Sebelum memulai
-
Siapkan lingkungan pengembangan Anda, baik Cloud Shell atau shell lokal:
Cloud Shell
Untuk menggunakan terminal online dengan gcloud CLI dan Terraform yang sudah disiapkan, aktifkan Cloud Shell.
Di bagian bawah halaman ini, sesi Cloud Shell akan dimulai dan menampilkan perintah command line. Diperlukan waktu beberapa detik hingga sesi diinisialisasi.
Shell lokal
Untuk menggunakan lingkungan pengembangan lokal, ikuti langkah-langkah berikut:
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Instal Terraform.
-
Buat atau pilih project Google Cloud.
-
Membuat project Google Cloud:
gcloud projects create PROJECT_ID
Ganti
PROJECT_ID
dengan nama untuk project Google Cloud yang Anda buat. -
Pilih project Google Cloud yang Anda buat:
gcloud config set project PROJECT_ID
Ganti
PROJECT_ID
dengan nama project Google Cloud Anda.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Aktifkan API Batch, Compute Engine, Cloud Logging, Cloud Scheduler, and Resource Manager:
gcloud services enable batch.googleapis.com
compute.googleapis.com logging.googleapis.com cloudscheduler.googleapis.com cloudresourcemanager.googleapis.com -
Pastikan project Anda memiliki setidaknya satu akun layanan dengan izin yang diperlukan untuk tutorial ini.
Secara khusus, Anda dapat menggunakan akun layanan yang sama atau dua akun layanan terpisah untuk memberikan izin berikut:
- Izinkan cron job untuk membuat tugas Batch dan melampirkan akun layanan untuk tugas Batch.
- Izinkan tugas Batch untuk membuat dan mengakses resource yang diperlukan untuk dijalankan.
Guna memastikan akun layanan untuk tutorial ini memiliki izin yang diperlukan agar dapat menggunakan Terraform guna membuat tugas Batch melalui cron job Cloud Scheduler, minta administrator Anda untuk memberikan peran IAM berikut kepada akun layanan:
-
Akun layanan untuk cron job Cloud Scheduler:
-
Batch Job Editor (
roles/batch.jobsEditor
) pada project -
Service Account User (
roles/iam.serviceAccountUser
) pada akun layanan untuk tugas Batch (meskipun jika itu sendiri)
-
Batch Job Editor (
-
Akun layanan untuk tugas Batch:
-
Batch Agent Reporter (
roles/batch.agentReporter
) pada project -
Logs Writer (
roles/logging.logWriter
) pada project
-
Batch Agent Reporter (
Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses.
Administrator mungkin juga dapat memberikan izin yang diperlukan kepada akun layanan untuk tutorial ini melalui peran khusus atau peran standar lainnya.
-
Pastikan Anda memiliki izin yang diperlukan untuk tutorial ini.
Secara khusus, Anda memerlukan izin untuk melakukan hal berikut:
- Buat cron job dan lampirkan akun layanan untuk cron job tersebut.
- Melihat dan menghapus cron job dan tugas Batch.
Untuk mendapatkan izin yang diperlukan untuk menggunakan Terraform guna membuat tugas Batch melalui cron job Cloud Scheduler, minta administrator Anda untuk memberi Anda peran IAM berikut:
-
Service Account User (
roles/iam.serviceAccountUser
) di akun layanan untuk cron job Cloud Scheduler -
Cloud Scheduler Admin (
roles/cloudscheduler.admin
) di project -
Batch Job Editor (
roles/batch.jobsEditor
) pada project -
Logs Viewer (
roles/logging.viewer
) di project
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 cron job Cloud Scheduler yang bernama batch-job-invoker
.
Saat 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 membuat direktori
terraform
, mengarahkan Anda ke sana, 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_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 } } }
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 cron job 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 cron job yang menghubungi metode API untuk membuat Batch job.
Untuk menyimpan dan menutup file, tekan
Ctrl+D
(atauCommand+D
di macOS).
Men-deploy konfigurasi Terraform untuk membuat cron job
Deploy konfigurasi Terraform dengan menginisialisasi Terraform, membuat perubahan yang direncanakan, dan menerapkan perubahan ini. Setelah men-deploy konfigurasi Terraform, Anda dapat mendeskripsikan resource dalam project untuk memastikan bahwa Terraform berhasil membuat cron job 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
Output-nya mirip dengan berikut ini, yang menunjukkan bahwa rencananya adalah membuat cron job
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.
Untuk menerapkan rencana pembuatan cron job
batch-job-invoker
, ikuti langkah-langkah berikut:Masukkan perintah berikut:
terraform apply
Outputnya mirip dengan perintah
terraform plan
sebelumnya, kecuali jika diakhiri dengan perintah konfirmasi.Untuk mengonfirmasi dan menerapkan rencana, 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 cron job
batch-job-invoker
ada dan diaktifkan, uraikan: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_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: '...'
Pada output, pastikan kolom
state
disetel keENABLED
.
Memastikan cron job membuat Batch job
Pastikan cron job batch-job-invoker
membuat
tugas Batch dengan benar.
Tunggu 5 menit agar cron job berjalan otomatis atau picu cron job untuk langsung berjalan:
gcloud scheduler jobs run batch-job-invoker --location us-central1
Tampilkan daftar tugas Batch yang telah dibuat oleh cron job
batch-job-invoker
:gcloud batch jobs list \ --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" \ --sort-by ~createTime
- Flag
--filter labels.source=\"terraform_and_cloud_scheduler_tutorial\"
akan memfilter daftar agar hanya menyertakan tugas Batch yang memiliki label dengan kuncisource
dan nilaiterraform_and_cloud_scheduler_tutorial
. - Flag
--sort-by ~createTime
mengurutkan daftar dari yang terbaru hingga terlama.
- Flag
Mengupdate konfigurasi Terraform untuk menjeda cron job
Setelah Anda memiliki jumlah tugas Batch yang diinginkan, perbarui dan deploy konfigurasi Terraform untuk menjeda cron job batch-job-invoker
. Jika Anda ingin memperbarui properti lain dari
cron job atau tugas Batch mendatang,
proses yang sama ini berlaku.
Update file konfigurasi Terraform untuk menjeda cron job dengan menetapkan 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 rencananya adalah 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 memperbarui cron job
batch-job-invoker
, ikuti langkah-langkah berikut:Masukkan perintah berikut:
terraform apply
Outputnya mirip dengan perintah
terraform plan
sebelumnya, kecuali jika diakhiri dengan perintah konfirmasi.Untuk mengonfirmasi dan menerapkan rencana, 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 memastikan cron job
batch-job-invoker
dijeda, deskripsikan: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_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: '...'
Pada output, pastikan kolom
state
disetel kePAUSED
.
Pembersihan
Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.
Menghapus project
Menghapus project Google Cloud:
gcloud projects delete PROJECT_ID
Buka direktori induk, lalu hapus direktori Terraform dan semua filenya.
cd .. && rm -r terraform
Menghapus resource satu per satu
Hapus cron job
batch-job-invoker
.terraform destroy
Untuk menghapus semua tugas Batch dari tutorial ini, ikuti langkah-langkah berikut:
Cantumkan semua tugas Batch yang dibuat oleh cron job
batch-job-invoker
:gcloud batch jobs list \ --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" \ --sort-by ~createTime
Catat nama setiap tugas yang perlu Anda hapus.
Hapus tugas Batch dari tutorial ini:
gcloud batch jobs delete JOB_NAME --location us-central1
Ganti
JOB_NAME
dengan nama Tugas batch.Ulangi langkah ini untuk semua tugas Batch.
Jika Anda membuat akun layanan untuk tutorial ini, hapus akun layanan tersebut:
gcloud iam service-accounts delete SERVICE_ACCOUNT_EMAIL
Ganti
SERVICE_ACCOUNT_EMAIL
dengan alamat email akun layanan yang Anda buat untuk tutorial ini. Yaitu, Anda menggunakan akun layanan berikut:CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL
: akun layanan untuk Cloud Scheduler.BATCH_SERVICE_ACCOUNT_EMAIL
: akun layanan untuk Batch.
Jika Anda membuat dua akun layanan terpisah, ulangi langkah ini.
Buka direktori induk, lalu hapus direktori Terraform dan semua filenya.
cd .. && rm -r terraform
Langkah selanjutnya
- Pelajari lebih lanjut cara menggunakan Terraform dengan Google Cloud:
- Pelajari cron job Cloud Scheduler lebih lanjut.
- Pelajari Tugas batch lebih lanjut.