โดยส่วนใหญ่แล้ว คุณจะต้องกำหนดค่าเพิ่มเติมสำหรับฟังก์ชัน เช่น คีย์ API ของบุคคลที่สามหรือการตั้งค่าที่ปรับได้ Firebase SDK สำหรับ Cloud Functions มีการกำหนดค่าสภาพแวดล้อมในตัวเพื่อให้จัดเก็บและเรียกข้อมูลประเภทนี้สำหรับโปรเจ็กต์ของคุณได้ง่าย
คุณสามารถเลือกตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้
- การกำหนดค่าแบบพารามิเตอร์ (แนะนําสําหรับสถานการณ์ส่วนใหญ่) ซึ่งจะให้การกำหนดค่าสภาพแวดล้อมที่มีการพิมพ์อย่างเข้มงวด พร้อมพารามิเตอร์ที่ได้รับการตรวจสอบในเวลาที่ทำการติดตั้งใช้งาน ซึ่ง จะช่วยป้องกันข้อผิดพลาดและลดความซับซ้อนในการแก้ไขข้อบกพร่อง
- การกำหนดค่าตัวแปรสภาพแวดล้อมตามไฟล์ ในวิธีนี้ คุณจะต้องสร้างไฟล์ dotenv ด้วยตนเองเพื่อโหลด ตัวแปรสภาพแวดล้อม
สําหรับกรณีการใช้งานส่วนใหญ่ เราขอแนะนําให้ใช้การกําหนดค่าแบบพารามิเตอร์ แนวทางนี้ ทำให้ค่าการกำหนดค่าพร้อมใช้งานทั้งในเวลาที่รันไทม์และเวลาที่ทำการติดตั้งใช้งาน และ การติดตั้งใช้งานจะถูกบล็อกจนกว่าพารามิเตอร์ทั้งหมดจะมีค่าที่ถูกต้อง ในทางกลับกัน การกำหนดค่าด้วยตัวแปรสภาพแวดล้อมจะไม่พร้อมใช้งานในเวลาที่ทำการ Deploy
การกำหนดค่าที่มีพารามิเตอร์
Cloud Functions for Firebase มีอินเทอร์เฟซสําหรับการกําหนดพารามิเตอร์การกําหนดค่า ภายในโค้ดเบสของคุณ ค่าของพารามิเตอร์เหล่านี้จะพร้อมใช้งานทั้งในระหว่างการติดตั้งใช้งานฟังก์ชัน เมื่อตั้งค่าตัวเลือกการติดตั้งใช้งานและรันไทม์ และในระหว่างการดำเนินการ ซึ่งหมายความว่า CLI จะบล็อกการติดตั้งใช้งาน เว้นแต่พารามิเตอร์ทั้งหมดจะมีค่าที่ถูกต้อง
หากต้องการกำหนดพารามิเตอร์ในโค้ด ให้ทำตามรูปแบบนี้
const functions = require('firebase-functions/v1');
const { defineInt, defineString } = require('firebase-functions/params');
// Define some parameters
const minInstancesConfig = defineInt('HELLO_WORLD_MININSTANCES');
const welcomeMessage = defineString('WELCOME_MESSAGE');
// To use configured parameters inside the config for a function, provide them
// directly. To use them at runtime, call .value() on them.
export const helloWorld = functions.runWith({ minInstances: minInstancesConfig}).https.onRequest(
(req, res) => {
res.send(`${welcomeMessage.value()}! I am a function.`);
}
);
เมื่อติดตั้งใช้งานฟังก์ชันที่มีตัวแปรการกำหนดค่าแบบพารามิเตอร์
Firebase CLI จะพยายามโหลดค่าจากไฟล์ .env ในเครื่องก่อน หากไม่มีอยู่ในไฟล์เหล่านั้นและไม่ได้ตั้งค่า default
ไว้ CLI จะแจ้งให้ป้อนค่าระหว่างการติดตั้งใช้งาน จากนั้นจะบันทึกค่าเหล่านั้นลงในไฟล์ .env
โดยอัตโนมัติซึ่งมีชื่อว่า .env.<project_ID>
ในไดเรกทอรี functions/
$ firebase deploy
i functions: preparing codebase default for deployment
? Enter a string value for ENVIRONMENT: prod
i functions: Writing new parameter values to disk: .env.projectId
…
$ firebase deploy
i functions: Loaded environment variables from .env.projectId
การเพิ่มไฟล์ .env.<project_ID>
ที่สร้างขึ้นลงในการควบคุมเวอร์ชันอาจมีประโยชน์ ทั้งนี้ขึ้นอยู่กับเวิร์กโฟลว์การพัฒนา
การใช้พารามิเตอร์ในขอบเขตส่วนกลาง
ในระหว่างการติดตั้งใช้งาน ระบบจะโหลดและตรวจสอบโค้ดฟังก์ชันก่อนที่พารามิเตอร์จะมีค่าจริง
ซึ่งหมายความว่าการดึงค่าพารามิเตอร์ในระหว่าง
ขอบเขตส่วนกลางจะทําให้การติดตั้งใช้งานล้มเหลว สําหรับกรณีที่คุณต้องการใช้พารามิเตอร์เพื่อเริ่มต้นค่าส่วนกลาง ให้ใช้การเรียกกลับการเริ่มต้น
onInit()
โดยการเรียกกลับนี้จะทํางานก่อนฟังก์ชันใดๆ ที่ทํางานในเวอร์ชันที่ใช้งานจริง แต่จะไม่เรียกใช้ในระหว่างเวลาการติดตั้งใช้งาน ดังนั้นจึงเป็นที่ที่ปลอดภัยในการเข้าถึงค่าของพารามิเตอร์
const { GoogleGenerativeAI } = require('@google/generative-ai');
const { defineSecret } = require('firebase-functions/params');
const { onInit } = require('firebase-functions/v1');
const apiKey = defineSecret('GOOGLE_API_KEY');
let genAI;
onInit(() => {
genAI = new GoogleGenerativeAI(apiKey.value());
})
กำหนดค่าลักษณะการทำงานของ CLI
คุณกำหนดค่าพารามิเตอร์ได้ด้วยOptions
ออบเจ็กต์ที่ควบคุมวิธีที่ CLI
จะแจ้งให้ป้อนค่า ตัวอย่างต่อไปนี้จะตั้งค่าตัวเลือกเพื่อตรวจสอบรูปแบบของหมายเลขโทรศัพท์ เพื่อให้ตัวเลือกการเลือกที่เรียบง่าย และเพื่อป้อนตัวเลือกการเลือกโดยอัตโนมัติจากโปรเจ็กต์ Firebase
const { defineString } = require('firebase-functions/params');
const welcomeMessage = defineString('WELCOME_MESSAGE', {default: 'Hello World',
description: 'The greeting that is returned to the caller of this function'});
const onlyPhoneNumbers = defineString('PHONE_NUMBER', {input: {text:
{validationRegex: /\d{3}-\d{3}-\d{4}/, validationErrorMessage: "Please enter
a phone number in the format XXX-YYY-ZZZZ"}}});
const selectedOption = defineString('PARITY', {input: {select: {options:
[{value: "odd"}, {value: "even"}]}}})
const storageBucket = defineString('BUCKET', {input: {resource: {type:
"storage.googleapis.com/Bucket"}}, description: "This will automatically
populate the selector field with the deploying Cloud Project’s
storage buckets"})
ประเภทพารามิเตอร์
การกำหนดค่าแบบพารามิเตอร์จะให้การพิมพ์ที่รัดกุมสำหรับค่าพารามิเตอร์ และยังรองรับข้อมูลลับจาก Secret Manager ของ Cloud ด้วย ประเภทที่รองรับมีดังนี้
- ข้อมูลลับ
- สตริง
- บูลีน
- จำนวนเต็ม
- ทศนิยม
ค่าและนิพจน์ของพารามิเตอร์
Firebase จะประเมินพารามิเตอร์ทั้งในเวลาที่ทำการติดตั้งใช้งานและขณะที่ฟังก์ชัน กำลังดำเนินการ เนื่องจากสภาพแวดล้อมคู่ดังกล่าว คุณจึงต้องระมัดระวังเป็นพิเศษเมื่อ เปรียบเทียบค่าพารามิเตอร์ และเมื่อใช้ค่าเหล่านั้นเพื่อตั้งค่าตัวเลือกขณะรันไทม์สำหรับฟังก์ชัน
หากต้องการส่งพารามิเตอร์ไปยังฟังก์ชันเป็นตัวเลือกขณะรันไทม์ ให้ส่งพารามิเตอร์โดยตรงดังนี้
const functions = require('firebase-functions/v1');
const { defineInt} = require('firebase-functions/params');
const minInstancesConfig = defineInt('HELLO\_WORLD\_MININSTANCES');
export const helloWorld = functions.runWith({ minInstances: minInstancesConfig}).https.onRequest(
(req, res) => {
//…
นอกจากนี้ หากต้องการเปรียบเทียบกับพารามิเตอร์เพื่อดูว่าควรเลือกตัวเลือกใด คุณจะต้องใช้ตัวเปรียบเทียบในตัวแทนการตรวจสอบค่า
const functions = require('firebase-functions/v1');
const { defineBool } = require('firebase-functions/params');
const environment = params.defineString(‘ENVIRONMENT’, {default: ‘dev’});
// use built-in comparators
const minInstancesConfig =environment.equals('PRODUCTION').thenElse(10, 1);
export const helloWorld = functions.runWith({ minInstances: minInstancesConfig}).https.onRequest(
(req, res) => {
//…
พารามิเตอร์และนิพจน์พารามิเตอร์ที่ใช้เฉพาะในรันไทม์จะเข้าถึงได้ด้วยฟังก์ชัน value
ดังนี้
const functions = require('firebase-functions/v1');
const { defineString } = require('firebase-functions/params');
const welcomeMessage = defineString('WELCOME_MESSAGE');
// To use configured parameters inside the config for a function, provide them
// directly. To use them at runtime, call .value() on them.
export const helloWorld = functions.https.onRequest(
(req, res) => {
res.send(`${welcomeMessage.value()}! I am a function.`);
}
);
พารามิเตอร์ในตัว
Cloud Functions SDK มีพารามิเตอร์ที่กำหนดไว้ล่วงหน้า 3 รายการ ซึ่งพร้อมใช้งานจากแพ็กเกจย่อย firebase-functions/params
projectID
- โปรเจ็กต์ระบบคลาวด์ที่ฟังก์ชันทำงานอยู่databaseURL
- URL ของอินสแตนซ์ Realtime Database ที่เชื่อมโยง กับฟังก์ชัน (หากเปิดใช้ในโปรเจ็กต์ Firebase)storageBucket
- ที่เก็บข้อมูล Cloud Storage ที่เชื่อมโยงกับฟังก์ชัน (หากเปิดใช้ในโปรเจ็กต์ Firebase)
ฟังก์ชันเหล่านี้ทำงานเหมือนพารามิเตอร์สตริงที่ผู้ใช้กำหนดในทุกด้าน ยกเว้นว่าเนื่องจากค่าของฟังก์ชันเหล่านี้เป็นค่าที่ Firebase CLI ทราบอยู่เสมอ ระบบจึงจะไม่แจ้งให้ป้อนค่าเมื่อทำการติดตั้งใช้งานและจะไม่บันทึกค่าลงในไฟล์ .env
พารามิเตอร์ลับ
พารามิเตอร์ประเภท Secret
ซึ่งกำหนดโดยใช้ defineSecret()
แสดงถึงพารามิเตอร์สตริง
ที่มีค่าจัดเก็บไว้ใน Secret Manager ของ Cloud พารามิเตอร์ลับจะตรวจสอบว่ามีอยู่ใน Secret Manager ของ Cloud หรือไม่ และจะแจ้งให้ป้อนค่าของข้อมูลลับใหม่แบบอินเทอร์แอกทีฟในระหว่างการติดตั้งใช้งาน แทนที่จะตรวจสอบกับไฟล์ .env
ในเครื่องและเขียนค่าใหม่ลงในไฟล์หากไม่มี
พารามิเตอร์ลับที่กำหนดด้วยวิธีนี้ต้องเชื่อมโยงกับฟังก์ชันแต่ละรายการที่ ควรมีสิทธิ์เข้าถึงพารามิเตอร์เหล่านั้น
const functions = require('firebase-functions/v1');
const { defineSecret } = require('firebase-functions/params');
const discordApiKey = defineSecret('DISCORD_API_KEY');
export const postToDiscord = functions.runWith({ secrets: [discordApiKey] }).https.onRequest(
(req, res) => {
const apiKey = discordApiKey.value();
//…
เนื่องจากระบบจะซ่อนค่าของข้อมูลลับจนกว่าจะมีการเรียกใช้ฟังก์ชัน คุณจึงใช้ค่าเหล่านั้นขณะกำหนดค่าฟังก์ชันไม่ได้
ตัวแปรสภาพแวดล้อม
Cloud Functions for Firebase รองรับรูปแบบไฟล์
dotenv
สำหรับการโหลดตัวแปรสภาพแวดล้อมที่ระบุไว้ในไฟล์ .env
ไปยังรันไทม์ของแอปพลิเคชัน เมื่อติดตั้งใช้งานแล้ว คุณจะอ่านตัวแปรสภาพแวดล้อมได้ผ่านอินเทอร์เฟซ
process.env
หากต้องการกำหนดค่าสภาพแวดล้อมด้วยวิธีนี้ ให้สร้างไฟล์ .env
ในโปรเจ็กต์
เพิ่มตัวแปรที่ต้องการ แล้วทำการติดตั้งใช้งาน
สร้างไฟล์
.env
ในไดเรกทอรีfunctions/
ดังนี้# Directory layout: # my-project/ # firebase.json # functions/ # .env # package.json # index.js
เปิด
.env
ไฟล์เพื่อแก้ไข แล้วเพิ่มคีย์ที่ต้องการ เช่นPLANET=Earth AUDIENCE=Humans
ทําให้ฟังก์ชันใช้งานได้และยืนยันว่าระบบโหลดตัวแปรสภาพแวดล้อมแล้ว
firebase deploy --only functions # ... # i functions: Loaded environment variables from .env. # ...
เมื่อติดตั้งใช้งานตัวแปรสภาพแวดล้อมที่กําหนดเองแล้ว
โค้ดฟังก์ชันจะเข้าถึงตัวแปรเหล่านั้นได้ด้วยไวยากรณ์
process.env
// Responds with "Hello Earth and Humans"
exports.hello = functions.https.onRequest((request, response) => {
response.send(`Hello ${process.env.PLANET} and ${process.env.AUDIENCE}`);
});
การติดตั้งใช้งานตัวแปรสภาพแวดล้อมหลายชุด
หากต้องการตัวแปรสภาพแวดล้อมชุดอื่นสำหรับโปรเจ็กต์ Firebase (เช่น การทดสอบเทียบกับการใช้งานจริง) ให้สร้างไฟล์ .env.<project or
alias>
แล้วเขียนตัวแปรสภาพแวดล้อมเฉพาะโปรเจ็กต์ไว้ในนั้น ตัวแปรสภาพแวดล้อมจากไฟล์ .env
และไฟล์ .env
เฉพาะโปรเจ็กต์ (หากมี) จะรวมอยู่ในฟังก์ชันที่ใช้งานทั้งหมด
เช่น โปรเจ็กต์อาจมีไฟล์ 3 ไฟล์ต่อไปนี้ซึ่งมีค่าที่แตกต่างกันเล็กน้อย สำหรับการพัฒนาและการใช้งานจริง
.env
|
.env.dev
|
.env.prod
|
PLANET=Earth
AUDIENCE=Humans |
AUDIENCE=Dev Humans | AUDIENCE=Prod Humans |
ค่าในไฟล์แยกเหล่านั้นจะทำให้ชุดตัวแปรสภาพแวดล้อม ที่ติดตั้งใช้งานกับฟังก์ชันแตกต่างกันไปตามโปรเจ็กต์เป้าหมาย
$ firebase use dev
$ firebase deploy --only functions
i functions: Loaded environment variables from .env, .env.dev.
# Deploys functions with following user-defined environment variables:
# PLANET=Earth
# AUDIENCE=Dev Humans
$ firebase use prod
$ firebase deploy --only functions
i functions: Loaded environment variables from .env, .env.prod.
# Deploys functions with following user-defined environment variables:
# PLANET=Earth
# AUDIENCE=Prod Humans
ตัวแปรสภาพแวดล้อมที่สงวนไว้
คีย์ตัวแปรสภาพแวดล้อมบางรายการสงวนไว้สำหรับการใช้งานภายใน อย่าใช้คีย์ใดๆ ต่อไปนี้ในไฟล์ .env
- คีย์ทั้งหมดที่ขึ้นต้นด้วย X_GOOGLE_
- คีย์ทั้งหมดที่ขึ้นต้นด้วย EXT_
- คีย์ทั้งหมดที่ขึ้นต้นด้วย FIREBASE_
- แป้นใดก็ได้จากรายการต่อไปนี้
- CLOUD_RUNTIME_CONFIG
- ENTRY_POINT
- GCP_PROJECT
- GCLOUD_PROJECT
- GOOGLE_CLOUD_PROJECT
- FUNCTION_TRIGGER_TYPE
- FUNCTION_NAME
- FUNCTION_MEMORY_MB
- FUNCTION_TIMEOUT_SEC
- FUNCTION_IDENTITY
- FUNCTION_REGION
- FUNCTION_TARGET
- FUNCTION_SIGNATURE_TYPE
- K_SERVICE
- K_REVISION
- PORT
- K_CONFIGURATION
จัดเก็บและเข้าถึงข้อมูลการกำหนดค่าที่ละเอียดอ่อน
ตัวแปรสภาพแวดล้อมที่จัดเก็บไว้ในไฟล์ .env
สามารถใช้สำหรับการกำหนดค่าฟังก์ชันได้ แต่คุณไม่ควรพิจารณาว่าตัวแปรเหล่านั้นเป็นวิธีที่ปลอดภัยในการจัดเก็บข้อมูลที่ละเอียดอ่อน เช่น ข้อมูลเข้าสู่ระบบของฐานข้อมูลหรือคีย์ API ซึ่งมีความสำคัญอย่างยิ่ง
หากคุณเช็คอินไฟล์ .env
ไปยังการควบคุมแหล่งที่มา
Cloud Functions for Firebase ผสานรวมกับ Google Cloud Secret Manager เพื่อช่วยคุณจัดเก็บข้อมูลการกำหนดค่าที่ละเอียดอ่อน บริการที่เข้ารหัสนี้จะจัดเก็บค่าการกำหนดค่าอย่างปลอดภัย ขณะเดียวกันก็ยังช่วยให้เข้าถึงจากฟังก์ชันของคุณได้ง่ายเมื่อจำเป็น
สร้างและใช้ข้อมูลลับ
หากต้องการสร้างข้อมูลลับ ให้ใช้ Firebase CLI
วิธีสร้างและใช้ข้อมูลลับ
เรียกใช้คำสั่งต่อไปนี้จากรูทของไดเรกทอรีโปรเจ็กต์ในเครื่อง
firebase functions:secrets:set SECRET_NAME
ป้อนค่าสำหรับ SECRET_NAME
CLI จะแสดงข้อความว่าดำเนินการสำเร็จและเตือนว่าคุณต้องติดตั้งใช้งานฟังก์ชัน เพื่อให้การเปลี่ยนแปลงมีผล
ก่อนที่จะติดตั้งใช้งาน โปรดตรวจสอบว่าโค้ดฟังก์ชันอนุญาตให้ฟังก์ชันเข้าถึงข้อมูลลับโดยใช้พารามิเตอร์
runWith
exports.processPayment = functions // Make the secret available to this function .runWith({ secrets: ["SECRET_NAME"] }) .onCall((data, context) => { const myBillingService = initializeBillingService( // reference the secret value process.env.SECRET_NAME ); // Process the payment });
ทำให้ Cloud Functions ใช้งานได้
firebase deploy --only functions
ตอนนี้คุณจะเข้าถึงได้เหมือนกับตัวแปรสภาพแวดล้อมอื่นๆ
ในทางกลับกัน หากฟังก์ชันอื่นที่ไม่ได้ระบุข้อมูลลับใน
runWith
พยายามเข้าถึงข้อมูลลับ ฟังก์ชันนั้นจะได้รับค่าที่ไม่ได้กำหนด
exports.anotherEndpoint = functions.https.onRequest((request, response) => {
response.send(`The secret API key is ${process.env.SECRET_NAME}`);
// responds with "The secret API key is undefined" because the `runWith` parameter is missing
});
เมื่อฟังก์ชันได้รับการติดตั้งใช้งานแล้ว ฟังก์ชันจะมีสิทธิ์เข้าถึงค่าลับ เฉพาะฟังก์ชันที่มีการระบุลับในพารามิเตอร์ runWith
เท่านั้นที่จะมีสิทธิ์เข้าถึงลับนั้นเป็นตัวแปรสภาพแวดล้อม
ซึ่งจะช่วยให้คุณมั่นใจได้ว่า
ค่าของข้อมูลลับจะพร้อมใช้งานเฉพาะในที่ที่จำเป็นเท่านั้น ซึ่งจะช่วยลดความเสี่ยงในการ
เปิดเผยข้อมูลลับโดยไม่ตั้งใจ
การจัดการข้อมูลลับ
ใช้ Firebase CLI เพื่อจัดการข้อมูลลับ ขณะจัดการข้อมูลลับด้วยวิธีนี้ โปรดทราบว่าการเปลี่ยนแปลง CLI บางอย่างกำหนดให้คุณต้องแก้ไขและ/หรือนำฟังก์ชันที่เชื่อมโยงกลับมาใช้งาน กล่าวโดยละเอียดคือ
- เมื่อใดก็ตามที่คุณตั้งค่าใหม่สำหรับข้อมูลลับ คุณต้องปรับใช้ฟังก์ชันทั้งหมดที่อ้างอิงข้อมูลลับนั้นอีกครั้งเพื่อให้ฟังก์ชันใช้ค่าล่าสุด
- หากลบข้อมูลลับ ให้ตรวจสอบว่าไม่มีฟังก์ชันที่ใช้งานจริง อ้างอิงข้อมูลลับนั้น ฟังก์ชันที่ใช้ค่าลับที่ถูกลบไปแล้วจะทำงานไม่สำเร็จโดยไม่มีการแจ้งเตือน
ข้อมูลสรุปเกี่ยวกับFirebaseคำสั่ง CLI สำหรับการจัดการลับมีดังนี้
# Change the value of an existing secret firebase functions:secrets:set SECRET_NAME # View the value of a secret functions:secrets:access SECRET_NAME # Destroy a secret functions:secrets:destroy SECRET_NAME # View all secret versions and their state functions:secrets:get SECRET_NAME # Automatically clean up all secrets that aren't referenced by any of your functions functions:secrets:prune
สำหรับคำสั่ง access
และ destroy
คุณสามารถระบุพารามิเตอร์เวอร์ชันที่ไม่บังคับ
เพื่อจัดการเวอร์ชันที่เฉพาะเจาะจงได้ เช่น
functions:secrets:access SECRET_NAME[@VERSION]
ดูข้อมูลเพิ่มเติมเกี่ยวกับการดำเนินการเหล่านี้ได้โดยส่ง -h
พร้อมคำสั่งเพื่อดูความช่วยเหลือของ CLI
วิธีเรียกเก็บเงินสำหรับข้อมูลลับ
Secret Manager อนุญาตให้มีเวอร์ชัน ข้อมูลลับที่ใช้งานอยู่ 6 รายการโดยไม่มีค่าใช้จ่าย ซึ่งหมายความว่าคุณสามารถมี Secret 6 รายการต่อเดือนในโปรเจ็กต์ Firebase ได้โดยไม่มีค่าใช้จ่าย
โดยค่าเริ่มต้น Firebase CLI จะพยายามทำลายเวอร์ชันลับที่ไม่ได้ใช้โดยอัตโนมัติ
ในกรณีที่เหมาะสม เช่น เมื่อคุณติดตั้งใช้งานฟังก์ชันที่มีเวอร์ชันใหม่
ของข้อมูลลับ นอกจากนี้ คุณยังล้างข้อมูลลับที่ไม่ได้ใช้ได้อย่างรวดเร็วโดยใช้
functions:secrets:destroy
และ functions:secrets:prune
Secret Manager อนุญาตให้ดำเนินการเข้าถึงรายเดือนที่ยังไม่ได้เรียกเก็บเงิน 10,000 รายการใน
Secret อินสแตนซ์ฟังก์ชันจะอ่านเฉพาะข้อมูลลับที่ระบุไว้ในrunWith
พารามิเตอร์ทุกครั้งที่เริ่มระบบแบบเย็น หากคุณมีอินสแตนซ์ฟังก์ชันจำนวนมาก
ที่อ่านข้อมูลลับจำนวนมาก โปรเจ็กต์อาจใช้เกินโควต้านี้ ซึ่งในกรณีนี้
ระบบจะเรียกเก็บเงิน $0.03 ต่อการดำเนินการเข้าถึง 10,000 รายการ
ดูข้อมูลเพิ่มเติมได้ที่Secret Manager ราคา
การรองรับโปรแกรมจำลอง
การกำหนดค่าสภาพแวดล้อมด้วย dotenv ออกแบบมาเพื่อทำงานร่วมกับCloud Functionsโปรแกรมจำลองในเครื่อง
เมื่อใช้Cloud Functionsโปรแกรมจำลองในเครื่อง คุณจะลบล้างตัวแปรสภาพแวดล้อม
ของโปรเจ็กต์ได้โดยการตั้งค่าไฟล์ .env.local
เนื้อหาของ
.env.local
มีผลเหนือกว่า .env
และไฟล์ .env
ของโปรเจ็กต์
เช่น โปรเจ็กต์อาจมีไฟล์ 3 ไฟล์ต่อไปนี้ซึ่งมีค่าที่แตกต่างกันเล็กน้อยสำหรับการพัฒนาและการทดสอบในเครื่อง
.env
|
.env.dev
|
.env.local
|
PLANET=Earth
AUDIENCE=Humans |
AUDIENCE=Dev Humans | AUDIENCE=Local Humans |
เมื่อเริ่มต้นในบริบทของเครื่องจำลองในเครื่อง เครื่องจำลองจะโหลดตัวแปรสภาพแวดล้อม ตามที่แสดง
$ firebase emulators:start
i emulators: Starting emulators: functions
# Starts emulator with following environment variables:
# PLANET=Earth
# AUDIENCE=Local Humans
ข้อมูลลับและข้อมูลเข้าสู่ระบบในโปรแกรมจำลอง Cloud Functions
Cloud Functionsโปรแกรมจำลองรองรับการใช้ข้อมูลลับเพื่อ จัดเก็บและเข้าถึงข้อมูลการกำหนดค่าที่ละเอียดอ่อน โดยค่าเริ่มต้น โปรแกรมจำลองจะพยายามเข้าถึงข้อมูลลับของเวอร์ชันที่ใช้งานจริงโดยใช้ข้อมูลเข้าสู่ระบบเริ่มต้นของแอปพลิเคชัน ในบางสถานการณ์ เช่น สภาพแวดล้อม CI โปรแกรมจำลองอาจเข้าถึงค่าลับไม่ได้เนื่องจากข้อจำกัดด้านสิทธิ์
คุณสามารถ
ลบล้างค่าลับได้โดยการตั้งค่าไฟล์ .secret.local
เช่นเดียวกับCloud Functionsที่รองรับตัวแปรสภาพแวดล้อม ซึ่งจะช่วยให้คุณทดสอบฟังก์ชันในเครื่องได้อย่างง่ายดาย โดยเฉพาะในกรณีที่คุณไม่มีสิทธิ์เข้าถึงค่าลับ
การย้ายข้อมูลจากการกำหนดค่าสภาพแวดล้อม
หากคุณใช้การกำหนดค่าสภาพแวดล้อมกับ functions.config
คุณ
ต้องย้ายข้อมูลการกำหนดค่าที่มีอยู่เป็นตัวแปรสภาพแวดล้อม (ในรูปแบบ dotenv) ก่อน
สิ้นปี 2025 ซึ่งเป็นช่วงเวลาที่functions.config
จะหยุดให้บริการ
Firebase CLI มีคำสั่งส่งออกที่แสดงผลการกำหนดค่าของแต่ละนามแฝงหรือโปรเจ็กต์ที่แสดงในไฟล์ .firebaserc
ของไดเรกทอรี (ในตัวอย่างด้านล่างคือ local
, dev
และ prod
) เป็นไฟล์ .env
หากต้องการย้ายข้อมูล ให้ส่งออกการกำหนดค่าสภาพแวดล้อมที่มีอยู่โดยใช้คำสั่ง firebase functions:config:export
ดังนี้
firebase functions:config:export i Importing configs from projects: [project-0, project-1] ⚠ The following configs keys could not be exported as environment variables: ⚠ project-0 (dev): 1foo.a => 1FOO\_A (Key 1FOO\_A must start with an uppercase ASCII letter or underscore, and then consist of uppercase ASCII letters, digits, and underscores.) Enter a PREFIX to rename invalid environment variable keys: CONFIG\_ ✔ Wrote functions/.env.prod ✔ Wrote functions/.env.dev ✔ Wrote functions/.env.local ✔ Wrote functions/.env
โปรดทราบว่าในบางกรณี ระบบจะแจ้งให้คุณป้อนคำนำหน้าเพื่อเปลี่ยนชื่อคีย์ตัวแปรสภาพแวดล้อมที่ส่งออก เนื่องจากระบบไม่สามารถแปลงการกำหนดค่าบางอย่างโดยอัตโนมัติได้ เพราะอาจไม่ถูกต้องหรืออาจเป็นคีย์ตัวแปรสภาพแวดล้อมที่สงวนไว้
เราขอแนะนำให้คุณตรวจสอบเนื้อหาของไฟล์ .env
ที่สร้างขึ้นอย่างละเอียด
ก่อนที่จะติดตั้งใช้งานฟังก์ชันหรือเช็คอินไฟล์ .env
ในการควบคุมแหล่งที่มา หากค่าใดมีความละเอียดอ่อนและไม่ควรมีการรั่วไหล ให้นำค่าเหล่านั้นออกจากไฟล์ .env
แล้วจัดเก็บอย่างปลอดภัยใน Secret Manager แทน
นอกจากนี้ คุณยังต้องอัปเดตรหัสฟังก์ชันด้วย ฟังก์ชันใดก็ตามที่ใช้
functions.config
จะต้องใช้ process.env
แทน ดังที่แสดงใน
อัปเกรดเป็นรุ่นที่ 2
การกำหนดค่าสภาพแวดล้อม
ตั้งค่าสภาพแวดล้อมด้วย CLI
หากต้องการจัดเก็บข้อมูลสภาพแวดล้อม คุณสามารถใช้firebase functions:config:set
คำสั่งใน Firebase CLI
คีย์แต่ละรายการสามารถใช้เนมสเปซได้โดยใช้จุดเพื่อจัดกลุ่มการกำหนดค่าที่เกี่ยวข้องเข้าด้วยกัน โปรดทราบว่าอนุญาตให้ใช้อักขระตัวพิมพ์เล็กเท่านั้น
ในคีย์ ไม่อนุญาตให้ใช้อักขระตัวพิมพ์ใหญ่
เช่น หากต้องการจัดเก็บรหัสไคลเอ็นต์และคีย์ API สำหรับ "บริการบางอย่าง" คุณอาจเรียกใช้คำสั่งต่อไปนี้
firebase functions:config:set someservice.key="THE API KEY" someservice.id="THE CLIENT ID"
เรียกข้อมูลการกำหนดค่าสภาพแวดล้อมปัจจุบัน
หากต้องการตรวจสอบสิ่งที่จัดเก็บไว้ในการกำหนดค่าสภาพแวดล้อมสำหรับโปรเจ็กต์ของคุณในปัจจุบัน คุณสามารถใช้ firebase functions:config:get
ได้ โดยจะแสดงผล JSON ดังนี้
{
"someservice": {
"key":"THE API KEY",
"id":"THE CLIENT ID"
}
}
ฟังก์ชันนี้อิงตามGoogle Cloud Runtime Configuration API
ใช้ functions.config
เพื่อเข้าถึงการกำหนดค่าสภาพแวดล้อมในฟังก์ชัน
ระบบจะให้การกำหนดค่าบางอย่างโดยอัตโนมัติภายใต้firebase
เนมสเปซที่สงวนไว้ การกำหนดค่าสภาพแวดล้อมจะพร้อมใช้งานภายในฟังก์ชันที่ทำงานผ่าน functions.config()
หากต้องการใช้การกำหนดค่าข้างต้น โค้ดอาจมีลักษณะดังนี้
const functions = require('firebase-functions/v1');
const request = require('request-promise');
exports.userCreated = functions.database.ref('/users/{id}').onWrite(event => {
let email = event.data.child('email').val();
return request({
url: 'https://someservice.com/api/some/call',
headers: {
'X-Client-ID': functions.config().someservice.id,
'Authorization': `Bearer ${functions.config().someservice.key}`
},
body: {email: email}
});
});
ใช้การกำหนดค่าสภาพแวดล้อมเพื่อเริ่มต้นโมดูล
โมดูล Node บางโมดูลพร้อมใช้งานโดยไม่ต้องกำหนดค่าใดๆ โมดูลอื่นๆ ต้องมีการกำหนดค่าเพิ่มเติมเพื่อเริ่มต้นอย่างถูกต้อง เราขอแนะนำให้คุณจัดเก็บการกำหนดค่านี้ ในตัวแปรการกำหนดค่าสภาพแวดล้อมแทนการฮาร์ดโค้ด ซึ่งจะช่วยให้ คุณเก็บโค้ดไว้ได้ง่ายขึ้นมาก ซึ่งจะช่วยให้คุณเปิดซอร์สแอปพลิเคชัน หรือสลับระหว่างเวอร์ชันที่ใช้งานจริงและเวอร์ชันทดสอบได้อย่างง่ายดาย
เช่น หากต้องการใช้โมดูล Slack Node SDK คุณอาจเขียนโค้ดดังนี้
const functions = require('firebase-functions/v1');
const IncomingWebhook = require('@slack/client').IncomingWebhook;
const webhook = new IncomingWebhook(functions.config().slack.url);
ก่อนที่จะติดตั้งใช้งาน ให้ตั้งค่าตัวแปรการกำหนดค่าสภาพแวดล้อม slack.url
ดังนี้
firebase functions:config:set slack.url=https://hooks.slack.com/services/XXX
คำสั่งสภาพแวดล้อมเพิ่มเติม
firebase functions:config:unset key1 key2
จะนำคีย์ที่ระบุออกจากไฟล์กำหนดค่าfirebase functions:config:clone --from <fromProject>
จะโคลนสภาพแวดล้อมของโปรเจ็กต์อื่นไปยัง โปรเจ็กต์ที่ใช้งานอยู่ในปัจจุบัน
ตัวแปรสภาพแวดล้อมที่สร้างขึ้นโดยอัตโนมัติ
มีตัวแปรสภาพแวดล้อมที่ระบบจะป้อนค่าโดยอัตโนมัติใน รันไทม์ของฟังก์ชันและในฟังก์ชันที่จำลองในเครื่อง ซึ่งรวมถึง รายการที่สร้างโดย Google Cloud รวมถึงตัวแปรสภาพแวดล้อมเฉพาะของ Firebase
process.env.FIREBASE_CONFIG
: ให้ข้อมูลการกำหนดค่าโปรเจ็กต์ Firebase ต่อไปนี้
{
databaseURL: 'https://DATABASE_NAME.firebaseio.com',
storageBucket: 'PROJECT_ID.firebasestorage.app
',
projectId: 'PROJECT_ID'
}
โปรดทราบว่าค่าในการกำหนดค่า Firebase จริงอาจแตกต่างกันไปตาม ทรัพยากรที่คุณจัดสรรไว้ในโปรเจ็กต์
การกำหนดค่านี้จะมีผลโดยอัตโนมัติเมื่อคุณเริ่มต้น Firebase Admin SDK โดยไม่มีอาร์กิวเมนต์ หากคุณเขียนฟังก์ชันใน JavaScript ให้เริ่มต้นใช้งานดังนี้
const admin = require('firebase-admin');
admin.initializeApp();
หากคุณเขียนฟังก์ชันใน TypeScript ให้เริ่มต้นใช้งานดังนี้
import * as functions from 'firebase-functions/v1';
import * as admin from 'firebase-admin';
import 'firebase-functions/v1';
admin.initializeApp();
หากต้องการเริ่มต้น Admin SDK ด้วยการกำหนดค่าโปรเจ็กต์เริ่มต้น
โดยใช้ข้อมูลเข้าสู่ระบบของบัญชีบริการ คุณสามารถโหลดข้อมูลเข้าสู่ระบบจากไฟล์และ
เพิ่มลงใน FIREBASE_CONFIG
ได้ดังนี้
serviceAccount = require('./serviceAccount.json');
const adminConfig = JSON.parse(process.env.FIREBASE_CONFIG);
adminConfig.credential = admin.credential.cert(serviceAccount);
admin.initializeApp(adminConfig);