Menjalankan tugas Cloud Run menggunakan Workflows

Workflows memungkinkan Anda menjalankan tugas Cloud Run sebagai bagian dari alur kerja untuk melakukan pemrosesan data yang lebih kompleks atau mengorkestrasi sistem tugas yang ada.

Tutorial ini menunjukkan cara menggunakan Workflows untuk menjalankan tugas Cloud Run yang memproses data yang diteruskan sebagai variabel lingkungan ke tugas, sebagai respons terhadap peristiwa dari Cloud Storage.

Perhatikan bahwa Anda juga dapat menyimpan data peristiwa di bucket Cloud Storage yang memungkinkan Anda mengenkripsi data menggunakan kunci enkripsi yang dikelola pelanggan. Untuk mengetahui informasi selengkapnya, lihat artikel Menjalankan tugas Cloud Run yang memproses data peristiwa yang disimpan di Cloud Storage.

Membuat tugas Cloud Run

Tutorial ini menggunakan contoh tugas Cloud Run dari GitHub. Tugas membaca data dari file input di Cloud Storage, dan melakukan beberapa pemrosesan arbitrer untuk setiap baris dalam file.

  1. Dapatkan kode contoh dengan meng-clone repositori aplikasi contoh ke komputer lokal Anda:

    git clone https://github.com/GoogleCloudPlatform/jobs-demos.git

    Atau, Anda dapat mendownload contoh sebagai file ZIP dan mengekstraknya.

  2. Ubah ke direktori yang berisi kode contoh:

    cd jobs-demos/parallel-processing
  3. Buat bucket Cloud Storage untuk menyimpan file input yang dapat ditulis dan memicu peristiwa:

    Konsol

    1. Di Google Cloud konsol, buka halaman Bucket Cloud Storage.

      Buka Buckets

    2. Klik add Buat.
    3. Di halaman Buat bucket, masukkan nama untuk bucket Anda:
      input-PROJECT_ID
      Ganti PROJECT_ID dengan ID Google Cloud project Anda.
    4. Pertahankan setelan default lainnya.
    5. Klik Buat.

    gcloud

    Jalankan perintah gcloud storage buckets create:

    gcloud storage buckets create gs://input-PROJECT_ID

    Jika permintaan berhasil, perintah akan menampilkan pesan berikut ini:

    Creating gs://input-PROJECT_ID/...

    Terraform

    Untuk membuat bucket Cloud Storage, gunakan resource google_storage_bucket dan ubah file main.tf Anda seperti yang ditunjukkan dalam contoh berikut.

    Untuk mempelajari cara menerapkan atau menghapus konfigurasi Terraform, lihat Perintah dasar Terraform.

    Perhatikan bahwa dalam alur kerja Terraform yang umum, Anda menerapkan seluruh rencana sekaligus. Namun, untuk tujuan tutorial ini, Anda dapat menargetkan resource tertentu. Contoh:

    terraform apply -target="random_id.bucket_name_suffix"
    dan
    terraform apply -target="google_storage_bucket.default"

    # Cloud Storage bucket names must be globally unique
    resource "random_id" "bucket_name_suffix" {
      byte_length = 4
    }
    
    # Create a Cloud Storage bucket
    resource "google_storage_bucket" "default" {
      name                        = "input-${data.google_project.project.name}-${random_id.bucket_name_suffix.hex}"
      location                    = "us-central1"
      storage_class               = "STANDARD"
      force_destroy               = false
      uniform_bucket_level_access = true
    }
  4. Buat repositori standar Artifact Registry tempat Anda dapat menyimpan image container:

    Konsol

    1. Di konsol Google Cloud , buka halaman Artifact Registry Repositories:

      Buka Repositori

    2. Klik Buat repositori.

    3. Masukkan nama untuk repositori—misalnya, my-repo. Untuk setiap lokasi repositori dalam project, nama repositori harus unik.

    4. Pertahankan format default yang seharusnya Docker.

    5. Pertahankan mode default yang seharusnya Standard.

    6. Untuk region, pilih us-central1 (Iowa).

    7. Pertahankan semua nilai default lainnya.

    8. Klik Buat.

    gcloud

    Jalankan perintah:

    gcloud artifacts repositories create REPOSITORY \
        --repository-format=docker \
        --location=us-central1

    Ganti REPOSITORY dengan nama unik untuk repositori, misalnya, my-repo. Untuk setiap lokasi repositori dalam project, nama repositori harus unik.

    Terraform

    Untuk membuat repositori Artifact Registry, gunakan resource google_artifact_registry_repository dan ubah file main.tf Anda seperti yang ditunjukkan dalam contoh berikut.

    Perhatikan bahwa dalam alur kerja Terraform umum, Anda menerapkan seluruh rencana sekaligus. Namun, untuk tujuan tutorial ini, Anda dapat menargetkan resource tertentu. Contoh:

    terraform apply -target="google_artifact_registry_repository.default"

    # Create an Artifact Registry repository
    resource "google_artifact_registry_repository" "default" {
      location      = "us-central1"
      repository_id = "my-repo"
      format        = "docker"
    }
  5. Bangun image container menggunakan buildpack Google Cloud default:

    export SERVICE_NAME=parallel-job
    gcloud builds submit \
        --pack image=us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}

    Ganti REPOSITORY dengan nama repositori Artifact Registry Anda.

    Proses build dapat memerlukan waktu beberapa menit.

  6. Buat tugas Cloud Run yang men-deploy image container:

    Konsol

    1. Di konsol Google Cloud , buka halaman Cloud Run:

      Buka Cloud Run

    2. Klik Buat tugas untuk menampilkan formulir Buat tugas.

      1. Di formulir, pilih us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/parallel-job:latest sebagai URL image container Artifact Registry.
      2. Opsional: Untuk nama tugas, masukkan parallel-job.
      3. Opsional: Untuk region, pilih us-central1 (Iowa).
      4. Untuk jumlah tugas yang ingin Anda jalankan dalam tugas, masukkan 10. Semua tugas harus berhasil agar pekerjaan berhasil. Secara default, tugas dijalankan secara paralel.
    3. Luaskan bagian Container, Variables & Secrets, Connections, Security dan pertahankan semua setelan default, kecuali setelan berikut:

      1. Klik tab General.

        1. Untuk perintah container, masukkan python.
        2. Untuk argumen container, masukkan process.py.
      2. Klik tab Variabel & Secret.

        1. Klik Tambahkan variabel, lalu masukkan INPUT_BUCKET untuk nama dan input-PROJECT_ID untuk nilai.
        2. Klik Tambahkan variabel, lalu masukkan INPUT_FILE untuk nama dan input_file.txt untuk nilai.
    4. Untuk membuat tugas, klik Buat.

    gcloud

    1. Tetapkan region Cloud Run default:

      gcloud config set run/region us-central1
    2. Buat tugas Cloud Run:

      gcloud run jobs create parallel-job \
          --image us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/parallel-job:latest \
          --command python \
          --args process.py \
          --tasks 10 \
          --set-env-vars=INPUT_BUCKET=input-PROJECT_ID,INPUT_FILE=input_file.txt

      Perhatikan bahwa jika Anda tidak menentukan tag gambar, Artifact Registry akan mencari gambar dengan tag latest default.

      Untuk daftar lengkap opsi yang tersedia saat membuat tugas, lihat dokumentasi command line gcloud run jobs create.

      Setelah tugas dibuat, Anda akan melihat pesan yang menunjukkan keberhasilan.

    Terraform

    Untuk membuat tugas Cloud Run, gunakan resource google_cloud_run_v2_job dan ubah file main.tf Anda seperti yang ditunjukkan dalam contoh berikut.

    Perhatikan bahwa dalam alur kerja Terraform umum, Anda menerapkan seluruh rencana sekaligus. Namun, untuk tujuan tutorial ini, Anda dapat menargetkan resource tertentu. Contoh:

    terraform apply -target="google_cloud_run_v2_job.default"

    # Create a Cloud Run job
    resource "google_cloud_run_v2_job" "default" {
      name     = "parallel-job"
      location = "us-central1"
    
      template {
        task_count = 10
        template {
          containers {
            image   = "us-central1-docker.pkg.dev/${data.google_project.project.name}/${google_artifact_registry_repository.default.repository_id}/parallel-job:latest"
            command = ["python"]
            args    = ["process.py"]
            env {
              name  = "INPUT_BUCKET"
              value = google_storage_bucket.default.name
            }
            env {
              name  = "INPUT_FILE"
              value = "input_file.txt"
            }
          }
        }
      }
    }

Men-deploy alur kerja yang menjalankan tugas Cloud Run

Tentukan dan deploy alur kerja yang menjalankan tugas Cloud Run yang baru saja Anda buat. Definisi alur kerja terdiri dari serangkaian langkah yang dijelaskan menggunakan sintaksis Workflows.

Konsol

  1. Di konsol Google Cloud , buka halaman Workflows:

    Buka Workflows

  2. Klik Buat.

  3. Masukkan nama untuk alur kerja baru, seperti cloud-run-job-workflow.

  4. Untuk region, pilih us-central1 (Iowa).

  5. Di kolom Service account, pilih akun layanan yang Anda buat sebelumnya.

    Akun layanan berfungsi sebagai identitas alur kerja. Anda seharusnya telah memberikan peran Admin Cloud Run ke akun layanan agar alur kerja dapat menjalankan tugas Cloud Run.

  6. Klik Berikutnya.

  7. Dalam editor alur kerja, masukkan definisi berikut untuk alur kerja Anda:

    main:
        params: [event]
        steps:
            - init:
                assign:
                    - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                    - event_bucket: ${event.data.bucket}
                    - event_file: ${event.data.name}
                    - target_bucket: ${"input-" + project_id}
                    - job_name: parallel-job
                    - job_location: us-central1
            - check_input_file:
                switch:
                    - condition: ${event_bucket == target_bucket}
                      next: run_job
                    - condition: true
                      next: end
            - run_job:
                call: googleapis.run.v1.namespaces.jobs.run
                args:
                    name: ${"namespaces/" + project_id + "/jobs/" + job_name}
                    location: ${job_location}
                    body:
                        overrides:
                            containerOverrides:
                                env:
                                    - name: INPUT_BUCKET
                                      value: ${event_bucket}
                                    - name: INPUT_FILE
                                      value: ${event_file}
                result: job_execution
            - finish:
                return: ${job_execution}
  8. Klik Deploy.

gcloud

  1. Buat file kode sumber untuk alur kerja Anda:

    touch cloud-run-job-workflow.yaml
  2. Salin definisi alur kerja berikut ke file kode sumber Anda:

    main:
        params: [event]
        steps:
            - init:
                assign:
                    - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                    - event_bucket: ${event.data.bucket}
                    - event_file: ${event.data.name}
                    - target_bucket: ${"input-" + project_id}
                    - job_name: parallel-job
                    - job_location: us-central1
            - check_input_file:
                switch:
                    - condition: ${event_bucket == target_bucket}
                      next: run_job
                    - condition: true
                      next: end
            - run_job:
                call: googleapis.run.v1.namespaces.jobs.run
                args:
                    name: ${"namespaces/" + project_id + "/jobs/" + job_name}
                    location: ${job_location}
                    body:
                        overrides:
                            containerOverrides:
                                env:
                                    - name: INPUT_BUCKET
                                      value: ${event_bucket}
                                    - name: INPUT_FILE
                                      value: ${event_file}
                result: job_execution
            - finish:
                return: ${job_execution}
  3. Deploy alur kerja dengan memasukkan perintah berikut:

    gcloud workflows deploy cloud-run-job-workflow \
        --location=us-central1 \
        --source=cloud-run-job-workflow.yaml \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

    Ganti kode berikut:

    • SERVICE_ACCOUNT_NAME: nama akun layanan yang Anda buat sebelumnya
    • PROJECT_ID: ID project Google Cloud Anda

    Akun layanan berfungsi sebagai identitas alur kerja. Anda seharusnya telah memberikan peran roles/run.admin ke akun layanan agar alur kerja dapat menjalankan tugas Cloud Run.

Terraform

Untuk membuat alur kerja, gunakan resource google_workflows_workflow dan ubah file main.tf Anda seperti yang ditunjukkan dalam contoh berikut.

Untuk mempelajari cara menerapkan atau menghapus konfigurasi Terraform, lihat Perintah dasar Terraform.

Perhatikan bahwa dalam alur kerja Terraform yang umum, Anda menerapkan seluruh rencana sekaligus. Namun, untuk tujuan tutorial ini, Anda dapat menargetkan resource tertentu. Contoh:

terraform apply -target="google_workflows_workflow.default"

# Create a workflow
resource "google_workflows_workflow" "default" {
  name        = "cloud-run-job-workflow"
  region      = "us-central1"
  description = "Workflow that routes a Cloud Storage event and executes a Cloud Run job"

  deletion_protection = false # set to "true" in production

  # Note that $$ is needed for Terraform
  source_contents = <<EOF
  main:
      params: [event]
      steps:
          - init:
              assign:
                  - project_id: $${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                  - event_bucket: $${event.data.bucket}
                  - event_file: $${event.data.name}
                  - target_bucket: "${google_storage_bucket.default.name}"
                  - job_name: parallel-job
                  - job_location: us-central1
          - check_input_file:
              switch:
                  - condition: $${event_bucket == target_bucket}
                    next: run_job
                  - condition: true
                    next: end
          - run_job:
              call: googleapis.run.v1.namespaces.jobs.run
              args:
                  name: $${"namespaces/" + project_id + "/jobs/" + job_name}
                  location: $${job_location}
                  body:
                      overrides:
                          containerOverrides:
                              env:
                                  - name: INPUT_BUCKET
                                    value: $${event_bucket}
                                  - name: INPUT_FILE
                                    value: $${event_file}
              result: job_execution
          - finish:
              return: $${job_execution}
  EOF
}

Alur kerja ini akan melakukan hal berikut:

  1. Langkah init—Menerima peristiwa Cloud Storage sebagai argumen, lalu menetapkan variabel yang diperlukan.

  2. Langkah check_input_file—Memeriksa apakah bucket Cloud Storage yang ditentukan dalam peristiwa adalah bucket yang digunakan oleh tugas Cloud Run.

    • Jika ya, alur kerja akan dilanjutkan ke langkah run_job.
    • Jika tidak, alur kerja akan berakhir, sehingga menghentikan pemrosesan lebih lanjut.
  3. Langkah run_job—Menggunakan metode googleapis.run.v1.namespaces.jobs.run dari konektor Cloud Run Admin API untuk mengeksekusi tugas. Nama bucket Cloud Storage dan file data diteruskan sebagai variabel penggantian dari alur kerja ke tugas.

  4. Langkah finish—Menampilkan informasi tentang eksekusi tugas sebagai hasil alur kerja.

Membuat pemicu Eventarc untuk alur kerja

Untuk menjalankan alur kerja dan tugas Cloud Run secara otomatis setiap kali file data input diperbarui, buat pemicu Eventarc yang merespons peristiwa Cloud Storage di bucket yang berisi file data input.

Konsol

  1. Di konsol Google Cloud , buka halaman Workflows:

    Buka Workflows

  2. Klik nama alur kerja Anda, seperti cloud-run-job-workflow.

  3. Di halaman Detail alur kerja, klik Edit.

  4. Di halaman Edit alur kerja, di bagian Pemicu, klik Tambahkan pemicu baru > Eventarc.

    Panel Pemicu Eventarc akan terbuka.

  5. Di kolom Nama pemicu, masukkan nama untuk pemicu, seperti cloud-run-job-workflow-trigger.

  6. Dari daftar Penyedia peristiwa, pilih Cloud Storage.

  7. Dari daftar Event, pilih google.cloud.storage.object.v1.finalized.

  8. Di kolom Bucket, pilih bucket yang berisi file data input. Nama bucket memiliki format input-PROJECT_ID.

  9. Di kolom Service account, pilih akun layanan yang Anda buat sebelumnya.

    Akun layanan berfungsi sebagai identitas pemicu. Anda seharusnya telah memberikan peran berikut ke akun layanan:

    • Eventarc Event Receiver: untuk menerima peristiwa
    • Workflows Invoker: untuk menjalankan alur kerja
  10. Klik Save trigger.

    Pemicu Eventarc kini muncul di bagian Pemicu di halaman Edit alur kerja.

  11. Klik Berikutnya.

  12. Klik Deploy.

gcloud

Buat pemicu Eventarc dengan menjalankan perintah berikut:

gcloud eventarc triggers create cloud-run-job-workflow-trigger \
    --location=us \
    --destination-workflow=cloud-run-job-workflow  \
    --destination-workflow-location=us-central1 \
    --event-filters="type=google.cloud.storage.object.v1.finalized" \
    --event-filters="bucket=input-PROJECT_ID" \
    --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

Ganti kode berikut:

  • PROJECT_ID: ID Google Cloud project Anda
  • SERVICE_ACCOUNT_NAME: nama akun layanan yang Anda buat sebelumnya.

Akun layanan berfungsi sebagai identitas pemicu. Anda seharusnya telah memberikan peran berikut ke akun layanan:

  • roles/eventarc.eventReceiver: untuk menerima peristiwa
  • roles/workflows.invoker: untuk menjalankan alur kerja

Terraform

Untuk membuat pemicu, gunakan resource google_eventarc_trigger dan ubah file main.tf Anda seperti yang ditunjukkan dalam contoh berikut.

Untuk mempelajari cara menerapkan atau menghapus konfigurasi Terraform, lihat Perintah dasar Terraform.

Perhatikan bahwa dalam alur kerja Terraform yang umum, Anda menerapkan seluruh rencana sekaligus. Namun, untuk tujuan tutorial ini, Anda dapat menargetkan resource tertentu. Contoh:

terraform apply -target="google_eventarc_trigger.default"

# Create an Eventarc trigger that routes Cloud Storage events to Workflows
resource "google_eventarc_trigger" "default" {
  name     = "cloud-run-job-trigger"
  location = google_workflows_workflow.default.region

  # Capture objects changed in the bucket
  matching_criteria {
    attribute = "type"
    value     = "google.cloud.storage.object.v1.finalized"
  }
  matching_criteria {
    attribute = "bucket"
    value     = google_storage_bucket.default.name
  }

  # Send events to Workflows
  destination {
    workflow = google_workflows_workflow.default.id
  }

  service_account = google_service_account.workflows.email

}

Setiap kali file diupload atau ditimpa di bucket Cloud Storage yang berisi file data input, alur kerja akan dieksekusi dengan peristiwa Cloud Storage yang sesuai sebagai argumen.

Memicu alur kerja

Uji sistem end-to-end dengan memperbarui file data input di Cloud Storage.

  1. Buat data baru untuk file input dan upload ke Cloud Storage di lokasi yang diharapkan oleh tugas Cloud Run:

    base64 /dev/urandom | head -c 100000 >input_file.txt
    gcloud storage cp input_file.txt gs://input-PROJECT_ID/input_file.txt

    Jika Anda membuat bucket Cloud Storage menggunakan Terraform, Anda dapat mengambil nama bucket dengan menjalankan perintah berikut:

    gcloud storage buckets list gs://input*

    Tugas Cloud Run dapat memerlukan waktu beberapa menit untuk dijalankan.

  2. Pastikan tugas Cloud Run berjalan seperti yang diharapkan dengan melihat eksekusi tugas:

    gcloud config set run/region us-central1
    gcloud run jobs executions list --job=parallel-job

    Anda akan melihat eksekusi tugas yang berhasil dalam output yang menunjukkan bahwa 10/10 tugas telah selesai.

Pelajari lebih lanjut cara memicu alur kerja dengan peristiwa atau pesan Pub/Sub.