Membuat dan menjalankan tugas Batch menggunakan Terraform dan Cloud Scheduler


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 tugas cron Cloud Scheduler yang menargetkan Batch API untuk membuat dan menjalankan tugas Batch. Cloud Scheduler adalah layanan Google Cloud yang memungkinkan Anda menjadwalkan tugas cron 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 tugas cron Cloud Scheduler yang membuat tugas Batch.
  • Deploy konfigurasi Terraform untuk menjalankan tugas cron.
  • Pastikan tugas cron membuat tugas Batch.
  • Perbarui konfigurasi Terraform untuk menjeda tugas cron agar berhenti membuat tugas Batch.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

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

  1. Siapkan lingkungan pengembangan Anda, baik Cloud Shell maupun 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. Perlu waktu beberapa detik hingga sesi dimulai.

    Shell lokal

    Untuk menggunakan lingkungan pengembangan lokal, ikuti langkah-langkah berikut:

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. Instal Terraform.
  2. 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.

  3. Make sure that billing is enabled for your Google Cloud project.

  4. 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
  5. 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 tugas cron membuat tugas Batch dan lampirkan akun layanan untuk tugas Batch.
    • Izinkan tugas Batch membuat dan mengakses resource yang diperlukan untuk dijalankan.

    Untuk memastikan bahwa akun layanan untuk tutorial ini memiliki izin yang diperlukan untuk menggunakan Terraform guna membuat tugas Batch melalui tugas cron Cloud Scheduler, minta administrator untuk memberikan akun layanan untuk tutorial ini peran IAM berikut:

    • Akun layanan untuk tugas cron Cloud Scheduler:
    • Akun layanan untuk tugas Batch:

    Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

    Administrator Anda mungkin juga dapat memberikan izin yang diperlukan kepada akun layanan untuk tutorial ini melalui peran khusus atau peran bawaan lainnya.

  6. Pastikan Anda memiliki izin yang diperlukan untuk tutorial ini.

    Secara khusus, Anda memerlukan izin untuk melakukan hal berikut:

    • Buat tugas cron dan lampirkan akun layanan untuk tugas cron.
    • Melihat dan menghapus tugas Cron dan tugas Batch.

    Untuk mendapatkan izin yang diperlukan guna menggunakan Terraform untuk membuat tugas Batch melalui tugas cron Cloud Scheduler, minta administrator untuk memberi Anda peran IAM berikut:

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, tugas cron batch-job-invoker akan berjalan setiap 5 menit untuk membuat instance baru dari tugas Batch yang ditentukan.

  1. Untuk membuat direktori dan file konfigurasi Terraform (.tf) baru dalam direktori tersebut, ketik perintah berikut, lalu tekan Enter:

    mkdir terraform && cd terraform && cat > main.tf
    

    Perintah ini membuat direktori terraform, mengarahkan Anda ke direktori tersebut, dan mulai menentukan file konfigurasi main.tf baru di baris berikutnya.

  2. 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 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.

  3. Untuk menyimpan dan menutup file, tekan Ctrl+D (atau Command+D di macOS).

Men-deploy konfigurasi Terraform untuk membuat tugas cron

Deploy konfigurasi Terraform dengan melakukan inisialisasi Terraform, membuat perubahan yang direncanakan, dan menerapkan perubahan ini. Setelah men-deploy konfigurasi Terraform, Anda dapat mendeskripsikan resource dalam project untuk memverifikasi bahwa Terraform berhasil membuat tugas cron batch-job-invoker.

  1. 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.
    
  2. Buat rencana eksekusi Terraform berdasarkan status project dan file konfigurasi Anda saat ini:

    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_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.
    
  3. Untuk menerapkan rencana guna membuat tugas cron batch-job-invoker, ikuti langkah-langkah berikut:

    1. Masukkan perintah berikut:

      terraform apply
      

      Outputnya mirip dengan perintah terraform plan sebelumnya, tetapi diakhiri dengan perintah konfirmasi.

    2. 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.
      
  4. Untuk memverifikasi bahwa tugas cron batch-job-invoker ada dan diaktifkan, 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_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 ditetapkan ke ENABLED.

Memverifikasi bahwa tugas cron membuat tugas Batch

Pastikan tugas cron batch-job-invoker membuat tugas Batch dengan benar.

  1. Tunggu 5 menit hingga tugas cron berjalan secara otomatis atau picu tugas cron untuk segera berjalan:

    gcloud scheduler jobs run batch-job-invoker --location us-central1
    
  2. Cantumkan 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\" memfilter daftar agar hanya menyertakan tugas Batch yang memiliki label dengan kunci source dan nilai terraform_and_cloud_scheduler_tutorial.
    • Flag --sort-by ~createTime mengurutkan daftar dari yang terbaru ke terlama.

Memperbarui konfigurasi Terraform untuk menjeda tugas cron

Setelah Anda memiliki jumlah tugas Batch yang diinginkan, update 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 ini berlaku.

  1. Perbarui file konfigurasi Terraform untuk menjeda tugas cron dengan menetapkan kolom paused ke true:

    sed -i 's/paused           = false # this cron job is enabled/paused           = true # this cron job is paused/g' main.tf
    
  2. Buat rencana eksekusi Terraform berdasarkan status project dan file konfigurasi Anda saat ini:

    terraform plan
    

    Output-nya mirip dengan berikut ini, yang menunjukkan bahwa rencananya adalah memperbarui nilai kolom paused dari false menjadi 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.
    
  3. Untuk menerapkan rencana guna memperbarui tugas cron batch-job-invoker, ikuti langkah-langkah berikut:

    1. Masukkan perintah berikut:

      terraform apply
      

      Outputnya mirip dengan perintah terraform plan sebelumnya, tetapi diakhiri dengan perintah konfirmasi.

    2. 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.
      
  4. Untuk memverifikasi bahwa tugas cron 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_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 ditetapkan ke PAUSED.

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

  1. Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

  2. Buka direktori induk, lalu hapus direktori Terraform dan semua filenya.

    cd .. && rm -r terraform
    

Menghapus resource satu per satu

  1. Hapus cron job batch-job-invoker.

    terraform destroy
    
  2. Untuk menghapus semua tugas Batch dari tutorial ini, ikuti langkah-langkah berikut:

    1. Cantumkan semua tugas Batch yang dibuat oleh tugas cron 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.

    2. Menghapus 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.

  3. Jika Anda membuat akun layanan untuk tutorial ini, hapus akun layanan:

    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.

  4. Buka direktori induk, lalu hapus direktori Terraform dan semua filenya.

    cd .. && rm -r terraform
    

Langkah selanjutnya