設定應用程式託管

如果是環境變數或執行階段設定 (例如並行、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)。

請注意,cpumemoryMiB 之間重要關係:記憶體可設為 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。基本工作流程如下:

  1. 實作 Service Worker,以便在伺服器收到要求時,為應用程式新增正確的標頭。
  2. 從伺服器上的要求取得標頭,然後使用 FirebaseServerApp 將其轉換為驗證使用者。