根據 Firestore 事件建立觸發條件

本指南說明如何從 Firestore 事件建立 Cloud Run 服務和函式的觸發條件。

您可以設定 Cloud Run 服務,在 Firestore 資料庫發生事件時觸發。觸發後,服務會透過 Firestore API 和用戶端程式庫,讀取及更新 Firestore 資料庫,以回應這些事件。

在一般生命週期中,當 Firestore 事件觸發 Cloud Run 服務時,會發生下列情況:

  1. 這項服務會等待特定文件的變更。

  2. 發生變更時,系統會觸發服務並執行任務。

  3. 服務會收到含有受影響文件快照的資料物件。如果是 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 說明文件。

事前準備

  1. 請確認您已按照設定頁面的說明,為 Cloud Run 設定新專案。
  2. 啟用 Artifact Registry、Cloud Build、Cloud Run Admin API、Eventarc、Firestore Cloud Logging 和 Pub/Sub API:

    啟用 API

  3. 授予必要的 IAM 角色和權限。

部署者帳戶的必要角色

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

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

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

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

設定 Firestore 資料庫

部署服務前,請先建立 Firestore 資料庫:

  1. 前往 Firestore 資料頁面。

  2. 選取「建立資料庫」。

  3. 按一下「原生模式」,然後選取「繼續」。

  4. 在「Name your database」(為資料庫命名) 欄位中,輸入資料庫 ID,例如 firestore-db。

  5. 在「位置類型」下方選取「區域」,然後選擇資料庫所在的區域。選定後即無法變更。

  6. 將「安全性規則」部分維持原樣。

  7. 按一下 [Create database] (建立資料庫)。

Firestore 資料模型包含內含文件的集合。文件包含一組鍵/值組合。

建立觸發條件

視您部署的服務類型而定,您可以:

建立服務的觸發條件

部署服務後,您可以使用 Google Cloud 控制台、Google Cloud CLI 或 Terraform 設定觸發條件。

控制台

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

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

    前往 Cloud Run

  3. 在服務清單中,點選現有服務。

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

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

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

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

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

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

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

    3. 從「Event provider」(事件提供者) 清單中選取「Firestore」,選取提供事件類型的產品,以觸發服務。如需事件提供者清單,請參閱「事件提供者和目的地」。

    4. 從「Event type」(事件類型) 清單中選取「type=google.cloud.firestore.document.v1.created」。觸發條件設定會因支援的事件類型而異。詳情請參閱「事件類型」。

    5. 在「篩選器」部分,選取資料庫、作業和屬性值,或使用預設選取項目。

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

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

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

    9. 如要啟用重試功能 (如果傳送嘗試失敗),請選取「Enable retry on failure」(失敗時啟用重試) 核取方塊;否則,預設行為是嘗試傳送一次,不會重試。詳情請參閱「重試事件」。

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

  7. 建立觸發程序後,請確認「觸發程序」分頁上顯示勾號 ,驗證觸發程序是否正常運作。

gcloud

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

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

    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" \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    更改下列內容:

    • 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=google.cloud.firestore.document.v1.written 指定在建立、更新或刪除文件時,根據事件類型觸發函式。
    • --event-filters=database='(default)' 指定 Firebase 資料庫。預設資料庫名稱請使用 (default)。
    • --event-filters-path-pattern=document='users/{username}' 提供應監控相關變更的文件路徑模式。這個路徑模式表示應監控 users 集合中的所有文件。詳情請參閱「瞭解路徑模式」。
    • 如要指定單一事件傳送嘗試,且不重試,請使用 --max-retry-attempts 旗標。唯一有效值為 1。如果省略旗標,系統會套用標準重試行為。詳情請參閱「重試事件」。
    • 其他旗標包括:詳情請參閱「gcloud eventarc triggers create」。

Terraform

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

建立函式的觸發條件

部署函式後,您可以使用 Google Cloud 控制台、Google Cloud CLI 或 Terraform 設定觸發條件。

控制台

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

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

    前往 Cloud Run。

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

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

  4. 選取「Firestore 觸發條件」。

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

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

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

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

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

    3. 從「Event provider」(事件提供者) 清單中選取「Firestore」,選取提供事件類型的產品,做為觸發函式的條件。如需事件提供者清單,請參閱「事件提供者和目的地」。

    4. 從「Event type」(事件類型) 清單中選取「type=google.cloud.firestore.document.v1.created」。觸發條件設定會因支援的事件類型而異。詳情請參閱「事件類型」。

    5. 在「篩選器」部分,選取資料庫、作業和屬性值,或使用預設選取項目。

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

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

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

    9. 如要啟用重試功能 (如果傳送嘗試失敗),請選取「Enable retry on failure」(失敗時啟用重試) 核取方塊;否則,預設行為是嘗試傳送一次,不會重試。詳情請參閱「重試事件」。

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

  7. 點選「建立」。

  8. 在「來源」分頁中,視需要編輯原始碼,然後選取「儲存並重新部署」。

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=LOCATION \
        --destination-run-service=FUNCTION  \
        --destination-run-region=DESTINATION_RUN_REGION \
        --event-filters="type=EVENT_FILTER_TYPE" \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    更改下列內容:

    • 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=google.cloud.firestore.document.v1.written 指定在建立、更新或刪除文件時,根據事件類型觸發函式。
    • --event-filters=database='(default)' 指定 Firebase 資料庫。預設資料庫名稱請使用 (default)。
    • --event-filters-path-pattern=document='users/{username}' 提供應監控相關變更的文件路徑模式。這個路徑模式表示應監控 users 集合中的所有文件。詳情請參閱「瞭解路徑模式」。
    • 如要指定單一事件傳送嘗試,且不重試,請使用 --max-retry-attempts 旗標。唯一有效值為 1。如果省略旗標,系統會套用標準重試行為。詳情請參閱「重試事件」。
    • 其他旗標包括:詳情請參閱「gcloud eventarc triggers create」。

Terraform

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

詳情請參閱「使用 Cloud Run functions 透過事件觸發條件擴充 Firestore」。

後續步驟

  • 請參閱函式範例,瞭解在指定集合中變更文件時觸發的函式。