โดยทั่วไป คุณจะต้องกำหนดค่าเพิ่มเติมสำหรับฟังก์ชัน เช่น คีย์ API ของบุคคลที่สามหรือการตั้งค่าที่ปรับได้ SDK สำหรับ Cloud Functions มีการกำหนดค่าสภาพแวดล้อมในตัวเพื่อให้จัดเก็บและดึงข้อมูลประเภทนี้สำหรับโปรเจ็กต์ได้ง่ายFirebase
คุณสามารถเลือกตัวเลือกต่อไปนี้
- การกำหนดค่าแบบมีพารามิเตอร์ (แนะนำสำหรับสถานการณ์ส่วนใหญ่) ซึ่งมีการกำหนดค่าสภาพแวดล้อมแบบกำหนดประเภทอย่างชัดเจนด้วยพารามิเตอร์ที่ได้รับการตรวจสอบความถูกต้องในระหว่างการทำให้ใช้งานได้ ซึ่งจะช่วยป้องกันข้อผิดพลาดและทำให้การแก้ไขข้อบกพร่องง่ายขึ้น
- การกำหนดค่าตัวแปรสภาพแวดล้อมแบบอิงตามไฟล์ ด้วยวิธีนี้ คุณจะสร้างไฟล์ dotenv เพื่อโหลดตัวแปรสภาพแวดล้อมด้วยตนเอง
เราขอแนะนำการกำหนดค่าแบบมีพารามิเตอร์สำหรับ Use Case ส่วนใหญ่ วิธีนี้จะทำให้ค่าการกำหนดค่าพร้อมใช้งานทั้งในระหว่างรันไทม์และในระหว่างการทำให้ใช้งานได้ และระบบจะบล็อกการทำให้ใช้งานได้เว้นแต่ว่าพารามิเตอร์ทั้งหมดจะมีค่าที่ถูกต้อง ในทางกลับกัน การกำหนดค่าด้วยตัวแปรสภาพแวดล้อมจะไม่พร้อมใช้งานในระหว่างการทำให้ใช้งานได้
การกำหนดค่าแบบมีพารามิเตอร์
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 ด้วย ประเภทที่รองรับมีดังนี้
- ข้อมูลลับ
- สตริง
- บูลีน
- จำนวนเต็ม
- ลอยขึ้นมา
ดูข้อมูลเกี่ยวกับฟังก์ชันสำหรับการกำหนดพารามิเตอร์ได้ที่ข้อมูลอ้างอิงเนมสเปซ params
ค่าและนิพจน์ของพารามิเตอร์
Firebase จะประเมินพารามิเตอร์ทั้งในระหว่างการทำให้ใช้งานได้และในขณะที่ฟังก์ชันกำลังทำงาน เนื่องจากมีสภาพแวดล้อม 2 แบบ คุณจึงต้องระมัดระวังเป็นพิเศษเมื่อ เปรียบเทียบค่าพารามิเตอร์และเมื่อใช้ค่าเหล่านั้นเพื่อตั้งค่าตัวเลือกการรันไทม์ สำหรับฟังก์ชัน
หากต้องการส่งพารามิเตอร์ไปยังฟังก์ชันเป็นตัวเลือกการรันไทม์ ให้ส่งพารามิเตอร์โดยตรงดังนี้
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 เวอร์ชัน โดยไม่มีค่าใช้จ่าย ซึ่งหมายความว่าคุณสามารถใช้ข้อมูลลับ 6 รายการต่อเดือนในโปรเจ็กต์ Firebase ได้โดยไม่มีค่าใช้จ่าย
โดยค่าเริ่มต้น Firebase CLI จะพยายามทำลายเวอร์ชันข้อมูลลับที่ไม่ได้ใช้โดยอัตโนมัติเมื่อเหมาะสม เช่น เมื่อคุณทำให้ฟังก์ชันใช้งานได้ด้วยข้อมูลลับเวอร์ชันใหม่ นอกจากนี้ คุณยังล้างข้อมูลลับที่ไม่ได้ใช้อย่างจริงจังได้โดยใช้ functions:secrets:destroy และ functions:secrets:prune
Secret Manager อนุญาตให้ดำเนินการเข้าถึงข้อมูลลับรายเดือนโดยไม่มีค่าใช้จ่าย 10,000 รายการบน
อินสแตนซ์ของฟังก์ชันจะอ่านเฉพาะข้อมูลลับที่ระบุไว้ในตัวเลือก secrets ทุกครั้งที่เริ่มทำงานแบบ Cold Start หากคุณมีอินสแตนซ์ของฟังก์ชันจำนวนมากที่อ่านข้อมูลลับจำนวนมาก โปรเจ็กต์ของคุณอาจใช้เกินขีดจำกัดนี้ ซึ่งในกรณีดังกล่าว ระบบจะเรียกเก็บเงินคุณ $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 API แล้วและจะหยุดให้บริการในเดือนมีนาคม 2027
หลังจากวันที่ดังกล่าว การทำให้ใช้งานได้ด้วย functions.config จะล้มเหลว
หากต้องการป้องกันไม่ให้การทำให้ใช้งานได้ล้มเหลว ให้ย้ายข้อมูลการกำหนดค่าไปยัง Secret Manager ของ Cloud โดยใช้ Firebase CLI เราขอแนะนำอย่างยิ่งให้ใช้วิธีนี้เนื่องจากเป็นวิธีที่มีประสิทธิภาพและปลอดภัยที่สุดในการย้ายข้อมูลการกำหนดค่า
ส่งออกการกำหนดค่าด้วย Firebase CLI
ใช้คำสั่ง
config exportเพื่อส่งออกการกำหนดค่าสภาพแวดล้อมที่มีอยู่ไปยังข้อมูลลับใหม่ใน Secret Manager ของ Cloud$ firebase functions:config:export i This command retrieves your Runtime Config values (accessed via functions.config()) and exports them as a Secret Manager secret. i Fetching your existing functions.config() from your project... ✔ Fetched your existing functions.config(). i Configuration to be exported: ⚠ This may contain sensitive data. Do not share this output. { ... } ✔ What would you like to name the new secret for your configuration? RUNTIME_CONFIG ✔ Created new secret version projects/project/secrets/RUNTIME_CONFIG/versions/1```อัปเดตโค้ดฟังก์ชันเพื่อเชื่อมโยงข้อมูลลับ
หากต้องการใช้การกำหนดค่าที่จัดเก็บไว้ในข้อมูลลับใหม่ใน Secret Manager ของ Cloud ให้ใช้
defineJsonSecretAPI ในแหล่งที่มาของฟังก์ชัน นอกจากนี้ โปรดตรวจสอบว่าได้เชื่อมโยงข้อมูลลับกับฟังก์ชันทั้งหมดที่จำเป็นแล้วก่อน
const functions = require("firebase-functions/v1"); exports.myFunction = functions.https.onRequest((req, res) => { const apiKey = functions.config().someapi.key; // ... });หลัง
const { onRequest } = require("firebase-functions/v2/https"); const { defineJsonSecret } = require("firebase-functions/params"); const config = defineJsonSecret("RUNTIME_CONFIG"); exports.myFunction = onRequest( // Bind secret to your function { secrets: [config] }, (req, res) => { // Access secret values via .value() const apiKey = config.value().someapi.key; // ... });ทำให้ฟังก์ชันใช้งานได้
ทำให้ฟังก์ชันที่อัปเดตแล้วใช้งานได้เพื่อใช้การเปลี่ยนแปลงและเชื่อมโยงสิทธิ์ของข้อมูลลับ
firebase deploy --only functions:<your-function-name>
ตัวแปรสภาพแวดล้อมที่ป้อนข้อมูลโดยอัตโนมัติ
มีตัวแปรสภาพแวดล้อมที่ป้อนข้อมูลโดยอัตโนมัติในรันไทม์ของฟังก์ชันและในฟังก์ชันที่จำลองในเครื่อง ซึ่งรวมถึง ตัวแปรที่ 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);