Как подключить 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

Настроить в apphosting.yaml

Чтобы настроить доступ, используйте сопоставление vpcAccess в файле apphosting.yaml. Используйте полное название сети/коннектора или идентификатор. Использование идентификаторов позволяет переносить данные между тестовой и рабочей средами с разными коннекторами и сетями.

Конфигурация прямого исходящего трафика 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

Пример: подключение к Memorystore for Redis из приложения Next.js

Системы кеширования, такие как Redis или Memcached, обычно используются для создания быстрого уровня кеширования данных для приложения. В этом примере показано, как настроить Memorystore для Redis в том же проекте Google Cloud, что и ваш бэкенд Firebase App Hosting, и подключиться к нему с помощью прямого исходящего трафика VPC.

Шаг 0. Создайте экземпляр Memorystore for Redis

  1. Перейдите на страницу Memorystore for Redis в консоли Google Cloud.
    • Убедитесь, что выбран тот же проект, который вы используете для Firebase App Hosting.
    • Если у вас нет доступа к этой странице, убедитесь, что для проекта включены платежные функции и Memorystore API.
  2. Нажмите Create Instance (Создать экземпляр).
  3. Задайте нужные настройки для нового экземпляра. Вот некоторые примеры значений:
    • В поле Instance ID (Идентификатор экземпляра) введите my-redis-cache.
    • В поле Отображаемое название введите Redis cache.
    • В селекторе уровней выберите Базовый. Базовый уровень обозначает отдельный узел Redis, в отличие от стандартного уровня, который использует узел реплики для резервного копирования ваших данных.
    • Выберите регион серверной части App Hosting в меню Region (Регион). Убедитесь, что это значение соответствует региону вашего бэкенда.
    • В селекторе зон выберите любую.
    • В поле Вместимость введите 5. В результате емкость экземпляра будет установлена на уровне 5 ГБ.
    • В разделе Версия выберите 7.0 (или рекомендуемую версию по умолчанию).
    • В меню Авторизованная сеть выберите вариант По умолчанию.

Шаг 1. Укажите идентификатор сети VPC в переменной apphosting.yaml

  1. Перейдите на страницу VPC networks (Сети VPC) в консоли Google Cloud.
  2. Найдите идентификатор сети VPC для своего экземпляра Memorystore for Redis (часто это default).
  3. Задайте конфигурацию прямого исходящего трафика VPC в apphosting.yaml, используя идентификатор сети VPC:

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

Шаг 2. Добавьте переменные среды, которые направляют приложение в Redis

  1. Информацию о подключении (хост и порт) можно найти на вкладке Connections (Подключения) экземпляра Memorystore for Redis в консоли Google Cloud.
  2. Подключитесь к Redis с помощью переменных среды REDISPORT и REDISHOST. Укажите их в 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. Установите пакет npm redis:

    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({
            socket: {
              host: REDISHOST,
              port: Number(REDISPORT),
            },
          })
            .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.emulator.yaml, чтобы сослаться на локальный экземпляр:

    env:
      - variable: REDISHOST
        value: 127.0.0.1