使用 Eventarc 觸發 Workflows

1. 總覽

在本研究室中,您將建立 Eventarc 觸發條件,將 Pub/Sub 主題連結至 Workflows 服務。Eventarc 可讓您區隔服務與服務通訊之間的狀況,讓您的解決方案更可擴充且更以事件為準。您將建立一個包含執行業務流程的多個步驟的工作流程,以計算在 Cymbal Eats 訂購商品的客戶獎勵點數。工作流程會呼叫私人 Cloud Run 服務 API 來執行商業邏輯。Cloud Run 服務已設為僅允許內部流量,而且需要驗證。工作流程會發布訊息至 Pub/Sub 主題,通知訂單服務計算的獎勵點數。

c6d4337a47b55333.png

什麼是 Eventarc?

Eventarc 可讓您建構事件導向的架構,而不必實作、自訂或維護基礎架構。Eventarc 提供標準化解決方案,可以管理分離微服務的狀態變更流程 (稱為事件)。觸發後,Eventarc 會透過 Pub/Sub 訂閱項目將這些事件轉送至多個目的地 (例如Workflows 或 Cloud Run),同時管理推送、安全性、授權、觀測能力和錯誤處理工作。

Google 事件供應商

  • 超過 90 個 Google Cloud 供應商。這些供應商可以直接從來源 (例如 Cloud Storage) 傳送事件,或是透過 Cloud 稽核記錄項目傳送事件。
  • Pub/Sub 供應商。這些提供者使用 Pub/Sub 訊息將事件傳送至 Eventarc。

第三方供應商

第三方供應商是指提供 Eventarc 來源的非 Google 實體。

Eventarc 觸發條件

  • Cloud Pub/Sub 事件。發布至 Pub/Sub 主題的訊息可觸發 Eventarc。
  • Cloud 稽核記錄 (CAL) 事件。Cloud 稽核記錄提供每個 Cloud 專案、資料夾和機構的管理員活動與資料存取稽核記錄。
  • 直接事件:各種直接事件都可觸發 Eventarc,例如 Cloud Storage 值區更新或更新 Firebase 遠端設定範本。

事件目的地

  • 工作流程
  • Cloud Run
  • GKE
  • Cloud Functions( 第 2 代)

c7ca054200edf1b3.png

什麼是 Workflows?

Workflows 是一項全代管服務,可讓您整合微服務、工作和 API。Workflows 是無伺服器的服務,可視需求調度資源。

Workflows 用途:

  • 事件導向的工作流程會對已定義的觸發條件執行。舉例來說,使用者提交新訂單且想計算客戶會員點數時。或者,如果訂單取消,系統則會發布活動,讓所有感興趣的服務處理這場活動。
  • 批次工作工作流程:使用 Cloud Scheduler 定期執行工作。例如夜間工作會檢查是否有失敗狀態的選單項目,並加以刪除。

Workflows 很適合用於自動化調度管理服務的工作流程。您可以自動執行程序,包含等待和重試最多一年。

Workflows 的優點:

  • 設定程式碼:將邏輯移至配置,而非編寫程式碼,藉此減少技術債。
  • 簡化架構。有狀態的 Workflows 不需要額外的依附元件,就能以視覺化方式呈現及監控複雜的服務整合項目。
  • 納入可靠性和容錯能力:使用預設或自訂重試邏輯和錯誤處理機制來控制故障情形,即使其他系統發生錯誤也不受影響。檢查每個步驟是否都可傳送至 Cloud Spanner,協助您追蹤進度。
  • 免維護視需要調度資源:無需進行修補或維護。您只須在工作流程執行時付費,等待或閒置時,無須支付任何費用。

在本研究室中,您將設定事件導向的工作流程。

學習目標

在本研究室中,您將瞭解如何執行下列操作:

  • 設定 Pub/Sub 主題和 Eventarc 以觸發 Workflows
  • 設定 Workflows 來呼叫 Cloud Run 服務,並將訊息發布至 Pub/Sub
  • 如何在 Cloud Logging 和 gcloud CLI 中查詢 Workflows 結構化記錄檔

必要條件

  • 本研究室假設您熟悉 Cloud 控制台和 Cloud Shell 環境。
  • 有沒有使用 Cloud Run 和 Cloud Pub/Sub 的經驗會有幫助,但並非必要。

2. 設定和需求

Cloud 專案設定

  1. 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 未使用的字元字串。您可以隨時更新。
  • 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常為 PROJECT_ID)。如果您對產生的 ID 不滿意,可以隨機產生一個 ID。此外,您也可以自行嘗試,看看系統是否提供該付款方式。在完成這個步驟後就無法變更,而且在專案期間仍會保持有效。
  • 資訊中的第三個值是專案編號,部分 API 會使用這個編號。如要進一步瞭解這三個值,請參閱說明文件
  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行這個程式碼研究室並不會產生任何費用,如果有的話。如要關閉資源,以免系統產生本教學課程結束後產生的費用,您可以刪除自己建立的資源,或刪除整個專案。Google Cloud 的新使用者符合 $300 美元免費試用計畫的資格。

環境設定

如要啟用 Cloud Shell,請按一下搜尋列右側的圖示。

eb0157a992f16fa3.png

複製存放區並前往目錄,將以下指令複製及貼上至終端機,然後按下 Enter 鍵:

git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/customer-service

執行 lab-setup.sh 來部署必要的依附元件

系統會建立下列資源:

  • AlloyDB 叢集和執行個體
  • Artifact Registry 可儲存 Cloud Run 工作和客戶服務的容器映像檔
  • 可讓 Cloud Run 服務和工作使用的虛擬私有雲存取連接器,與 AlloyDB 資料庫相互通訊
  • 透過 Cloud Run 工作建立 AlloyDB 資料庫
  • Cloud Run 客戶服務 - 使用 Quarkus 架構的 Java 型微服務。
./lab-setup.sh

如果出現授權提示,請按一下「授權」以繼續。

6356559df3eccdda.png

設定程序大約需要 10 分鐘的時間。

請等待指令碼完成,並查看下方輸出內容,再執行其他步驟。

Deploying container to Cloud Run service [customer-service] in project [cymbal-eats-19227-5681] region [us-east1]
OK Deploying new service... Done.                                                   
  OK Creating Revision...
  OK Routing traffic...
Done.
Service [customer-service] revision [customer-service-00001-mid] has been deployed and is serving 100 percent of traffic.
Service URL: https://customer-service-e4p5zon5rq-ue.a.run.app

您可以探索下一節,然後從下一個步驟繼續完成。

3. 查看工作流程

Workflows 核心概念

工作流程包含一系列使用 Workflows 語法( YAML 或 JSON) 的步驟。

工作流程建立完成之後會「部署」,讓工作流程準備好執行。

「執行」是工作流程定義中包含邏輯的單次執行作業。未執行的工作流程不會產生費用。所有工作流程執行作業都各自獨立,這項產品的快速資源調度功能可允許進行大量的並行執行作業。

執行作業控制選項

  • 步驟:如要建立工作流程,請使用 Workflows 語法定義所需的 steps 和執行順序。每個工作流程至少要有一個步驟。
  • 條件:您可以使用 switch 區塊做為選取機制,允許運算式的值控制工作流程的執行流程。
  • 疊代 - 您可以使用 for 迴圈,針對一串數字或資料集合 (例如清單或地圖) 疊代。
  • 子工作流程:子工作流程的運作方式與使用程式設計語言中的例行或函式類似,可讓您將工作流程多次重複的步驟或一組步驟進行封裝。

觸發執行作業

  • 手動:您可以透過 Google Cloud 控制台或 Google Cloud CLI 使用指令列管理工作流程。
  • 程式輔助:Workflows API 的 Cloud 用戶端程式庫,或 REST API,可用於管理工作流程。
  • 已排定時間:您可以使用 Cloud Scheduler 按照特定排程執行工作流程。

執行階段引數

如要存取執行階段傳遞的資料,只要在主要工作流程中新增 params 欄位 (位於主要區塊中)。主要區塊接受單一引數,該引數可以是任何有效的 JSON 資料類型。「params」欄位會命名工作流程用來儲存傳入資料的變數。

Cloud Run 服務驗證的工作流程

「客戶服務」是包含在此存放區中的範例應用程式,在 Cloud Run 上執行,且已設為僅允許來自內部網路的已驗證要求。您將設定 Workflows,藉此將 Google 簽署的 OpenID Connect(OIDC) 權杖新增至要求,以便透過 Cloud Run 服務進行驗證。

請參閱說明文件,進一步瞭解服務對服務驗證

工作流程驗證是在 args 區塊底下使用 auth 區段設定。

rewardsWorkflow.yaml.tmpl

   - create_customer:
        call: http.post
        args:
          url: CUSTOMER_SERVICE_URL/customer
          auth:
            type: OIDC

工作流程邏輯

如果客戶不存在,這項工作流程就會發出 API 呼叫來先建立客戶,然後再更新獎勵點數。工作流程會依據訂單總金額,選取係數來計算消費者可獲得獎勵點數。詳情請參閱下方範例。

  - calculate_multiplier:
        switch:
          - condition: ${totalAmount < 10}
            steps:
              - set_multiplier1:
                  assign:
                    - multiplier: 2
          - condition: ${totalAmount >= 10 and totalAmount < 25}
            steps:
              - set_multiplier2:
                  assign:
                    - multiplier: 3
          - condition: ${totalAmount >= 25}
            steps:
              - set_multiplier3:
                  assign:
                    - multiplier: 5
    - calculate_rewards:
        assign:
            - rewardPoints: ${customerRecord.rewardPoints * multiplier}

fcd91b2bc5d60347.png

4. 設定及部署 Workflows

設定環境變數:

export REGION=us-east1

export CUSTOMER_SERVICE_URL=$(gcloud run services describe customer-service \
  --platform managed \
  --region $REGION \
  --format=json | jq \
  --raw-output ".status.url")

echo $CUSTOMER_SERVICE_URL

替換工作流程範本中的服務網址:

sed "s@CUSTOMER_SERVICE_URL@$CUSTOMER_SERVICE_URL@g" rewardsWorkflow.yaml.tmpl > rewardsWorkflow.yaml

設定 Workflows 服務和專案環境變數的位置:

gcloud config set workflows/location ${REGION}

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')

使用下列權限為工作流程建立自訂服務帳戶:

  • 叫用 Cloud Run 服務
  • 呼叫記錄 API
  • 將訊息發布至 Pub/Sub 主題
export WORKFLOW_SERVICE_ACCOUNT=workflows-cloudrun-sa

gcloud iam service-accounts create ${WORKFLOW_SERVICE_ACCOUNT}

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member "serviceAccount:${WORKFLOW_SERVICE_ACCOUNT}@$PROJECT_ID.iam.gserviceaccount.com" \
  --role "roles/run.invoker"

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member "serviceAccount:${WORKFLOW_SERVICE_ACCOUNT}@$PROJECT_ID.iam.gserviceaccount.com" \
  --role "roles/logging.logWriter"

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member "serviceAccount:${WORKFLOW_SERVICE_ACCOUNT}@$PROJECT_ID.iam.gserviceaccount.com" \
  --role "roles/pubsub.publisher"

部署工作流程。工作流程設定為使用上一步建立的服務帳戶:

export WORKFLOW_NAME=rewardsWorkflow

gcloud workflows deploy ${WORKFLOW_NAME} \
  --source=rewardsWorkflow.yaml \
  --service-account=${WORKFLOW_SERVICE_ACCOUNT}@$PROJECT_ID.iam.gserviceaccount.com

查看工作流程來源和其他詳細資料 (「觸發條件」分頁)。目前尚未設定執行這項工作流程的觸發條件。您將在下一個步驟中進行設定。

d3527393fb07a9b3.png

5. 設定 Pub/Sub 主題和 Eventarc 觸發條件

接下來,您將建立兩個 Pub/Sub 主題,並設定一個 Eventarc 觸發條件。

訂單服務會將訊息發布至 order-topic,並附上新訂單的相關資訊。

工作流程會將訊息發布至 order-points-topic,當中包含訂單獎勵點數和總金額等資訊。訂單服務(未部署在本研究室中的一部分) 會公開 order-points-topic, 推送訂閱項目使用的端點,用來更新獎勵點數和每筆訂單總金額。

建立新的 Pub/Sub 主題:

export TOPIC_ID=order-topic
export ORDER_POINTS_TOPIC_ID=order-points-topic
gcloud pubsub topics create $TOPIC_ID --project=$PROJECT_ID
gcloud pubsub topics create $ORDER_POINTS_TOPIC_ID --project=$PROJECT_ID

設定 Eventarc 服務的位置:

gcloud config set eventarc/location ${REGION}

建立要由 Eventarc 觸發條件執行的自訂服務帳戶。

export TRIGGER_SERVICE_ACCOUNT=eventarc-workflow-sa

gcloud iam service-accounts create ${TRIGGER_SERVICE_ACCOUNT}

將存取權授予服務帳戶以執行工作流程。

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member="serviceAccount:${TRIGGER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role="roles/workflows.invoker"

建立 Eventarc 觸發條件,以便監聽 Pub/Sub 訊息並傳送至 Workflows。

gcloud eventarc triggers create new-orders-trigger \
  --destination-workflow=${WORKFLOW_NAME} \
  --destination-workflow-location=${REGION} \
  --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
  --service-account="${TRIGGER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --transport-topic=$TOPIC_ID

輸出內容範例:

Creating trigger [new-orders-trigger] in project [qwiklabs-gcp-01-1a990bfcadb3], location [us-east1]...done.     
Publish to Pub/Sub topic [projects/qwiklabs-gcp-01-1a990bfcadb3/topics/order-topic] to receive events in Workflow [rewardsWorkflow].
WARNING: It may take up to 2 minutes for the new trigger to become active.

查看已建立的 Eventarc 觸發條件

bda445561ad5f4.png

檢查已建立的觸發條件訂閱項目

3fccdda7d5526597.png

查看工作流程端的變更。已新增觸發條件。

23d338abc16eaac8.png

6. 測試工作流程

c6d4337a47b55333.png

如要模擬訂單服務,您會透過 Cloud Shell 傳送訊息至 Pub/Sub 主題,並在 Cloud 控制台中驗證 Cloud Run 客戶服務記錄檔。

export TOPIC_ID=order-topic
gcloud pubsub topics publish $TOPIC_ID --message '{"userId":"id1","orderNumber":123456,"name":"Angela Jensen","email":"ajensen9090+eats@gmail.com","address":"1845 Denise St","city":"Mountain View","state":"CA","zip":"94043","orderItems":[{"id":7,"createDateTime":"2022-03-17T21:51:44.968584","itemImageURL":"https://images.unsplash.com/photo-1618449840665-9ed506d73a34?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=687&q=80","itemName":"Curry Plate","itemPrice":12.5,"itemThumbnailURL":"https://images.unsplash.com/photo-1618449840665-9ed506d73a34?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=687&q=80","spiceLevel":0,"status":"Ready","tagLine":"Spicy touch for your taste buds","updateDateTime":"2022-03-18T01:30:29.340584","inventory":8,"quantity":1}]}'

輸出內容範例:

messageIds:
- '5063709859203105'

查看工作流程執行詳細資料和記錄檔

1e802826c700cc3e.png

aad0eae7a970316.png

7. 工作流程結構化記錄

工作流程已設為以 JSON 格式寫入結構化記錄檔。記錄是使用 Cloud Logging API、workflows.googleapis.com/Workflow 資源,以及記錄名稱 projects/${PROJECT_ID}/logs/Workflows 下寫入。

請查看下方的記錄設定。

    - log_totalAmount:
        call: sys.log
        args:
            json:
              orderNumber: ${order.orderNumber}
              totalAmount: ${totalAmount}
              multiplier: ${multiplier}
              totalRewardPoints: ${rewardPoints}
              orderRewardPoints: ${orderRewardPoints}
            severity: INFO

在控制台中開啟記錄檔探索工具,然後針對總金額超過 $2 美元的已處理訂單執行查詢

請使用下方查詢,將專案 ID(qwiklabs-gcp-01-1a990bfcadb3) 替換為目前的專案 ID:

resource.type="workflows.googleapis.com/Workflow" AND 
logName=projects/qwiklabs-gcp-01-1a990bfcadb3/logs/Workflows AND 
jsonPayload.totalAmount > 2 AND 
timestamp >= "2022-11-01T23:59:59Z" AND 
timestamp <= "2023-11-05T00:00:00Z"

輸出內容範例:

22d2f4686c58724d.png

開啟 Cloud Shell 並透過下列指令使用 gcloud CLI 讀取記錄

將專案 ID(qwiklabs-gcp-01-1a990bfcadb3) 替換為目前的專案 ID。

gcloud logging read 'resource.type="workflows.googleapis.com/Workflow" AND logName=projects/qwiklabs-gcp-01-1a990bfcadb3/logs/Workflows AND jsonPayload.totalAmount > 2 AND timestamp >= "2022-11-01T23:59:59Z" AND timestamp <= "2023-11-05T00:00:00Z"' --limit 10 --format="table(jsonPayload.orderNumber,jsonPayload.totalAmount,jsonPayload.orderRewardPoints,jsonPayload.totalRewardPoints,jsonPayload.multiplier)"

使用 table 格式的輸出內容範例:

35d5fd851ecde60.png

將專案 ID(qwiklabs-gcp-01-1a990bfcadb3) 替換為目前的專案 ID。

gcloud logging read 'resource.type="workflows.googleapis.com/Workflow" AND logName=projects/qwiklabs-gcp-01-1a990bfcadb3/logs/Workflows AND jsonPayload.totalAmount > 2 AND timestamp >= "2022-11-01T23:59:59Z" AND timestamp <= "2023-11-05T00:00:00Z"' --limit 10 --format=json | jq

使用 json 格式的輸出內容範例:

ac7421548ea9a9f2.png

8. 查看客戶記錄

(選用步驟) 目前 customer-service 已設為僅接受來自內部網路的流量。

執行下列指令,儲存服務網址並呼叫客戶服務人員。

export REGION=us-east1
CUSTOMER_SERVICE_URL=$(gcloud run services describe customer-service \
    --region=$REGION \
    --format=json | jq \
    --raw-output ".status.url")

curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $CUSTOMER_SERVICE_URL/customer

您會收到存取權遭拒的錯誤訊息。

<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>403 Forbidden</title>
</head>
<body text=#000000 bgcolor=#ffffff>
<h1>Error: Forbidden</h1>
<h2>Access is forbidden.</h2>
<h2></h2>
</body></html>

如要查看現有客戶記錄,請將 Cloud Run 的 customer-service ingress 設定變更為「Allow all traffic」然後按一下 [儲存]

這會將端點設為公開,接著您就能使用 curl 從 Cloud Shell 呼叫 Customer Service API。

9156e0eb0a19bc68.png

執行下列指令,儲存服務網址及列出現有客戶。

CUSTOMER_SERVICE_URL=$(gcloud run services describe customer-service \
    --region=$REGION \
    --format=json | jq \
    --raw-output ".status.url")

curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $CUSTOMER_SERVICE_URL/customer | jq

輸出內容範例:

[
  {
    "id": "id1",
    "rewardPoints": 3,
    "address": "1845 Denise St",
    "city": "Mountain View",
    "createDateTime": "2022-11-11T15:56:45.487566",
    "email": "ajensen9090+eats@gmail.com",
    "name": "Angela Jensen",
    "state": "CA",
    "updateDateTime": "2022-11-11T15:56:45.866125",
    "zip": "94043"
  }
]

執行指令來多次發布新訂單,並使用 curl 指令驗證客戶獎勵點數。

發布新的訂單訊息:

export TOPIC_ID=order-topic
gcloud pubsub topics publish $TOPIC_ID --message '{"userId":"id1","orderNumber":123456,"name":"Angela Jensen","email":"ajensen9090+eats@gmail.com","address":"1845 Denise St","city":"Mountain View","state":"CA","zip":"94043","orderItems":[{"id":7,"createDateTime":"2022-03-17T21:51:44.968584","itemImageURL":"https://images.unsplash.com/photo-1618449840665-9ed506d73a34?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=687&q=80","itemName":"Curry Plate","itemPrice":12.5,"itemThumbnailURL":"https://images.unsplash.com/photo-1618449840665-9ed506d73a34?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=687&q=80","spiceLevel":0,"status":"Ready","tagLine":"Spicy touch for your taste buds","updateDateTime":"2022-03-18T01:30:29.340584","inventory":8,"quantity":1}]}'

確認客戶獎勵點數:

curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $CUSTOMER_SERVICE_URL/customer | jq

驗證記錄。將專案 ID(qwiklabs-gcp-01-1a990bfcadb3) 替換為目前的專案 ID。

gcloud logging read 'resource.type="workflows.googleapis.com/Workflow" AND logName=projects/qwiklabs-gcp-01-1a990bfcadb3/logs/Workflows AND jsonPayload.totalAmount > 2 AND timestamp >= "2022-11-01T23:59:59Z" AND timestamp <= "2023-11-05T00:00:00Z"' --limit 10 --format="table(jsonPayload.orderNumber,jsonPayload.totalAmount,jsonPayload.orderRewardPoints,jsonPayload.totalRewardPoints,jsonPayload.multiplier)"

9. 恭喜!

恭喜,您已完成程式碼研究室!

本文涵蓋的內容:

  • 如何設定 Workflows
  • 如何為 Workflows 設定 Eventarc 觸發條件
  • 如何透過 Workflows 呼叫 Cloud Run 服務
  • 如何在 Cloud Logging 和 gcloud CLI 中查詢結構化記錄檔

下一步:

探索其他 Cymbal Eats 程式碼研究室:

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。

刪除專案

如要避免付費,最簡單的方法就是刪除您針對教學課程建立的專案。