คุณสามารถทำให้ฟังก์ชันใช้งานได้ ลบ และแก้ไขฟังก์ชันโดยใช้ Firebase คำสั่ง CLI หรือโดยการตั้งค่าตัวเลือกรันไทม์ในซอร์สโค้ดของฟังก์ชัน
ทำให้ฟังก์ชันใช้งานได้
หากต้องการทำให้ฟังก์ชันใช้งานได้ ให้เรียกใช้คำสั่ง Firebase CLI นี้
firebase deploy --only functions
โดยค่าเริ่มต้น CLI ของ Firebase จะทำให้ฟังก์ชันทั้งหมดภายในใช้งานได้
แหล่งที่มาของคุณไปพร้อมๆ กันด้วย หากโปรเจ็กต์มีฟังก์ชันมากกว่า 5 รายการ
เราขอแนะนำให้ใช้ Flag --only
ที่มีชื่อฟังก์ชันที่เฉพาะเจาะจง
เพื่อติดตั้งใช้งานเฉพาะฟังก์ชัน
ที่คุณได้แก้ไข การทําให้ฟังก์ชันที่เฉพาะเจาะจงใช้งานได้จะช่วยเร่งกระบวนการทําให้ใช้งานได้และช่วยให้คุณหลีกเลี่ยงการถึงโควต้าการทําให้ใช้งานได้ เช่น
firebase deploy --only functions:addMessage,functions:makeUppercase
เมื่อทำให้ฟังก์ชันใช้งานได้จำนวนมาก ฟังก์ชันของคุณอาจเกินขีดจำกัด มาตรฐานและรับข้อความแสดงข้อผิดพลาด HTTP 429 หรือ 500 วิธีแก้ปัญหานี้คือให้ติดตั้งใช้งานฟังก์ชันเป็นกลุ่มๆ ไม่เกิน 10 รายการ
ดูFirebaseข้อมูลอ้างอิง CLI สำหรับรายการที่มีอยู่ทั้งหมด คำสั่ง
โดยค่าเริ่มต้น Firebase CLI จะค้นหาซอร์สโค้ดในโฟลเดอร์ functions/
หากต้องการ คุณสามารถจัดระเบียบฟังก์ชันในโค้ดเบสหรือไฟล์หลายชุดได้
ลบฟังก์ชัน
คุณลบฟังก์ชันที่ติดตั้งใช้งานไปก่อนหน้านี้ได้ดังนี้
- อย่างชัดแจ้งใน Firebase CLI กับ
functions:delete
- อย่างชัดเจนในคอนโซล Google Cloud
- โดยปริยาย โดยนำฟังก์ชันออกจากซอร์สก่อนทำให้ใช้งานได้
การดำเนินการลบทั้งหมด ให้คุณยืนยันก่อนที่จะนำฟังก์ชันออกจากเวอร์ชันที่ใช้งานจริง
การลบฟังก์ชันที่ชัดแจ้งใน Firebase CLI รองรับอาร์กิวเมนต์หลายตัว ตลอดจนฟังก์ชัน กลุ่ม และช่วยให้คุณระบุฟังก์ชันที่จะทำงานในภูมิภาคหนึ่งๆ ได้ นอกจากนี้ คุณยังลบล้างข้อความยืนยันได้ด้วย
# Delete all functions that match the specified name in all regions. firebase functions:delete myFunction
# Delete a specified function running in a specific region. firebase functions:delete myFunction --region us-east-1
# Delete more than one function firebase functions:delete myFunction myOtherFunction
# Delete a specified functions group. firebase functions:delete groupA
# Bypass the confirmation prompt. firebase functions:delete myFunction --force
เมื่อใช้การลบฟังก์ชันโดยนัย firebase deploy
จะแยกวิเคราะห์แหล่งที่มาและนำฟังก์ชันที่นําออกจากไฟล์ออกจากเวอร์ชันที่ใช้งานจริง
แก้ไขชื่อ ภูมิภาค หรือทริกเกอร์ของฟังก์ชัน
หากคุณเปลี่ยนชื่อหรือเปลี่ยนภูมิภาคหรือทริกเกอร์สำหรับฟังก์ชันที่ จัดการการรับส่งข้อมูลเวอร์ชันที่ใช้งานจริง โปรดทำตามขั้นตอนในส่วนนี้เพื่อไม่ให้สูญเสียข้อมูล เหตุการณ์ระหว่างการแก้ไข ก่อนทำตามขั้นตอนเหล่านี้ ให้ตรวจสอบก่อนว่าฟังก์ชันทำงานแบบไม่เปลี่ยนแปลง เนื่องจากทั้งฟังก์ชันเวอร์ชันใหม่และเวอร์ชันเก่าจะทำงานพร้อมกันในระหว่างการเปลี่ยนแปลง
เปลี่ยนชื่อฟังก์ชัน
หากต้องการเปลี่ยนชื่อฟังก์ชัน ให้สร้างฟังก์ชันที่มีการเปลี่ยนชื่อใหม่ในแหล่งที่มา
จากนั้นเรียกใช้คำสั่งการติดตั้งใช้งาน 2 อย่างแยกกัน คำสั่งแรกจะทำให้ฟังก์ชัน
และคำสั่งที่ 2 จะนำฟังก์ชันที่ทำให้ใช้งานได้ก่อนหน้านี้ออก
เวอร์ชัน ตัวอย่างเช่น หากคุณมีฟังก์ชัน Node.js ที่ชื่อ webhook
ที่ต้องการเปลี่ยนเป็น webhookNew
ให้แก้ไขโค้ดดังนี้
// before
const functions = require('firebase-functions/v1');
exports.webhook = functions.https.onRequest((req, res) => {
res.send("Hello");
});
// after
const functions = require('firebase-functions/v1');
exports.webhookNew = functions.https.onRequest((req, res) => {
res.send("Hello");
});
จากนั้นเรียกใช้คำสั่งต่อไปนี้เพื่อทำให้ฟังก์ชันใหม่ใช้งานได้:
# Deploy new function called webhookNew firebase deploy --only functions:webhookNew # Wait until deployment is done; now both webhookNew and webhook are running # Delete webhook firebase functions:delete webhook
เปลี่ยนภูมิภาคของฟังก์ชัน
หากคุณเปลี่ยนภูมิภาคที่ระบุสำหรับ ที่จัดการกับการรับส่งข้อมูลที่ใช้งานจริง คุณจะป้องกันการสูญเสียเหตุการณ์ได้โดย โปรดปฏิบัติตามขั้นตอนเหล่านี้ตามลำดับ
- เปลี่ยนชื่อฟังก์ชัน แล้วเปลี่ยนภูมิภาคหรือภูมิภาคตามต้องการ
- ติดตั้งใช้งานฟังก์ชันที่เปลี่ยนชื่อ ซึ่งจะทําให้เรียกใช้โค้ดเดียวกันในทั้ง 2 ชุดของภูมิภาคชั่วคราว
- ลบฟังก์ชันก่อนหน้า
เช่น หากคุณมีฟังก์ชัน
ที่เรียกว่า webhook
ซึ่งขณะนี้อยู่ใน
ภูมิภาคของฟังก์ชันเริ่มต้นเป็น us-central1
และต้องการย้ายข้อมูลไปยัง
asia-northeast1
คุณต้องแก้ไขซอร์สโค้ดก่อนเพื่อเปลี่ยนชื่อ
อีกครั้ง และแก้ไขภูมิภาค
// before
const functions = require('firebase-functions/v1');
exports.webhook = functions
.https.onRequest((req, res) => {
res.send("Hello");
});
// after
const functions = require('firebase-functions/v1');
exports.webhookAsia = functions
.region('asia-northeast1')
.https.onRequest((req, res) => {
res.send("Hello");
});
จากนั้นทำให้ใช้งานได้โดยการเรียกใช้:
firebase deploy --only functions:webhookAsia
ตอนนี้มีฟังก์ชันที่เหมือนกัน 2 รายการที่ทำงานอยู่ โดย webhook
ทำงานใน us-central1
และ webhookAsia
ทำงานใน asia-northeast1
จากนั้นลบ webhook
firebase functions:delete webhook
ตอนนี้มีเพียงฟังก์ชันเดียว คือ webhookAsia
ซึ่งกำลังทำงานใน asia-northeast1
เปลี่ยนประเภททริกเกอร์ของฟังก์ชัน
เมื่อคุณพัฒนาการติดตั้งใช้งาน Cloud Functions for Firebase เมื่อเวลาผ่านไป คุณอาจ จำเป็นต้องเปลี่ยนประเภททริกเกอร์ของฟังก์ชันด้วยเหตุผลหลายประการ ตัวอย่างเช่น คุณอาจต้องเปลี่ยนจาก Firebase Realtime Database ประเภทใดประเภทหนึ่ง หรือ Cloud Firestore เป็นประเภทอื่น
คุณไม่สามารถเปลี่ยนประเภทเหตุการณ์ของฟังก์ชันโดยการเปลี่ยนแปลงฟังก์ชัน
ซอร์สโค้ดและการเรียกใช้ firebase deploy
หากต้องการหลีกเลี่ยงข้อผิดพลาด ให้เปลี่ยนประเภททริกเกอร์ของฟังก์ชันตามขั้นตอนต่อไปนี้
- แก้ไขซอร์สโค้ดให้รวมฟังก์ชันใหม่ที่มีประเภททริกเกอร์ที่ต้องการ
- ทำให้ฟังก์ชันใช้งานได้ ซึ่งจะทําให้ทั้งฟังก์ชันเก่าและใหม่ทํางานร่วมกันชั่วคราว
- ลบฟังก์ชันเก่าออกจากเวอร์ชันที่ใช้งานจริงอย่างชัดเจนโดยใช้ Firebase CLI
ตัวอย่างเช่น หากคุณมีฟังก์ชัน Node.js ที่ชื่อ objectChanged
ซึ่งมีฟังก์ชันเดิม
onChange
ประเภทเหตุการณ์ และคุณต้องการเปลี่ยนเป็น onFinalize
ให้เปลี่ยนชื่อก่อน
ฟังก์ชันแล้วแก้ไขให้มีประเภทเหตุการณ์ onFinalize
// before
const functions = require('firebase-functions/v1');
exports.objectChanged = functions.storage.object().onChange((object) => {
return console.log('File name is: ', object.name);
});
// after
const functions = require('firebase-functions/v1');
exports.objectFinalized = functions.storage.object().onFinalize((object) => {
return console.log('File name is: ', object.name);
});
จากนั้นเรียกใช้คำสั่งต่อไปนี้เพื่อสร้างฟังก์ชันใหม่ก่อนที่จะลบฟังก์ชันเก่า
# Create new function objectFinalized firebase deploy --only functions:objectFinalized # Wait until deployment is done; now both objectChanged and objectFinalized are running # Delete objectChanged firebase functions:delete objectChanged
ตั้งค่าตัวเลือกรันไทม์
Cloud Functions for Firebase ให้คุณเลือกตัวเลือกรันไทม์ เช่น เวอร์ชันรันไทม์ของ Node.js และระยะหมดเวลาต่อฟังก์ชัน การจัดสรรหน่วยความจำ และอินสแตนซ์ฟังก์ชันขั้นต่ำ/สูงสุด
แนวทางปฏิบัติแนะนำคือให้ตั้งค่าตัวเลือกเหล่านี้ (ยกเว้นเวอร์ชัน Node.js)
ออบเจ็กต์การกำหนดค่าภายในโค้ดฟังก์ชัน ออบเจ็กต์ RuntimeOptions
นี้เป็นแหล่งข้อมูลสำหรับตัวเลือกรันไทม์ของฟังก์ชัน และจะลบล้างตัวเลือกที่ตั้งค่าไว้ผ่านวิธีการอื่นๆ (เช่น ผ่านคอนโซล Google Cloud หรือ gcloud CLI)
หากเวิร์กโฟลว์การพัฒนาของคุณเกี่ยวข้องกับการตั้งค่าตัวเลือกรันไทม์ด้วยตนเองผ่านคอนโซล Google Cloud หรือ gcloud CLI และคุณไม่ต้องการให้ระบบลบล้างค่าเหล่านี้ในการทำให้ใช้งานได้แต่ละครั้ง ให้ตั้งค่าตัวเลือก preserveExternalChanges
เป็น true
เมื่อใช้ตัวเลือกนี้เป็น true
แล้ว Firebase จะรวมตัวเลือกรันไทม์ที่ตั้งค่าไว้ใน
ที่มีการตั้งค่าฟังก์ชันเวอร์ชันที่ใช้งานได้ในปัจจุบันด้วย
ลำดับความสำคัญต่อไปนี้
- มีการตั้งค่าตัวเลือกในโค้ดฟังก์ชัน: ลบล้างการเปลี่ยนแปลงภายนอก
- ตัวเลือกได้รับการตั้งค่าเป็น
RESET_VALUE
ในโค้ดฟังก์ชัน: ลบล้างการเปลี่ยนแปลงภายนอกด้วยค่าเริ่มต้น - ไม่ได้ตั้งค่าตัวเลือกในโค้ดฟังก์ชัน แต่ตั้งค่าไว้ในฟังก์ชันที่ใช้งานอยู่ในปัจจุบัน: ใช้ตัวเลือกที่ระบุไว้ในฟังก์ชันที่ใช้งานอยู่
เราไม่แนะนําให้ใช้ตัวเลือก preserveExternalChanges: true
ในสถานการณ์ส่วนใหญ่ เนื่องจากโค้ดของคุณจะไม่เป็นแหล่งข้อมูลทั้งหมดที่ถูกต้องสําหรับตัวเลือกรันไทม์ของฟังก์ชันอีกต่อไป หากคุณใช้ ให้ตรวจสอบคอนโซล Google Cloud หรือใช้ gcloud
CLI เพื่อดูการกำหนดค่าแบบเต็มของฟังก์ชัน
ตั้งค่าเวอร์ชัน Node.js
Firebase SDK สําหรับ Cloud Functions อนุญาตให้เลือกรันไทม์ Node.js คุณเลือกเรียกใช้ฟังก์ชันทั้งหมดในโปรเจ็กต์บนรันไทม์เท่านั้นได้ ที่สอดคล้องกับหนึ่งในเวอร์ชัน Node.js ที่สนับสนุนเหล่านี้:
- Node.js 20 (ตัวอย่าง)
- Node.js 18
- Node.js 16
- Node.js 14
วิธีตั้งค่าเวอร์ชัน Node.js
คุณสามารถตั้งค่าเวอร์ชันในช่อง engines
ในไฟล์ package.json
ที่สร้างขึ้นในไดเรกทอรี functions/
ในระหว่างการเริ่มต้น
เช่น หากต้องการใช้เฉพาะเวอร์ชัน 18 ให้แก้ไขบรรทัดนี้ใน package.json
"engines": {"node": "18"}
หากคุณใช้ตัวจัดการแพ็กเกจ Yarn หรือมีข้อกำหนดเฉพาะอื่นๆ สำหรับ
ฟิลด์ engines
คุณสามารถตั้งค่ารันไทม์ของ SDK Firebase ให้กับ Cloud Functions ได้ใน
firebase.json
แทน:
{
"functions": {
"runtime": "nodejs18" // or nodejs14, nodejs16 or nodejs20
}
}
CLI จะใช้ค่าที่ตั้งไว้ใน firebase.json
แทนค่าหรือช่วงที่คุณตั้งค่าแยกต่างหากใน package.json
อัปเกรดรันไทม์ของ Node.js
วิธีอัปเกรดรันไทม์ Node.js
- ตรวจสอบว่าโปรเจ็กต์อยู่ใน แพ็กเกจราคา Blaze
- ตรวจสอบว่าคุณใช้ Firebase CLI v11.18.0 ขึ้นไป
- เปลี่ยนค่า
engines
ในไฟล์package.json
ที่สร้างขึ้นในไดเรกทอรีfunctions/
ในระหว่างการเริ่มต้น ตัวอย่างเช่น ถ้าคุณอัปเกรดจากเวอร์ชัน 16 เป็นเวอร์ชัน 18 รายการ ควรมีลักษณะเช่นนี้:"engines": {"node": "18"}
- คุณทดสอบการเปลี่ยนแปลงโดยใช้ Firebase Local Emulator Suite หรือไม่ก็ได้
- ติดตั้งใช้งานฟังก์ชันทั้งหมดอีกครั้ง
ควบคุมลักษณะการปรับขนาด
โดยค่าเริ่มต้น Cloud Functions for Firebase จะปรับขนาดจำนวนอินสแตนซ์ที่ทำงานอยู่ตามจำนวนคำขอขาเข้า และอาจปรับขนาดให้เหลือ 0 อินสแตนซ์เมื่อการรับส่งข้อมูลลดลง อย่างไรก็ตาม หากแอปของคุณต้องการเวลาในการตอบสนองที่ลดลงและคุณต้องการจำกัดจำนวนการเริ่มต้นแบบเย็น คุณสามารถเปลี่ยนลักษณะการทำงานเริ่มต้นนี้ได้โดยการระบุจำนวนอินสแตนซ์คอนเทนเนอร์ขั้นต่ำที่จะเก็บไว้และพร้อมให้บริการคำขอ
ในทำนองเดียวกัน คุณสามารถตั้งค่าจำนวนสูงสุดเพื่อจำกัดการปรับขนาดของอินสแตนซ์ใน ตอบสนองต่อคำขอที่เข้ามาใหม่ ใช้การตั้งค่านี้เป็นวิธีควบคุมต้นทุนหรือจํากัดจํานวนการเชื่อมต่อกับบริการสนับสนุน เช่น ฐานข้อมูล
ลดจำนวน Cold Start
หากต้องการตั้งค่าจำนวนอินสแตนซ์ขั้นต่ำของฟังก์ชันในซอร์สโค้ด ให้ใช้วิธี runWith
เมธอดนี้จะยอมรับออบเจ็กต์ JSON ที่เป็นไปตามอินเทอร์เฟซ RuntimeOptions
ซึ่งกำหนดค่าสำหรับ minInstances
ตัวอย่างเช่น
ฟังก์ชันนี้จะกำหนดอินสแตนซ์อย่างน้อย 5 อินสแตนซ์เพื่อทำให้อุปกรณ์อุ่นอยู่เสมอ:
exports.getAutocompleteResponse = functions
.runWith({
// Keep 5 instances warm for this latency-critical function
minInstances: 5,
})
.https.onCall((data, context) => {
// Autocomplete a user's search term
});
ต่อไปนี้เป็นสิ่งที่ควรพิจารณาเมื่อตั้งค่าสำหรับ minInstances
- หาก Cloud Functions for Firebase ปรับขนาดแอปสูงกว่าการตั้งค่า
minInstances
คุณจะเห็น Cold Start เกิดขึ้นกับแต่ละอินสแตนซ์ที่สูงกว่าเกณฑ์นั้น - Cold Start จะส่งผลกระทบรุนแรงที่สุดกับแอปที่มีการรับส่งข้อมูลในปริมาณสูง หากแอปของคุณมีการเข้าชมที่เพิ่มขึ้นอย่างรวดเร็วและคุณตั้งค่า
minInstances
ให้สูงพอที่จะลดการเริ่มต้นแบบ Cold เมื่อมีการเข้าชมเพิ่มขึ้นแต่ละครั้ง คุณจะเห็นเวลาในการตอบสนองลดลงอย่างมาก สำหรับแอปที่มีการเข้าชมคงที่ Cold Start จะไม่ อาจส่งผลต่อประสิทธิภาพอย่างมาก การตั้งค่าอินสแตนซ์ขั้นต่ำอาจเหมาะสมสำหรับสภาพแวดล้อมการใช้งานจริง แต่ ที่ควรหลีกเลี่ยงในสภาพแวดล้อมการทดสอบ หากต้องการปรับสัดส่วนเป็น 0 ใน แต่ยังคงลด Cold Start ในโปรเจ็กต์ที่ใช้งานจริง ตั้งค่า
minInstances
ได้ตามตัวแปรสภาพแวดล้อมFIREBASE_CONFIG
ดังนี้// Get Firebase project id from `FIREBASE_CONFIG` environment variable const envProjectId = JSON.parse(process.env.FIREBASE_CONFIG).projectId; exports.renderProfilePage = functions .runWith({ // Keep 5 instances warm for this latency-critical function // in production only. Default to 0 for test projects. minInstances: envProjectId === "my-production-project" ? 5 : 0, }) .https.onRequest((req, res) => { // render some html });
จำกัดจำนวนอินสแตนซ์สูงสุดของฟังก์ชัน
หากต้องการตั้งค่าอินสแตนซ์สูงสุดในซอร์สโค้ดของฟังก์ชัน ให้ใช้วิธี runWith
เมธอดนี้จะยอมรับออบเจ็กต์ JSON ที่เป็นไปตามอินเทอร์เฟซ RuntimeOptions
ซึ่งกำหนดค่าสำหรับ maxInstances
ตัวอย่างเช่น ฟังก์ชันนี้จะกำหนดขีดจำกัดอินสแตนซ์ไว้ที่ 100 รายการเพื่อไม่ให้ฐานข้อมูลเดิมสมมติทำงานหนักเกินไป
exports.mirrorOrdersToLegacyDatabase = functions
.runWith({
// Legacy database only supports 100 simultaneous connections
maxInstances: 100,
})
.firestore.document("orders/{orderId}")
.onWrite((change, context) => {
// Connect to legacy database
});
หากปรับขนาดฟังก์ชัน HTTP จนถึงขีดจํากัด maxInstances
ระบบจะจัดคิวคําขอใหม่เป็นเวลา 30 วินาที จากนั้นจะปฏิเสธด้วยรหัสการตอบกลับ 429 Too Many Requests
หากไม่มีอินสแตนซ์พร้อมใช้งานภายในเวลาดังกล่าว
ดูข้อมูลเพิ่มเติมเกี่ยวกับแนวทางปฏิบัติแนะนำในการใช้การตั้งค่าอินสแตนซ์สูงสุดได้จากแนวทางปฏิบัติแนะนำในการใช้ maxInstances
ตั้งค่าการหมดเวลาและการจัดสรรหน่วยความจำ
ในบางกรณี ฟังก์ชันอาจมีข้อกำหนดพิเศษเป็นระยะเวลานาน หรือการจัดสรรหน่วยความจำในปริมาณมาก คุณตั้งค่าเหล่านี้ได้ในคอนโซล Google Cloud หรือในซอร์สโค้ดของฟังก์ชัน (Firebase เท่านั้น)
หากต้องการตั้งค่าการจัดสรรหน่วยความจำและระยะหมดเวลาในซอร์สโค้ดของฟังก์ชัน ให้ใช้
runWith
เปิดตัวพารามิเตอร์ Firebase SDK สำหรับ Cloud Functions 2.0.0 ตัวเลือกรันไทม์นี้ยอมรับ
ออบเจ็กต์ JSON ที่สอดคล้องกับ
RuntimeOptions
ซึ่งกำหนดค่าสำหรับ timeoutSeconds
และ memory
ตัวอย่างเช่น ฟังก์ชันพื้นที่เก็บข้อมูลนี้ใช้หน่วยความจำ 1 GB และหมดเวลาหลังจาก 300 วินาที
exports.convertLargeFile = functions
.runWith({
// Ensure the function has enough memory and time
// to process large files
timeoutSeconds: 300,
memory: "1GB",
})
.storage.object()
.onFinalize((object) => {
// Do some complicated things that take a lot of memory and time
});
ค่าสูงสุดสำหรับ timeoutSeconds
คือ 540
หรือ 9 นาที
จำนวนหน่วยความจำที่อนุญาตให้ฟังก์ชันหนึ่งๆ ใช้จะสอดคล้องกับ CPU ที่จัดสรรให้กับฟังก์ชันนั้นๆ ตามที่ระบุไว้ในรายการค่าที่ถูกต้องสำหรับ memory
ดังนี้
128MB
— 200MHz256MB
— 400MHz512MB
— 800MHz1GB
— 1.4 GHz2GB
- 2.4 GHz4GB
— 4.8 GHz8GB
— 4.8 GHz
วิธีตั้งค่าการจัดสรรหน่วยความจำและระยะหมดเวลาในคอนโซล Google Cloud
- ในคอนโซล Google Cloud ของ Google ให้เลือก Cloud Functions จากเมนูด้านซ้าย
- เลือกฟังก์ชันโดยคลิกที่ชื่อในรายการฟังก์ชัน
- คลิกไอคอนแก้ไขในเมนูด้านบน
- เลือกการจัดสรรหน่วยความจำจากเมนูแบบเลื่อนลงที่มีป้ายกำกับว่าหน่วยความจำที่จัดสรร
- คลิกเพิ่มเติมเพื่อแสดงตัวเลือกขั้นสูง แล้วป้อนจำนวนวินาทีในกล่องข้อความหมดเวลา
- คลิกบันทึกเพื่ออัปเดตฟังก์ชัน