ส่วนใหญ่แล้วคุณจะต้องกำหนดค่าเพิ่มเติมสำหรับฟังก์ชันต่างๆ เช่น คีย์ API ของบุคคลที่สามหรือการตั้งค่าที่ปรับแต่งได้ Firebase SDK สำหรับ Cloud Functions มีการกำหนดค่าสภาพแวดล้อมในตัวเพื่อช่วยให้จัดเก็บและเรียกข้อมูลประเภทนี้สำหรับโปรเจ็กต์ของคุณได้อย่างง่ายดาย
คุณมีตัวเลือก 3 แบบดังนี้
- การกำหนดค่าที่มีพารามิเตอร์ (แนะนำสำหรับสถานการณ์ส่วนใหญ่) ซึ่งจะมีการกำหนดค่าสภาพแวดล้อมที่มีการพิมพ์ขั้นสูงพร้อมพารามิเตอร์ที่จะตรวจสอบในเวลาทำให้ใช้งานได้ ซึ่งป้องกันข้อผิดพลาดและทำให้การแก้ไขข้อบกพร่องง่ายขึ้น
- การกำหนดค่าตามไฟล์ของตัวแปรสภาพแวดล้อม วิธีนี้จะช่วยให้คุณสร้างไฟล์ dotenv ด้วยตนเองสำหรับการโหลดตัวแปรสภาพแวดล้อม
- การกำหนดค่าสภาพแวดล้อมรันไทม์ด้วย Firebase CLI และ
functions.config
(Cloud Functions (รุ่นที่ 1) เท่านั้น)
สําหรับ Use Case ส่วนใหญ่ ขอแนะนำให้กําหนดค่าเป็นพารามิเตอร์ วิธีนี้จะทำให้ค่าของการกำหนดค่าพร้อมใช้งานทั้งในช่วงรันไทม์และเวลาที่ทำให้ใช้งานได้ และระบบจะบล็อกการติดตั้งใช้งาน เว้นแต่ว่าพารามิเตอร์ทั้งหมดจะมีค่าที่ถูกต้อง ในทางกลับกัน การกำหนดค่าด้วยตัวแปรสภาพแวดล้อมจะไม่พร้อมใช้งานในขณะที่ทำให้ใช้งานได้
การกำหนดค่าพารามิเตอร์
Cloud Functions for Firebase มีอินเทอร์เฟซสำหรับกำหนดพารามิเตอร์การกำหนดค่าอย่างชัดเจนภายในฐานของโค้ด ค่าของพารามิเตอร์เหล่านี้จะใช้ได้ทั้งระหว่างการทำให้ฟังก์ชันใช้งานได้ เมื่อตั้งค่าตัวเลือกการติดตั้งใช้งานและรันไทม์ และระหว่างการดำเนินการ ซึ่งหมายความว่า CLI จะบล็อกการทำให้ใช้งานได้ เว้นแต่ว่าพารามิเตอร์ทั้งหมดจะมีค่าที่ถูกต้อง
หากต้องการกำหนดพารามิเตอร์ในโค้ดของคุณ ให้ทำตามโมเดลนี้
const functions = require('firebase-functions');
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>
ที่สร้างขึ้นลงในการควบคุมเวอร์ชันอาจมีประโยชน์ ทั้งนี้ขึ้นอยู่กับเวิร์กโฟลว์การพัฒนา
การใช้พารามิเตอร์ในขอบเขตทั้งหมด
ในระหว่างการทำให้ใช้งานได้ ระบบจะโหลดและตรวจสอบโค้ดฟังก์ชันก่อนที่พารามิเตอร์จะมีค่าจริง ซึ่งหมายความว่าการดึงข้อมูลค่าพารามิเตอร์ระหว่างขอบเขตส่วนกลางจะทำให้การทำให้ใช้งานได้ล้มเหลว สำหรับกรณีที่คุณต้องการใช้พารามิเตอร์เพื่อเริ่มต้นค่าส่วนกลาง ให้ใช้ Callback การเริ่มต้น
onInit()
Callback นี้จะทำงานก่อนฟังก์ชันใดๆ จะทำงานในเวอร์ชันที่ใช้งานจริง แต่จะไม่เรียกใช้ในระหว่างเวลาการทำให้ใช้งานได้ ดังนั้นจึงเป็นที่ที่ปลอดภัยสำหรับการเข้าถึงค่าของพารามิเตอร์
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"})
ประเภทพารามิเตอร์
การกำหนดค่าพารามิเตอร์จะทำให้พิมพ์ค่าพารามิเตอร์ได้อย่างถูกต้อง และรองรับข้อมูลลับจาก Cloud Secret Manager ด้วย ประเภทที่รองรับมีดังนี้
- ข้อมูลลับ
- สตริง
- บูลีน
- จำนวนเต็ม
- FLOAT
ค่าของพารามิเตอร์และนิพจน์
Firebase จะประเมินพารามิเตอร์ของคุณทั้งในเวลาการติดตั้งใช้งานและขณะที่ฟังก์ชันกำลังทำงาน และเนื่องจากสภาพแวดล้อมแบบ 2 อย่างนี้ คุณจึงต้องระมัดระวังเป็นพิเศษเมื่อเปรียบเทียบค่าพารามิเตอร์ และเมื่อใช้พารามิเตอร์ดังกล่าวเพื่อตั้งค่าตัวเลือกรันไทม์สำหรับฟังก์ชัน
หากต้องการส่งพารามิเตอร์ไปยังฟังก์ชันเป็นตัวเลือกรันไทม์ ให้ส่งพารามิเตอร์โดยตรงโดยทำดังนี้
const functions = require('firebase-functions');
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');
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');
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()
แสดงพารามิเตอร์สตริงซึ่งมีค่าที่เก็บไว้ใน Cloud Secret Manager พารามิเตอร์ลับจะตรวจสอบกับการมีอยู่ใน Cloud Secret Manager แทนการตรวจสอบกับไฟล์ .env
ในเครื่องและเขียนค่าใหม่ลงในไฟล์หากขาดหายไป
พารามิเตอร์ลับที่กำหนดด้วยวิธีนี้ต้องเชื่อมโยงกับแต่ละฟังก์ชันที่ควรมีสิทธิ์เข้าถึง
const functions = require('firebase-functions');
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=โลก
AUDIENCE=มนุษย์ |
AUDIENCE=มนุษย์พัฒนา | AUDIENCE ผู้ชมที่เป็นมนุษย์ |
สำหรับค่าในไฟล์ที่แยกต่างหากเหล่านั้น ชุดตัวแปรสภาพแวดล้อมที่ทำให้ใช้งานได้กับฟังก์ชันจะแตกต่างกันไปตามโปรเจ็กต์เป้าหมาย ดังนี้
$ 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_
- คีย์ใดก็ได้จากรายการต่อไปนี้
- การกำหนดค่าเวลา RUNTIME
- ENTRY_POINT
- GCP_PROJECT
- โปรเจ็กต์ GCLOUD
- โปรเจ็กต์ Google Cloud
- ประเภท FUNCTION_ทริกเกอร์
- FUNCTION_NAME
- FUNCTION_MEMORY_MB
- FUNCTION_TIMEOUT_SEC
- FUNCTION_IDENTITY
- FUNCTION_ภูมิภาค
- FUNCTION_เป้าหมาย
- ประเภท FUNCTION_SIGNATURE_TYPE
- K_SERVICE
- เกาหลี (K_REVISION)
- พอร์ต
- การกำหนดค่า K
จัดเก็บและเข้าถึงข้อมูลการกำหนดค่าที่ละเอียดอ่อน
ตัวแปรสภาพแวดล้อมที่จัดเก็บไว้ในไฟล์ .env
ใช้เพื่อการกำหนดค่าฟังก์ชันได้ แต่คุณไม่ควรถือว่าเป็นวิธีที่ปลอดภัยในการจัดเก็บข้อมูลที่ละเอียดอ่อน เช่น ข้อมูลเข้าสู่ระบบฐานข้อมูลหรือคีย์ API ขั้นตอนนี้สำคัญมากหากคุณตรวจสอบไฟล์ .env
ในการควบคุมแหล่งที่มา
Cloud Functions for Firebase จะผสานรวมกับ Secret Manager ของ Google Cloud เพื่อช่วยคุณจัดเก็บข้อมูลการกำหนดค่าที่ละเอียดอ่อน บริการที่เข้ารหัสนี้จะจัดเก็บค่าของการกำหนดค่าไว้อย่างปลอดภัย ในขณะเดียวกันก็ยังให้สิทธิ์เข้าถึงฟังก์ชันต่างๆ ได้อย่างง่ายดายเมื่อจำเป็น
สร้างและใช้ข้อมูลลับ
หากต้องการสร้างข้อมูลลับ ให้ใช้ 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 ครั้งสำหรับข้อมูลลับ อินสแตนซ์ฟังก์ชันจะอ่านเฉพาะข้อมูลลับที่ระบุในพารามิเตอร์ runWith
ทุกครั้งที่ 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=โลก
AUDIENCE=มนุษย์ |
AUDIENCE=มนุษย์พัฒนา | AUDIENCE มนุษย์ท้องถิ่น |
เมื่อเริ่มต้นในบริบทเฉพาะเครื่อง โปรแกรมจำลองจะโหลดตัวแปรสภาพแวดล้อมตามที่แสดง
$ 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)
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
การกำหนดค่าสภาพแวดล้อม
ก่อนที่จะมีการเผยแพร่การรองรับตัวแปรสภาพแวดล้อมใน firebase-functions
v3.18.0
การใช้ functions.config()
เป็นวิธีที่แนะนำสำหรับการกำหนดค่าสภาพแวดล้อม ระบบยังคงรองรับวิธีการนี้ แต่เราขอแนะนําให้โปรเจ็กต์ใหม่ทั้งหมดใช้ตัวแปรสภาพแวดล้อมแทน เนื่องจากใช้งานง่ายกว่าและปรับปรุงการถ่ายโอนโค้ดได้
ตั้งค่าการกำหนดค่าสภาพแวดล้อมด้วย 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"
}
}
ฟังก์ชันนี้อิงตาม API การกำหนดค่ารันไทม์ของ Google Cloud
ใช้ functions.config
เพื่อเข้าถึงการกำหนดค่าสภาพแวดล้อมในฟังก์ชัน
การกำหนดค่าบางอย่างจะจัดเตรียมไว้โดยอัตโนมัติภายใต้เนมสเปซ firebase
ที่จองไว้ การกำหนดค่าสภาพแวดล้อมพร้อมให้ใช้งานภายในฟังก์ชันที่กำลังทำงานผ่าน functions.config()
หากต้องการใช้การกำหนดค่าข้างต้น โค้ดของคุณอาจมีลักษณะดังนี้
const functions = require('firebase-functions');
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}
});
});
ใช้การกำหนดค่าสภาพแวดล้อมเพื่อเริ่มต้นโมดูล
โมดูลโหนดบางรายการพร้อมใช้งานโดยไม่มีการกำหนดค่า โมดูลอื่นๆ ต้องมีการกำหนดค่าเพิ่มเติมเพื่อให้เริ่มต้นได้อย่างถูกต้อง เราขอแนะนำให้คุณเก็บการกำหนดค่านี้ไว้ในตัวแปรการกำหนดค่าสภาพแวดล้อม แทนที่จะฮาร์ดโค้ดการกำหนดค่าไว้ การทำเช่นนี้ช่วยให้โค้ดของคุณพกพาไปได้ทุกที่ จึงช่วยให้คุณเป็นโอเพนซอร์สกับแอปพลิเคชันหรือสลับใช้ระหว่างเวอร์ชันที่ใช้งานจริงกับเวอร์ชันทดลองใช้ได้อย่างง่ายดาย
ตัวอย่างเช่น หากต้องการใช้โมดูล Slack Node SDK คุณอาจเขียนดังนี้
const functions = require('firebase-functions');
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://databaseName.firebaseio.com',
storageBucket: 'projectId.appspot.com',
projectId: 'projectId'
}
ระบบจะใช้การกำหนดค่านี้โดยอัตโนมัติเมื่อคุณเริ่มต้น Firebase Admin SDK โดยไม่มีอาร์กิวเมนต์ ถ้าคุณเขียนฟังก์ชันใน JavaScript ให้เริ่มต้นดังนี้
const admin = require('firebase-admin');
admin.initializeApp();
หากคุณกำลังเขียนฟังก์ชันใน TypeScript ให้เริ่มต้นดังนี้
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import 'firebase-functions';
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);