1. 總覽
在本實驗室中,您將建立 Eventarc 觸發條件,將 Pub/Sub 主題連結至 Workflows 服務。Eventarc 可讓您將服務對服務通訊解除耦合,使解決方案更具擴充性,並以事件驅動。您將建立包含多個步驟的工作流程,執行業務程序,計算在 Cymbal Eats 下單的顧客獎勵點數。工作流程會呼叫私有 Cloud Run 服務 API,執行業務邏輯。Cloud Run 服務已設定為僅允許內部流量,且需要驗證。工作流程會將訊息發布至 Pub/Sub 主題,通知訂單服務已計算出獎勵點數。
什麼是 Eventarc?
Eventarc 可讓您建構事件導向架構,不必實作、自訂或維護基礎架構。Eventarc 提供標準化解決方案,可管理已分離微服務之間的狀態變更流程 (稱為「事件」)。觸發之後,Eventarc 會透過 Pub/Sub 訂閱項目,將這些事件轉送至不同的目的地 (例如 Workflows 或 Cloud Run),同時為您管理傳送、安全防護、授權、觀測和錯誤處理工作。
Google Event 提供者
- 超過 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 bucket 更新或 Firebase 遠端設定範本更新。
活動目的地
- 工作流程
- Cloud Run
- GKE
- Cloud Functions( 第 2 代)

什麼是 Workflows?
工作流程是一項全代管服務,可讓您整合微服務、工作和 API。Workflows 是無伺服器服務,可視需求調整規模。
工作流程用途:
- 事件導向工作流程會在定義的觸發條件下執行。舉例來說,當提交新訂單時,您想要計算顧客忠誠度積分。或者,當訂單取消時,系統可以發布事件,所有感興趣的服務都會處理該事件。
- 批次工作流程會使用 Cloud Scheduler 定期執行工作。舉例來說,您可以排定每晚執行工作,檢查狀態為失敗的菜單項目並刪除。
Workflows 非常適合用於自動調度管理服務的工作流程。您可以將流程自動化,包括長達一年的等待及重試。
工作流程優點:
- 設定優於程式碼:將邏輯移至設定,而非編寫程式碼,藉此減少技術債。
- 簡化架構。有狀態的工作流程可讓您以視覺化方式呈現及監控複雜的服務整合作業,無須依賴其他依附元件。
- 結合可靠性和容錯能力。使用預設或自訂重試邏輯和錯誤處理機制來控制失敗,即使其他系統指向 Cloud Spanner 的每個步驟發生查核點錯誤,也能協助您掌握進度。
- 免維護。視需求調度資源:無需修補或維護。您僅須為工作流程實際執行的工作量付費,等待或非使用狀態不會產生費用。
在本實驗室中,您將設定事件驅動型工作流程。
學習目標
在本實驗室中,您將瞭解如何執行下列操作:
- 設定 Pub/Sub 主題和 Eventarc,以觸發 Workflows
- 設定 Workflow,呼叫 Cloud Run 服務並將訊息發布至 Pub/Sub
- 如何在 Cloud Logging 中查詢 Workflows 結構化記錄,以及如何使用 gcloud CLI
必要條件
- 本實驗室假設您已熟悉 Cloud 控制台和 Cloud Shell 環境。
- 具備 Cloud Run 和 Cloud Pub/Sub 經驗會有幫助,但並非必要條件。
2. 設定和需求
設定 Cloud 專案
- 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。



- 專案名稱是這個專案參與者的顯示名稱。這是 Google API 未使用的字元字串。你隨時可以更新該位置資訊。
- 專案 ID 在所有 Google Cloud 專案中都是不重複的,而且設定後即無法變更。Cloud 控制台會自動產生不重複的字串,通常您不需要在意這個字串。在大多數程式碼研究室中,您需要參照專案 ID (通常會標示為
PROJECT_ID)。如果您不喜歡產生的 ID,可以產生另一個隨機 ID。你也可以嘗試自訂名稱,看看是否可用。完成這個步驟後就無法變更,且專案期間都會維持這個設定。 - 請注意,部分 API 會使用第三個值,也就是「專案編號」。如要進一步瞭解這三種值,請參閱說明文件。
- 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成本程式碼研究室的費用應該不高,甚至完全免費。如要關閉資源,避免產生本教學課程以外的費用,您可以刪除自己建立的資源,或刪除整個專案。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。
環境設定
按一下搜尋列右側的圖示,啟用 Cloud Shell。

複製存放區並前往該目錄,將下列指令複製並貼到終端機,然後按下 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 資料庫通訊
- 建立 AlloyDB 資料庫的 Cloud Run 工作
- Cloud Run 客戶服務 - 使用 Quarkus 架構的 Java 微服務。
./lab-setup.sh
如果系統提示您授權,請點選「授權」繼續操作。

設定程序約需 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 語法( YAML 或 JSON) 描述。
建立工作流程後,系統會部署工作流程,讓工作流程準備執行。
「執行作業」是指單次執行工作流程定義中包含的邏輯。如果工作流程尚未執行,就不會產生任何費用。所有工作流程執行作業都是獨立的,而且產品可快速調度資源,因此能同時執行大量作業。
執行控制項
- 步驟:如要建立工作流程,請使用 Workflows 語法定義所需的
steps和執行順序。每個工作流程至少要有一個步驟。 - 條件 - 您可以使用
switch區塊做為選取機制,讓運算式的值控管工作流程的執行流程。 - 疊代 - 您可以使用
for迴圈,疊代處理一系列數字或資料集合 (例如清單或對應)。 - 子工作流程:子工作流程的運作方式與程式設計語言中的常式或函式類似,可讓您封裝工作流程會重複執行的步驟或一組步驟。
觸發執行作業
- 手動:您可以使用 Google Cloud 控制台或 Google Cloud CLI,透過指令列管理工作流程。
- 程式輔助 - 您可以使用 Workflows API 的 Cloud 用戶端程式庫或 REST API 管理工作流程。
- 已排定 - 您可以使用 Cloud Scheduler,按照特定時間表執行工作流程。
執行階段引數
如要存取在執行階段傳遞的資料,請將 params 欄位新增至主要工作流程 (放在主要區塊中)。主要區塊會接受單一引數,也就是任何有效的 JSON 資料型別。params 欄位會命名工作流程用來儲存您傳入資料的變數。
Cloud Run 服務驗證工作流程
Customer service 是這個存放區中包含的範例應用程式,可在 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}

4. 設定及部署工作流程
設定環境變數:
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 服務
- 呼叫 Logging 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
查看工作流程來源和其他詳細資料 (「觸發條件」分頁)。目前尚未設定任何觸發條件來執行這項工作流程。您會在下一個步驟中設定。

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 觸發條件。

查看為觸發條件建立的訂閱項目。

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

6. 測試工作流程
如要模擬訂單服務,請從 Cloud Shell 將訊息傳送至 Pub/Sub 主題,並在 Cloud Console 中驗證 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'
查看工作流程執行詳細資料和記錄。


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"
輸出內容範例:

開啟 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 格式的輸出內容範例:

將專案 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 格式的輸出內容範例:

8. 查看顧客記錄
(選用步驟) 目前 customer-service 設為僅接受來自內部網路的流量。
執行下列指令,儲存服務網址並呼叫 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。

執行下列指令,儲存服務網址並列出現有客戶。
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 設定 Eventarc 觸發條件
- 如何從 Workflows 呼叫 Cloud Run 服務
- 如何在 Cloud Logging 中查詢結構化記錄,以及如何使用 gcloud CLI
後續步驟:
探索其他 Cymbal Eats 程式碼研究室:
- 從 Cloud Storage 觸發事件處理程序
- 從 Cloud Run 連線至 Private CloudSQL
- 從 Cloud Run 連線至全代管資料庫
- 使用 Identity-Aware Proxy (IAP) 保護無伺服器應用程式
- 使用 Cloud Scheduler 觸發 Cloud Run 工作
- 安全地部署至 Cloud Run
- 保護 Cloud Run 傳入流量
- 從 GKE Autopilot 連線至私有 AlloyDB
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。
刪除專案
如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。
