เชื่อมต่อโฮสติ้งแอป Firebase กับเครือข่าย VPC

แบ็กเอนด์ Firebase App Hosting สามารถเชื่อมต่อกับเครือข่าย Virtual Private Cloud (VPC) ได้ ซึ่งจะช่วยให้แบ็กเอนด์ Firebase App Hosting ของคุณเข้าถึงบริการแบ็กเอนด์ที่ไม่สามารถเข้าถึงได้โดยใช้ที่อยู่ IP สาธารณะ เช่น Cloud SQL, Spanner, Cloud Memorystore, Compute Engine หรือ Microservice ภายในของ Kubernetes

การเข้าถึง VPC จะใช้ได้เฉพาะที่รันไทม์ (จากคอนเทนเนอร์ Cloud Run ของคุณ) ไม่ใช่ที่เวลาบิลด์ (Cloud Build)

เลือกวิธีเชื่อมต่อกับเครือข่าย VPC

  • Direct VPC Egress: ง่ายกว่า เร็วกว่า และประหยัดกว่า ใช้ที่อยู่ IP 1 รายการต่อคอนเทนเนอร์ แนะนำสำหรับกรณีการใช้งานส่วนใหญ่
  • เครื่องมือเชื่อมต่อแบบ Serverless: รวมที่อยู่ IP สำหรับแอปพลิเคชันขนาดใหญ่ ต้องชำระเงินสำหรับ VM ที่เกี่ยวข้อง ดูรายละเอียดราคาได้ที่ "การเข้าถึง VPC แบบ Serverless" ในหน้าราคา 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

การกำหนดค่าเครื่องมือเชื่อมต่อแบบ Serverless (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 สำหรับ Redis

  1. ไปที่หน้า Memorystore สำหรับ Redis ในคอนโซล Google Cloud
    • ตรวจสอบว่าได้เลือกโปรเจ็กต์เดียวกับที่คุณใช้สำหรับ Firebase App Hosting แล้ว
    • หากเข้าถึงหน้านี้ไม่ได้ ให้ตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์และเปิดใช้ Memorystore API แล้ว
  2. เลือกสร้างอินสแตนซ์
  3. กำหนดค่าอินสแตนซ์ใหม่ด้วยการตั้งค่าที่ต้องการ ตัวอย่างค่าที่คุณใช้ได้มีดังนี้
    • ป้อน my-redis-cache ในส่วนรหัสอินสแตนซ์
    • ป้อน Redis cache ในส่วนชื่อที่แสดง
    • เลือกพื้นฐานในตัวเลือกระดับ ระดับพื้นฐานจะกำหนดโหนด Redis แบบสแตนด์อโลน ซึ่งต่างจากระดับมาตรฐานที่ใช้โหนดจำลองเพื่อสำรองข้อมูล
    • เลือกภูมิภาคของแบ็กเอนด์ App Hosting จากตัวเลือกภูมิภาค ตรวจสอบว่าได้ตั้งค่านี้ให้ตรงกับภูมิภาคของแบ็กเอนด์
    • เลือกทั้งหมดจากตัวเลือกโซน
    • ป้อน 5 ในส่วนความจุ การดำเนินการนี้จะตั้งค่าความจุของอินสแตนซ์เป็น 5 GB
    • เลือก 7.0 (หรือเวอร์ชันที่แนะนำโดยค่าเริ่มต้น) ในส่วนเวอร์ชัน
    • เลือกค่าเริ่มต้นจากตัวเลือกเครือข่ายที่ได้รับอนุญาต

ขั้นตอนที่ 1: อัปเดต apphosting.yaml ด้วยรหัสเครือข่าย VPC

  1. ไปที่หน้าเครือข่าย VPC ในคอนโซล Google Cloud
  2. ค้นหารหัสเครือข่าย VPC สำหรับอินสแตนซ์ Memorystore สำหรับ 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 มีดังนี้

    • 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