Conecta Firebase App Hosting a una red de VPC

Tu backend de Firebase App Hosting puede conectarse a una red de nube privada virtual (VPC). Esto permite que tu Firebase App Hosting backend acceda a servicios de backend que no son accesibles con direcciones IP públicas, como Cloud SQL, Spanner, Cloud Memorystore, Compute Engine, o microservicios internos de Kubernetes.

El acceso a la VPC solo está disponible en el tiempo de ejecución (desde tu Cloud Run contenedor), no en el tiempo de compilación (Cloud Build).

Elige cómo conectarte a una red de VPC

  • Salida de VPC directa: Es más simple, rápida y económica. Usa una dirección IP por contenedor. Se recomienda para la mayoría de los casos de uso.
  • Conectores sin servidores: Agrupan direcciones IP para aplicaciones más grandes. Requiere el pago de la VM subyacente. Consulta "Acceso a VPC sin servidores" en la página de precios de VPC para obtener detalles sobre los precios.

Configura en apphosting.yaml

Usa la asignación vpcAccess en tu archivo apphosting.yaml para configurar el acceso. Usa un nombre o un ID de red o conector completamente calificado. El uso de IDs permite la portabilidad entre entornos de etapa de pruebas y producción con diferentes conectores o redes.

Configuración de salida de VPC directa (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

Configuración del conector sin servidores (apphosting.yaml):

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

Ejemplo: Conéctate a Memorystore para Redis desde una app de Next.js

Los sistemas de almacenamiento en caché, como Redis o Memcached, se usan comúnmente para compilar una capa de almacenamiento en caché de datos rápida para una app. En este ejemplo, se muestra cómo configurar Memorystore para Redis en el mismo Google Cloud proyecto que tu Firebase App Hosting backend y conectarte a él con la salida de VPC directa.

Paso 0: Crea una instancia de Memorystore para Redis

  1. Ve a la página en la consola Google Cloud.
    • Asegúrate de que esté seleccionado el mismo proyecto que usas para Firebase App Hosting es.
    • Si no puedes acceder a esta página, asegúrate de que la facturación esté habilitada para tu proyecto y de que hayas habilitado la API de Memorystore.
  2. Selecciona Crear instancia.
  3. Configura la nueva instancia con los parámetros de configuración que prefieras. Estos son algunos valores de ejemplo que puedes usar:
    • Ingresa my-redis-cache en ID de instancia.
    • Ingresa Redis cache en Nombre visible.
    • Elige Básico en el selector de nivel. En el nivel Básico, se designa un nodo independiente de Redis, en lugar del nivel Estándar, que usa un nodo de réplica para crear una copia de seguridad de tus datos.
    • Elige la región de tu backend de App Hosting en el selector de Región. Asegúrate de establecer este valor para que coincida con la región de tu backend.
    • Elige cualquiera en el selector de zona.
    • Ingresa 5 en Capacidad. Esto establece tu capacidad de instancia en 5 GB.
    • Selecciona 5.0 en Versión (recomendado).
    • Elige predeterminado en el selector de Red autorizada.

Paso 1: Actualiza apphosting.yaml con el ID de tu red de VPC

  1. Visita la página de redes de VPC en la Google Cloud consola.
  2. Busca el ID de red de VPC de tu instancia de Memorystore para Redis (a menudo será default).
  3. Configura la salida de VPC directa en apphosting.yaml con el ID de red de VPC:

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

Paso 2: Agrega variables de entorno que dirijan tu app a Redis

  1. Busca la información de conexión (host y puerto) en la pestaña "Conexiones" de tu instancia de Memorystore para Redis en la Google Cloud consola.
  2. Conéctate a Redis con las variables de entorno REDISPORT y REDISHOST. Configúralas en apphosting.yaml con los valores de host y puerto de la Google Cloud consola:

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

Paso 3: Usa Redis desde tu app

  1. Instala el paquete npm de Redis:

    npm install redis@latest

  2. Accede a tu caché de Redis desde tu código. Usa las variables de entorno configuradas en el paso anterior. Por ejemplo, así puedes leer desde una caché en un controlador de ruta de 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 });
      }
      

Paso 4 (opcional): Configura tu app para el desarrollo local

El emulador Firebase App Hosting puede anular valores con apphosting.emulator.yaml. Aquí, puedes cambiar el valor de REDISHOST para que apunte al host local y puedas desarrollar de forma local con una instalación local de Redis.

  1. Instala Redis en tu máquina local.
  2. Crea o edita apphosting.emulators.yaml para hacer referencia a tu instancia local:

    env:
      - variable: REDISHOST
        value: 127.0.0.1