使用 Eventarc 建立觸發條件

本頁說明如何建立 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 預設服務帳戶具備叫用服務的正確權限。詳情請參閱必要角色

事前準備

  1. 請確認您已按照設定頁面所述,為 Cloud Run 設定新專案。

  2. 啟用 Artifact Registry、Cloud Build、Cloud Run Admin API 和 Eventarc API:

    啟用 API

必要的角色

您或管理員必須為部署者帳戶、觸發程序身分,以及 (選擇性) Pub/Sub 服務代理程式授予下列 IAM 角色。

部署者帳戶的必要角色

如要取得設定 Eventarc 觸發程序所需的權限,請要求管理員為您授予專案的下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

您或許還可透過自訂角色或其他預先定義的角色取得必要權限。

請注意,根據預設,Cloud Build 權限包含上傳及下載 Artifact Registry 構件的權限

觸發身分所需的角色

  1. 記下 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)'

    在正式環境中,我們強烈建議建立新的服務帳戶,並授予一或多個包含最低必要權限的 IAM 角色,遵循最低權限原則。

  2. 根據預設,只有專案擁有者、專案編輯者,以及 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 Invoker 角色,系統仍會成功建立並啟用觸發條件。不過,觸發條件不會正常運作,記錄中會顯示類似以下的訊息:

    The request was not authenticated. Either allow unauthenticated invocations or set the proper Authorization header.
  3. 將專案的 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 服務代理,請將服務帳戶權杖建立者角色 (roles/iam.serviceAccountTokenCreator) 授予服務代理,以支援已驗證的 Pub/Sub 推送要求。否則,系統會預設授予這個角色:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator

建立服務的觸發條件

部署服務後,您就能指定觸發條件。

按一下分頁標籤,瞭解如何使用自選工具。

主控台

  1. 使用容器來源部署 Cloud Run 服務。

  2. 前往 Google Cloud 控制台的「Cloud Run」

    前往 Cloud Run

  3. 在服務清單中,按一下現有服務。

  4. 在「Service details」(服務詳細資料) 頁面中,前往「Triggers」(觸發條件) 分頁標籤。

  5. 按一下「新增觸發條件」,然後選取所需選項。

  6. 在「Eventarc trigger」(Eventarc 觸發條件) 窗格中,按照下列步驟修改觸發條件詳細資料:

    1. 在「觸發條件名稱」欄位中,輸入觸發條件名稱或使用預設名稱。

    2. 從清單中選取「觸發條件類型」,指定下列其中一種觸發條件類型:

      • Google 來源:指定 Pub/Sub、Cloud Storage、Firestore 和其他 Google 事件供應商的觸發條件。

      • 第三方:與提供 Eventarc 來源的非 Google 供應商整合。詳情請參閱「Eventarc 中的第三方事件」。

    3. 從「活動供應商」清單中選取活動供應商,藉此選取提供觸發服務的活動類型產品。如需事件提供者清單,請參閱事件提供者和目的地

    4. 從「活動類型」清單中選取活動類型。觸發條件設定會因支援的事件類型而異。詳情請參閱「事件類型」。

    5. 如果啟用「區域」欄位,請選取 Eventarc 觸發程序的位置。一般來說,Eventarc 觸發條件的位置應與要監控事件的 Google Cloud 資源位置一致。在大多數情況下,您也應在相同區域部署服務。如要進一步瞭解 Eventarc 觸發條件的所在位置,請參閱「瞭解 Eventarc 位置」。

    6. 在「服務帳戶」欄位中,選取服務帳戶。 Eventarc 觸發程序會連結至服務帳戶,在叫用服務時做為身分使用。Eventarc 觸發程序的服務帳戶必須具備叫用服務的權限。根據預設,Cloud Run 會使用 Compute Engine 預設服務帳戶

    7. 視需要指定服務網址路徑,將傳入要求傳送至該路徑。這是目的地服務上的相對路徑,觸發條件的事件應傳送至該路徑。例如://routerouteroute/subroute

    8. 填妥必填欄位後,按一下「儲存觸發條件」

  7. 建立觸發條件後,請前往「觸發條件」分頁,確認觸發條件旁邊是否顯示勾號 ,藉此驗證觸發條件的健康狀態。

gcloud

  1. 使用容器來源部署 Cloud Run 服務。

  2. 執行下列指令,建立用於篩選事件的觸發條件:

    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 地區。例如:europe-west1

    • PROJECT_NUMBER 改成您的 Google Cloud 專案編號。Eventarc 觸發程序會連結至服務帳戶,在叫用服務時做為身分使用。Eventarc 觸發程序的服務帳戶必須具備叫用服務的權限。根據預設,Cloud Run 會使用預設的 Compute 服務帳戶。

    每個 event-filters 標記都會指定事件類型,且只有在事件符合 event-filters 標記中指定的所有條件時,函式才會觸發。每個觸發條件都必須有 event-filters 旗標,指定支援的事件類型,例如寫入 Firestore 的新文件,或是上傳至 Cloud Storage 的檔案。建立後即無法變更事件篩選器類型。 如要變更事件篩選器類型,請建立新觸發條件並刪除舊觸發條件。視需要重複使用 --event-filters 旗標,並以 ATTRIBUTE=VALUE 形式新增更多支援的篩選條件。

Terraform

如要為 Cloud Run 服務建立 Eventarc 觸發條件,請參閱「使用 Terraform 建立觸發條件」。

建立函式的觸發條件

按一下分頁標籤,瞭解如何使用自選工具。

主控台

使用 Google Cloud 控制台建立函式時,也可以為函式新增觸發條件。請按照下列步驟為函式建立觸發條件:

  1. 前往 Google Cloud 控制台的 Cloud Run:

    前往 Cloud Run

  2. 按一下「編寫函式」,然後輸入函式詳細資料。如要進一步瞭解如何在部署期間設定函式,請參閱「部署函式」。

  3. 在「觸發條件」部分中,按一下「新增觸發條件」

  4. 選取所需選項。

  5. 在「Eventarc trigger」(Eventarc 觸發條件) 窗格中,按照下列步驟修改觸發條件詳細資料:

    1. 在「觸發條件名稱」欄位中輸入觸發條件名稱,或使用預設名稱。

    2. 從清單中選取「觸發條件類型」

      • Google 來源:指定 Pub/Sub、Cloud Storage、Firestore 和其他 Google 事件供應商的觸發條件。

      • 第三方:與提供 Eventarc 來源的非 Google 供應商整合。詳情請參閱「Eventarc 中的第三方事件」。

    3. 從「活動供應商」清單中選取活動供應商,以便選取提供活動類型的產品,觸發函式。如需事件提供者清單,請參閱事件提供者和目的地

    4. 從「活動類型」清單中選取活動類型。觸發條件設定會因支援的事件類型而異。詳情請參閱「事件類型」。

    5. 如果啟用「區域」欄位,請選取 Eventarc 觸發程序的位置。一般來說,Eventarc 觸發條件的位置應與要監控事件的 Google Cloud 資源位置一致。在多數情況下,您也應該在相同區域中部署函式。如要進一步瞭解 Eventarc 觸發條件的所在位置,請參閱「瞭解 Eventarc 位置」。

    6. 在「服務帳戶」欄位中,選取服務帳戶。 Eventarc 觸發程序會連結至服務帳戶,在叫用函式時做為身分。Eventarc 觸發程序的服務帳戶必須具備叫用函式的權限。根據預設,Cloud Run 會使用 Compute Engine 預設服務帳戶

    7. 視需要指定服務網址路徑,將傳入要求傳送至該路徑。這是目的地服務上的相對路徑,觸發條件的事件應傳送至該路徑。例如://routerouteroute/subroute

  6. 填妥必填欄位後,按一下「儲存觸發條件」

gcloud

使用 gcloud CLI 建立函式時,您必須先部署函式,然後建立觸發條件。請按照下列步驟為函式建立觸發條件:

  1. 在包含程式碼範例的目錄中執行下列指令,即可部署函式:

    gcloud run deploy FUNCTION \
            --source . \
            --function FUNCTION_ENTRYPOINT \
            --base-image BASE_IMAGE_ID \
            --region REGION
    

    取代:

    • FUNCTION 改為您要部署的函式名稱。您可以完全省略這個參數,但這樣系統會提示您輸入名稱。

    • FUNCTION_ENTRYPOINT,並在原始碼中輸入函式的進入點。這是 Cloud Run 在函式執行時執行的程式碼。這個旗標的值必須是來源程式碼中存在的函式名稱或完整類別名稱。

    • BASE_IMAGE_ID 改為函式適用的基本映像檔環境。如要進一步瞭解基礎映像檔,以及每個映像檔中包含的套件,請參閱「執行階段基礎映像檔」。

    • REGION,其中 Google Cloud是您要部署函式的地區。例如:europe-west1

  2. 執行下列指令,建立用於篩選事件的觸發條件:

    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 標記中指定的所有條件時,函式才會觸發。每個觸發條件都必須有 event-filters 旗標,指定支援的事件類型,例如寫入 Firestore 的新文件,或是上傳至 Cloud Storage 的檔案。建立後即無法變更事件篩選器類型。 如要變更事件篩選器類型,請建立新觸發條件並刪除舊觸發條件。視需要重複使用 --event-filters 旗標,並以 ATTRIBUTE=VALUE 形式新增更多支援的篩選條件。

Terraform

如要為 Cloud Run 函式建立 Eventarc 觸發條件,請參閱「使用 Terraform 建立觸發條件」。

設定 Pub/Sub 應答期限

事件導向的 Cloud Run 函式是透過 Eventarc 搭配 Pub/Sub 訂閱項目實作。根據預設,這項 Pub/Sub 訂閱項目的確認 (ack) 期限為 10 秒。這項設定不足以支援許多函式,而且可能會導致不必要的重複執行。

建議您將服務或函式的 ack 期限設為 600 秒 (上限),做法如下:

主控台

部署函式後,請按照下列步驟修改函式的 ack 期限:

  1. 前往 Google Cloud 控制台的「Cloud Run」

    前往 Cloud Run

  2. 在「Services」(服務) 清單中找出要更新的函式,然後按一下開啟該函式的詳細資料。

  3. 開啟「觸發條件」分頁。

  4. 按一下觸發條件名稱,開啟「觸發條件詳細資料」

  5. 按一下「主題」連結,開啟主題編輯窗格。

  6. 按一下「訂閱 ID」名稱前往訂閱窗格,然後按一下頁面頂端的「編輯」

  7. 將「確認期限」的值設為 600,然後按一下「更新」儲存變更。

gcloud

將每個觸發程序的 ack 期限更新為 600 秒上限。 請注意,下列指令會參照您在上一個步驟中設定值的變數 (TRIGGER_NAMEREGION)。

## 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

後續步驟