透過 Pub/Sub 事件建立觸發條件

在 Cloud Run 中,您可以使用 Eventarc,依據 Pub/Sub 訊息觸發服務。為服務指定 Pub/Sub 觸發條件時,您也會指定 Pub/Sub 主題。因此,每當您將訊息發布至指定主題,系統就會呼叫您的服務。

Google Events 存放區包含其他資源,可協助您處理事件資料。

事前準備

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

  2. 啟用 Artifact Registry、Cloud Build、Cloud Run Admin API、Eventarc、Cloud Logging 和 Pub/Sub API:

    啟用 API

設定必要角色

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

部署者帳戶的必要角色

如要取得從 Pub/Sub 事件觸發函式所需的權限,請要求管理員授予您專案的下列 IAM 角色:

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

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

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

觸發身分所需的角色

  1. 記下 Compute Engine 預設服務帳戶,因為您會將其附加至 Eventarc 觸發程序,代表觸發程序的身分,以利進行測試。啟用或使用採用 Compute Engine 的服務後,系統會自動建立這個服務帳戶,電子郵件地址格式如下: Google Cloud

    PROJECT_NUMBER[email protected]

    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[email protected] \
        --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[email protected] \
        --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. 按一下「新增觸發條件」,然後選取「Pub/Sub 觸發條件」

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

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

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

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

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

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

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

    5. 在「Select a Cloud Pub/Sub topic」(選取 Cloud Pub/Sub 主題) 主題欄位中,選擇要讓觸發條件監控的主題。您發布至這個主題的訊息會觸發函式呼叫。

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

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

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

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

  7. 建立觸發程序後,請確認「觸發程序」分頁上顯示勾號 ,藉此驗證觸發程序的健康狀態。

gcloud

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

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

    gcloud eventarc triggers create TRIGGER_NAME  \
        --location=EVENTARC_TRIGGER_LOCATION \
        --destination-run-service=SERVICE  \
        --destination-run-region=REGION \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --transport-topic=projects/PROJECT_ID/topics/TOPIC_ID \
        --service-account=PROJECT_NUMBER[email protected]
    

    取代:

    • 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. 選取「Pub/Sub trigger」(Pub/Sub 觸發條件)

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

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

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

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

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

    3. 從「Event provider」(事件供應商) 清單中選取「Pub/Sub」,然後選取提供觸發函式事件類型的產品。如需事件提供者清單,請參閱事件提供者和目的地

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

    5. 在「Select a Cloud Pub/Sub topic」(選取 Cloud Pub/Sub 主題) 主題欄位中,選擇要讓觸發條件監控的主題。您發布至這個主題的訊息會觸發函式呼叫。

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

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

    8. 視需要指定服務網址路徑,將傳入要求傳送至該路徑。這是目的地服務上的相對路徑,觸發條件的事件應傳送至該路徑。例如://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=EVENTARC_TRIGGER_LOCATION \
        --destination-run-service=FUNCTION  \
        --destination-run-region=REGION \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --transport-topic=projects/PROJECT_ID/topics/TOPIC_ID \
        --service-account=PROJECT_NUMBER[email protected]
    

    取代:

    • 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 建立觸發條件」。

後續步驟