管理功能


您可以使用 Firebase CLI 指令,或在函式原始碼中設定執行階段選項,來部署、刪除及修改函式。

部署函式

如要部署函式,請執行以下 Firebase CLI 指令:

firebase deploy --only functions

根據預設,Firebase CLI 會同時部署來源中的所有函式。如果您的專案含有超過 5 個函式, 建議您搭配特定函式名稱使用 --only 旗標 方便您只部署 各個顏色或版本部署特定功能可加快部署程序,並避免觸及部署配額。例如:

firebase deploy --only functions:addMessage,functions:makeUppercase

部署大量函式時,您可能會超過標準配額,並收到 HTTP 429 或 500 錯誤訊息。如要解決這個問題,請以 10 個或更少的函式為一組部署。

如需可用指令的完整清單,請參閱 Firebase CLI 參考資料

根據預設,Firebase CLI 會在 functions/ 資料夾中尋找 Cloud Build 觸發條件 會在您變更原始碼時自動啟動建構作業如有需要,您可以在程式碼集或多組檔案中整理函式

刪除函式

您可以透過下列方式刪除先前部署的函式:

  • Firebase CLI 中明確使用 functions:delete
  • Google Cloud 控制台明確設定。
  • 隱含:在部署前從來源中移除函式。

所有刪除作業 從實際工作環境移除函式前,會提示您進行確認。

Firebase CLI 中的明確函式刪除作業支援多個引數和函式群組,並可讓您指定在特定區域執行的函式。此外,您也可以覆寫確認提示。

# Delete all functions that match the specified name in all regions.
firebase functions:delete myFunction
# Delete a specified function running in a specific region.
firebase functions:delete myFunction --region us-east-1
# Delete more than one function
firebase functions:delete myFunction myOtherFunction
# Delete a specified functions group.
firebase functions:delete groupA
# Bypass the confirmation prompt.
firebase functions:delete myFunction --force

透過隱含函式刪除,firebase deploy 會剖析來源, 會從檔案中移除所有函式。

修改函式的名稱、區域或觸發條件

如果您要針對適用於 請按照本節所述步驟處理,以免遺失 事件。在您按照這些步驟操作之前,請先確認函式是否冪等,因為在變更期間,函式的新舊版本都會同時執行。

重新命名函式

如要重新命名函式,請在來源中建立新版本的函式並重新命名,然後執行兩個個別的部署指令。第一個指令會部署 新命名的函式,第二個指令則移除先前部署的 版本。舉例來說,如果您使用 Node.js 函式 名為「webhook」的通知 變更為 webhookNew,請按照下列步驟修改程式碼:

// before
const functions = require('firebase-functions/v1');

exports.webhook = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

// after
const functions = require('firebase-functions/v1');

exports.webhookNew = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

接著,請執行下列指令來部署新函式:

# Deploy new function called webhookNew
firebase deploy --only functions:webhookNew

# Wait until deployment is done; now both webhookNew and webhook are running

# Delete webhook
firebase functions:delete webhook

變更函式的區域或區域

如果要變更的指定區域 處理正式環境流量的函數,如要避免事件遺失, 執行下列步驟:

  1. 重新命名函式,並視需要變更區域或區域。
  2. 部署重新命名的函式,以便在兩組區域中暫時執行相同的程式碼。
  3. 刪除前一個函式。

舉例來說 名為 webhook,目前位於 us-central1 的預設函式區域,想遷移至 asia-northeast1,您必須先修改原始碼,才能將 並修改區域。

// before
const functions = require('firebase-functions/v1');

exports.webhook = functions
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

// after
const functions = require('firebase-functions/v1');

exports.webhookAsia = functions
    .region('asia-northeast1')
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

接著執行下列指令來部署:

firebase deploy --only functions:webhookAsia

現在有兩個相同的函式正在執行:webhookus-central1 中執行。 而 webhookAsia 正在 asia-northeast1 中執行。

然後刪除 webhook

firebase functions:delete webhook

現在只有一個函式 - webhookAsia,會在 asia-northeast1 中執行。

變更函式的觸發類型

隨著 Cloud Functions for Firebase 部署作業的進行,您可能會基於各種原因而需要變更函式的觸發事件類型。例如: 建議變更其中一種Firebase Realtime Database類型,或是 Cloud Firestore 事件變更為另一種類型。

您無法只變更原始碼並執行 firebase deploy,就變更函式的事件類型。為避免發生錯誤 透過以下程序變更函式的觸發條件類型:

  1. 修改原始碼,加入包含所需觸發條件類型的新函式。
  2. 部署函式,這會導致暫時同時執行舊函式和新函式。
  3. 使用 Firebase CLI 將舊函式從實際工作環境中明確刪除。

舉例來說,如果您有一個名為 objectChanged 的 Node.js 函式,且該函式使用舊版 onChange 事件類型,而您想將其變更為 onFinalize,請先重新命名該函式,然後編輯該函式,以便使用 onFinalize 事件類型。

// before
const functions = require('firebase-functions/v1');

exports.objectChanged = functions.storage.object().onChange((object) => {
    return console.log('File name is: ', object.name);
});

// after
const functions = require('firebase-functions/v1');

exports.objectFinalized = functions.storage.object().onFinalize((object) => {
    return console.log('File name is: ', object.name);
});

接著,請先執行下列指令建立新函式,再刪除舊函式:

# Create new function objectFinalized
firebase deploy --only functions:objectFinalized

# Wait until deployment is done; now both objectChanged and objectFinalized are running

# Delete objectChanged
firebase functions:delete objectChanged

設定執行階段選項

Cloud Functions for Firebase 可讓您選取 Node.js 等執行階段選項 執行階段版本和每個函式的逾時時間、記憶體配置和最小/最大 函式執行個體。

根據最佳做法,建議您開啟這些選項 (Node.js 版本除外) 函式程式碼中的設定物件。這個 RuntimeOptions敬上 是函式執行階段選項的可靠資料來源, 透過其他方法 (例如透過 Google Cloud 控制台) 設定的覆寫選項 或 gcloud CLI)。

如果開發工作流程涉及透過 Google Cloud 主控台或 gcloud CLI 手動設定執行階段選項,且您不希望這些值在每次部署時都會遭到覆寫,請將 preserveExternalChanges 選項設為 true。將這個選項設為 true 時,Firebase 會合併 程式碼和目前部署的函式設定。 下列優先順序:

  1. 函式程式碼中已設定選項:覆寫外部變更。
  2. 在函式程式碼中將選項設為 RESET_VALUE:使用預設值覆寫外部變更。
  3. 選項未在函式程式碼中設定,而是在目前已部署的函式中設定:請使用已部署函式中指定的選項。

在大多數情況下,不建議使用 preserveExternalChanges: true 選項,因為您的程式碼將不再是函式執行階段選項的完整來源。如果可以的話,請查看 Google Cloud 控制台或使用 gcloud 查看函式的完整設定。

設定 Node.js 版本

Cloud Functions 適用的 Firebase SDK 允許選取 Node.js 執行階段。 您可以選擇只在執行階段執行專案中的所有函式 環境:

  • Node.js 20 (預先發布版)
  • Node.js 18
  • Node.js 16
  • Node.js 14

如要設定 Node.js 版本:

您可以在 package.jsonengines 欄位中設定版本 該檔案是在初始化期間建立的 functions/ 目錄中。 舉例來說 18 版,請在 package.json 中編輯這一行:

  "engines": {"node": "18"}

如果您使用 Yarn 套件管理工具,或有其他 engines 欄位,您可以在以下位置設定 Firebase SDK 的 Cloud Functions 執行階段: firebase.json

  {
    "functions": {
      "runtime": "nodejs18" // or nodejs14, nodejs16 or nodejs20
    }
  }

CLI 會優先使用 firebase.json 中設定的值,而非您在 package.json 中個別設定的任何值或範圍。

升級 Node.js 執行階段

如要升級 Node.js 執行階段:

  1. 請確認專案採用 Blaze 定價方案
  2. 請務必使用 Firebase CLI v11.18.0 以上版本。
  3. 變更先前建立的 package.json 檔案內的 engines 值。 functions/ 目錄, 舉例來說,如果您從 16 版升級至第 18 版, 看起來應該像這樣:"engines": {"node": "18"}
  4. 視需要使用 Firebase Local Emulator Suite
  5. 重新部署所有函式。

控管資源調度行為

根據預設,Cloud Functions for Firebase 會依據傳入要求的數量調整執行中的執行個體數量,在流量減少時,可能會縮減為零個執行個體。不過,如果您的應用程式需要 如要限製冷啟動的次數,您可以變更 您可以指定容器執行個體數量下限 保持暖機狀態,隨時可供處理要求。

同樣地,您可以設定上限,限制 回應傳入要求。使用這項設定來控管費用 或限制後端服務的連線數量,例如 資料庫

減少冷啟動次數

如要設定原始碼中某個函式的執行個體數量下限,請使用 runWith敬上 方法。此方法接受符合 RuntimeOptions敬上 介面,用於定義 minInstances 的值。舉例來說,這個函式會將最少 5 個執行個體設為保持暖機狀態:

exports.getAutocompleteResponse = functions
    .runWith({
      // Keep 5 instances warm for this latency-critical function
      minInstances: 5,
    })
    .https.onCall((data, context) => {
      // Autocomplete a user's search term
    });

設定 minInstances 的值時,請考量以下幾點:

  • 如果 Cloud Functions for Firebase 將應用程式縮放至超過 minInstances 的設定,每個超出該門檻的執行個體都會發生冷啟動。
  • 對於流量暴增的應用程式而言,冷啟動的效果最為嚴重。如果您的 應用程式的流量高峰,而您將 minInstances 值設為夠高。 每當流量增加時,冷啟動都會降低 縮短延遲時間如果應用程式的流量穩定,冷啟動就不會 可能會嚴重影響成效
  • 在實際工作環境中設定最低執行個體是合理的做法,但 通常應避免在測試環境中使用。如要在測試專案中縮放至零,但仍要減少正式專案中的冷啟動次數,您可以根據 FIREBASE_CONFIG 環境變數設定 minInstances

    // Get Firebase project id from `FIREBASE_CONFIG` environment variable
    const envProjectId = JSON.parse(process.env.FIREBASE_CONFIG).projectId;
    
    exports.renderProfilePage = functions
        .runWith({
          // Keep 5 instances warm for this latency-critical function
          // in production only. Default to 0 for test projects.
          minInstances: envProjectId === "my-production-project" ? 5 : 0,
        })
        .https.onRequest((req, res) => {
          // render some html
        });
    

限制函式的執行個體數量上限

如要在函式原始碼中設定上限執行個體,請使用 runWith 方法。這個方法會接受符合 RuntimeOptions 介面的 JSON 物件,該介面會定義 maxInstances 的值。例如,這個函式會將上限設為 100 執行個體以避免過多假想舊資料庫:

exports.mirrorOrdersToLegacyDatabase = functions
    .runWith({
      // Legacy database only supports 100 simultaneous connections
      maxInstances: 100,
    })
    .firestore.document("orders/{orderId}")
    .onWrite((change, context) => {
      // Connect to legacy database
    });

如果 HTTP 函式提高至 maxInstances 的限制,新的要求就會 排入佇列 30 秒,然後遭到拒絕,回應代碼為 如果屆時沒有任何執行個體,則為 429 Too Many Requests

如要進一步瞭解使用執行個體上限設定的最佳做法,請參閱 這些 使用 maxInstances 的最佳做法

設定逾時和記憶體分配

在某些情況下,您的函式可能需要長的逾時值或大量的記憶體配置。您可以在 Google Cloud 控制台或函式原始碼中 (僅限 Firebase)。

如要在函式原始碼中設定記憶體配置和逾時時間,請使用 Firebase SDK for Cloud Functions 2.0.0 中引進的 runWith 參數。這個執行階段選項接受 符合 RuntimeOptions敬上 介面,用於定義 timeoutSecondsmemory 的值。 舉例來說,這個儲存空間函式會使用 1 GB 的記憶體,並在之後逾時 300 秒:

exports.convertLargeFile = functions
    .runWith({
      // Ensure the function has enough memory and time
      // to process large files
      timeoutSeconds: 300,
      memory: "1GB",
    })
    .storage.object()
    .onFinalize((object) => {
      // Do some complicated things that take a lot of memory and time
    });

timeoutSeconds 的最大值為 540,即 9 分鐘。分配給函式的記憶體量 會對應至分配的 CPU 函式的有效值清單,如下方的 memory 有效值清單中所述:

  • 128MB - 200 MHz
  • 256MB - 400 MHz
  • 512MB - 800MHz
  • 1GB - 1.4 GHz
  • 2GB - 2.4 GHz
  • 4GB — 4.8 GHz
  • 8GB - 4.8 GHz

如要在 Google Cloud 主控台中設定記憶體分配和逾時時間,請按照下列步驟操作:

  1. 在 Google Google Cloud 控制台中,從左側選單中選取「Cloud Functions」
  2. 在函式清單中按一下函式名稱,即可選取函式。
  3. 按一下頂端選單中的「編輯」圖示。
  4. 從標示為「Memory allocation」的下拉式選單中,選取記憶體分配情形
  5. 按一下「更多」顯示進階選項,然後在「逾時」文字方塊中輸入秒數。
  6. 按一下「儲存」即可更新函式。