在 Cloud Run 中,您可以透過 Eventarc 從 Cloud Storage 觸發服務,以回應 Cloud Storage 的變更。
為服務指定 Cloud Storage 觸發條件時,請選擇事件類型並指定 Cloud Storage bucket。觸發後,每當指定值區中的物件 (檔案) 發生變更,系統就會呼叫您的服務。
如要讓服務在 Cloud Storage 值區發生事件時觸發,服務和值區必須位於同一個 Google Cloud 專案中。
如需從 Cloud Storage 事件建立觸發條件的詳細操作說明和程式碼範例,請參閱下列教學課程:
使用 Eventarc 從 Cloud Storage 觸發函式。使用 Cloud Storage 觸發條件部署 Cloud Run 函式後,您也可以在 Google Cloud 控制台中找到範例程式碼,瞭解如何因應 Cloud Storage 事件觸發函式。
支援的 Cloud Storage 事件類型
Cloud Run 支援下列 Cloud Storage 事件類型:
事件 | 事件類型 | 說明 |
---|---|---|
物件已完成 |
|
當您建立新物件或覆寫現有物件,且 Cloud Storage 建立該物件的新版本時,就會發生這個事件。 |
物件已刪除 |
|
永久刪除物件時會發生。 |
物件已封存 |
|
當物件的使用中版本變成非現行版本時,就會發生這種情況。 詳情請參閱物件版本管理。 |
物件中繼資料已更新 |
|
變更現有物件的中繼資料時會觸發。 |
「Google Events」存放區包含其他資源,可供您處理事件資料。
事前準備
請確認您已按照設定頁面所述,為 Cloud Run 設定新專案。
啟用 Artifact Registry、Cloud Build、Cloud Run Admin API、Eventarc、Cloud Logging、Pub/Sub 和 Cloud Storage API:
設定必要角色
您或管理員必須為部署者帳戶、觸發程序身分,以及 (視需要) Pub/Sub 服務代理程式授予下列 IAM 角色。
部署者帳戶的必要角色
如要取得從 Cloud Storage 事件觸發函式所需的權限,請要求管理員為您授予專案的下列 IAM 角色:
-
Cloud Build 編輯器 (
roles/cloudbuild.builds.editor
) -
Cloud Run Admin (
roles/run.admin
) -
Eventarc 管理員 (
roles/eventarc.admin
) -
記錄檔檢視存取者 (
roles/logging.viewAccessor
) -
專案 IAM 管理員 (
roles/resourcemanager.projectIamAdmin
) -
服務帳戶管理員 (
roles/iam.serviceAccountAdmin
) -
服務帳戶使用者 (
roles/iam.serviceAccountUser
) -
服務使用情形管理員 (
roles/serviceusage.serviceUsageAdmin
) -
儲存空間管理員 (
roles/storage.admin
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
觸發身分所需的角色
記下 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 Invoker 角色,系統仍會成功建立並啟用觸發條件。不過,觸發條件不會正常運作,記錄中會顯示類似以下的訊息:
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 服務代理,請將服務帳戶權杖建立者角色 (
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
建立服務的觸發條件
部署服務後,您就能指定觸發條件。
按一下分頁標籤,瞭解如何使用自選工具。
主控台
前往 Google Cloud 控制台的「Cloud Run」:
在服務清單中,按一下現有服務。
在「Service details」(服務詳細資料) 頁面中,前往「Triggers」(觸發條件) 分頁標籤。
按一下「新增觸發條件」,然後選取「Cloud Storage 觸發條件」。
在「Eventarc trigger」(Eventarc 觸發條件) 窗格中,按照下列步驟修改觸發條件詳細資料:
在「觸發條件名稱」欄位中,輸入觸發條件名稱或使用預設名稱。
從清單中選取「觸發條件類型」,指定下列其中一種觸發條件類型:
Google 來源:指定 Pub/Sub、Cloud Storage、Firestore 和其他 Google 事件供應商的觸發條件。
第三方:與提供 Eventarc 來源的非 Google 提供者整合。詳情請參閱「Eventarc 中的第三方事件」。
從「Event provider」(事件提供者) 清單中選取「Cloud Storage」,選取提供事件類型的產品,以觸發服務。如需事件提供者清單,請參閱事件提供者和目的地。
從「事件類型」清單中選取「google.cloud.storage.object.v1.finalized」google.cloud.storage.object.v1.finalized。觸發條件設定會因支援的事件類型而異。詳情請參閱「事件類型」。
在「Bucket」(值區) 欄位中,按一下「Browse」(瀏覽),選取要讓觸發條件監控的 Cloud Storage 值區。變更這個 bucket 內的物件時,系統會觸發對函式的呼叫。
如果「區域」欄位已啟用,請選取 Eventarc 觸發程序的位置。一般來說,Eventarc 觸發條件的位置應與要監控事件的 Google Cloud 資源位置一致。在大多數情況下,您也應在相同區域部署服務。如要進一步瞭解 Eventarc 觸發條件的所在位置,請參閱「瞭解 Eventarc 位置」。
在「服務帳戶」欄位中,選取服務帳戶。 Eventarc 觸發程序會連結至服務帳戶,在叫用服務時做為身分。Eventarc 觸發程序的服務帳戶必須具備叫用服務的權限。根據預設,Cloud Run 會使用 Compute Engine 預設服務帳戶。
視需要指定服務網址路徑,將傳入要求傳送至該路徑。這是目的地服務上的相對路徑,觸發條件的事件應傳送至該路徑。例如:
/
、/route
、route
和route/subroute
。填妥必填欄位後,按一下「儲存觸發條件」。
建立觸發程序後,請確認「觸發程序」分頁上顯示勾號 check_circle,藉此驗證觸發程序的健康狀態。
gcloud
執行下列指令,建立用於篩選事件的觸發條件:
gcloud eventarc triggers create TRIGGER_NAME \ --location=EVENTARC_TRIGGER_LOCATION \ --destination-run-service=SERVICE \ --destination-run-region=REGION \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=PROJECT_ID-bucket" \ --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
,篩選條件會觸發對您服務的呼叫。每個觸發條件都必須有支援的事件類型。建立事件篩選器後,即無法變更類型。如要變更事件篩選器類型,請建立新觸發條件並刪除舊觸發條件。視需要重複使用--event-filters
旗標和表單ATTRIBUTE=VALUE
中的支援篩選器,新增更多篩選器。
Terraform
如要為 Cloud Run 服務建立 Eventarc 觸發條件,請參閱「使用 Terraform 建立觸發條件」。
建立函式的觸發條件
按一下分頁標籤,瞭解如何使用自選工具。
主控台
使用 Google Cloud 控制台建立函式時,也可以為函式新增觸發條件。請按照下列步驟為函式建立觸發條件:
前往 Google Cloud 控制台的 Cloud Run:
按一下「編寫函式」,然後輸入函式詳細資料。如要進一步瞭解如何在部署期間設定函式,請參閱「部署函式」。
在「觸發條件」部分中,按一下「新增觸發條件」。
選取「Cloud Storage trigger」(Cloud Storage 觸發條件)。
在「Eventarc trigger」(Eventarc 觸發條件) 窗格中,按照下列步驟修改觸發條件詳細資料:
在「觸發條件名稱」欄位中輸入觸發條件名稱,或使用預設名稱。
從清單中選取「觸發條件類型」,指定下列其中一種觸發條件類型:
Google 來源:指定 Pub/Sub、Cloud Storage、Firestore 和其他 Google 事件供應商的觸發條件。
第三方:與提供 Eventarc 來源的非 Google 提供者整合。詳情請參閱「Eventarc 中的第三方事件」。
從「Event provider」(事件提供者) 清單中選取「Cloud Storage」,選取提供事件類型的產品,以觸發函式。如需事件提供者清單,請參閱事件提供者和目的地。
從「事件類型」清單中選取「google.cloud.storage.object.v1.finalized」google.cloud.storage.object.v1.finalized。觸發條件設定會因支援的事件類型而異。詳情請參閱「事件類型」。
在「Bucket」(值區) 欄位中,按一下「Browse」(瀏覽),選取要讓觸發條件監控的 Cloud Storage 值區。變更這個 bucket 內的物件時,系統會觸發對函式的呼叫。
如果「區域」欄位已啟用,請選取 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=EVENTARC_TRIGGER_LOCATION \ --destination-run-service=FUNCTION \ --destination-run-region=REGION \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=PROJECT_ID-bucket" \ --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
旗標和表單ATTRIBUTE=VALUE
中的支援篩選器,新增更多篩選器。
Terraform
如要為 Cloud Run 函式建立 Eventarc 觸發條件,請參閱「使用 Terraform 建立觸發條件」。
活動傳送
Cloud Storage 觸發條件是透過 Cloud Storage 的 Pub/Sub 通知實作。事件須遵守 Pub/Sub 通知傳送保證。
Cloud Storage 值區最多可設定 10 項通知,在特定事件發生時觸發通知。超出 bucket 的通知限制,會導致後續函式部署作業失敗,並顯示類似下列的錯誤:
Cloud Storage bucket ...: Pub/Sub notification limit reached
如要解決這項限制,可以自行管理 Pub/Sub 主題,並註冊該主題以接收 Cloud Storage 通知,讓函式對您想要的通知類型做出回應。舉例來說,您可以為所選事件 (例如物件建立) 設定單一通知,並傳送至 Pub/Sub 主題。接著,視需要讓多個函式訂閱者處理主題事件,並將事件傳送至多個目的地。例如:
- 建立自己的 Pub/Sub 主題。
- 在 Cloud Storage 值區中建立單一通知設定,在特定事件 (例如物件建立
OBJECT_FINALIZE
) 發生時觸發,並將事件傳送至單一 Pub/Sub 主題。 - 建立由 Pub/Sub 主題觸發的函式。
這樣一來,您會得到一個 Cloud Storage 通知設定、一個 Pub/Sub 主題,以及所需數量的函式 (Pub/Sub 允許的傳送限制非常高)。
如要進一步瞭解 Cloud Storage 限制,請參閱「配額與限制」。