Menunggu peristiwa menggunakan callback dan pemicu Eventarc


Alur kerja Anda mungkin perlu menunggu proses eksternal. Anda dapat menggunakan callback HTTP untuk menunggu layanan lain membuat permintaan ke endpoint callback; permintaan tersebut akan melanjutkan eksekusi alur kerja. Anda juga dapat menunggu penggunaan polling.

Tutorial ini menunjukkan cara menunggu peristiwa atau pesan Pub/Sub, bukan menggunakan polling, menggunakan callback HTTP dan pemicu Eventarc. Meskipun Anda dapat memicu alur kerja dengan peristiwa atau pesan Pub/Sub, sebaiknya hentikan eksekusi tersebut untuk menunggu peristiwa lain sebelum melanjutkan. Misalnya, peristiwa memicu alur kerja untuk memulai proses, tetapi alur kerja harus menunggu peristiwa lain yang menandakan bahwa proses tersebut sudah selesai. Anda dapat mengimplementasikannya dengan membuat satu alur kerja memanggil kembali alur kerja lainnya.

Tujuan

Dalam tutorial ini, hal berikut terjadi:

  1. Alur kerja utama yang harus menunggu peristiwa di-deploy dan dijalankan. Karena harus menunggu peristiwa terjadi, detail callback-nya akan disimpan dalam database Firestore sehingga alur kerja sekunder dapat mengambil detailnya. Alur kerja utama kemudian menunggu panggilan HTTP.

  2. Alur kerja sekunder dipicu oleh peristiwa dan mengambil detail callback dari database Firestore saat peristiwa dibuat. Alur kerja sekunder kemudian memanggil kembali alur kerja utama yang melanjutkan eksekusinya.

Berikut adalah gambaran umum dari seluruh proses:

Menunggu peristiwa menggunakan callback serta alur kerja utama dan sekunder

Alur kerja utama:

  1. Alur kerja callback-event-sample membuat endpoint callback untuk dua sumber peristiwa: topik Pub/Sub dan bucket Cloud Storage.
  2. Alur kerja ini menyimpan kedua endpoint callback di dokumen Firestore.
  3. Alur kerja ini akan menghentikan eksekusinya dan menunggu permintaan HTTP tiba di endpoint callback.

Peristiwa:

  1. Peristiwa terjadi: pesan dipublikasikan ke topik Pub/Sub dan file diupload ke bucket Cloud Storage.

Alur kerja sekunder:

  1. Eventarc merutekan peristiwa ke alur kerja callback-event-listener dan memicu eksekusinya.
  2. Alur kerja ini mengambil URL endpoint callback yang sesuai dari dokumen Firestore.
  3. Alur kerja ini mengeksekusi callback ke endpoint yang sesuai dalam contoh alur kerja.

Alur kerja utama:

  1. Alur kerja callback-event-sample menerima peristiwa di endpoint callback dan melanjutkan eksekusinya.
  2. Alur kerja ini menghapus URL callback dari dokumen Firestore dan menyelesaikan eksekusinya.

Biaya

Dalam dokumen ini, Anda 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.

Sebelum memulai

Anda dapat menjalankan perintah berikut di Konsol Google Cloud, atau dengan menggunakan Google Cloud CLI di terminal atau Cloud Shell.

Batasan keamanan yang ditentukan oleh organisasi mungkin mencegah Anda menyelesaikan langkah-langkah berikut. Untuk mengetahui informasi pemecahan masalah, lihat Mengembangkan aplikasi di lingkungan Google Cloud yang terbatas.

Konsol

  1. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  2. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda. Pelajari cara memeriksa apakah penagihan telah diaktifkan pada suatu project.

  3. Aktifkan App Engine, Eventarc, Firestore, Pub/Sub, dan Workflows API.

    Mengaktifkan API

  4. Buat akun layanan untuk alur kerja Anda yang akan digunakan untuk autentikasi dengan layanan Google Cloud lainnya dan berikan peran yang sesuai:

    1. Di Konsol Google Cloud, buka halaman Akun layanan.

      Buka Akun Layanan

    2. Untuk membuka halaman Create service account, pilih project Anda.

    3. Di kolom Nama akun layanan, masukkan nama. Konsol Google Cloud mengisi kolom Service account ID berdasarkan nama ini.

      Di kolom Deskripsi akun layanan, masukkan sebuah deskripsi. Misalnya, Service account for tutorial.

    4. Klik Buat dan lanjutkan.

    5. Pada daftar Select a role, filter untuk peran berikut yang akan diberikan ke akun layanan yang dikelola pengguna yang Anda buat di langkah sebelumnya:

      • Cloud Datastore User: untuk mengakses Firestore dalam data mode Datastore (Datastore).
      • Penerima Peristiwa Eventarc: untuk menerima peristiwa dari penyedia peristiwa.
      • Logs Writer: untuk menulis log.
      • Workflows Invoker: untuk menjalankan alur kerja dan mengelola eksekusi.

      Untuk peran tambahan, klik Tambahkan peran lain, lalu tambahkan setiap peran lainnya.

    6. Klik Lanjutkan.

    7. Untuk menyelesaikan pembuatan akun, klik Selesai.

  5. Untuk membuat pemicu Eventarc yang merutekan peristiwa dari Cloud Storage, berikan peran Pub/Sub Publisher ke agen layanan Cloud Storage. Biasanya, namanya adalah service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com. Anda dapat mengambil alamat email untuk agen layanan Cloud Storage.

    1. Di konsol Google Cloud, buka halaman IAM.

      Buka IAM

    2. Di baris untuk agen layanan Cloud Storage, klik Edit principal. (Jika agen layanan tidak tercantum, lanjutkan ke langkah berikutnya.) Panel Edit akses akan terbuka.

      1. Klik Add another role, lalu telusuri peran Pub/Sub Publisher.
      2. Pilih peran.
      3. Klik Save.
    3. Jika agen layanan tidak tercantum, klik Berikan akses. Panel Berikan akses akan terbuka.

      1. Di kolom New principals, masukkan alamat email untuk agen layanan.
      2. Dalam daftar Select a role, telusuri peran Pub/Sub Publisher.
      3. Pilih peran.
      4. Klik Save.

gcloud

  1. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

  2. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda. Pelajari cara memeriksa apakah penagihan telah diaktifkan pada suatu project.

  3. Aktifkan App Engine, Eventarc, Firestore, Pub/Sub, dan Workflows API.

    gcloud services enable \
        appengine.googleapis.com \
        eventarc.googleapis.com \
        firestore.googleapis.com \
        pubsub.googleapis.com \
        workflows.googleapis.com
  4. Buat akun layanan untuk alur kerja Anda yang akan digunakan untuk autentikasi dengan layanan Google Cloud lainnya dan berikan peran yang sesuai kepadanya.

    1. Buat akun layanan:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Ganti SERVICE_ACCOUNT_NAME dengan nama untuk akun layanan.

    2. Berikan peran ke akun layanan yang dikelola pengguna yang Anda buat di langkah sebelumnya. Jalankan perintah berikut satu kali untuk setiap peran IAM berikut:

      • roles/datastore.user: untuk mengakses data Firestore dalam mode Datastore (Datastore).
      • roles/eventarc.eventReceiver: untuk menerima peristiwa dari penyedia peristiwa.
      • roles/logging.logWriter: untuk menulis log.
      • roles/workflows.invoker: untuk menjalankan alur kerja dan mengelola eksekusi.
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
          --role=ROLE

      Ganti kode berikut:

      • PROJECT_ID: project ID tempat Anda membuat akun layanan
      • ROLE: peran yang akan diberikan
  5. Untuk membuat pemicu Eventarc yang merutekan peristiwa dari Cloud Storage, berikan peran Pub/Sub Publisher ke agen layanan Cloud Storage. Biasanya, namanya adalah service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com. Gunakan gsutil kms serviceaccount untuk mengambil agen layanan Cloud Storage terlebih dahulu.

    SERVICE_ACCOUNT_STORAGE="$(gsutil kms serviceaccount -p PROJECT_ID)"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:$SERVICE_ACCOUNT_STORAGE \
        --role=roles/pubsub.publisher

Membuat database Firestore

Firestore menyimpan data Anda dalam dokumen yang berisi kolom yang dipetakan terhadap nilai. Dokumen ini disimpan dalam koleksi, yang merupakan container untuk dokumen Anda dan dapat digunakan untuk mengatur data dan membuat kueri. Pelajari Firestore lebih lanjut.

Perhatikan bahwa setiap project Google Cloud dibatasi untuk satu database Firestore. Selesaikan langkah-langkah berikut jika Anda perlu membuat database baru.

Konsol

  1. Di Konsol Google Cloud, buka halaman Get started di Firestore.

    Buka halaman Memulai

  2. Klik Pilih Mode Native .

    Untuk panduan memilih mode database dan perbandingan fitur demi fitur, lihat memilih antara Mode Native dan Mode Datastore.

  3. Pada daftar Select a location, pilih nam5 (United States).

    Lokasi ini berlaku untuk database Firestore dan aplikasi App Engine di project Google Cloud Anda. Setelah membuat database, Anda tidak dapat mengubah lokasinya.

  4. Klik Buat database.

gcloud

Untuk membuat database Firestore, Anda harus terlebih dahulu membuat aplikasi App Engine, lalu menjalankan perintah gcloud firestore databases create:

gcloud app create --region=us-central
gcloud firestore databases create --region=us-central

Anda dapat mengabaikan peringatan us-central is not a valid Firestore location. App Engine dan Firestore mendukung lokasi yang sama, tetapi region us-central App Engine (Iowa) dipetakan ke multi-region Firestore nam5 (Amerika Serikat).

Membuat topik Pub/Sub

Tutorial ini menggunakan Pub/Sub sebagai sumber peristiwa. Buat topik Pub/Sub sehingga Anda dapat memublikasikan pesan ke topik tersebut. Pelajari lebih lanjut cara membuat dan mengelola topik.

Konsol

  1. Di konsol Google Cloud, buka halaman Topics Pub/Sub.

    Buka Topik

  2. Klik CREATE TOPIC.

  3. Di kolom Topic ID, masukkan topic-callback.

  4. Setujui default lainnya.

  5. Klik Create topic.

gcloud

Untuk membuat topik, jalankan perintah gcloud pubsub topics create:

gcloud pubsub topics create topic-callback

Membuat bucket Cloud Storage

Tutorial ini menggunakan Cloud Storage sebagai sumber peristiwa. Buat bucket Cloud Storage agar Anda dapat mengupload file ke dalamnya. Pelajari lebih lanjut cara membuat bucket penyimpanan.

Konsol

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

    Buka Cloud Storage

  2. Klik Buat.

  3. Untuk Name bucket, masukkan PROJECT_ID-bucket-callback.

    Project ID digunakan dalam alur kerja callback-event-sample untuk mengidentifikasi bucket.

  4. Klik Lanjutkan.

  5. Untuk Location type, pilih Region, lalu pilih us-central1 (Iowa).

  6. Setujui default lainnya.

  7. Klik Create.

gcloud

Untuk membuat bucket, jalankan perintah gcloud storage buckets create:

gcloud storage buckets create gs://PROJECT_ID-bucket-callback \
    --location=us-central1

Project ID digunakan dalam alur kerja callback-event-sample untuk mengidentifikasi bucket.

Setelah sumber peristiwa dibuat, Anda dapat men-deploy alur kerja penerima peristiwa.

Men-deploy alur kerja yang memproses peristiwa

Alur kerja callback-event-listener dipicu saat pesan dipublikasikan ke topik Pub/Sub atau saat file diupload ke bucket Cloud Storage. Alur kerja ini menerima peristiwa, mengambil detail callback yang sesuai dari database Firestore, lalu mengirim permintaan HTTP ke endpoint callback.

Konsol

  1. Di konsol Google Cloud, buka halaman Workflows:

    Buka Workflows

  2. Klik Buat.

  3. Masukkan nama untuk alur kerja baru: callback-event-listener.

  4. Pada daftar Region, pilih us-central1.

  5. Pilih Akun layanan yang telah dibuat sebelumnya.

  6. Klik Next.

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

    main:
      params: [event]
      steps:
        - log_event:
            call: sys.log
            args:
              text: ${event}
              severity: INFO
        - init:
            assign:
              - database_root: ${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/databases/(default)/documents/callbacks/"}
              - event_source_tokens: ${text.split(event.source, "/")}
              - event_source_len: ${len(event_source_tokens)}
              - event_source: ${event_source_tokens[event_source_len - 1]}
              - doc_name: ${database_root + event_source}
        - get_document_for_event_source:
            try:
              call: googleapis.firestore.v1.projects.databases.documents.get
              args:
                name: ${doc_name}
              result: document
            except:
                as: e
                steps:
                    - known_errors:
                        switch:
                        - condition: ${e.code == 404}
                          return: ${"No callbacks for event source " + event_source}
                    - unhandled_exception:
                        raise: ${e}
        - process_callback_urls:
            steps:
              - check_fields_exist:
                  switch:
                  - condition: ${not("fields" in document)}
                    return: ${"No callbacks for event source " + event_source}
                  - condition: true
                    next: processFields
              - processFields:
                  for:
                      value: key
                      in: ${keys(document.fields)}
                      steps:
                          - extract_callback_url:
                              assign:
                                  - callback_url: ${document.fields[key]["stringValue"]}
                          - log_callback_url:
                              call: sys.log
                              args:
                                text: ${"Calling back url " + callback_url}
                                severity: INFO
                          - http_post:
                              call: http.post
                              args:
                                  url: ${callback_url}
                                  auth:
                                      type: OAuth2
                                  body:
                                      event: ${event}
  8. Klik Deploy.

gcloud

  1. Buat file kode sumber untuk alur kerja Anda:

    touch callback-event-listener.yaml
  2. Di editor teks, salin alur kerja berikut ke file kode sumber Anda:

    main:
      params: [event]
      steps:
        - log_event:
            call: sys.log
            args:
              text: ${event}
              severity: INFO
        - init:
            assign:
              - database_root: ${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/databases/(default)/documents/callbacks/"}
              - event_source_tokens: ${text.split(event.source, "/")}
              - event_source_len: ${len(event_source_tokens)}
              - event_source: ${event_source_tokens[event_source_len - 1]}
              - doc_name: ${database_root + event_source}
        - get_document_for_event_source:
            try:
              call: googleapis.firestore.v1.projects.databases.documents.get
              args:
                name: ${doc_name}
              result: document
            except:
                as: e
                steps:
                    - known_errors:
                        switch:
                        - condition: ${e.code == 404}
                          return: ${"No callbacks for event source " + event_source}
                    - unhandled_exception:
                        raise: ${e}
        - process_callback_urls:
            steps:
              - check_fields_exist:
                  switch:
                  - condition: ${not("fields" in document)}
                    return: ${"No callbacks for event source " + event_source}
                  - condition: true
                    next: processFields
              - processFields:
                  for:
                      value: key
                      in: ${keys(document.fields)}
                      steps:
                          - extract_callback_url:
                              assign:
                                  - callback_url: ${document.fields[key]["stringValue"]}
                          - log_callback_url:
                              call: sys.log
                              args:
                                text: ${"Calling back url " + callback_url}
                                severity: INFO
                          - http_post:
                              call: http.post
                              args:
                                  url: ${callback_url}
                                  auth:
                                      type: OAuth2
                                  body:
                                      event: ${event}
  3. Deploy alur kerja dengan memasukkan perintah berikut:

    gcloud workflows deploy callback-event-listener \
        --source=callback-event-listener.yaml \
        --location=us-central1 \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

    Ganti SERVICE_ACCOUNT_NAME dengan nama akun layanan yang Anda buat sebelumnya.

Men-deploy alur kerja yang menunggu peristiwa

Alur kerja callback-event-sample menyimpan detail callback-nya dalam database Firestore, menghentikan eksekusinya, lalu menunggu peristiwa tertentu terjadi.

Konsol

  1. Di konsol Google Cloud, buka halaman Workflows:

    Buka Workflows

  2. Klik Buat.

  3. Masukkan nama untuk alur kerja baru: callback-event-sample.

  4. Pada daftar Region, pilih us-central1.

  5. Pilih Akun layanan yang telah dibuat sebelumnya.

  6. Klik Next.

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

    main:
      steps:
        - init:
            assign:
              - pubsub_topic: topic-callback
              - storage_bucket: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "-bucket-callback"}
        - await_pubsub_message:
            call: await_callback_event
            args:
              event_source: ${pubsub_topic}
            result: pubsub_event
        - await_storage_bucket:
            call: await_callback_event
            args:
              event_source: ${storage_bucket}
            result: storage_event
        - return_events:
            return:
                pubsub_event: ${pubsub_event}
                storage_event: ${storage_event}
    
    await_callback_event:
        params: [event_source]
        steps:
            - init:
                assign:
                  - database_root: ${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/databases/(default)/documents/callbacks/"}
                  - doc_name: ${database_root + event_source}
                  - execution_id: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_EXECUTION_ID")}
                  - firestore_key: ${"exec_" + text.split(execution_id, "-")[0]}
            - create_callback:
                call: events.create_callback_endpoint
                args:
                  http_callback_method: POST
                result: callback_details
            - save_callback_url:
                call: googleapis.firestore.v1.projects.databases.documents.patch
                args:
                  name: ${doc_name}
                  updateMask:
                    fieldPaths: ["${firestore_key}"]
                  body:
                    fields:
                      ${firestore_key}:
                        stringValue: ${callback_details.url}
            - log_and_await_callback:
                try:
                  steps:
                    - log_await_start:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Started waiting 1hr for an event from source " + event_source}
                    - await_callback:
                        call: events.await_callback
                        args:
                          callback: ${callback_details}
                          timeout: 3600
                        result: callback_request
                    - log_await_stop:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Stopped waiting for an event from source " + event_source}
                except:
                    as: e
                    steps:
                        - log_error:
                            call: sys.log
                            args:
                                severity: "ERROR"
                                text: ${"Received error " + e.message}
            - delete_callback_url:
                call: googleapis.firestore.v1.projects.databases.documents.patch
                args:
                  name: ${doc_name}
                  updateMask:
                    fieldPaths: ["${firestore_key}"]
            - check_null_event:
                switch:
                  - condition: ${callback_request == null}
                    return: null
            - log_await_result:
                call: sys.log
                args:
                  severity: INFO
                  data: ${callback_request.http_request.body.event}
            - return_event:
                return: ${callback_request.http_request.body.event}
  8. Klik Deploy.

gcloud

  1. Buat file kode sumber untuk alur kerja Anda:

    touch callback-event-sample.yaml
  2. Di editor teks, salin alur kerja berikut ke file kode sumber Anda:

    main:
      steps:
        - init:
            assign:
              - pubsub_topic: topic-callback
              - storage_bucket: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "-bucket-callback"}
        - await_pubsub_message:
            call: await_callback_event
            args:
              event_source: ${pubsub_topic}
            result: pubsub_event
        - await_storage_bucket:
            call: await_callback_event
            args:
              event_source: ${storage_bucket}
            result: storage_event
        - return_events:
            return:
                pubsub_event: ${pubsub_event}
                storage_event: ${storage_event}
    
    await_callback_event:
        params: [event_source]
        steps:
            - init:
                assign:
                  - database_root: ${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/databases/(default)/documents/callbacks/"}
                  - doc_name: ${database_root + event_source}
                  - execution_id: ${sys.get_env("GOOGLE_CLOUD_WORKFLOW_EXECUTION_ID")}
                  - firestore_key: ${"exec_" + text.split(execution_id, "-")[0]}
            - create_callback:
                call: events.create_callback_endpoint
                args:
                  http_callback_method: POST
                result: callback_details
            - save_callback_url:
                call: googleapis.firestore.v1.projects.databases.documents.patch
                args:
                  name: ${doc_name}
                  updateMask:
                    fieldPaths: ["${firestore_key}"]
                  body:
                    fields:
                      ${firestore_key}:
                        stringValue: ${callback_details.url}
            - log_and_await_callback:
                try:
                  steps:
                    - log_await_start:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Started waiting 1hr for an event from source " + event_source}
                    - await_callback:
                        call: events.await_callback
                        args:
                          callback: ${callback_details}
                          timeout: 3600
                        result: callback_request
                    - log_await_stop:
                        call: sys.log
                        args:
                          severity: INFO
                          data: ${"Stopped waiting for an event from source " + event_source}
                except:
                    as: e
                    steps:
                        - log_error:
                            call: sys.log
                            args:
                                severity: "ERROR"
                                text: ${"Received error " + e.message}
            - delete_callback_url:
                call: googleapis.firestore.v1.projects.databases.documents.patch
                args:
                  name: ${doc_name}
                  updateMask:
                    fieldPaths: ["${firestore_key}"]
            - check_null_event:
                switch:
                  - condition: ${callback_request == null}
                    return: null
            - log_await_result:
                call: sys.log
                args:
                  severity: INFO
                  data: ${callback_request.http_request.body.event}
            - return_event:
                return: ${callback_request.http_request.body.event}
  3. Deploy alur kerja dengan memasukkan perintah berikut:

    gcloud workflows deploy callback-event-sample \
        --source=callback-event-sample.yaml \
        --location=us-central1 \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

    Ganti SERVICE_ACCOUNT_NAME dengan nama akun layanan yang Anda buat sebelumnya.

Membuat pemicu Eventarc untuk merutekan peristiwa Pub/Sub

Pemicu Eventarc memungkinkan Anda merutekan peristiwa dengan menentukan filter untuk pemicu tersebut, termasuk sumber peristiwa, dan alur kerja target. Buat pemicu Eventarc untuk menjalankan alur kerja callback-event-listener sebagai hasil dari memublikasikan pesan ke topik Pub/Sub. Pelajari lebih lanjut cara memicu alur kerja.

Konsol

  1. Di konsol Google Cloud, buka halaman Eventarc.

    Buka Eventarc

  2. Klik Create trigger.

  3. Ketik Nama pemicu.

    Misalnya, trigger-pubsub-events-listener.

  4. Dalam daftar Event provider, pilih Cloud Pub/Sub.

  5. Dalam daftar Peristiwa, di bagian Kustom, pilih google.cloud.pubsub.topic.v1.messagePublished.

  6. Pada daftar Select a Cloud Pub/Sub topic, pilih topik yang Anda buat sebelumnya.

  7. Pada daftar Region, pilih us-central1 (Iowa).

  8. Jika diminta, berikan peran iam.serviceAccountTokenCreator ke akun layanan Pub/Sub.

  9. Pilih Akun layanan yang telah dibuat sebelumnya.

  10. Dalam daftar Tujuan acara, pilih Alur kerja.

  11. Di daftar Select a Workflow, pilih alur kerja callback-event-pemroses.

  12. Klik Create.

gcloud

Untuk membuat pemicu, jalankan perintah gcloud eventarc triggers create:

gcloud eventarc triggers create trigger-pubsub-events-listener \
    --location=us-central1 \
    --destination-workflow=callback-event-listener \
    --destination-workflow-location=us-central1 \
    --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
    --transport-topic=topic-callback \
    --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

Peristiwa diubah dan diteruskan ke eksekusi alur kerja sebagai argumen runtime. Perhatikan bahwa perlu waktu hingga 2 menit agar pemicu baru menjadi aktif.

Membuat pemicu Eventarc untuk merutekan peristiwa Cloud Storage

Pemicu Eventarc memungkinkan Anda merutekan peristiwa dengan menentukan filter untuk pemicu tersebut, termasuk sumber peristiwa, dan alur kerja target. Buat pemicu Eventarc untuk menjalankan alur kerja callback-event-listener sebagai hasil dari mengupload file ke bucket Cloud Storage. Pelajari lebih lanjut cara memicu alur kerja.

Konsol

  1. Di konsol Google Cloud, buka halaman Eventarc.

    Buka Eventarc

  2. Klik Create trigger.

  3. Ketik Nama pemicu.

    Misalnya, trigger-storage-events-listener.

  4. Dalam daftar Event provider, pilih Cloud Storage.

  5. Dalam daftar Event, di bagian Direct, pilih google.cloud.storage.object.v1.finalized.

  6. Dalam daftar Bucket, cari bucket yang sebelumnya Anda buat, lalu pilih bucket tersebut.

  7. Dalam daftar Region, berdasarkan bucket Cloud Storage Anda, terima setelan default us-central1 (Iowa).

  8. Jika diminta, berikan peran iam.serviceAccountTokenCreator ke akun layanan Pub/Sub.

  9. Pilih Akun layanan yang telah dibuat sebelumnya.

  10. Dalam daftar Tujuan acara, pilih Alur kerja.

  11. Di daftar Select a Workflow, pilih alur kerja callback-event-pemroses.

  12. Klik Create.

gcloud

Untuk membuat pemicu, jalankan perintah gcloud eventarc triggers create:

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

Peristiwa diubah dan diteruskan ke eksekusi alur kerja sebagai argumen runtime. Perhatikan bahwa perlu waktu hingga 2 menit agar pemicu baru menjadi aktif.

Menjalankan alur kerja utama

Mengeksekusi alur kerja akan menjalankan definisi alur kerja saat ini yang terkait dengan alur kerja. Jalankan alur kerja callback-event-sample. Ini adalah alur kerja utama dan menunggu peristiwa tertentu terjadi, hanya melanjutkan eksekusi saat alur kerja sekunder membuat permintaan callback yang sesuai.

Konsol

  1. Di konsol Google Cloud, buka halaman Workflows.

    Buka Workflows

  2. Di halaman Workflows, klik alur kerja callback-event-sample untuk membuka halaman detailnya.

  3. Di halaman Workflow Details, klik Execute.

  4. Klik Execute lagi.

    Eksekusi alur kerja dimulai. Saat eksekusi berjalan, Anda akan melihat Status eksekusi Running dan entri log yang mirip dengan berikut ini: Started waiting 1hr for an event from source topic-callback.

gcloud

Untuk menjalankan alur kerja, jalankan perintah gcloud workflows run:

gcloud workflows run callback-event-sample \
    --location=us-central1

Eksekusi alur kerja dimulai. Saat eksekusi berjalan, Anda akan melihat status eksekusi yang mirip seperti berikut ini:

Waiting for execution [a848a164-268a-449c-b2fe-396f32f2ed66] to complete...working...

Membuat peristiwa dan memeriksa status eksekusi

Anda dapat mengonfirmasi bahwa hasilnya sesuai yang diharapkan dengan membuat peristiwa, melihat entri log, dan memeriksa status eksekusi alur kerja.

Publikasikan pesan

Publikasikan pesan ke topik Pub/Sub yang Anda buat sebelumnya.

Konsol

  1. Di konsol Google Cloud, buka halaman Topics Pub/Sub.

    Buka Topik

  2. Klik topic-callback.

  3. Klik tab Pesan.

  4. Klik Publikasikan pesan.

  5. Di kolom Isi pesan, masukkan Hello World.

  6. Klik Publikasikan.

gcloud

Untuk memublikasikan pesan, gunakan perintah gcloud pubsub topics publish:

gcloud pubsub topics publish topic-callback \
    --message="Hello World"

Mengupload objek

Upload file ke bucket Cloud Storage yang telah Anda buat sebelumnya.

Konsol

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

    Buka Buckets

  2. Klik nama bucket yang telah Anda buat sebelumnya.

  3. Di tab Objects, lakukan salah satu hal berikut:

    • Tarik lalu lepas file yang diinginkan dari desktop atau file manager ke panel utama di Konsol Google Cloud.

    • Klik Upload files, pilih file yang ingin diupload, lalu klik Open.

gcloud

Untuk mengupload file, jalankan perintah gcloud storage cp:

gcloud storage cp OBJECT_LOCATION gs://PROJECT_ID-bucket-callback/

Ganti OBJECT_LOCATION dengan jalur lokal ke objek Anda. Contoh, random.txt.

Melihat entri log dan status eksekusi

Konfirmasi bahwa alur kerja callback-event-sample berhasil diselesaikan.

Konsol

  1. Di konsol Google Cloud, buka halaman Workflows.

    Buka Workflows

  2. Di halaman Workflows, klik alur kerja callback-event-sample untuk membuka halaman detailnya.

  3. Di halaman Workflow Details, untuk mengambil detail eksekusi tertentu, klik ID eksekusi yang sesuai.

    Execution state harus Succeeded dan, di panel Output, Anda akan melihat peristiwa Pub/Sub dan Cloud Storage yang diterima.

gcloud

  1. Filter entri log dan tampilkan output dalam format JSON:

    gcloud logging read "resource.type=workflows.googleapis.com/Workflow AND textPayload:calling OR textPayload:waiting" \
        --format=json
  2. Cari entri log yang mirip dengan:

    "textPayload": "Stopped waiting for an event from source..."
    "textPayload": "Calling back url https://workflowexecutions.googleapis.com/v1/projects/..."
    "textPayload": "Started waiting 1hr for an event from source..."
    
  3. Periksa status upaya eksekusi terakhir:

    gcloud workflows executions wait-last

    Hasilnya akan terlihat seperti berikut:

    Using cached execution name: projects/1085953646031/locations/us-central1/workflows/callback-event-sample/executions/79929e4e-82c1-4da1-b068-f828034c01b7
    Waiting for execution [79929e4e-82c1-4da1-b068-f828034c01b7] to complete...done.
    [...]
    state: SUCCEEDED
    

Pembersihan

Jika Anda membuat project baru untuk tutorial ini, hapus project tersebut. Jika Anda menggunakan project yang ada dan ingin mempertahankannya tanpa perubahan yang ditambahkan dalam tutorial ini, hapus resource yang dibuat untuk tutorial.

Menghapus project

Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.

Untuk menghapus project:

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Menghapus resource yang dibuat dalam tutorial ini

  1. Menghapus data dari Firestore.

  2. Menghapus topik Pub/Sub.

  3. Menghapus bucket Cloud Storage.

  4. Menghapus pemicu Eventarc.

  5. Menghapus alur kerja.

Langkah selanjutnya