1. 簡介

Cloud Run 可讓您在全代管環境中執行無狀態容器。這項服務是以開放原始碼的 Knative 打造而成,可讓您選擇透過 Cloud Run 全代管的方式執行容器,或是透過 Cloud Run for Anthos 在您的 Google Kubernetes Engine 叢集中執行容器。
Events for Cloud Run for Anthos 可讓您輕鬆將 Cloud Run 服務與各種來源的事件連結。您可以在其中建構微服務鬆耦合的分散式事件導向架構。此外,這項服務還會為您處理事件擷取、傳送、安全防護、授權和錯誤處理作業,進而提升開發人員的靈活度和應用程式的復原能力。
在本程式碼研究室中,您將瞭解 Cloud Run for Anthos 事件。具體來說,您將監聽 Cloud Pub/Sub、稽核記錄、Cloud Storage 和 Cloud Scheduler 的事件,並瞭解如何產生/使用自訂事件。
課程內容
- Cloud Run for Anthos 事件的長期願景
- Events for Cloud Run for Anthos 的現況
- 建立 Cloud Run 接收器
- 為 Cloud Pub/Sub 建立事件觸發條件
- 為稽核記錄建立事件觸發條件
- 為 Cloud Storage 建立事件觸發條件
- 為 Cloud Scheduler 建立事件觸發條件
- 產生及取用自訂事件
2. 長期願景
採用無伺服器架構後,事件就成為解耦微服務通訊不可或缺的一環。Events for Cloud Run for Anthos 將事件視為 Cloud Run for Anthos 服務的一級公民,方便您建構以事件為準的無伺服器應用程式。
Events for Cloud Run for Anthos 可從封裝或應用程式建立的事件來源,將非同步事件可靠、安全地傳送至叢集內和叢集外的取用者,並支援擴充。

Google Cloud 來源 | Google Cloud 擁有的產品 |
Google 來源 | Google 擁有的產品,例如 Gmail、Hangouts、Android 管理服務等 |
自訂來源 | 並非 Google 產品,而是由使用者自行建立的活動來源。這些來源可以是使用者開發的 Knative 來源,也可以是叢集上執行的任何其他應用程式,只要能產生 Cloud Event 即可。 |
第三方來源 | 既不屬於 Google,也不屬於使用者的活動來源。包括由第三方供應商、合作夥伴或 OSS 社群擁有及維護的熱門事件來源,例如 GitHub、SAP、Datadog、Pagerduty 等。 |
為確保跨服務互通性,系統會將事件正規化為 CloudEvents v1.0 格式。CloudEvents 是與供應商無關的開放規格,用於以通用格式描述事件資料,可在服務、平台和系統之間實現互通性。
Cloud Run 的事件符合 Knative Eventing 規範,可讓容器在其他以 Knative 為基礎的實作項目之間轉移。這項功能提供與雲端無關的一致架構,可宣告式地將事件產生者與事件消費者連結。
3. 目前狀態
這個預覽版是第一個版本,提供一開始的長期功能。

為協助使用者建構事件導向的無伺服器應用程式,我們初期會著重於以下兩方面:
- 提供廣泛的 Google Cloud 來源生態系統,讓 Anthos 叢集上的 Cloud Run 服務能對 Google Cloud 服務的事件做出反應。
- 一開始,Google Cloud 來源的事件會透過 Cloud 稽核記錄 (CAL) 傳送,因此可支援各種事件來源。這些來源的事件傳送延遲和可用性,與 Cloud 稽核記錄的延遲和可用性息息相關。每當發布 Google Cloud 來源的事件時,系統就會建立對應的 Cloud 稽核記錄項目。
- 除了 Cloud 稽核記錄,我們也提供一流的支援,可從 Cloud Storage、Cloud Pub/Sub 和 Cloud Scheduler 接收事件。我們會持續從使用者歷程和意見回饋中學習,並加入更多一流來源,擴大這個來源生態系統。
- 啟用使用者應用程式和服務,方法是發布至命名空間範圍的叢集本機代理程式網址,藉此發出自訂事件。
基礎傳送機制會使用 Cloud Pub/Sub 主題和訂閱項目,這些項目會顯示在客戶的專案中。因此,這項功能提供的傳送保證與 Cloud Pub/Sub 相同。
事件觸發條件提供事件訂閱方式,因此符合觸發條件篩選器的事件會傳送至觸發條件指向的目的地 (或接收器)。
所有事件都會以 Cloud Events v1.0 格式傳送,以利跨服務互通。
我們會持續以疊代方式提供更多價值,直到正式版發布後仍會繼續。
4. 設定和需求
自修實驗室環境設定



- 「專案名稱」是這個專案的顯示名稱。只要遵守命名慣例,您可以使用任何名稱,並隨時更新。
- 專案 ID 在所有 Google Cloud 專案中不得重複,且一經設定即無法變更。Cloud 控制台會自動產生專屬字串,通常您不需要在意該字串為何。在大多數程式碼研究室中,您需要參照專案 ID (通常會標示為
PROJECT_ID),因此如果您不喜歡該字串,可以產生另一個隨機字串,或嘗試使用自己的字串,看看是否可用。專案建立後,系統就會「凍結」該值。
- 接著,您必須在 Cloud 控制台中啟用帳單,才能使用 Google Cloud 資源。
完成本程式碼研究室的費用應該不高,甚至完全免費。請務必按照「清除」部分的指示操作,瞭解如何停用資源,避免在本教學課程結束後繼續產生帳單費用。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。
啟動 Cloud Shell
雖然可以透過筆電遠端操作 Google Cloud,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是可在雲端執行的指令列環境。
在 GCP 主控台,按一下右上角工具列的 Cloud Shell 圖示:

佈建並連線至環境的作業需要一些時間才能完成。完成後,您應該會看到如下的內容:

這部虛擬機器搭載各種您需要的開發工具,並提供永久的 5GB 主目錄,而且可在 Google Cloud 運作,大幅提升網路效能並強化驗證功能。本實驗室的所有工作都可在瀏覽器上完成。
5. 啟用 API、設定區域和平台
設定專案 ID 並安裝 Alpha 版元件
在 Cloud Shell 中,GOOGLE_CLOUD_PROJECT 應已設為您的專案 ID。如果沒有,請確認已設定專案 ID,且 gcloud 已設定該專案 ID:
export GOOGLE_CLOUD_PROJECT=your-project-id
gcloud config set project ${GOOGLE_CLOUD_PROJECT}
確認已安裝 Alpha 版的 gcloud 元件:
gcloud components install alpha
啟用 API
啟用所有必要服務:
gcloud services enable cloudapis.googleapis.com gcloud services enable container.googleapis.com gcloud services enable containerregistry.googleapis.com gcloud services enable cloudbuild.googleapis.com
設定區域和平台
建立啟用 Cloud Run Events 的 GKE 叢集前,請先設定叢集名稱、區域和平台。舉例來說,我們將名稱和區域設為 events-cluster 和 europe-west1-b,平台則為 gke,
在 Cloud Shell 中:
export CLUSTER_NAME=events-cluster
export CLUSTER_ZONE=europe-west1-b
gcloud config set run/cluster ${CLUSTER_NAME}
gcloud config set run/cluster_location ${CLUSTER_ZONE}
gcloud config set run/platform gke
您可以檢查設定是否已完成:
gcloud config list ... [run] cluster = events-cluster cluster_location = europe-west1-b platform = gke
6. 建立啟用 Cloud Run Events 的 GKE 叢集
建立執行 Kubernetes >= 1.15.9-gke.26 的 GKE 叢集,並啟用下列外掛程式:CloudRun、HttpLoadBalancing、HorizontalPodAutoscaling:
gcloud beta container clusters create ${CLUSTER_NAME} \
--addons=HttpLoadBalancing,HorizontalPodAutoscaling,CloudRun \
--machine-type=n1-standard-4 \
--enable-autoscaling --min-nodes=3 --max-nodes=10 \
--no-issue-client-certificate --num-nodes=3 --image-type=cos \
--enable-stackdriver-kubernetes \
--scopes=cloud-platform,logging-write,monitoring-write,pubsub \
--zone ${CLUSTER_ZONE} \
--release-channel=rapid
7. 設定 Cloud Run 事件 (控制平面)
Cloud Run Events 包含控制層和資料層,需要分別設定。如要設定控制層,請按照下列步驟操作:
在 Cloud Shell 中:
gcloud beta events init
這會初始化事件,並建立多個必要的服務帳戶。系統提示建立服務帳戶時,請務必選取「是」。
此時控制層應已正確初始化。您應該會看到四個 Pod,並顯示
Running 狀態、cloud-run-events 命名空間中的 2 個 (controller-xxx-xxx 和 webhook-xxx-xxx),以及 knative-eventing 命名空間中的 2 個 (eventing-controller-xxx-xxx 和 eventing-webhook-xxx-xxx)。您可以執行下列指令進行檢查:
kubectl get pods -n cloud-run-events NAME READY STATUS RESTARTS AGE controller-9cc679b67-2952n 1/1 Running 0 22s webhook-8576c4cfcb-dhz82 1/1 Running 0 16m
kubectl get pods -n knative-eventing NAME READY STATUS RESTARTS AGE eventing-controller-77f46f6cf8-kj9ck 1/1 Running 0 17m eventing-webhook-5bc787965f-hcmwg 1/1 Running 0 17m
8. 設定 Cloud Run Events (資料平面)
接下來,請在使用者命名空間中設定資料層。這會建立 Broker,並具備從 Pub/Sub 讀取/寫入資料的適當權限。
在 Cloud Shell 中,為要用於物件的命名空間設定 NAMESPACE 環境變數。如要使用預設命名空間,可以將其設為 default,如下所示:
export NAMESPACE=default
請注意,如果指定的命名空間不存在 (即命名空間不是預設命名空間),您必須建立該命名空間:
kubectl create namespace ${NAMESPACE}
使用預設密鑰初始化命名空間:
gcloud beta events namespaces init ${NAMESPACE} --copy-default-secret
在命名空間中建立預設代理程式:
gcloud beta events brokers create default --namespace ${NAMESPACE}
確認代理程式已建立。請注意,代理人可能需要幾秒鐘的時間才能準備就緒:
kubectl get broker -n ${NAMESPACE}
NAME READY REASON URL
default True http://default-brokercell-ingress.cloud-run-events.svc.cluster.local/default/default
9. 探索活動
您可以瞭解已註冊的來源、可發出的事件類型,以及如何設定觸發條件來使用這些事件。
如要查看不同類型事件的清單,請執行下列指令:
gcloud beta events types list
如要進一步瞭解每個事件類型,請執行下列指令:
gcloud beta events types describe google.cloud.pubsub.topic.v1.messagePublished
10. 建立 Cloud Run 接收器
部署 Cloud Run 服務做為事件接收器,記錄收到的 CloudEvent 內容。
您可以運用 Knative 中已編譯的 event_display,以及在 Knative 版本中建構的容器映像檔。您可以在 event-display.yaml 中查看容器映像檔詳細資料:
... containers: - image: gcr.io/knative-releases/knative.dev/eventing-contrib/cmd/event_display@sha256:8da2440b62a5c077d9882ed50397730e84d07037b1c8a3e40ff6b89c37332b27
部署至 Cloud Run
將容器化應用程式部署至 Cloud Run:
export SERVICE_NAME=event-display
gcloud run deploy ${SERVICE_NAME} \
--namespace=${NAMESPACE} \
--image gcr.io/knative-releases/knative.dev/eventing-contrib/cmd/event_display@sha256:8da2440b62a5c077d9882ed50397730e84d07037b1c8a3e40ff6b89c37332b27
成功完成後,指令列會顯示服務網址。您現在可透過任一瀏覽器視窗開啟服務網址,查看已部署的容器。
11. 為 Cloud Pub/Sub 建立事件觸發條件
接收事件的方式之一是透過 Cloud Pub/Sub。自訂應用程式可將訊息發布至 Cloud Pub/Sub,而這些訊息可透過 Events for Cloud Run 傳送至 Google Cloud Run 接收器。
建立主題
首先,請建立 Cloud Pub/Sub 主題。您可以將 TOPIC_ID 替換成偏好的專屬主題名稱:
export TOPIC_ID=cr-gke-topic
gcloud pubsub topics create ${TOPIC_ID}
建立觸發條件
建立觸發條件前,請先取得建構 Cloud Pub/Sub 事件觸發條件所需的參數詳細資料:
gcloud beta events types describe google.cloud.pubsub.topic.v1.messagePublished
建立觸發條件,將發布到 Cloud Pub/Sub 主題的事件篩選至已部署的 Cloud Run 服務:
gcloud beta events triggers create trigger-pubsub \
--namespace ${NAMESPACE} \
--target-service ${SERVICE_NAME} \
--type google.cloud.pubsub.topic.v1.messagePublished \
--parameters topic=${TOPIC_ID}
測試觸發條件
您可以列出所有觸發條件,確認是否已建立:
gcloud beta events triggers list
請等待最多 10 分鐘,觸發條件建立完成並生效後,才能開始篩選事件。
您可以使用 gcloud 觸發事件,模擬自訂應用程式傳送訊息的情境:
gcloud pubsub topics publish ${TOPIC_ID} --message="Hello there"
我們建立的 Cloud Run 接收器會記錄傳入訊息的內容。您可以前往 Cloud Run 執行個體的「記錄」專區查看:

請注意,由於「Hello there」是由 Pub/Sub 傳送,因此會經過 Base64 編碼,您必須解碼才能查看原始訊息。
刪除觸發條件
測試完畢後,即可刪除觸發條件。
gcloud beta events triggers delete trigger-pubsub --namespace ${NAMESPACE}
12. 為稽核記錄建立事件觸發條件
您將設定觸發條件來監聽稽核記錄事件。具體來說,您會在稽核記錄中尋找 Pub/Sub 主題建立事件。
啟用稽核記錄
如要接收來自服務的事件,您必須啟用稽核記錄。在 Cloud 控制台中,選取左上方的選單 IAM & Admin > Audit Logs。在服務清單中,勾選 Google Cloud Pub/Sub:

確認已選取右側的「管理員」、「讀取」和「寫入」。按一下「儲存」:

測試稽核記錄
現在,您需要找出設定實際觸發條件所需的參數,並執行實際作業。
舉例來說,建立 Pub/Sub 主題:
gcloud pubsub topics create cre-gke-topic1
接著查看這項更新產生的稽核記錄。在 Cloud 控制台中,選取左上方的選單 Logging > Logs Viewer。
在「Query Builder,」下方選擇「Cloud Pub/Sub Topic」並按一下「Add」:

執行查詢後,您會看到 Pub/Sub 主題的記錄,其中一項應該是 google.pubsub.v1.Publisher.CreateTopic:

請注意 serviceName、methodName 和 resourceName。稍後建立觸發條件時會用到。
建立觸發條件
現在所有前置作業都已就緒,可以為稽核記錄建立事件觸發條件了。
如要進一步瞭解建構 Google Cloud 來源事件觸發條件所需的參數,請執行下列指令:
gcloud beta events types describe google.cloud.audit.log.v1.written
建立觸發條件並指定正確的篩選條件:
gcloud beta events triggers create trigger-auditlog \
--namespace ${NAMESPACE} \
--target-service ${SERVICE_NAME} \
--type=google.cloud.audit.log.v1.written \
--parameters serviceName=pubsub.googleapis.com \
--parameters methodName=google.pubsub.v1.Publisher.CreateTopic
測試觸發條件
列出所有觸發條件,確認已成功建立:
gcloud beta events triggers list
請等待最多 10 分鐘,觸發條件建立完成並生效後,才能開始篩選事件。準備就緒後,觸發條件就會篩選建立事件並傳送至服務,接著就能開始觸發事件了。
如先前所述,建立另一個 Pub/Sub 主題:
gcloud pubsub topics create cre-gke-topic2
在 Cloud Console 中查看 Cloud Run 服務記錄時,您應該會看到收到的事件:

刪除觸發條件和主題
測試完畢後,即可刪除觸發條件 (選用):
gcloud beta events triggers delete trigger-auditlog
一併刪除主題:
gcloud pubsub topics delete cre-gke-topic1 cre-gke-topic2
13. 為 Cloud Storage 建立事件觸發條件
您將設定觸發條件,監聽 Cloud Storage 事件。
建立 bucket
首先,請在已部署 Cloud Run 服務的相同區域建立 Cloud Storage bucket。您可以將 BUCKET_NAME 替換成偏好的專屬名稱:
export BUCKET_NAME=[new bucket name] export REGION=europe-west1 gsutil mb -p $(gcloud config get-value project) \ -l $REGION \ gs://$BUCKET_NAME/
設定 Cloud Storage 權限
建立觸發程序前,請先授予 Cloud Storage 的預設服務帳戶發布至 Pub/Sub 的權限。
首先,您需要找出 Cloud Storage 用於發布至 Pub/Sub 的服務帳戶。您可以按照「取得 Cloud Storage 服務帳戶」一節所述步驟取得服務帳戶,也可以使用下列指令:
curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://storage.googleapis.com/storage/v1/projects/$(gcloud config get-value project)/serviceAccount"
服務帳戶應列在「email_address」下方。
假設您在上方找到的服務帳戶是 service-XYZ@gs-project-accounts.iam.gserviceaccount.com,請將此帳戶設為環境變數:
export GCS_SERVICE_ACCOUNT=service-XYZ@gs-project-accounts.iam.gserviceaccount.com
接著,授予該服務帳戶發布至 Pub/Sub 的權限:
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} \
--member=serviceAccount:${GCS_SERVICE_ACCOUNT} \
--role roles/pubsub.publisher
建立觸發條件
現在所有前置作業都已就緒,可以為 Cloud Storage 事件建立事件觸發條件了。
您可以取得建構觸發條件所需的參數詳細資料:
gcloud beta events types describe google.cloud.storage.object.v1.finalized
建立觸發條件並指定正確的篩選條件:
gcloud beta events triggers create trigger-storage \
--namespace ${NAMESPACE} \
--target-service ${SERVICE_NAME} \
--type=google.cloud.storage.object.v1.finalized \
--parameters bucket=${BUCKET_NAME}
測試觸發條件
列出所有觸發條件,確認已成功建立:
gcloud beta events triggers list
請等待最多 10 分鐘,觸發條件建立完成並生效後,才能開始篩選事件。準備就緒後,觸發條件就會篩選建立事件並傳送至服務。
接著就能開始觸發事件了。
將隨機檔案上傳至 Cloud Storage bucket:
echo "Hello World" > random.txt
gsutil cp random.txt gs://${BUCKET_NAME}/random.txt
在 Cloud Console 中查看 Cloud Run 服務記錄時,您應該會看到收到的事件:

刪除觸發條件
測試完畢後,即可刪除觸發條件 (選用):
gcloud beta events triggers delete trigger-storage
14. 為 Cloud Scheduler 建立事件觸發條件
您將設定觸發條件,監聽 Cloud Scheduler 的事件。
建立 App Engine 應用程式
目前使用者必須建立 App Engine 應用程式,才能使用 Cloud Scheduler。選取「App Engine Location」並建立應用程式:
export APP_ENGINE_LOCATION=europe-west
gcloud app create --region=${APP_ENGINE_LOCATION}
建立觸發條件
如要進一步瞭解建構 Google Cloud 來源事件觸發條件所需的參數,請執行下列指令:
gcloud beta events types describe google.cloud.scheduler.job.v1.executed
選擇 Cloud Scheduler 位置來建立排程器:
export SCHEDULER_LOCATION=europe-west1
建立觸發條件,在 Google Cloud Scheduler 中每分鐘建立要執行的工作,並呼叫目標服務:
gcloud beta events triggers create trigger-scheduler \
--namespace ${NAMESPACE} \
--target-service=${SERVICE_NAME} \
--type=google.cloud.scheduler.job.v1.executed \
--parameters location=${SCHEDULER_LOCATION} \
--parameters schedule="* * * * *" \
--parameters data="trigger-scheduler-data"
測試觸發條件
列出所有觸發條件,確認已成功建立:
gcloud beta events triggers list
請等待最多 10 分鐘,觸發條件建立完成並生效後,才能開始篩選事件。準備就緒後,觸發條件就會篩選建立事件並傳送至服務。
在 Cloud Console 中查看 Cloud Run 服務記錄,應該會看到收到的事件。
刪除觸發條件
測試完畢後,即可刪除觸發條件 (選用):
gcloud beta events triggers delete trigger-scheduler
15. 自訂事件 (代理程式端點)
在本程式碼研究室的這一部分,您將使用 Broker 產生及取用自訂事件。
建立 Curl Pod 來產生事件
事件通常是透過程式來建立。不過,在這個步驟中,您會使用 curl 手動傳送個別事件,並查看這些事件是否由正確的消費者接收。
如要建立做為事件生產者的 Pod,請執行下列指令:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
labels:
run: curl
name: curl
namespace: $NAMESPACE
spec:
containers:
- image: radial/busyboxplus:curl
imagePullPolicy: IfNotPresent
name: curl
resources: {}
stdin: true
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
tty: true
EOF
確認 curl Pod 正常運作。您應該會看到名為 curl 的 Pod,其中包含 Status=Running:
kubectl get pod curl -n ${NAMESPACE}
建立觸發條件
您將建立觸發條件,並針對要發出的特定 CloudEvents 類型 (本例中為 alpha-type) 設定篩選器。請注意,系統支援對任意數量的 CloudEvents 屬性和擴充功能進行完全相符的篩選。如果篩選器設定多個屬性,事件必須具備所有屬性,觸發條件才能加以篩選。反之,如果您未指定篩選器,服務就會收到所有事件。
建立觸發條件:
gcloud beta events triggers create trigger-custom \
--namespace ${NAMESPACE} \
--target-service ${SERVICE_NAME} \
--type=alpha-type \
--custom-type
測試觸發條件
列出所有觸發條件,確認已成功建立:
gcloud beta events triggers list
將 HTTP 要求傳送至 Broker,建立事件。執行下列指令,提醒自己 Broker URL:
kubectl get brokers -n ${NAMESPACE}
NAME READY REASON URL
default True http://default-broker.<NAMESPACE>.svc.cluster.local
透過 SSH 連線至您先前建立的 curl Pod:
kubectl --namespace ${NAMESPACE} attach curl -it
您已透過 SSH 連線至 Pod,現在可以發出 HTTP 要求。畫面會顯示類似下面的提示:
Defaulting container name to curl. Use 'kubectl describe pod/curl -n default' to see all of the containers in this pod. If you don't see a command prompt, try pressing enter. [ root@curl:/ ]$
建立活動:
curl -v "<BROKER-URL>" \
-X POST \
-H "Ce-Id: my-id" \
-H "Ce-Specversion: 1.0" \
-H "Ce-Type: alpha-type" \
-H "Ce-Source: my-source" \
-H "Content-Type: application/json" \
-d '{"msg":"send-cloudevents-to-broker"}'
如果已收到事件,您會收到 HTTP 202 Accepted 回覆。使用 Ctrl + D 結束 SSH 工作階段
查看 Cloud Run 服務的記錄,確認已傳送發布的事件:
kubectl logs --selector serving.knative.dev/service=$SERVICE_NAME \ -c user-container -n $NAMESPACE --tail=100
刪除觸發條件
測試完畢後,即可刪除觸發條件 (選用):
gcloud beta events triggers delete trigger-custom
16. 恭喜!
恭喜您完成本程式碼研究室。
涵蓋內容
- Cloud Run for Anthos 事件的長期願景
- Events for Cloud Run for Anthos 的現況
- 建立 Cloud Run 接收器
- 為 Cloud Pub/Sub 建立事件觸發條件
- 為稽核記錄建立事件觸發條件
- 為 Cloud Storage 建立事件觸發條件
- 為 Cloud Scheduler 建立事件觸發條件
- 產生及取用自訂事件