您可以使用 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
變更函式的區域或區域
如果要變更的指定區域 處理正式環境流量的函數,如要避免事件遺失, 執行下列步驟:
- 重新命名函式,並視需要變更區域或區域。
- 部署重新命名的函式,以便在兩組區域中暫時執行相同的程式碼。
- 刪除前一個函式。
舉例來說
名為 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
現在有兩個相同的函式正在執行:webhook
在 us-central1
中執行。
而 webhookAsia
正在 asia-northeast1
中執行。
然後刪除 webhook
:
firebase functions:delete webhook
現在只有一個函式 - webhookAsia
,且在 asia-northeast1
中執行。
變更函式的觸發條件類型
隨著您逐步開發 Cloud Functions for Firebase 部署作業,您可以 因為各種原因而需要變更函式的觸發條件類型。例如: 建議變更一種類型的Firebase Realtime Database或 Cloud Firestore 事件變更為另一種類型。
您無法只透過變更
並執行 firebase deploy
。為避免發生錯誤
透過以下程序變更函式的觸發條件類型:
- 修改原始碼,加入包含所需觸發條件類型的新函式。
- 部署函式,會導致新舊函式暫時同時執行。
- 使用 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 會合併
程式碼和目前部署的函式設定。
下列優先順序:
- 函式程式碼中已設定選項:覆寫外部變更。
- 函式程式碼中的選項設為
RESET_VALUE
:以預設值覆寫外部變更。 - 選項未在函式程式碼中設定,而是在目前部署的函式中設定:請使用已部署函式中指定的選項。
不建議使用 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.json
的 engines
欄位中設定版本
該檔案是在初始化期間建立的 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 執行階段:
- 請確認您的專案位於 Blaze 定價方案。
- 請務必使用 Firebase CLI v11.18.0 以上版本。
- 變更先前建立的
package.json
檔案內的engines
值。functions/
目錄, 舉例來說,如果您從 16 版升級至第 18 版, 看起來應該像這樣:"engines": {"node": "18"}
- 視需要使用 Firebase Local Emulator Suite。
- 重新部署所有函式。
控管資源調度行為
根據預設,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
敬上
介面,當中定義了
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)。
如要在函式原始碼中設定記憶體分配和逾時,請使用
runWith
敬上
參數,Firebase適用於 Cloud Functions2.0.0 版。這個執行階段選項接受
符合
RuntimeOptions
敬上
介面,用於定義 timeoutSeconds
和 memory
的值。
舉例來說,這個儲存空間函式會使用 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 MHz256MB
- 400 MHz512MB
- 800 MHz1GB
- 1.4 GHz2GB
- 2.4 GHz4GB
- 4.8 GHz8GB
- 4.8 GHz
如要在 Google Cloud 控制台中設定記憶體分配和逾時功能,請按照下列步驟操作:
- 在 Google Google Cloud 控制台中,選取「Cloud Functions」 左側選單
- 在函式清單中按一下函式名稱以選取函式。
- 按一下頂端選單中的「編輯」圖示。
- 從標示為「Memory allocation」的下拉式選單中,選取記憶體分配情形。
- 按一下「更多」顯示進階選項,然後在「逾時」文字方塊中輸入秒數。
- 按一下「Save」(儲存) 以更新函式。