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 menggunakan polling.

Alih-alih menggunakan polling, tutorial ini menunjukkan cara menunggu peristiwa atau pesan Pub/Sub menggunakan callback HTTP dan pemicu Eventarc. Meskipun Anda dapat memicu alur kerja dengan peristiwa atau pesan Pub/Sub, Anda mungkin ingin menghentikan 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 selesai. Anda dapat menerapkannya dengan membuat satu alur kerja memanggil kembali alur kerja lain.

Tujuan

Dalam tutorial ini, hal berikut akan terjadi:

  1. Alur kerja utama yang perlu menunggu peristiwa di-deploy dan dieksekusi. Karena harus menunggu peristiwa terjadi, alur kerja ini menyimpan detail callback-nya di database Firestore sehingga alur kerja sekunder dapat mengambil detail tersebut. 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 eksekusi.

Berikut adalah ringkasan seluruh prosesnya:

Menunggu peristiwa menggunakan callback dan 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 dalam dokumen Firestore.
  3. Alur kerja ini 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 akan menggunakan komponen Google Cloud yang dapat ditagih berikut: Google Cloud:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna Google Cloud baru 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 .

    Buka pemilih project

  2. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda. Pelajari cara memeriksa apakah penagihan diaktifkan pada 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 Service Accounts.

      Buka Akun Layanan

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

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

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

    4. Klik Buat dan lanjutkan.

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

      • Pengguna Cloud Datastore: untuk mengakses data Firestore dalam mode Datastore (Datastore).
      • Eventarc Event Receiver: 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 tambahan.

    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, ini adalah service-PROJECT_NUMBER@gs-project-accounts.. 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 Tambahkan peran lain, lalu telusuri peran Pub/Sub Publisher.
      2. Pilih peran.
      3. Klik Simpan.
    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 Simpan.

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

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

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

    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.

    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. \
          --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, ini adalah service-PROJECT_NUMBER@gs-project-accounts.. Gunakan gcloud storage service-agent untuk mengambil agen layanan Cloud Storage terlebih dahulu.

    SERVICE_ACCOUNT_STORAGE="$(gcloud storage service-agent --project=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 pemetaan kolom ke nilai. Dokumen ini disimpan dalam koleksi, yang merupakan penampung untuk dokumen Anda, yang 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 Firestore Mulai.

    Buka Mulai

  2. Klik Pilih Mode Native .

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

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

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

  4. Klik Buat database.

gcloud

Untuk membuat database Firestore, Anda harus membuat aplikasi App Engine terlebih dahulu, 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 App Engine us-central (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 agar Anda dapat memublikasikan pesan ke topik tersebut. Pelajari lebih lanjut cara membuat dan mengelola topik.

Konsol

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

    Buka Topik

  2. Klik CREATE TOPIC.

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

  4. Terima setelan 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 Cloud Storage Bucket.

    Buka Cloud Storage

  2. Klik Buat.

  3. Untuk Name bucket Anda, 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. Terima setelan 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 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. Dalam daftar Region, pilih us-central1.

  5. Pilih Service account yang sebelumnya Anda buat.

  6. Klik Berikutnya.

  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.

    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 di 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. Dalam daftar Region, pilih us-central1.

  5. Pilih Service account yang sebelumnya Anda buat.

  6. Klik Berikutnya.

  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.

    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, termasuk sumber peristiwa, dan alur kerja target. Buat pemicu Eventarc untuk menjalankan alur kerja callback-event-listener sebagai hasil dari publikasi 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 Penyedia peristiwa, pilih Cloud Pub/Sub.

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

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

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

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

  9. Pilih Service account yang sebelumnya Anda buat.

  10. Dalam daftar Tujuan peristiwa, pilih Alur kerja.

  11. Dalam daftar Select a workflow, pilih alur kerja callback-event-listener.

  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.

Peristiwa diubah dan diteruskan ke eksekusi alur kerja sebagai argumen runtime. Perhatikan bahwa diperlukan 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, 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. Di daftar Penyedia peristiwa, pilih Cloud Storage.

  5. Dalam daftar Peristiwa, pada bagian Langsung, pilih google.cloud.storage.object.v1.finalized.

  6. Dalam daftar Bucket, jelajahi bucket yang telah Anda buat sebelumnya dan pilih.

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

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

  9. Pilih Service account yang sebelumnya Anda buat.

  10. Dalam daftar Tujuan peristiwa, pilih Alur kerja.

  11. Dalam daftar Select a workflow, pilih alur kerja callback-event-listener.

  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.

Peristiwa diubah dan diteruskan ke eksekusi alur kerja sebagai argumen runtime. Perhatikan bahwa diperlukan 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 eksekusinya saat alur kerja sekunder membuat permintaan callback yang sesuai.

Konsol

  1. Di konsol Google Cloud , buka halaman Workflows.

    Buka Workflows

  2. Di halaman Alur kerja, 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: 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 dengan berikut ini:

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

Membuat peristiwa dan memeriksa status eksekusi

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

Publikasikan pesan

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

Konsol

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

    Buka Topik

  2. Klik callback-topik.

  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"

Mengunggah 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 pengelola file ke panel utama di konsol Google Cloud .

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

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 Alur kerja, 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.

    Status eksekusi harus Berhasil 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 mirip dengan berikut ini:

    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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Menghapus resource yang dibuat dalam tutorial ini

  1. Menghapus data dari Firestore.

  2. Menghapus topik Pub/Sub.

  3. Hapus bucket Cloud Storage.

  4. Menghapus pemicu Eventarc.

  5. Menghapus alur kerja.

Langkah selanjutnya