本指南將說明如何根據 Firestore 事件,為 Cloud Run 服務和函式建立觸發事件。
您可以設定 Cloud Run 服務,讓服務由 Firestore 資料庫中的事件觸發。觸發時,服務會透過 Firestore API 和用戶端程式庫讀取及更新 Firestore 資料庫,以回應這些事件。
在一般生命週期中,當 Cloud Run 服務由 Firestore 事件觸發時,會發生下列情況:
服務會等待特定文件的變更。
發生變更時,系統會觸發服務並執行相關工作。
服務會接收含有受影響文件快照的資料物件。對於
write
或update
事件,資料物件包含快照,代表觸發事件前後的文件狀態。
事件類型
Firestore 支援 create
、update
、delete
和 write
事件。write
事件涵蓋文件的所有修改作業。
事件類型 | 觸發條件 |
---|---|
google.cloud.firestore.document.v1.created (預設) |
在第一次寫入文件時觸發。 |
google.cloud.firestore.document.v1.updated |
在文件已經存在且已變更任何值時觸發。 |
google.cloud.firestore.document.v1.deleted |
在刪除具有資料的文件時觸發。 |
google.cloud.firestore.document.v1.written |
在建立、更新或刪除文件時觸發。 |
萬用字元會在觸發事件中使用大括號編寫,例如:
projects/YOUR_PROJECT_ID/databases/(default)/documents/collection/{document_wildcard}
指定文件路徑
如要觸發服務,請指定要監聽的文件路徑。文件路徑必須與服務位於相同的 Google Cloud 專案中。
以下列舉幾個有效文件路徑的範例:
users/marie
:有效的觸發條件。監控單一文件/users/marie
。users/{username}
:有效的觸發條件。監控所有使用者文件。萬用字元可用於監控集合中的所有文件。users/{username}/addresses
:無效觸發事件。指的是子集合addresses
,而非文件。users/{username}/addresses/home
:有效的觸發條件。監控所有使用者的住家地址文件。users/{username}/addresses/{addressId}
:有效的觸發條件。監控所有地址文件。users/{user=**}
:有效的觸發條件。監控所有使用者文件,以及每個使用者文件 (例如/users/userID/address/home
或/users/userID/phone/work
) 下方子集合中的任何文件。
萬用字元和參數
如果不知道要監控的特定文件,請使用 {wildcard}
而非文件 ID:
users/{username}
會監聽所有使用者文件的變更。
在這個範例中,當 users
中任何文件的任何欄位發生變更時,就會比對名為 {username}
的萬用字元。
如果 users
中的文件含有子集合,且其中一個子集合文件中的欄位有所變更,則 {username}
萬用字元不會觸發。如果您也想回應子集合中的事件,請使用多分段萬用字元 {username=**}
。
系統會從文件路徑中擷取萬用字元比對項目。您可以視需要定義任意數量的萬用字元,用於取代明確的集合或文件 ID。您最多可以使用一個多區隔萬用字元,例如 {username=**}
。
事件結構
這個觸發條件會使用類似以下的事件叫用您的服務:
{ "oldValue": { // Update and Delete operations only A Document object containing a pre-operation document snapshot }, "updateMask": { // Update operations only A DocumentMask object that lists changed fields. }, "value": { // A Document object containing a post-operation document snapshot } }
每個 Document
物件都包含一或多個 Value
物件。如需類型參照,請參閱 Value
說明文件。
事前準備
- 請確認您已按照設定頁面所述,為 Cloud Run 設定新專案。
啟用 Artifact Registry、Cloud Build、Cloud Run Admin API、Eventarc、Firestore Cloud Logging 和 Pub/Sub API:
必要的角色
您或管理員必須為部署者帳戶、觸發器身分,以及 Pub/Sub 服務代理人 (選用) 授予下列 IAM 角色。
部署者帳戶的必要角色
如要取得從 Firestore 事件觸發所需的權限,請要求管理員為您授予專案的下列 IAM 角色:
-
Cloud Build 編輯器 (
roles/cloudbuild.builds.editor
) -
Cloud Run 管理員 (
roles/run.admin
) -
資料儲存庫擁有者 (
roles/datastore.owner
) -
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
設定 Firestore 資料庫
在部署服務之前,您必須建立 Firestore 資料庫:
前往 Firestore 資料頁面。
選取「建立資料庫」。
按一下「原生模式」,然後選取「繼續」。
在「資料庫名稱」欄位中輸入資料庫 ID,例如
firestore-db
。在「位置類型」中,選取「區域」,然後選擇資料庫所在的區域。選定後即無法變更。
將「安全性規則」部分保留原樣。
按一下 [Create database] (建立資料庫)。
Firestore 資料模型包含內含文件的集合。文件包含一組鍵/值組合。
建立觸發條件
視您部署的服務類型而定,您可以:
為服務建立觸發條件
您可以在部署服務後指定觸發條件。
按一下分頁標籤,瞭解如何使用自選工具。
主控台
前往 Google Cloud 控制台的「Cloud Run」:
在服務清單中按一下現有服務。
在「Service details」(服務詳細資料) 頁面中,前往「Triggers」(觸發條件) 分頁。
按一下「新增觸發條件」,然後選取「Firestore 觸發條件」。
在「Eventarc trigger」窗格中,修改觸發條件詳細資料,如下所示:
在「Trigger name」(觸發器名稱) 欄位中輸入觸發器名稱,或使用預設名稱。
從清單中選取「觸發條件類型」,指定下列其中一種觸發條件類型:
Google 來源:指定 Pub/Sub、Cloud Storage、Firestore 和其他 Google 事件供應器的觸發事件。
第三方:整合提供 Eventarc 來源的非 Google 供應商。詳情請參閱「Eventarc 中的第三方事件」。
從「Event provider」清單中選取「Firestore」Firestore,即可選取提供可觸發服務的事件類型產品。如需事件提供者清單,請參閱「事件提供者和目的地」。
在「Event type」清單中,選取「type=google.cloud.firestore.document.v1.created」。觸發條件設定會因支援的事件類型而異。詳情請參閱「事件類型」。
在「篩選器」部分,選取資料庫、運算和屬性值,或使用預設選項。
如果已啟用「區域」欄位,請為 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=EVENTARC_TRIGGER_LOCATION \ --destination-run-service=SERVICE \ --destination-run-region=REGION \ --event-filters="type=google.cloud.firestore.document.v1.created" \ --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
取代:
TRIGGER_NAME 替換為觸發條件的名稱。
EVENTARC_TRIGGER_LOCATION 與 Eventarc 觸發條件的所在位置。一般來說,Eventarc 觸發事件的位置應與您要監控事件的 Google Cloud 資源位置相符。在大多數情況下,您也應在相同的地區部署服務。詳情請參閱「Eventarc 位置」。
SERVICE 改為您要部署的服務名稱。
REGION 與服務的 Cloud Run region 相同。
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:
按一下「編寫函式」,然後輸入函式詳細資料。如要進一步瞭解如何在部署期間設定函式,請參閱「部署函式」。
在「觸發條件」部分中,按一下「新增觸發條件」。
選取「Firestore 觸發條件」。
在「Eventarc trigger」窗格中,修改觸發條件詳細資料,如下所示:
在「Trigger name」欄位中輸入觸發事件名稱,或使用預設名稱。
從清單中選取「觸發條件類型」,指定下列其中一種觸發條件類型:
Google 來源:指定 Pub/Sub、Cloud Storage、Firestore 和其他 Google 事件供應器的觸發事件。
第三方:整合提供 Eventarc 來源的非 Google 供應商。詳情請參閱「Eventarc 中的第三方事件」。
從「Event provider」清單中選取「Firestore」Firestore,即可選取提供事件類型以觸發函式的產品。如需事件提供者清單,請參閱「事件提供者和目的地」。
在「Event type」清單中,選取「type=google.cloud.firestore.document.v1.created」。觸發條件設定會因支援的事件類型而異。詳情請參閱「事件類型」。
在「篩選器」部分,選取資料庫、運算和屬性值,或使用預設選項。
如果已啟用「區域」欄位,請為 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.firestore.document.v1.created" \ --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
取代:
TRIGGER_NAME 替換為觸發條件的名稱。
EVENTARC_TRIGGER_LOCATION 與 Eventarc 觸發條件的所在位置。一般來說,Eventarc 觸發事件的位置應與您要監控事件的 Google Cloud 資源位置相符。在大多數情況下,您也應在相同的區域中部署函式。詳情請參閱「Eventarc 位置」。
FUNCTION 改為您要部署的函式名稱。
REGION 與函式的 Cloud Run region 搭配使用。
PROJECT_NUMBER 換成您的 Google Cloud 專案編號。Eventarc 觸發事件會連結至服務帳戶,以便在叫用函式時做為身分識別資訊使用。Eventarc 觸發事件的服務帳戶必須具備叫用函式的權限。根據預設,Cloud Run 會使用預設的 Compute 服務帳戶。
event-filters
標記可指定觸發事件監控的事件篩選器。符合所有event-filters
的事件會觸發對函式的呼叫,每個觸發條件都必須有支援的事件類型。建立後即無法變更事件篩選器類型。如要變更事件篩選器類型,您必須建立新的觸發條件,並刪除舊的觸發條件。您可以選擇在ATTRIBUTE=VALUE
表單中重複使用支援的篩選器,藉此新增更多篩選器。--event-filters
Terraform
如要為 Cloud Run 函式建立 Eventarc 觸發條件,請參閱「使用 Terraform 建立觸發條件」一文。
後續步驟
- 請參閱函式範例,瞭解在指定集合中變更文件時會觸發的函式。