将 Firebase App Hosting 连接到 VPC 网络

您的 Firebase App Hosting 后端可以连接到 虚拟私有云 (VPC) 网络。这样,您的 Firebase App Hosting 后端便可以访问无法使用 公共 IP 地址访问的后端服务,例如 Cloud SQL、Spanner、Cloud Memorystore、 Compute Engine 或 Kubernetes 内部微服务。

VPC 访问权限仅在运行时(从您的 Cloud Run 容器)可用,在构建时间(Cloud Build)不可用。

选择连接到 VPC 网络的方式

  • 直接 VPC 出站流量: 更简单、更快、更便宜。每个容器使用一个 IP 地址。 适合大多数使用场景。
  • 无服务器 连接器: 为大型应用汇集 IP 地址。需要为底层虚拟机付费。如需了解价格详情,请参阅 VPC 价格页面 中的“无服务器 VPC 访问通道”。

apphosting.yaml 中进行配置

使用 apphosting.yaml 文件中的 vpcAccess 映射配置访问权限。 使用完全限定的网络/连接器名称或 ID。使用 ID 可以在具有不同连接器/网络的预演环境和生产环境之间实现可移植性。

直接 VPC 出站流量配置 (apphosting.yaml):

runConfig:
  vpcAccess:
    egress: PRIVATE_RANGES_ONLY # Default value
    networkInterfaces:
      # Specify at least one of network and/or subnetwork
      - network: my-network-id
        subnetwork: my-subnetwork-id

无服务器连接器配置 (apphosting.yaml):

runConfig:
  vpcAccess:
    egress: ALL_TRAFFIC
    connector: connector-id

示例:从 Next.js 应用连接到 Memorystore for Redis

缓存系统(例如 Redis 或 Memcached)通常用于为应用构建快速数据缓存层。此示例向您展示了如何在与 Firebase App Hosting 后端相同的 Google Cloud 项目中设置 Memorystore for Redis,并使用 Direct VPC egress连接到该实例。

第 0 步:创建 Memorystore for Redis 实例

  1. 前往 Memorystore for Redis 页面 in the Google Cloud console.
    • 确保选择与 Firebase App Hosting 相同的项目。
    • 如果您无法访问此页面,请确保您的 项目已启用结算功能,并且您已启用 Memorystore API
  2. 选择创建实例
  3. 使用首选设置配置新实例。以下是一些您可以使用的示例值:
    • 实例 ID 下输入 my-redis-cache
    • 显示名 下输入 Redis cache
    • 在层级选择器下选择基本 。与使用副本节点来备份数据的标准层级相反,基本层级指定独立的 Redis 节点。
    • App Hosting 后端的 区域 选择器中选择区域。请务必将此值设置为与后端的区域一致。
    • 从可用区选择器中选择任意
    • 容量 下输入 5。这会将您的实例容量设置为 5 GB。
    • 版本 下选择 5.0(推荐)。
    • 已获授权的网络 选择器中选择默认

第 1 步:使用 VPC 网络 ID 更新 apphosting.yaml

  1. 访问 VPC 网络页面Google Cloud 控制台。
  2. 找到 Memorystore for Redis 实例的 VPC 网络 ID(通常为 default)。
  3. 使用 VPC 网络 ID 在 apphosting.yaml 中设置直接 VPC 出站流量配置:

    runConfig:
      vpcAccess:
        egress: PRIVATE_RANGES_ONLY # Default value
      networkInterfaces:
        - network: my-network-id
    

第 2 步:添加将应用定向到 Redis 的环境变量

  1. Google Cloud 控制台中 Memorystore for Redis 实例的“连接”标签页中查找连接信息(主机和端口)。
  2. 使用 REDISPORTREDISHOST 环境变量连接到 Redis。使用 Google Cloud 控制台中的主机和端口值在 apphosting.yaml 中设置 这些变量:Google Cloud

    env:
      # Sample only. Use actual values provided by Memorystore
      - variable: REDISPORT
        value: 6379
      - variable: REDISHOST
        value: 10.127.16.3
    

第 3 步:从应用中使用 Redis

  1. 安装 Redis npm 软件包:

    npm install redis@latest

  2. 从代码访问 Redis 缓存。使用在上一步中配置的环境变量。例如,以下代码段展示了如何在 Next.js 路由处理程序中从缓存读取数据:

    • src/lib/redis.js

      import { createClient } from "redis";
      
      // Set these environment variables in apphosting.yaml
      const REDISHOST = process.env.REDISHOST;
      const REDISPORT = process.env.REDISPORT;
      
      let redisClient;
      
      export async function getClient(req, res) {
        // Only connect if a connection isn't already available
        if (!redisClient) {
          redisClient = await createClient(REDISPORT, REDISHOST)
            .on("error", (err) => console.error("Redis Client Error", err))
            .connect();
        }
      
        return redisClient;
      }
      
    • src/app/counter/route.js

      import { getClient } from "@/lib/redis.js";
      
      export async function GET(request) {
        const redisClient = await getClient();
        const count = await redisClient.get("counter");
      
        return Response.json({ count });
      }
      
      export async function POST(request) {
        const redisClient = await getClient();
        const count = await redisClient.incr("counter");
      
        return Response.json({ count });
      }
      

第 4 步(可选):为本地开发配置应用

Firebase App Hosting 模拟器可以使用 apphosting.emulator.yaml 替换值。在这里,您可以更改 REDISHOST 的值以指向 localhost,以便您可以使用本地安装的 Redis 在本地进行开发。

  1. 在本地机器上安装 Redis
  2. 创建或修改 apphosting.emulators.yaml 以引用本地实例:

    env:
      - variable: REDISHOST
        value: 127.0.0.1