กำหนดค่าและจัดการแบ็กเอนด์โฮสติ้งของแอป

App Hosting ได้รับการออกแบบมาให้ใช้งานง่ายและมีการบำรุงรักษาต่ำ โดยมีการตั้งค่าเริ่มต้นที่เพิ่มประสิทธิภาพสำหรับกรณีการใช้งานส่วนใหญ่ ในขณะเดียวกัน App Hosting ยังมีเครื่องมือให้คุณจัดการและกำหนดค่าแบ็กเอนด์ สำหรับความต้องการเฉพาะของคุณด้วย คู่มือนี้จะอธิบายเครื่องมือและกระบวนการดังกล่าว

สร้างและแก้ไข apphosting.yaml

สำหรับการกำหนดค่าขั้นสูง เช่น ตัวแปรสภาพแวดล้อมหรือการตั้งค่ารันไทม์ เช่น ขีดจำกัดของจำนวนการทำงานพร้อมกัน, CPU และหน่วยความจำ คุณจะต้องสร้างและแก้ไขไฟล์ apphosting.yaml ในรูทไดเรกทอรีของแอป นอกจากนี้ ไฟล์นี้ยัง รองรับการอ้างอิงถึงข้อมูลลับที่จัดการ ด้วย Secret Manager ของ Cloud ซึ่งทำให้ตรวจสอบการควบคุมแหล่งที่มาได้อย่างปลอดภัย

หากต้องการสร้าง apphosting.yaml ให้เรียกใช้คำสั่งต่อไปนี้

firebase init apphosting

ซึ่งจะสร้างไฟล์ apphosting.yaml เริ่มต้นพื้นฐานพร้อมตัวอย่างการกำหนดค่า (ที่แสดงความคิดเห็น) หลังจากแก้ไขแล้ว ไฟล์ apphosting.yaml ทั่วไปอาจมีลักษณะดังต่อไปนี้ โดยมีการตั้งค่าสำหรับบริการ Cloud Run ของแบ็กเอนด์ ตัวแปรสภาพแวดล้อมบางรายการ และการอ้างอิงถึงข้อมูลลับบางอย่างที่จัดการโดย Cloud Secret Manager

# Settings for Cloud Run
runConfig:
  minInstances: 2
  maxInstances: 100
  concurrency: 100
  cpu: 2
  memoryMiB: 1024

# Environment variables and secrets
env:
  - variable: STORAGE_BUCKET
    value: mybucket.firebasestorage.app
    availability:
      - BUILD
      - RUNTIME

  - variable: API_KEY
    secret: myApiKeySecret

    # Same as API_KEY above but with a pinned version.
  - variable: PINNED_API_KEY
    secret: myApiKeySecret@5

    # Same as API_KEY above but with the long form secret reference as defined by Cloud Secret Manager.
  - variable: VERBOSE_API_KEY
    secret: projects/test-project/secrets/secretID

    # Same as API_KEY above but with the long form secret reference with pinned version.
  - variable: PINNED_VERBOSE_API_KEY
    secret: projects/test-project/secrets/secretID/versions/5

ส่วนที่เหลือของคู่มือนี้จะให้ข้อมูลและบริบทเพิ่มเติมสำหรับการตั้งค่าตัวอย่างเหล่านี้

กำหนดCloud Runการตั้งค่าบริการ

การตั้งค่า apphosting.yaml ช่วยให้คุณกำหนดค่าวิธีจัดสรรบริการ Cloud Run ได้ การตั้งค่าที่ใช้ได้สำหรับบริการ Cloud Run จะอยู่ในออบเจ็กต์ runConfig

  • cpu - จำนวน CPU ที่ใช้สำหรับอินสแตนซ์การแสดงผลแต่ละรายการ (ค่าเริ่มต้นคือ 0)
  • memoryMiB - จำนวนหน่วยความจำที่จัดสรรให้กับอินสแตนซ์การแสดงผลแต่ละรายการใน MiB (ค่าเริ่มต้นคือ 512)
  • maxInstances – จำนวนคอนเทนเนอร์สูงสุดที่เคยเรียกใช้พร้อมกัน (ค่าเริ่มต้นคือ 100 และจัดการโดยโควต้า)
  • minInstances – จำนวนคอนเทนเนอร์ที่จะเปิดไว้เสมอ (ค่าเริ่มต้นคือ 0)
  • concurrency - จำนวนคำขอสูงสุดที่อินสแตนซ์การแสดงโฆษณาแต่ละรายการรับได้ (ค่าเริ่มต้นคือ 80)

โปรดทราบความสัมพันธ์ที่สำคัญระหว่าง cpu กับ memoryMiB คุณตั้งค่าหน่วยความจำเป็นค่าจำนวนเต็มใดก็ได้ระหว่าง 128 ถึง 32768 แต่การเพิ่มขีดจำกัดหน่วยความจำอาจต้องเพิ่มขีดจำกัด CPU ด้วย

  • หากมีขนาดมากกว่า 4 GiB จะต้องมี CPU อย่างน้อย 2 ตัว
  • หากมี RAM มากกว่า 8 GiB จะต้องมี CPU อย่างน้อย 4 ตัว
  • หากมี RAM มากกว่า 16 GiB จะต้องมี CPU อย่างน้อย 6 ตัว
  • หากมี RAM มากกว่า 24 GiB จะต้องมี CPU อย่างน้อย 8 ตัว

ในทำนองเดียวกัน ค่าของ cpu จะส่งผลต่อการตั้งค่าการทำงานพร้อมกัน หากตั้งค่า CPU น้อยกว่า 1 คุณต้องตั้งค่าการทำงานพร้อมกันเป็น 1 และระบบจะจัดสรร CPU ระหว่างการประมวลผลคำขอเท่านั้น

กำหนดค่าสภาพแวดล้อม

บางครั้งคุณอาจต้องกำหนดค่าเพิ่มเติมสำหรับกระบวนการบิลด์ เช่น คีย์ API ของบุคคลที่สามหรือการตั้งค่าที่ปรับได้ App Hosting มีการกำหนดค่าสภาพแวดล้อมใน apphosting.yaml เพื่อจัดเก็บและเรียกข้อมูลประเภทนี้สำหรับโปรเจ็กต์ของคุณ

env:
-   variable: STORAGE_BUCKET
    value: mybucket.firebasestorage.app

สำหรับแอป Next.js ไฟล์ dotenv ที่มีตัวแปรสภาพแวดล้อมจะใช้ได้กับ App Hosting ด้วย เราขอแนะนำให้ใช้ apphosting.yaml เพื่อควบคุมตัวแปรสภาพแวดล้อมแบบละเอียดด้วยเฟรมเวิร์กใดก็ได้

ใน apphosting.yaml คุณระบุกระบวนการที่มีสิทธิ์เข้าถึงตัวแปรสภาพแวดล้อมได้โดยใช้พร็อพเพอร์ตี้ availability คุณสามารถจำกัดตัวแปรสภาพแวดล้อมให้ใช้ได้เฉพาะในสภาพแวดล้อมการสร้าง หรือใช้ได้เฉพาะในสภาพแวดล้อมรันไทม์ โดยค่าเริ่มต้น จะพร้อมใช้งานสำหรับทั้ง 2 อย่าง

env:
-   variable: STORAGE_BUCKET
    value: mybucket.firebasestorage.app
    availability:
    -   BUILD
    -   RUNTIME

สำหรับแอป Next.js คุณยังใช้คำนำหน้า NEXT_PUBLIC_ ในลักษณะเดียวกับที่ใช้ในไฟล์ dotenv เพื่อให้ตัวแปรเข้าถึงได้ในเบราว์เซอร์

env:
-   variable: NEXT_PUBLIC_STORAGE_BUCKET
    value: mybucket.firebasestorage.app
    availability:
    -   BUILD
    -   RUNTIME

คีย์ตัวแปรที่ถูกต้องประกอบด้วยอักขระ A-Z หรือขีดล่าง คีย์ตัวแปรสภาพแวดล้อมบางรายการสงวนไว้สำหรับการใช้งานภายใน อย่าใช้คีย์ต่อไปนี้ในไฟล์การกำหนดค่า

  • ตัวแปรใดก็ตามที่ขึ้นต้นด้วย X_FIREBASE_
  • PORT
  • K_SERVICE
  • K_REVISION
  • K_CONFIGURATION

ลบล้างสคริปต์การสร้างและเรียกใช้

App Hosting อนุมานคำสั่งบิลด์และคำสั่งเริ่มต้นของแอปตามเฟรมเวิร์กที่ตรวจพบ หากต้องการใช้คำสั่งบิลด์หรือคำสั่งเริ่มต้นที่กำหนดเอง คุณสามารถลบล้างค่าเริ่มต้นของ App Hosting ใน apphosting.yaml ได้

scripts:
  buildCommand: next build --no-lint
  runCommand: node dist/index.js

การลบล้างคำสั่งบิลด์จะมีลำดับความสำคัญเหนือกว่าคำสั่งบิลด์อื่นๆ และ จะเลือกไม่ใช้ตัวดัดแปลงเฟรมเวิร์กของแอป รวมถึงปิดใช้การเพิ่มประสิทธิภาพเฉพาะเฟรมเวิร์กที่ App Hosting มีให้ โดยจะใช้ได้ดีที่สุดเมื่ออะแดปเตอร์ไม่รองรับฟีเจอร์ของแอป หากต้องการเปลี่ยนคำสั่งบิลด์ แต่ยังคงใช้อะแดปเตอร์ที่เราให้ไว้ ให้ตั้งค่าสคริปต์บิลด์ใน package.json แทนตามที่อธิบายไว้ในApp Hosting อะแดปเตอร์เฟรมเวิร์ก

ใช้การลบล้างคำสั่งเรียกใช้เมื่อมีคำสั่งเฉพาะที่คุณต้องการใช้เพื่อเริ่มแอป ซึ่งแตกต่างจากApp Hostingคำสั่งที่อนุมาน

กำหนดค่าเอาต์พุตบิลด์

App Hosting จะเพิ่มประสิทธิภาพการติดตั้งใช้งานแอปโดยค่าเริ่มต้นด้วยการลบไฟล์เอาต์พุตที่ไม่ได้ใช้ ตามที่เฟรมเวิร์กระบุ หากต้องการเพิ่มประสิทธิภาพขนาดการติดตั้งใช้งานแอปหรือละเว้นการเพิ่มประสิทธิภาพเริ่มต้น คุณสามารถลบล้างการตั้งค่านี้ได้ใน apphosting.yaml

outputFiles:
  serverApp:
    include: [dist, server.js]

พารามิเตอร์ include จะรับรายการไดเรกทอรีและไฟล์ที่สัมพันธ์กับ ไดเรกทอรีรากของแอปซึ่งจำเป็นต่อการติดตั้งใช้งานแอป หากต้องการตรวจสอบ ว่าระบบเก็บไฟล์ทั้งหมดไว้ ให้ตั้งค่า include เป็น [.] แล้วระบบจะติดตั้งใช้งานไฟล์ทั้งหมด

จัดเก็บและเข้าถึงพารามิเตอร์ลับ

ควรจัดเก็บข้อมูลที่ละเอียดอ่อน เช่น คีย์ API เป็นข้อมูลลับ คุณสามารถ อ้างอิงข้อมูลลับใน apphosting.yaml เพื่อหลีกเลี่ยงการเช็คอินข้อมูลที่ละเอียดอ่อน ลงในการควบคุมแหล่งที่มา

พารามิเตอร์ประเภท secret แสดงพารามิเตอร์สตริงที่มีค่า จัดเก็บไว้ใน Cloud Secret Manager พารามิเตอร์ลับจะตรวจสอบการมีอยู่ของข้อมูลลับใน Secret Manager ของ Cloud และโหลดค่าระหว่างการเปิดตัวแทนที่จะ ดึงค่าโดยตรง

  -   variable: API_KEY
      secret: myApiKeySecret

ข้อมูลลับใน Cloud Secret Manager อาจมีหลายเวอร์ชัน โดยค่าเริ่มต้น ค่าของพารามิเตอร์ลับที่แบ็กเอนด์แบบสดของคุณใช้ได้จะตรึงไว้กับ เวอร์ชันล่าสุดของข้อมูลลับที่พร้อมใช้งาน ณ เวลาที่สร้างแบ็กเอนด์ หากมีข้อกำหนดสำหรับการควบคุมเวอร์ชันและการจัดการวงจรของพารามิเตอร์ คุณสามารถ ปักหมุดเวอร์ชันที่เฉพาะเจาะจงด้วย Cloud Secret Manager ได้ เช่น หากต้องการปักหมุดเป็น เวอร์ชัน 5 ให้ทำดังนี้

  - variable: PINNED_API_KEY
    secret: myApiKeySecret@5

คุณสร้าง Secret ได้ด้วยคำสั่ง CLI firebase apphosting:secrets:set และระบบจะแจ้งให้คุณเพิ่มสิทธิ์ที่จำเป็น ขั้นตอนการทำงานนี้จะให้ ตัวเลือกในการเพิ่มการอ้างอิงลับไปยัง apphosting.yaml โดยอัตโนมัติ

หากต้องการใช้ฟังก์ชันการทำงานทั้งหมดของ Cloud Secret Manager คุณสามารถใช้คอนโซล Cloud Secret Manager แทนได้ หากทำเช่นนี้ คุณจะต้องให้สิทธิ์แก่App Hostingแบ็กเอนด์ด้วยคำสั่ง CLI firebase apphosting:secrets:grantaccess

กำหนดค่าการเข้าถึง VPC

App Hostingแบ็กเอนด์เชื่อมต่อกับเครือข่าย Virtual Private Cloud (VPC) ได้ ดูข้อมูลเพิ่มเติมและ ตัวอย่างได้ที่เชื่อมต่อ Firebase App Hosting กับเครือข่าย VPC

ใช้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

จัดการแบ็กเอนด์

คำสั่งสำหรับการจัดการพื้นฐานของแบ็กเอนด์ App Hosting มีให้ใช้งานใน Firebase CLI และคอนโซล Firebase ส่วนนี้ อธิบายงานการจัดการที่พบบ่อยบางอย่าง รวมถึงการสร้างและ การลบแบ็กเอนด์

สร้างแบ็กเอนด์

App Hostingแบ็กเอนด์คือชุดของทรัพยากรที่มีการจัดการซึ่ง App Hostingสร้างขึ้นเพื่อสร้างและเรียกใช้เว็บแอป

คอนโซล Firebase: จากเมนูสร้าง ให้เลือก App Hosting แล้วเลือกสร้างแบ็กเอนด์ (หากนี่เป็นแบ็กเอนด์แรกในโปรเจ็กต์ Firebase ให้เลือกเริ่มต้นใช้งาน)

CLI: (เวอร์ชัน 13.15.4 ขึ้นไป) หากต้องการสร้างแบ็กเอนด์ ให้เรียกใช้คำสั่งต่อไปนี้ จากรูทของไดเรกทอรีโปรเจ็กต์ในเครื่อง โดยระบุprojectID เป็นอาร์กิวเมนต์

firebase apphosting:backends:create --project PROJECT_ID

สำหรับทั้งคอนโซลหรือ CLI ให้ทำตามข้อความแจ้งเพื่อเลือกภูมิภาค สร้างการเชื่อมต่อ GitHub และกำหนดค่าการตั้งค่าการติดตั้งใช้งานพื้นฐานต่อไปนี้

  • ตั้งค่าไดเรกทอรีรากของแอป (ค่าเริ่มต้นคือ /)

    โดยปกติแล้ว package.json จะอยู่ในโฟลเดอร์นี้

  • ตั้งค่าสาขาที่ใช้งานจริง

    นี่คือสาขาของที่เก็บ GitHub ที่จะได้รับการติดตั้งใช้งานไปยัง URL ที่ใช้งานจริง โดยมักจะเป็นกิ่งก้านที่ใช้ผสานกิ่งก้านฟีเจอร์หรือกิ่งก้านการพัฒนา

  • ยอมรับหรือปฏิเสธการเปิดตัวอัตโนมัติ

    ระบบจะเปิดใช้การเปิดตัวอัตโนมัติโดยค่าเริ่มต้น เมื่อสร้างแบ็กเอนด์เสร็จสมบูรณ์ คุณสามารถเลือกให้ระบบนำแอปไปใช้งานใน App Hosting ได้ทันที

  • ตั้งชื่อแบ็กเอนด์

ลบแบ็กเอนด์

หากต้องการนำแบ็กเอนด์ออกทั้งหมด ให้ใช้ FirebaseCLI หรือFirebaseคอนโซลเพื่อลบแบ็กเอนด์ก่อน จากนั้นให้นำ ชิ้นงานที่เกี่ยวข้องออกด้วยตนเอง โดยระมัดระวังเป็นพิเศษไม่ให้ลบทรัพยากรใดๆ ที่แบ็กเอนด์อื่นๆ หรือส่วนอื่นๆ ของโปรเจ็กต์ Firebase อาจใช้

คอนโซล Firebase: จากเมนูการตั้งค่า ให้เลือกลบแบ็กเอนด์

CLI: (เวอร์ชัน 13.15.4 ขึ้นไป)

  1. เรียกใช้คำสั่งต่อไปนี้เพื่อลบApp Hostingแบ็กเอนด์ การดำเนินการนี้จะปิดใช้โดเมนทั้งหมดสำหรับแบ็กเอนด์และลบบริการ Cloud Run ที่เชื่อมโยงออก

    firebase apphosting:backends:delete BACKEND_ID --project PROJECT_ID
    
  2. (ไม่บังคับ) ในแท็บ Google Cloud Console สำหรับ Artifact Registry ให้ลบรูปภาพสำหรับแบ็กเอนด์ใน "firebaseapphosting-images"

  3. ใน Cloud Secret Manager ให้ลบข้อมูลลับที่มี "apphosting" ในชื่อข้อมูลลับ โดยระมัดระวังเป็นพิเศษ เพื่อให้แน่ใจว่าแบ็กเอนด์อื่นๆ หรือ ส่วนอื่นๆ ของโปรเจ็กต์ Firebase จะไม่ใช้ข้อมูลลับเหล่านี้