将 Firebase App Hosting 连接到 VPC 网络

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

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

apphosting.yaml 中配置

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

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

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

Redis 或 Memcached 等缓存系统通常用于为应用构建快速数据缓存层。此示例将向您展示如何在与 Firebase App Hosting 后端相同的 Google Cloud 项目中设置 Memorystore for Redis,以及如何使用直接 VPC 出站流量连接到该实例。

第 0 步:创建 Memorystore for Redis 实例

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

第 1 步:将 apphosting.yaml 替换为您的 VPC 网络 ID

  1. 访问 Google Cloud 控制台中的 VPC 网络页面
  2. 找到 Memorystore for Redis 实例的 VPC 网络 ID(通常为 default)。
  3. apphosting.yaml 中使用 VPC 网络 ID 设置直接 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 中设置这些值:

    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