ربط ميزة "استضافة التطبيقات" من Firebase بشبكة VPC

يمكن لخدمة الخلفية في Firebase App Hosting الاتصال بشبكة سحابة إلكترونية خاصة افتراضية (VPC). يتيح ذلك لخلفية Firebase App Hosting الوصول إلى خدمات الخلفية التي لا يمكن الوصول إليها باستخدام عناوين IP العامة، مثل Cloud SQL أو Spanner أو Cloud Memorystore أو Compute Engine أو الخدمات المصغّرة الداخلية في Kubernetes.

لا يتوفّر الوصول إلى سحابة VPC إلا في وقت التشغيل (من حاوية Cloud Run)، وليس في وقت الإنشاء (Cloud Build).

اختيار كيفية الاتصال بشبكة VPC

  • Direct VPC Egress: أبسط وأسرع وأقل تكلفة. يستخدم عنوان IP واحدًا لكل حاوية. يُنصح بهذا الإعداد لمعظم حالات الاستخدام.
  • الموصِّلات بدون خادم: تجمع عناوين IP للتطبيقات الأكبر حجمًا. يتطلّب الدفع مقابل الجهاز الافتراضي الأساسي. يمكنك الاطّلاع على "الوصول إلى VPC بدون خادم" في صفحة أسعار VPC لمعرفة تفاصيل الأسعار.

الضبط في "apphosting.yaml"

استخدِم عملية ربط vpcAccess في ملف apphosting.yaml لضبط إمكانية الوصول. استخدِم اسم شبكة/موصل مؤهَّل بالكامل أو رقم تعريف. يتيح استخدام المعرّفات إمكانية النقل بين بيئات الإصدار التجريبي والتشغيل الفعلي باستخدام موصّلات أو شبكات مختلفة.

إعدادات Direct VPC Egress ‏(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 for Redis في مشروع Google Cloud نفسه الذي يتضمّن الخلفية في Firebase App Hosting والاتصال به باستخدام مخرج VPC المباشر.

الخطوة 0: إنشاء مثيل Memorystore for Redis

  1. انتقِل إلى صفحة Memorystore for Redis في وحدة تحكّم Google Cloud.
    • تأكَّد من اختيار المشروع نفسه الذي تستخدمه في Firebase App Hosting.
    • إذا لم تتمكّن من الوصول إلى هذه الصفحة، تأكَّد من تفعيل الفوترة لمشروعك ومن تفعيل واجهة برمجة تطبيقات Memorystore.
  2. انقر على إنشاء مثيل.
  3. اضبط المثيل الجديد باستخدام الإعدادات المفضّلة لديك. في ما يلي بعض الأمثلة على القيم التي يمكنك استخدامها:
    • أدخِل my-redis-cache ضمن رقم تعريف المثيل.
    • أدخِل Redis cache ضمن الاسم المعروض.
    • اختَر الخطة الأساسية ضمن أداة اختيار المستوى. تحدّد الدرجة الأساسية عقدة Redis مستقلة، على عكس الدرجة العادية التي تستخدم عقدة نسخة طبق الأصل لنسخ بياناتك احتياطيًا.
    • اختَر منطقة الخلفية في App Hosting من أداة اختيار المنطقة. تأكَّد من ضبط هذه القيمة لتتطابق مع منطقة الخلفية.
    • اختَر أي من أداة اختيار المنطقة.
    • أدخِل 5 ضمن السعة. يؤدي ذلك إلى ضبط سعة المثيل على 5 غيغابايت.
    • اختَر 7.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. يمكنك العثور على معلومات الاتصال (المضيف والمنفذ) في علامة التبويب "الاتصالات" (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 للإشارة إلى المضيف المحلي حتى تتمكن من التطوير محليًا باستخدام تثبيت محلي لـ Redis.

  1. تثبيت Redis على جهازك
  2. أنشئ apphosting.emulator.yaml أو عدّله للإشارة إلى المثيل المحلي:

    env:
      - variable: REDISHOST
        value: 127.0.0.1