对于环境变量或运行时设置(例如并发、CPU 和内存限制)等高级配置,您需要在应用的根目录中创建和修改 apphosting.yaml
文件。此文件还支持对使用 Cloud Secret Manager 管理的 Secret 的引用,确保您可以安全地签入源代码控制系统。
典型的 apphosting.yaml
文件可能如下所示,其中包含后端 Cloud Run 服务的设置、一些环境变量,以及对 Cloud Secret Manager 管理的 Secret 的一些引用:
# 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 服务的预配方式。Cloud Run 服务的可用设置在 runConfig
对象中提供:
cpu
- 每个服务实例使用的 CPU 数量(默认值为 0)。memoryMiB
- 为每个服务实例分配的内存量,以 MiB 为单位(默认值为 512)maxInstances
- 一次可运行的容器数上限(默认值为 100,由配额管理)minInstances
- 要始终保持活跃状态的容器数量(默认值为 0)。concurrency
- 每个服务实例可以接收的请求数上限(默认值为 80)。
请注意 cpu
和 memoryMiB
之间的重要关系;内存可以设置为 128 到 32768 之间的任何整数值,但提高内存上限可能需要提高 CPU 上限:
- 超过 4GiB 至少需要 2 个 CPU
- 超过 8GiB 至少需要 4 个 CPU
- 超过 16GiB 至少需要 6 个 CPU
- 超过 24GiB 至少需要 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 密钥等敏感信息应以 Secret 形式存储。您可以在 apphosting.yaml
中引用 Secret,以避免将敏感信息签入源代码控制系统。
secret
类型的参数表示具有存储在 Cloud Secret Manager 中的值的字符串参数。Secret 参数会检查 Cloud Secret Manager 中是否存在,并在发布期间加载值,而不是直接派生值。
- variable: API_KEY
secret: myApiKeySecret
Cloud Secret Manager 中的 Secret 可以有多个版本。默认情况下,在构建后端时,可供实时后端使用的 Secret 参数的值会固定到最新可用版本的 Secret。如果您对参数的版本控制和生命周期管理有要求,则可以使用 Cloud Secret Manager 固定到特定版本。例如,如需固定到版本 5,请运行以下命令:
- variable: PINNED_API_KEY
secret: myApiKeySecret@5
您可以使用 CLI 命令 firebase apphosting:secrets:set
创建 Secret,系统会提示您添加必要的权限。通过此流程,您可以选择自动将 Secret 引用添加到 apphosting.yaml
。
如需使用全套 Cloud Secret Manager 功能,您可以改用 Cloud Secret Manager 控制台。如需执行此操作,您需要使用 CLI 命令 firebase
apphosting:secrets:grantaccess
向 App Hosting 后端授予权限。
同步 Firebase Auth 状态
使用 Firebase Authentication 的应用应考虑使用 Firebase Web SDK 来帮助确保身份验证状态在客户端和服务器之间保持同步。使用 Service Worker 实现 FirebaseServerApp
可以简化这一过程。基本任务流程如下:
- 实现一个 Service Worker,以便在向服务器发送请求时为您的应用添加正确的标头。
- 从服务器上的请求获取标头,并使用
FirebaseServerApp
将其转换为身份验证用户。