קישור Firebase App Hosting לרשת VPC

ה-backend של Firebase App Hosting יכול להתחבר לרשת ענן וירטואלי פרטי (VPC). כך הקצה העורפי של Firebase App Hosting יכול לגשת לשירותים בקצה העורפי שאי אפשר לגשת אליהם באמצעות כתובות IP ציבוריות, כמו Cloud SQL,‏ Spanner,‏ Cloud Memorystore,‏ Compute Engine או מיקרו-שירותים פנימיים של Kubernetes.

הגישה ל-VPC זמינה רק בזמן הריצה (מהקונטיינר של Cloud Run), ולא בזמן ה-build‏ (Cloud Build).

איך בוחרים את אופן החיבור לרשת VPC

  • ‫Direct VPC Egress: פשוט, מהיר וזול יותר. משתמש בכתובת IP אחת לכל קונטיינר. מומלץ לרוב תרחישי השימוש.
  • מחברים ללא שרת (serverless): מאגרים של כתובות IP לאפליקציות גדולות יותר. נדרש תשלום על ה-VM הבסיסי. לפרטים על המחירים, קראו את הקטע "חיבור לרשת (VPC) מאפליקציית serverless" בדף התמחור של VPC.

הגדרה ב-apphosting.yaml

כדי להגדיר את הגישה, משתמשים במיפוי vpcAccess בקובץ apphosting.yaml. צריך להשתמש בשם מלא או במזהה של הרשת או המחבר. שימוש במזהים מאפשר ניידות בין סביבות Staging וסביבות ייצור עם מחברים או רשתות שונים.

הגדרת תעבורת נתונים יוצאת (egress) ב-Direct 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

הגדרת מחבר ללא שרת (serverless) (apphosting.yaml):

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

דוגמה: התחברות ל-Memorystore for Redis מאפליקציית Next.js

מערכות לשמירה במטמון כמו Redis או Memcached משמשות בדרך כלל ליצירת שכבת שמירת נתונים מהירה במטמון לאפליקציה. בדוגמה הזו מוסבר איך להגדיר את Memorystore for 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. מגדירים את המכונה החדשה לפי ההגדרות הרצויות. הנה כמה דוגמאות לערכים שאפשר להשתמש בהם:
    • מזינים את הערך my-redis-cache בשדה Instance ID.
    • מזינים Redis cache בקטע שם לתצוגה.
    • בוחרים באפשרות בסיסי מתחת לבחירת הרמה. המסלול הבסיסי מיועד לצומת Redis עצמאי, בניגוד למסלול הרגיל שמשתמש בצומת רפליקה כדי לגבות את הנתונים.
    • בוחרים את האזור של הקצה העורפי של App Hosting בבורר Region. חשוב להגדיר את הערך הזה כך שיתאים לאזור של הקצה העורפי.
    • בוחרים באפשרות any בבורר האזורים.
    • מזינים 5 בקטע קיבולת. הפעולה הזו מגדירה את קיבולת המכונה ל-5GB.
    • בקטע Version, בוחרים באפשרות 7.0 (או בגרסה המומלצת שמוגדרת כברירת מחדל).
    • בוחרים באפשרות default בבורר Authorized network.

שלב 1: מעדכנים את apphosting.yaml במזהה של רשת ה-VPC

  1. נכנסים לדף רשתות VPC במסוף Google Cloud.
  2. מאתרים את המזהה של רשת ה-VPC של המכונה של Memorystore for Redis (בדרך כלל הוא יהיה default).
  3. מגדירים את תצורת Direct VPC egress ב-apphosting.yaml באמצעות מזהה רשת ה-VPC:

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

שלב 2: מוסיפים משתני סביבה שמפנים את האפליקציה ל-Redis

  1. במסוף Google Cloud, בכרטיסייה Connections של המכונה של Memorystore for Redis, מאתרים את פרטי החיבור (המארח והיציאה).
  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 route handler:

    • 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 כך שיצביע על המארח המקומי, כדי שתוכלו לפתח באופן מקומי באמצעות התקנה מקומית של Redis.

  1. התקנת Redis במחשב המקומי
  2. יוצרים או עורכים את apphosting.emulator.yaml כדי להפנות למכונה המקומית:

    env:
      - variable: REDISHOST
        value: 127.0.0.1