根據 Firestore 事件建立觸發條件

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

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

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

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

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

  3. 服務會收到含有受影響文件快照的資料物件。如果是 writeupdate 事件,資料物件會包含快照,代表觸發事件前後的文件狀態。

事件類型

Firestore 支援 createupdatedeletewrite 事件。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. 如有需要,請指定服務網址路徑,將傳入的要求傳送至該路徑。這是目的地服務上的相對路徑,觸發條件的事件應傳送至該路徑。例如://routerouteroute/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. 如有需要,請指定服務網址路徑,將傳入的要求傳送至該路徑。這是目的地服務上的相對路徑,觸發條件的事件應傳送至該路徑。例如://routerouteroute/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」。

後續步驟

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