本頁面說明如何建立 Eventarc 觸發條件,讓 Cloud Run 服務接收來自其他 Google Cloud 服務的事件。
Eventarc 是一項 Google Cloud服務,可讓您建構事件導向架構,而不必實作、自訂或維護基礎架構。
如要建立 Eventarc 觸發條件,請指定觸發條件的篩選器,並設定事件轉送,包括事件來源和目標 Cloud Run 服務。當指定事件或一組事件符合篩選條件時,Cloud Run 服務會自動叫用,因應事件。使用 Eventarc 觸發條件的服務稱為事件導向服務。傳送至 Cloud Run 服務的事件會以 HTTP 要求的形式接收。
下列事件類型可觸發對服務的要求:
觸發位置
建立 Eventarc 觸發條件時,您必須指定位置。這應與您要監控事件的 Google Cloud 資源位置相符。在多數情況下,您也應在相同區域部署事件導向的 Cloud Run 服務。詳情請參閱「瞭解 Eventarc 位置」。
觸發條件身分
建立 Eventarc 觸發條件時,您必須為其指定 Identity and Access Management (IAM) 服務帳戶。觸發條件會使用這個服務帳戶做為預設身分。建議您指定使用者代管的服務帳戶,並授予必要最低權限。
事前準備
啟用 Artifact Registry、Cloud Build、Cloud Run Admin API 和 Eventarc API:
建立服務觸發條件
部署服務後,您可以使用 Google Cloud 控制台、Google Cloud CLI 或 Terraform 設定觸發條件。
控制台
前往 Google Cloud 控制台的「Cloud Run」:
在服務清單中,點選現有服務。
在「Service details」頁面,前往「Triggers」分頁。
按一下「 新增觸發條件」,然後選取所需選項。
在「Eventarc trigger」(Eventarc 觸發條件) 窗格中,按照下列方式修改觸發條件詳細資料:
在「Trigger name」(觸發條件名稱) 欄位中,輸入觸發條件名稱,或使用預設名稱。
從清單中選取「Trigger type」(觸發條件類型),指定下列其中一種觸發條件類型:
Google 來源:指定 Pub/Sub、Cloud Storage、Firestore 和其他 Google 事件提供者的觸發條件。
第三方:與提供 Eventarc 來源的非 Google 供應商整合。詳情請參閱「Eventarc 中的第三方事件」。
從「Event provider」(事件提供者) 清單中選取事件提供者,以選取提供觸發服務事件類型的產品。如需事件提供者清單,請參閱「事件提供者和目的地」。
從「Event type」(事件類型) 清單中選取事件類型。觸發條件設定會因支援的事件類型而異。詳情請參閱「事件類型」。
如果「Region」(區域) 欄位已啟用,請選取 Eventarc 觸發條件的位置。一般來說,Eventarc 觸發條件的位置應與要監控事件的 Google Cloud 資源位置一致。在多數情況下,您也應該在相同區域部署服務。如要進一步瞭解 Eventarc 觸發條件位置,請參閱「瞭解 Eventarc 位置」。
在「Service account」(服務帳戶) 欄位中,選取服務帳戶。Eventarc 觸發條件會連結至服務帳戶,在叫用服務時做為身分識別。Eventarc 觸發條件的服務帳戶必須具備叫用服務的權限。根據預設,Cloud Run 會使用 Compute Engine 預設服務帳戶。
(選用) 指定要將傳入要求傳送至哪個「Service URL path」(服務網址路徑)。這是目的地服務上的相對路徑,觸發條件的事件應傳送至該路徑。例如:
/、/route、route和route/subroute。如要在傳送失敗時啟用重試功能,請勾選「Enable retry on failure」(啟用失敗時重試) 核取方塊。如未勾選,預設行為是只傳送一次,不重試。詳情請參閱「重試事件」。
填妥必填欄位後,按一下「儲存觸發條件」。
建立觸發條件後,請確認「Triggers」(觸發條件) 分頁中是否有勾號 check_circle,藉此驗證其健康狀態。
gcloud
執行下列指令,建立篩選及轉送事件的觸發條件:
gcloud eventarc triggers create TRIGGER_NAME \ --location=LOCATION \ --destination-run-service=DESTINATION_RUN_SERVICE \ --destination-run-region=DESTINATION_RUN_REGION \ --event-filters="type=EVENT_FILTER_TYPE" \ --max-retry-attempts=1 \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.更改下列內容:
TRIGGER_NAME:觸發條件 ID 或 完整 ID。LOCATION:Eventarc 觸發條件的位置。或者,您也可以設定eventarc/location屬性,例如gcloud config set eventarc/location us-central1。為避免任何效能和資料落地問題,位置必須與產生事件的 Google Cloud 服務位置相符。詳情請參閱「Eventarc 位置」。
-
DESTINATION_RUN_SERVICE:接收觸發條件事件的 Cloud Run 服務名稱。服務可以位於 Cloud Run 支援的任何位置,不一定要與觸發條件位於相同位置。不過,服務必須與觸發條件位於同一項專案,且每當事件產生時,服務都會收到以 HTTP POST 要求形式傳送至其根網址路徑 (/) 的事件。 -
DESTINATION_RUN_REGION:(選用) 目的地 Cloud Run 服務所在的 Cloud Run 位置。如未指定,系統會假設服務與觸發條件位於相同區域。 EVENT_FILTER_TYPE:事件 ID。 如果方法 API 呼叫成功,系統就會產生事件。如果是長時間執行的作業,系統只會在作業結束時產生事件,且只有在動作成功執行時才會產生。如需支援的事件類型清單,請參閱「Eventarc 支援的 Google 事件類型」。SERVICE_ACCOUNT_NAME:使用者自行管理的服務帳戶名稱。PROJECT_ID:您的 Google Cloud 專案 ID。
注意:
- 必須使用
--event-filters="type=EVENT_FILTER_TYPE"旗標。如未設定其他事件篩選器,系統會比對所有資源的事件。 EVENT_FILTER_TYPE建立後即無法變更。如要變更EVENT_FILTER_TYPE,請建立新的觸發條件,並刪除舊的觸發條件。- 每個觸發條件可以有多個事件篩選器,並以逗號分隔在一個
--event-filters=[ATTRIBUTE=VALUE,...] 旗標中,或者您可以重複使用旗標來新增更多篩選器。只有符合所有篩選條件的事件才會傳送至目的地。不支援萬用字元和規則運算式,但使用--event-filters-path-pattern旗標時,您可以定義資源路徑模式。 - 您也可以使用
--max-retry-attempts旗標,指定只嘗試傳送一次事件,不重試。唯一有效的值是1。如果省略標記,系統會套用標準重試行為。詳情請參閱「重試事件」。 - 您也可以使用其他旗標。詳情請參閱「
gcloud eventarc triggers create」。
Terraform
如要為 Cloud Run 服務建立 Eventarc 觸發條件,請參閱「使用 Terraform 建立觸發條件」。
建立函式觸發條件
部署函式後,您可以使用 Google Cloud 控制台、Google Cloud CLI 或 Terraform 設定觸發條件。
控制台
使用 Google Cloud 控制台建立函式時,也可以為函式新增觸發條件。請按照下列步驟為函式建立觸發條件:
前往 Google Cloud 控制台的「Cloud Run」頁面:
按一下「編寫函式」,然後輸入函式詳細資料。如要進一步瞭解如何在部署期間設定函式,請參閱「部署函式」。
在「觸發條件」部分,按一下「新增觸發條件」。
選取所需選項。
在「Eventarc trigger」(Eventarc 觸發條件) 窗格中,按照下列方式修改觸發條件詳細資料:
在「Trigger name」(觸發條件名稱) 欄位中輸入觸發條件名稱,或使用預設名稱。
從清單中選取「觸發條件類型」:
Google 來源:指定 Pub/Sub、Cloud Storage、Firestore 和其他 Google 事件提供者的觸發條件。
第三方:與提供 Eventarc 來源的非 Google 供應商整合。詳情請參閱「Eventarc 中的第三方事件」。
從「Event provider」(事件供應商) 清單中選取事件供應商,以選取提供觸發函式事件類型的產品。如需事件提供者清單,請參閱「事件提供者和目的地」。
從「Event type」(事件類型) 清單中選取事件類型。觸發條件設定會因支援的事件類型而異。詳情請參閱「事件類型」。
如果「Region」(區域) 欄位已啟用,請選取 Eventarc 觸發條件的位置。一般來說,Eventarc 觸發條件的位置應與要監控事件的Google Cloud 資源位置相符。在多數情況下,您也應在相同區域部署函式。如要進一步瞭解 Eventarc 觸發條件位置,請參閱「瞭解 Eventarc 位置」。
在「Service account」(服務帳戶) 欄位中,選取服務帳戶。Eventarc 觸發條件會連結至服務帳戶,在叫用函式時做為身分識別。Eventarc 觸發條件的服務帳戶必須具備叫用函式的權限。根據預設,Cloud Run 會使用 Compute Engine 預設服務帳戶。
(選用) 指定要將傳入要求傳送至哪個「Service URL path」(服務網址路徑)。這是目的地服務上的相對路徑,觸發條件的事件應傳送至該路徑。例如:
/、/route、route和route/subroute。如要在傳送失敗時啟用重試功能,請勾選「Enable retry on failure」(啟用失敗時重試) 核取方塊。如未勾選,預設行為是只傳送一次,不重試。詳情請參閱「重試事件」。
填妥必填欄位後,按一下「儲存觸發條件」。
點選「建立」。
在「Source」(來源) 分頁中,視需要編輯原始碼,然後選取「Save and redeploy」(儲存並重新部署)。
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=LOCATION \ --destination-run-service=FUNCTION \ --destination-run-region=DESTINATION_RUN_REGION \ --event-filters="type=EVENT_FILTER_TYPE" \ --max-retry-attempts=1 \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.更改下列內容:
TRIGGER_NAME:觸發條件 ID 或 完整 ID。LOCATION:Eventarc 觸發條件的位置。或者,您也可以設定eventarc/location屬性,例如gcloud config set eventarc/location us-central1。為避免任何效能和資料落地問題,位置必須與產生事件的 Google Cloud 服務位置相符。詳情請參閱「Eventarc 位置」。
-
FUNCTION:已部署的 Cloud Run 函式名稱,用於接收觸發條件的事件。 -
DESTINATION_RUN_REGION:(選用) 目的地 Cloud Run 函式所在的 Cloud Run 位置。如未指定,系統會假設函式與觸發條件位於相同區域。 EVENT_FILTER_TYPE:事件 ID。 如果方法 API 呼叫成功,系統就會產生事件。如果是長時間執行的作業,系統只會在作業結束時產生事件,且只有在動作成功執行時才會產生。如需支援的事件類型清單,請參閱「Eventarc 支援的 Google 事件類型」。SERVICE_ACCOUNT_NAME:使用者自行管理的服務帳戶名稱。PROJECT_ID:您的 Google Cloud 專案 ID。
注意:
- 必須使用
--event-filters="type=EVENT_FILTER_TYPE"旗標。如未設定其他事件篩選器,系統會比對所有資源的事件。 EVENT_FILTER_TYPE建立後即無法變更。如要變更EVENT_FILTER_TYPE,請建立新的觸發條件,並刪除舊的觸發條件。- 每個觸發條件可以有多個事件篩選器,並以逗號分隔在一個
--event-filters=[ATTRIBUTE=VALUE,...] 旗標中,或者您可以重複使用旗標來新增更多篩選器。只有符合所有篩選條件的事件才會傳送至目的地。不支援萬用字元和規則運算式,但使用--event-filters-path-pattern旗標時,您可以定義資源路徑模式。 - 您也可以使用
--max-retry-attempts旗標,指定只嘗試傳送一次事件,不重試。唯一有效的值是1。如果省略標記,系統會套用標準重試行為。詳情請參閱「重試事件」。 - 您也可以使用其他旗標。詳情請參閱「
gcloud eventarc triggers create」。
Terraform
如要為 Cloud Run 函式建立 Eventarc 觸發條件,請參閱「使用 Terraform 建立觸發條件」。
設定 Pub/Sub 確認期限
事件導向 Cloud Run 函式是使用 Eventarc 搭配 Pub/Sub 訂閱項目實作。根據預設,這個 Pub/Sub 訂閱項目的確認 (ack) 期限為 10 秒。這項設定不適用於許多函式,而且可能會導致不必要的重複執行。
如果您不使用 Eventarc,而是直接透過 Pub/Sub 推送訂閱項目觸發服務或函式,則直接推送訂閱項目會共用相同的 10 秒預設值和 600 秒 (10 分鐘) 的確認期限上限,這會限制有效的要求逾時。
建議您將服務或函式的 ack 期限設為最大值 600 秒,如下所示:
控制台
部署函式後,請按照下列步驟修改函式的 ack 期限:
前往 Google Cloud 控制台的「Cloud Run」:
在「Services」(服務) 清單中,找出要更新的函式,然後按一下以開啟該函式的詳細資料。
開啟「觸發條件」分頁。
按一下觸發條件名稱,開啟「觸發條件詳細資料」。
按一下「主題」連結,開啟主題編輯窗格。
按一下「Subscription ID」(訂閱項目 ID) 名稱,前往訂閱項目窗格,然後按一下頁面頂端的「Edit」(編輯)。
將「Acknowledgement Deadline」(確認期限) 的值設為 600,然後按一下「Update」(更新) 儲存變更。
gcloud
將每個觸發條件的 ack 期限更新為最大值 600 秒。請注意,下列指令會參照您在先前步驟中設定值的變數 (TRIGGER_NAME 和 LOCATION)。
## Per Cloud Run function: # Update Ack Deadline to max (600s) SUBSCRIPTION_ID=$(gcloud eventarc triggers describe "$TRIGGER_NAME" --location $LOCATION --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 services and Cloud Run functions 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 $LOCATION --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_idLogEntry.labels.run.googleapis.com/cloud_event_source