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

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

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

הגדרה ב-apphosting.yaml

כדי להגדיר גישה, משתמשים במיפוי vpcAccess בקובץ 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

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

מערכות שמירה במטמון כמו Redis או Memcached משמשות בדרך כלל ליצירת שכבת שמירה במטמון נתונים מהירה לאפליקציה. בדוגמה הזו מוסבר איך להגדיר את Memorystore for Redis באותו פרויקט Google Cloud כמו קצה העורפי (backend) של 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 בשדה שם לתצוגה.
    • בבורר הרמות, בוחרים באפשרות Basic. בדרגת Basic מוגדר צומת Redis עצמאי, בניגוד לדרגת Standard שבה נעשה שימוש בצומת משוכפל לגיבוי הנתונים.
    • בוחרים את האזור של ה-backend של App Hosting מבורר Region (אזור). חשוב להגדיר את הערך הזה כך שיתאים לאזור של ה-Backend.
    • בוחרים באפשרות כל בבורר האזורים.
    • מזינים 5 בקטע קיבולת. הפעולה הזו מגדירה את קיבולת המופע ל-5GB.
    • בוחרים באפשרות 5.0 בקטע גרסה (מומלץ).
    • בוחרים באפשרות ברירת מחדל מתוך בורר הרשת המורשית.

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

  1. נכנסים לדף רשתות ה-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. אפשר למצוא את פרטי החיבור (המארח והיציאה) בכרטיסייה 'חיבורים' של מופע 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 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(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 כך שיצביע על המארח המקומי, כדי שתוכלו לפתח באופן מקומי באמצעות התקנה מקומית של Redis.

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

    env:
      - variable: REDISHOST
        value: 127.0.0.1