如果是環境變數或執行階段設定 (例如並行、CPU 和記憶體限制),您必須在應用程式的根目錄中建立及編輯 apphosting.yaml
檔案。這個檔案也支援使用 Cloud Secret Manager 管理的密鑰參照,因此可以安全地簽入原始碼控管。
以下是一般 apphosting.yaml
檔案可能的外觀,包括後端的 Cloud Run 服務設定、一些環境變數,以及 Cloud Secret Manager 所管理密鑰的部分參照:
# Settings for Cloud Run
runConfig:
minInstances: 2
maxInstances: 100
concurrency: 100
cpu: 2
memoryMiB: 1024
# Environment variables and secrets
env:
- variable: STORAGE_BUCKET
value: mybucket.appspot.com
availability:
- BUILD
- RUNTIME
- variable: API_KEY
secret: myApiKeySecret
# Same as API_KEY above but with a pinned version.
- variable: PINNED_API_KEY
secret: myApiKeySecret@5
# Same as API_KEY above but with the long form secret reference as defined by Cloud Secret Manager.
- variable: VERBOSE_API_KEY
secret: projects/test-project/secrets/secretID
# Same as API_KEY above but with the long form secret reference with pinned version.
- variable: PINNED_VERBOSE_API_KEY
secret: projects/test-project/secrets/secretID/versions/5
本指南的其餘部分提供了這些範例設定的詳細資訊和背景資訊。
調整 Cloud Run 服務設定
透過 apphosting.yaml
設定,您可以設定 Cloud Run 服務的佈建方式。runConfig
物件中提供了 Cloud Run 服務的可用設定:
cpu
- 每個服務執行個體使用的 CPU 數量 (預設為 0)。memoryMiB
- 為 MiB 中的每個服務執行個體分配的記憶體量 (預設值為 512)maxInstances
- 一次執行的容器數量上限 (預設為 100 個,由配額管理)minInstances
- 要一律保持運作的容器數量 (預設值為 0)。concurrency
- 每個服務執行個體可接收的要求數量上限 (預設為 80)。
請注意,cpu
和 memoryMiB
之間重要關係:記憶體可設為 128 至 32768 之間的任何整數值,但提高記憶體限制可能需要提高 CPU 限制:
- 超過 4 GiB 需要至少 2 個 CPU
- 超過 8 GiB 需要至少 4 個 CPU
- 超過 16 GiB 需要至少 6 個 CPU
- 超過 24 GiB 需要至少 8 個 CPU
同樣地,cpu
的值也會影響並行設定。如果設定的值小於 1 CPU,必須將並行設為 1,且系統只會在要求處理期間分配 CPU。
設定建構環境
有時,您會需要建構程序所需的額外設定,例如第三方 API 金鑰或可調整的設定。App Hosting 提供 apphosting.yaml
環境設定,可為您的專案儲存及擷取這類類型的資料。
env:
- variable: STORAGE_BUCKET
value: mybucket.appspot.com
如果是 Next.js 應用程式,包含環境變數的 dotenv 檔案也可使用 App Hosting。建議您使用 apphosting.yaml
,以便對任何架構進行精細的環境變數控制。
在 apphosting.yaml
中,您可以使用 availability
屬性指定哪些程序可以存取環境變數。您可以限制環境變數僅供建構環境使用,或是僅供執行階段環境使用。根據預設,系統會為這兩種平台提供參數。
env:
- variable: STORAGE_BUCKET
value: mybucket.appspot.com
availability:
- BUILD
- RUNTIME
對於 Next.js 應用程式,您也可以像在 dotenv 檔案中使用 NEXT_PUBLIC_
前置字串相同,以便在瀏覽器中存取變數。
env:
- variable: NEXT_PUBLIC_STORAGE_BUCKET
value: mybucket.appspot.com
availability:
- BUILD
- RUNTIME
有效的變數鍵由 A 到 Z 字元或底線組成。部分環境變數金鑰僅保留供內部使用。請勿在設定檔中使用下列任一金鑰:
- 任何開頭為
X_FIREBASE_
的變數 PORT
K_SERVICE
K_REVISION
K_CONFIGURATION
儲存及存取密鑰參數
應以 Secret 的形式儲存 API 金鑰等機密資訊。您可以在 apphosting.yaml
中參照密鑰,避免將機密資訊檢查至原始碼控管中。
secret
類型的參數代表儲存在 Cloud Secret Manager 中的值的字串參數。密鑰參數會檢查 Cloud Secret Manager 是否存在,並在推出期間載入值,而非直接擷取值。
- variable: API_KEY
secret: myApiKeySecret
Cloud Secret Manager 中的密鑰可以有多個版本。根據預設,即時後端可用的密鑰參數值會在建構後端時,固定使用最新的可用密鑰版本。如果您有參數的版本管理和生命週期管理需求,可以使用 Cloud Secret Manager 固定特定版本。舉例來說,如要固定至第 5 版:
- variable: PINNED_API_KEY
secret: myApiKeySecret@5
您可以使用 CLI 指令 firebase apphosting:secrets:set
建立密鑰,系統會提示您新增必要權限。此流程可讓您選擇自動將密鑰參照新增至 apphosting.yaml
。
如要使用完整的 Cloud Secret Manager 功能,可以改用 Cloud Secret Manager 控制台。執行這項操作後,您必須使用 CLI 指令 firebase
apphosting:secrets:grantaccess
,將權限授予 App Hosting 後端。
同步處理 Firebase 驗證狀態
使用 Firebase 驗證的應用程式應考慮使用 Firebase Web SDK,確保用戶端和伺服器之間的驗證狀態保持同步。也可以使用 Service Worker 實作 FirebaseServerApp
。基本工作流程如下:
- 實作 Service Worker,以便在伺服器收到要求時,為應用程式新增正確的標頭。
- 從伺服器上的要求取得標頭,然後使用
FirebaseServerApp
將其轉換為驗證使用者。