คุณสามารถปรับใช้ ลบ และแก้ไขฟังก์ชันโดยใช้คำสั่ง Firebase CLI หรือโดยการตั้งค่าตัวเลือกรันไทม์ในซอร์สโค้ดของฟังก์ชันของคุณ
ปรับใช้ฟังก์ชัน
ในการปรับใช้ฟังก์ชัน ให้รันคำสั่ง Firebase CLI นี้:
firebase deploy --only functions
โดยค่าเริ่มต้น Firebase CLI จะปรับใช้ฟังก์ชันทั้งหมดภายใน index.js
พร้อมกัน หากโปรเจ็กต์ของคุณมีมากกว่า 5 ฟังก์ชัน เราขอแนะนำให้คุณใช้แฟล็ก --only
ที่มีชื่อฟังก์ชันเฉพาะเพื่อปรับใช้เฉพาะฟังก์ชันที่คุณแก้ไข การปรับใช้ฟังก์ชันเฉพาะ ด้วยวิธีนี้จะช่วยเพิ่มความเร็วในกระบวนการปรับใช้และช่วยให้คุณหลีกเลี่ยงการใช้งานโควตาการปรับใช้ ตัวอย่างเช่น:
firebase deploy --only functions:addMessage,functions:makeUppercase
เมื่อปรับใช้ฟังก์ชันจำนวนมาก คุณอาจเกินโควต้ามาตรฐานและได้รับข้อความแสดงข้อผิดพลาด HTTP 429 หรือ 500 ในการแก้ปัญหานี้ ให้ปรับใช้ฟังก์ชันในกลุ่มที่มีไม่เกิน 10 คน
ดู ข้อมูลอ้างอิง Firebase CLI สำหรับรายการคำสั่งทั้งหมดที่มี
โดยค่าเริ่มต้น Firebase CLI จะค้นหาซอร์สโค้ดใน functions/
โฟลเดอร์ หากต้องการ คุณสามารถ จัดระเบียบฟังก์ชัน ใน codebases หรือไฟล์หลายชุดได้
ลบฟังก์ชัน
คุณสามารถลบฟังก์ชันที่ปรับใช้ก่อนหน้านี้ด้วยวิธีเหล่านี้:
- อย่างชัดเจน ใน Firebase CLI ด้วย
functions:delete
- อย่างชัดเจน ใน Google Cloud Console
- โดย ปริยาย โดยการลบฟังก์ชันออกจาก
index.js
ก่อนทำการปรับใช้
การดำเนินการลบทั้งหมดจะแจ้งให้คุณยืนยันก่อนที่จะลบฟังก์ชันออกจากการผลิต
การลบฟังก์ชันที่ชัดเจนใน 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
parses index.js
และนำฟังก์ชันใดๆ ที่ถูกลบออกจากไฟล์ออกจากการผลิต
แก้ไขชื่อ ภูมิภาค หรือทริกเกอร์ของฟังก์ชัน
หากคุณกำลังเปลี่ยนชื่อหรือเปลี่ยนภูมิภาคหรือทริกเกอร์สำหรับฟังก์ชันที่จัดการปริมาณการใช้งานการผลิต ให้ทำตามขั้นตอนในส่วนนี้เพื่อหลีกเลี่ยงการสูญเสียเหตุการณ์ระหว่างการปรับเปลี่ยน ก่อนที่คุณจะทำตามขั้นตอนเหล่านี้ ก่อนอื่นตรวจสอบให้แน่ใจว่าฟังก์ชันของคุณเป็น idempotent เนื่องจากทั้งเวอร์ชันใหม่และเวอร์ชันเก่าของฟังก์ชันของคุณจะทำงานพร้อมกันระหว่างการเปลี่ยนแปลง
เปลี่ยนชื่อฟังก์ชัน
ในการเปลี่ยนชื่อฟังก์ชัน ให้สร้างเวอร์ชันที่เปลี่ยนชื่อใหม่ของฟังก์ชันใน index.js
แล้วรันคำสั่งการปรับใช้สองคำสั่งแยกกัน คำสั่งแรกปรับใช้ฟังก์ชันที่มีชื่อใหม่ และคำสั่งที่สองจะลบเวอร์ชันที่ปรับใช้ก่อนหน้านี้ ตัวอย่างเช่น หากคุณมีฟังก์ชันที่เรียกว่า webhook
ซึ่งคุณต้องการเปลี่ยนเป็น webhookNew
ให้แก้ไขโค้ดดังต่อไปนี้:
// before
const functions = require('firebase-functions');
exports.webhook = functions.https.onRequest((req, res) => {
res.send("Hello");
});
// after
const functions = require('firebase-functions');
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
เปลี่ยนขอบเขตหรือภูมิภาคของฟังก์ชัน
หากคุณกำลังเปลี่ยน ขอบเขต ที่ระบุสำหรับฟังก์ชันที่จัดการปริมาณการใช้งานจริง คุณสามารถป้องกันการสูญเสียเหตุการณ์โดยทำตามขั้นตอนเหล่านี้ตามลำดับ:
- เปลี่ยนชื่อฟังก์ชัน และเปลี่ยนภูมิภาคหรือภูมิภาคตามต้องการ
- ปรับใช้ฟังก์ชันที่เปลี่ยนชื่อ ซึ่งส่งผลให้มีการเรียกใช้โค้ดเดียวกันชั่วคราวในทั้งสองชุดของภูมิภาค
- ลบฟังก์ชันก่อนหน้า
ตัวอย่างเช่น หากคุณมีฟังก์ชันที่เรียกว่า webhook
ซึ่งขณะนี้อยู่ในขอบเขตฟังก์ชันเริ่มต้นของ us-central1
และคุณต้องการย้ายไปยัง asia-northeast1
คุณต้องแก้ไขซอร์สโค้ดของคุณเพื่อเปลี่ยนชื่อฟังก์ชันและแก้ไขพื้นที่ก่อน .
// before
const functions = require('firebase-functions');
exports.webhook = functions
.https.onRequest((req, res) => {
res.send("Hello");
});
// after
const functions = require('firebase-functions');
exports.webhookAsia = functions
.region('asia-northeast1')
.https.onRequest((req, res) => {
res.send("Hello");
});
จากนั้นปรับใช้โดยเรียกใช้:
firebase deploy --only functions:webhookAsia
ขณะนี้มีสองฟังก์ชันที่เหมือนกันที่ทำงานอยู่: webhook
กำลังทำงานใน us-central1
และ webhookAsia
กำลังทำงานใน asia-northeast1
จากนั้นลบ webhook
:
firebase functions:delete webhook
ขณะนี้มีฟังก์ชันเดียวคือ webhookAsia
ซึ่งทำงานใน asia-northeast1
เปลี่ยนประเภททริกเกอร์ของฟังก์ชัน
เมื่อคุณพัฒนาการใช้งาน Cloud Functions for Firebase เมื่อเวลาผ่านไป คุณอาจต้องเปลี่ยนประเภททริกเกอร์ของฟังก์ชันด้วยเหตุผลหลายประการ ตัวอย่างเช่น คุณอาจต้องการ:
- เปลี่ยนจากเหตุการณ์
onChange
ที่เก็บข้อมูลดั้งเดิมเป็นonFinalize
,onDelete
,onArchive
และonMetadataUpdate
(เรียนรู้เพิ่มเติมเกี่ยวกับสิ่งนี้ใน คู่มือการอัปเกรดเบต้าเป็น v1 หรือ v2 ) - เปลี่ยนจากเหตุการณ์ Firebase Realtime Database หรือ Cloud Firestore ประเภทหนึ่งไปเป็นอีกประเภทหนึ่ง เช่น เหตุการณ์
onWrite
ทั่วไปเป็นเหตุการณ์onCreate
แบบละเอียด
เป็นไปไม่ได้ที่จะเปลี่ยนประเภทเหตุการณ์ของฟังก์ชันโดยเพียงแค่เปลี่ยนซอร์สโค้ดและเรียกใช้ firebase deploy
เพื่อหลีกเลี่ยงข้อผิดพลาด เปลี่ยนประเภททริกเกอร์ของฟังก์ชันตามขั้นตอนนี้:
- แก้ไขซอร์สโค้ดเพื่อรวมฟังก์ชันใหม่กับประเภททริกเกอร์ที่ต้องการ
- ปรับใช้ฟังก์ชัน ซึ่งส่งผลให้มีการเรียกใช้ฟังก์ชันทั้งเก่าและใหม่ชั่วคราว
- ลบฟังก์ชันเก่าออกจากการใช้งานจริงอย่างชัดเจนโดยใช้ Firebase CLI
ตัวอย่างเช่น หากคุณมีฟังก์ชัน objectChanged
ที่มีเหตุการณ์ onChange
แบบเดิม และคุณต้องการเปลี่ยนเป็น onFinalize
ก่อนอื่นให้เปลี่ยนชื่อฟังก์ชันและแก้ไขเพื่อให้มีประเภทเหตุการณ์ onFinalize
// before
const functions = require('firebase-functions');
exports.objectChanged = functions.storage.object().onChange((object) => {
return console.log('File name is: ', object.name);
});
// after
const functions = require('firebase-functions');
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 เวอร์ชัน
Firebase SDK สำหรับ Cloud Functions 2.0.0 และสูงกว่าอนุญาตให้เลือกรันไทม์ Node.js คุณสามารถเลือกที่จะเรียกใช้ฟังก์ชันทั้งหมดในโปรเจ็กต์โดยเฉพาะบนสภาพแวดล้อมรันไทม์ที่สอดคล้องกับหนึ่งในเวอร์ชัน Node.js ที่รองรับเหล่านี้:
- Node.js 16
- Node.js 14
- Node.js 12
- Node.js 10
- Node.js 8 (เลิกใช้เมื่อวันที่ 8 มิถุนายน 2020) การปรับใช้ฟังก์ชันกับรันไทม์ Node.js 8 ถูกปิดใช้งานใน Firebase CLI เมื่อวันที่ 15 ธันวาคม 2020 การดำเนินการของฟังก์ชันที่ปรับใช้แล้วจะหยุดลงในอนาคต หากคุณได้ปรับใช้ฟังก์ชันกับรันไทม์ Node.js 8 เราขอแนะนำให้คุณ อัปเกรดเป็นรันไทม์ Node.js 16
วิธีตั้งค่าเวอร์ชัน Node.js:
ตั้งค่าเวอร์ชันในช่อง package.json
engines
สร้างขึ้นในไดเร็กทอรี functions/
ของคุณระหว่างการเริ่มต้น ตัวอย่างเช่น หากต้องการใช้เฉพาะเวอร์ชัน 16 ให้แก้ไขบรรทัดนี้ใน package.json
:
"engines": {"node": "16"}
ต้องระบุฟิลด์ engines
ต้อง ระบุหนึ่งในเวอร์ชัน Node.js ที่รองรับ เพื่อให้คุณปรับใช้และเรียกใช้ฟังก์ชันได้ firebase init functions
ในปัจจุบันตั้งค่าฟิลด์นี้เป็น 16
อัปเกรดรันไทม์ Node.js ของคุณ
วิธีอัปเกรดรันไทม์ Node.js ของคุณ:
- ตรวจสอบให้แน่ใจว่าโครงการของคุณอยู่ใน แผนการกำหนดราคา Blaze
- ตรวจสอบให้แน่ใจว่าคุณใช้ Firebase CLI v9.17.0 หรือใหม่กว่า
- เปลี่ยนค่า
package.json
engines
สร้างขึ้นในไดเร็กทอรีfunctions/
ของคุณในระหว่างการเริ่มต้น ตัวอย่างเช่น หากคุณกำลังอัปเกรดจากเวอร์ชัน 10 เป็นเวอร์ชัน 16 รายการควรมีลักษณะดังนี้:"engines": {"node": "16"}
- ทางเลือก ทดสอบการเปลี่ยนแปลงของคุณโดยใช้ Firebase Local Emulator Suite
- ปรับใช้ฟังก์ชันใหม่โดยใช้ Firebase CLI v9.17.0 หรือใหม่กว่า
ควบคุมพฤติกรรมการปรับขนาด
โดยค่าเริ่มต้น Cloud Functions สำหรับ Firebase จะปรับขนาดจำนวนอินสแตนซ์ที่ทำงานอยู่ตามจำนวนคำขอที่เข้ามา ซึ่งอาจลดขนาดลงเป็นศูนย์อินสแตนซ์ในช่วงเวลาที่การรับส่งข้อมูลลดลง อย่างไรก็ตาม หากแอปของคุณต้องการเวลาในการตอบสนองที่ลดลง และคุณต้องการจำกัดจำนวนการเริ่มโปรแกรมเย็น คุณสามารถเปลี่ยนการทำงานเริ่มต้นนี้ได้โดยระบุจำนวนอินสแตนซ์คอนเทนเนอร์ขั้นต่ำเพื่อให้อบอุ่นและพร้อมที่จะให้บริการตามคำขอ
ในทำนองเดียวกัน คุณสามารถกำหนดจำนวนสูงสุดเพื่อจำกัดขนาดของอินสแตนซ์เพื่อตอบสนองต่อคำขอที่เข้ามา ใช้การตั้งค่านี้เป็นวิธีควบคุมต้นทุนของคุณ หรือจำกัดจำนวนการเชื่อมต่อไปยังบริการสำรอง เช่น ฐานข้อมูล
ลดจำนวนการสตาร์ทเย็น
ในการตั้งค่าจำนวนอินสแตนซ์ขั้นต่ำสำหรับฟังก์ชันในซอร์สโค้ด ให้ใช้พารามิเตอร์ 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 สำหรับแต่ละอินสแตนซ์ที่สูงกว่าเกณฑ์นั้น - การสตาร์ทแบบเย็นมีผลรุนแรงที่สุดกับแอปที่มีการจราจรติดขัด หากแอปของคุณมีทราฟฟิกที่แหลมคม และคุณตั้งค่า
minInstances
สูงพอที่จะทำให้การเริ่มเย็นลงในแต่ละการเข้าชมที่เพิ่มขึ้น คุณจะเห็นเวลาแฝงที่ลดลงอย่างมาก สำหรับแอปที่มีปริมาณการใช้งานคงที่ การสตาร์ทแบบเย็นจะไม่ส่งผลกระทบอย่างรุนแรงต่อประสิทธิภาพการทำงาน การตั้งค่าอินสแตนซ์ขั้นต่ำอาจเหมาะสมสำหรับสภาพแวดล้อมการใช้งานจริง แต่โดยปกติควรหลีกเลี่ยงในสภาพแวดล้อมการทดสอบ หากต้องการปรับขนาดเป็นศูนย์ในโปรเจ็กต์ทดสอบของคุณแต่ยังคงลดการเริ่มเย็นในโปรเจ็กต์ที่ใช้งานจริงของคุณ คุณสามารถตั้งค่า
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 Console หรือในซอร์สโค้ดของฟังก์ชัน (Firebase เท่านั้น)
ในการตั้งค่าการจัดสรรหน่วยความจำและการหมดเวลาในซอร์สโค้ดของฟังก์ชัน ให้ใช้พารามิเตอร์ runWith
ที่แนะนำใน Firebase SDK สำหรับ Cloud Functions 2.0.0 ตัวเลือกรันไทม์นี้ยอมรับอ็อบเจ็กต์ JSON ที่สอดคล้องกับอินเทอร์เฟซ RuntimeOptions
ซึ่งกำหนดค่าสำหรับ timeoutSeconds
และ memory
ตัวอย่างเช่น ฟังก์ชันการจัดเก็บข้อมูลนี้ใช้หน่วยความจำ 1GB และหมดเวลาหลังจาก 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
— 200MHz -
256MB
— 400MHz -
512MB
— 800MHz -
1GB
— 1.4 GHz -
2GB
— 2.4 GHz -
4GB
— 4.8 GHz -
8GB
— 4.8 GHz
ในการตั้งค่าการจัดสรรหน่วยความจำและการหมดเวลาใน Google Cloud Console:
- ใน Google Google Cloud Console ให้เลือก Cloud Functions จากเมนูด้านซ้าย
- เลือกฟังก์ชันโดยคลิกที่ชื่อในรายการฟังก์ชัน
- คลิกไอคอน แก้ไข ในเมนูด้านบน
- เลือกการจัดสรรหน่วยความจำจากเมนูแบบเลื่อนลงที่ระบุว่า หน่วยความจำที่จัดสรร
- คลิก เพิ่มเติม เพื่อแสดงตัวเลือกขั้นสูง และป้อนจำนวนวินาทีในกล่องข้อความ หมดเวลา
- คลิก บันทึก เพื่ออัปเดตฟังก์ชัน