本頁面說明如何建立 Eventarc 觸發條件,讓 Cloud Run 服務接收來自其他 Google Cloud 服務的事件。
Eventarc 是一種 Google Cloud 服務,可讓您建構事件導向架構,而無須實作、自訂或維護基礎架構。
您可以為觸發條件指定篩選器,並設定事件路由 (包括事件來源和目標 Cloud Run 服務),藉此建立 Eventarc 觸發條件。當指定的事件或事件組合與篩選器相符時,系統就會自動叫用 Cloud Run 服務,以回應事件。使用 Eventarc 觸發條件的服務稱為事件驅動型服務。傳送至 Cloud Run 服務的事件會以 HTTP 要求的形式接收。
以下事件類型會觸發對服務的請求:
您也可以使用 Google Cloud CLI 或 Eventarc 控制台頁面建立 Eventarc 觸發條件。如要瞭解如何為特定供應商、事件類型和目的地建立觸發條件,請篩選清單,進一步瞭解 Eventarc 的事件供應者和目的地。
觸發地點
建立 Eventarc 觸發條件時,請指定位置。這應與您要監控事件的 Google Cloud 資源位置相符。在大多數情況下,您也應在相同區域部署事件驅動型 Cloud Run 服務。詳情請參閱「瞭解 Eventarc 位置」。
觸發條件身分
Eventarc 觸發事件的服務帳戶必須具備叫用服務的權限。您可能需要確認 Compute Engine 預設服務帳戶是否具備正確的權限,才能叫用您的服務。詳情請參閱「必要角色」。
事前準備
請確認您已按照設定頁面所述,為 Cloud Run 設定新專案。
啟用 Artifact Registry、Cloud Build、Cloud Run Admin API 和 Eventarc API:
必要的角色
您或管理員必須將下列 IAM 角色授予部署者帳戶、觸發器身分,以及 Pub/Sub 服務代理人 (選用)。
部署者帳戶的必要角色
如要取得設定 Eventarc 觸發事件所需的權限,請要求管理員為您授予專案的下列 IAM 角色:
-
Cloud Build 編輯器 (
roles/cloudbuild.builds.editor
) -
Cloud Run 管理員 (
roles/run.admin
) -
Eventarc 管理員 (
roles/eventarc.admin
) -
記錄檔檢視存取者 (
roles/logging.viewAccessor
) -
專案 IAM 管理員 (
roles/resourcemanager.projectIamAdmin
) -
服務帳戶管理員 (
roles/iam.serviceAccountAdmin
) -
服務帳戶使用者 (
roles/iam.serviceAccountUser
) -
服務使用情形管理員 (
roles/serviceusage.serviceUsageAdmin
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
請注意,根據預設,Cloud Build 權限包含上傳及下載 Artifact Registry 構件的權限。
觸發條件身分的必要角色
請記下 Compute Engine 預設服務帳戶,因為您會將其附加至 Eventarc 觸發事件,以便代表觸發事件的身分,用於測試用途。啟用或使用使用 Compute Engine 的 Google Cloud 服務後,系統會自動建立這個服務帳戶,且電子郵件格式如下:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
將
PROJECT_NUMBER
替換為您的 Google Cloud專案編號。您可以在 Google Cloud 控制台的「歡迎」頁面上找到專案編號,也可以執行下列指令:gcloud projects describe PROJECT_ID --format='value(projectNumber)'
- 根據預設,只有專案擁有者、專案編輯者,以及 Cloud Run 管理員和叫用者可以叫用 Cloud Run 服務。您可以依服務控制存取權,但為了測試,請將 Google Cloud 專案的 Cloud Run 叫用者角色 (
run.invoker
) 授予 Compute Engine 服務帳戶。這樣一來,系統就會為專案中的所有 Cloud Run 服務和工作授予這個角色。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/run.invoker
請注意,如果您為經過驗證的 Cloud Run 服務建立觸發條件,但未授予 Cloud Run 叫用者角色,系統會成功建立觸發條件並啟用。不過,觸發條件無法正常運作,而且記錄中會顯示類似以下的訊息:
The request was not authenticated. Either allow unauthenticated invocations or set the proper Authorization header.
- 將專案的 Eventarc 事件接收者角色 (
roles/eventarc.eventReceiver
) 授予 Compute Engine 預設服務帳戶,以便 Eventarc 觸發條件接收事件供應者的事件。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/eventarc.eventReceiver
Pub/Sub 服務代理人的選用角色
- 如果您是在 2021 年 4 月 8 日當天或之前啟用 Cloud Pub/Sub 服務代理,以便支援經過驗證的 Pub/Sub 推送要求,請將 服務帳戶權杖建立者角色 (
roles/iam.serviceAccountTokenCreator
) 授予服務代理。否則,系統會預設授予這個角色:gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
為服務建立觸發條件
您可以在部署服務後指定觸發條件。
按一下分頁標籤,瞭解如何使用自選工具。
主控台
前往 Google Cloud 控制台的「Cloud Run」:
在服務清單中按一下現有服務。
在「Service details」(服務詳細資料) 頁面中,前往「Triggers」(觸發條件) 分頁。
按一下「新增觸發條件」,然後選取所需選項。
在「Eventarc trigger」窗格中,修改觸發條件詳細資料,如下所示:
在「Trigger name」(觸發器名稱) 欄位中輸入觸發器名稱,或使用預設名稱。
從清單中選取「觸發條件類型」,指定下列其中一種觸發條件類型:
Google 來源:指定 Pub/Sub、Cloud Storage、Firestore 和其他 Google 事件供應器的觸發事件。
第三方:整合提供 Eventarc 來源的非 Google 供應商。詳情請參閱「Eventarc 中的第三方事件」。
從「事件供應器」清單中選取事件供應器,即可選取提供觸發服務所需事件類型的產品。如要查看事件提供者清單,請參閱「事件提供者和目的地」。
從「事件類型」清單中選取事件類型。觸發條件設定會因支援的事件類型而異。詳情請參閱「事件類型」。
如果已啟用「區域」欄位,請為 Eventarc 觸發條件選取「位置」。一般來說,Eventarc 觸發條件的位置應與您要監控事件的 Google Cloud 資源位置一致。在大多數情況下,您也應在相同的區域中部署服務。如要進一步瞭解 Eventarc 觸發條件的所在位置,請參閱「瞭解 Eventarc 位置」。
在「服務帳戶」欄位中,選取服務帳戶。Eventarc 觸發事件會連結至服務帳戶,以便在叫用服務時做為身分使用。Eventarc 觸發事件的服務帳戶必須具備叫用服務的權限。根據預設,Cloud Run 會使用 Compute Engine 預設服務帳戶。
您可以視需要指定要傳送傳入要求的服務網址路徑。這是目的地服務中的相對路徑,應將觸發事件傳送至此路徑。例如:
/
、/route
、route
和route/subroute
。填妥必填欄位後,按一下「儲存觸發條件」。
建立觸發條件後,請確認「Triggers」分頁上有勾號 check_circle,以驗證觸發條件的健康狀態。
gcloud
執行下列指令,建立用於篩選事件的觸發條件:
gcloud eventarc triggers create TRIGGER_NAME \ --location=REGION \ --destination-run-service=SERVICE \ --destination-run-region=REGION \ --event-filters="EVENT_FILTER" \ --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
取代:
TRIGGER_NAME 替換為觸發條件的名稱。
EVENTARC_TRIGGER_LOCATION 與 Eventarc 觸發條件的所在位置。一般來說,Eventarc 觸發事件的位置應與您要監控事件的 Google Cloud 資源位置相符。在大多數情況下,您也應在相同的地區部署服務。詳情請參閱「Eventarc 位置」。
SERVICE 改為您要部署的服務名稱。
REGION 與服務的 Cloud Run 區域。
PROJECT_NUMBER 換成您的 Google Cloud 專案編號。Eventarc 觸發事件會連結至服務帳戶,以便在叫用服務時做為身分使用。Eventarc 觸發事件的服務帳戶必須具備叫用服務的權限。根據預設,Cloud Run 會使用預設的 Compute 服務帳戶。
event-filters
標記可指定觸發事件監控的事件篩選器。符合所有event-filters
的事件會觸發對服務的呼叫。每個觸發條件都必須有支援的事件類型。建立後即無法變更事件篩選器類型。如要變更事件篩選器類型,您必須建立新的觸發條件,並刪除舊的觸發條件。您可以選擇在ATTRIBUTE=VALUE
表單中重複使用支援的篩選器,藉此新增更多篩選器。--event-filters
Terraform
如要為 Cloud Run 服務建立 Eventarc 觸發條件,請參閱「使用 Terraform 建立觸發條件」一文。
為函式建立觸發條件
按一下分頁標籤,瞭解如何使用自選工具。
主控台
使用 Google Cloud 控制台建立函式時,您也可以為函式新增觸發條件。請按照下列步驟為函式建立觸發條件:
前往 Google Cloud 控制台的 Cloud Run:
按一下「編寫函式」,然後輸入函式詳細資料。如要進一步瞭解如何在部署期間設定函式,請參閱「部署函式」。
在「觸發條件」部分中,按一下「新增觸發條件」。
選取所需選項。
在「Eventarc trigger」窗格中,修改觸發條件詳細資料,如下所示:
在「Trigger name」欄位中輸入觸發事件名稱,或使用預設名稱。
從清單中選取「觸發條件類型」,指定下列其中一種觸發條件類型:
Google 來源:指定 Pub/Sub、Cloud Storage、Firestore 和其他 Google 事件供應器的觸發事件。
第三方:整合提供 Eventarc 來源的非 Google 供應商。詳情請參閱「Eventarc 中的第三方事件」。
從「事件供應工具」清單中選取事件供應工具,即可選取提供可觸發函式所需事件類型的產品。如要查看事件提供者清單,請參閱「事件提供者和目的地」。
從「事件類型」清單中選取事件類型。觸發條件設定會因支援的事件類型而異。詳情請參閱「事件類型」。
如果已啟用「區域」欄位,請為 Eventarc 觸發條件選取「位置」。一般來說,Eventarc 觸發條件的位置應與您要監控事件的 Google Cloud 資源位置一致。在大多數情況下,您也應在相同的地區部署函式。如要進一步瞭解 Eventarc 觸發條件的所在位置,請參閱「瞭解 Eventarc 位置」。
在「服務帳戶」欄位中,選取服務帳戶。Eventarc 觸發事件會連結至服務帳戶,以便在叫用函式時做為身分使用。Eventarc 觸發事件的服務帳戶必須具備叫用函式的權限。根據預設,Cloud Run 會使用 Compute Engine 預設服務帳戶。
您可以視需要指定要傳送傳入要求的服務網址路徑。這是目的地服務中的相對路徑,應將觸發事件傳送至此路徑。例如:
/
、/route
、route
和route/subroute
。
填妥必填欄位後,按一下「儲存觸發條件」。
gcloud
使用 gcloud CLI 建立函式時,您必須先部署函式,然後再建立觸發條件。請按照下列步驟為函式建立觸發條件:
在包含程式碼範例的目錄中執行下列指令,即可部署函式:
gcloud run deploy FUNCTION \ --source . \ --function FUNCTION_ENTRYPOINT \ --base-image BASE_IMAGE_ID \ --region REGION
取代:
執行下列指令,建立用於篩選事件的觸發條件:
gcloud eventarc triggers create TRIGGER_NAME \ --location=REGION \ --destination-run-service=FUNCTION \ --destination-run-region=REGION \ --event-filters="EVENT_FILTER" \ --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
取代:
TRIGGER_NAME 替換為觸發條件的名稱。
EVENTARC_TRIGGER_LOCATION 與 Eventarc 觸發條件的所在位置。一般來說,Eventarc 觸發事件的位置應與您要監控事件的 Google Cloud 資源位置相符。在大多數情況下,您也應在相同的區域中部署函式。詳情請參閱「Eventarc 位置」。
FUNCTION 改為您要部署的函式名稱。
REGION 與函式的 Cloud Run 區域。
PROJECT_NUMBER 換成您的 Google Cloud 專案編號。Eventarc 觸發事件會連結至服務帳戶,以便在叫用函式時做為身分識別資訊使用。Eventarc 觸發事件的服務帳戶必須具備叫用函式的權限。根據預設,Cloud Run 會使用預設的 Compute 服務帳戶。
event-filters
標記可指定觸發事件監控的事件篩選器。符合所有event-filters
的事件會觸發對函式的呼叫,每個觸發條件都必須有支援的事件類型。建立後即無法變更事件篩選器類型。如要變更事件篩選器類型,您必須建立新的觸發條件,並刪除舊的觸發條件。您可以選擇在ATTRIBUTE=VALUE
表單中重複使用支援的篩選器,藉此新增更多篩選器。--event-filters
Terraform
如要為 Cloud Run 函式建立 Eventarc 觸發條件,請參閱「使用 Terraform 建立觸發條件」一文。
設定 Pub/Sub 確認期限
事件導向的 Cloud Run 函式是使用 Eventarc 搭配 Pub/Sub 訂閱項目實作。根據預設,此 Pub/Sub 訂閱項目的確認 (ack
) 期限為 10 秒。這項設定對許多函式來說並不夠用,而且可能會導致不必要的執行重複。
建議您將服務或函式的 ack
期限設為 600 秒的最大值,如下所示:
主控台
部署函式後,請按照下列步驟修改函式的 ack
期限:
前往 Google Cloud 控制台的「Cloud Run」:
在「Services」清單中找出要更新的函式,然後按一下即可開啟該函式的詳細資料。
開啟「觸發條件」分頁。
按一下觸發事件名稱,開啟「觸發事件詳細資料」。
按一下「主題」連結,開啟主題編輯窗格。
按一下「Subscription ID」名稱,前往訂閱方塊,然後按一下頁面頂端的「Edit」。
將「確認期限」的值設為 600,然後按一下「更新」,儲存變更。
gcloud
將每個觸發事件的 ack
期限更新為 600 秒的最大值。請注意,下列指令會參照您在上一個步驟中設定的值變數 (TRIGGER_NAME
和 REGION
)。
## Per Cloud Run function: # Update Ack Deadline to max (600s) SUBSCRIPTION_ID=$(gcloud eventarc triggers describe "$TRIGGER_NAME" --location $REGION --format json | jq -r '.transport.pubsub.subscription') gcloud pubsub subscriptions update "$SUBSCRIPTION_ID" --ack-deadline=600
針對所有服務和函式觸發事件執行大量更新作業,將其 ack
截止時間設為 600 秒:
### Match all Cloud Run service triggers and update all deadlines to 600s (max timeout) ### This will change ALL Cloud Run Service and Cloud Run function TRIGGER_NAMES=($(gcloud eventarc triggers list | awk '/Cloud Run service/ {print $1}')) if [ ${#TRIGGER_NAMES[@]} -eq 0 ]; then echo "No matching triggers found" fi for trigger in "${TRIGGER_NAMES[@]}"; do echo "Updating ack deadline for trigger: $trigger" SUBSCRIPTION_ID=$(gcloud eventarc triggers describe "$trigger" --location $REGION --format json | jq -r '.transport.pubsub.subscription') if [ -z "$SUBSCRIPTION_ID" ]; then echo "Error: Could not retrieve subscription ID for trigger: $trigger" continue # Skip to the next trigger fi gcloud pubsub subscriptions update "$SUBSCRIPTION_ID" --ack-deadline=600 echo "Ack deadline updated for subscription: $SUBSCRIPTION_ID" done
查看 CloudEvent ID 和來源
如要查看觸發服務的 CloudEvent ID 和來源,請在 Cloud Run 服務記錄中查看下列資源:
LogEntry.labels.run.googleapis.com/cloud_event_id
LogEntry.labels.run.googleapis.com/cloud_event_source
後續步驟
- 進一步瞭解 Eventarc
- 瞭解 Eventarc 的計費元件
- 為在 Cloud Run 中部署的函式建立觸發條件
- Eventarc 支援的 Google 事件類型。
- 在 Eventarc 中啟用事件重試功能