บ่อยครั้งคุณจะต้องกำหนดค่าเพิ่มเติมสำหรับฟังก์ชันต่างๆ เช่น คีย์ API ของบุคคลที่สามหรือการตั้งค่าที่ปรับแต่งได้ Firebase SDK สำหรับ Cloud Functions เสนอการกำหนดค่าสภาพแวดล้อมในตัวเพื่อให้จัดเก็บและดึงข้อมูลประเภทนี้สำหรับโปรเจ็กต์ของคุณได้ง่ายขึ้น
โดยเลือกได้จาก 3 ตัวเลือกต่อไปนี้
- การกําหนดค่าที่มีพารามิเตอร์ (แนะนําสําหรับสถานการณ์ส่วนใหญ่) โดยวิธีนี้จะมีการกำหนดค่าสภาพแวดล้อมที่มีการจัดประเภทอย่างเข้มงวดพร้อมด้วยพารามิเตอร์ที่ได้รับการตรวจสอบ ณ เวลาที่ทำให้ใช้งานได้ ซึ่งจะป้องกันข้อผิดพลาดและทำให้การแก้ไขข้อบกพร่องง่ายขึ้น
- การกำหนดค่าตามไฟล์ของตัวแปรสภาพแวดล้อม ด้วยวิธีนี้ คุณจะสร้างไฟล์ dotenv ขึ้นมาด้วยตนเองสำหรับการโหลดตัวแปรสภาพแวดล้อม
- การกำหนดค่าสภาพแวดล้อมรันไทม์ด้วย Firebase CLI และ
functions.config
(Cloud Functions (รุ่นที่ 1) เท่านั้น)
สําหรับ Use Case ส่วนใหญ่ เราขอแนะนําให้ใช้การกําหนดค่าที่เป็นพารามิเตอร์ วิธีนี้ทำให้ค่าการกำหนดค่าพร้อมใช้งานทั้งในรันไทม์และเวลาติดตั้งใช้งาน และระบบจะบล็อกการติดตั้งใช้งานจนกว่าพารามิเตอร์ทั้งหมดมีค่าที่ถูกต้อง ในทางกลับกัน การกำหนดค่าที่มีตัวแปรสภาพแวดล้อมไม่พร้อมใช้งานในเวลาทำให้ใช้งานได้
การกำหนดค่าที่มีพารามิเตอร์
Cloud Functions for Firebase จะมีอินเทอร์เฟซสำหรับการกำหนดพารามิเตอร์การกำหนดค่าอย่างชัดเจนภายในฐานของโค้ด ค่าของพารามิเตอร์เหล่านี้จะใช้ได้ทั้งในระหว่างการติดตั้งใช้งานฟังก์ชัน เมื่อตั้งค่าตัวเลือกการติดตั้งใช้งานและรันไทม์ และระหว่างการดำเนินการ ซึ่งหมายความว่า CLI จะบล็อกการทำให้ใช้งานได้ เว้นแต่พารามิเตอร์ทั้งหมดมีค่าที่ถูกต้อง
Node.js
const { onRequest } = require('firebase-functions/v2/https');
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 = onRequest(
{ minInstances: minInstancesConfig },
(req, res) => {
res.send(`${welcomeMessage.value()}! I am a function.`);
}
);
Python
from firebase_functions import https_fn
from firebase_functions.params import IntParam, StringParam
MIN_INSTANCES = IntParam("HELLO_WORLD_MIN_INSTANCES")
WELCOME_MESSAGE = StringParam("WELCOME_MESSAGE")
# To use configured parameters inside the config for a function, provide them
# directly. To use them at runtime, call .value() on them.
@https_fn.on_request(min_instances=MIN_INSTANCES)
def hello_world(req):
return https_fn.Response(f'{WELCOME_MESSAGE.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()
โค้ดเรียกกลับนี้จะทำงานก่อนที่ฟังก์ชันใดๆ จะทำงานในเวอร์ชันที่ใช้งานจริง แต่จะไม่เรียกใช้ระหว่างเวลาที่ทำให้ใช้งานได้ จึงเป็นพื้นที่ที่ปลอดภัยสำหรับการเข้าถึงค่าของพารามิเตอร์
Node.js
const { GoogleGenerativeAI } = require('@google/generative-ai');
const { defineSecret } = require('firebase-functions/params');
const { onInit } = require('firebase-functions/v2/core');
const apiKey = defineSecret('GOOGLE_API_KEY');
let genAI;
onInit(() => {
genAI = new GoogleGenerativeAI(apiKey.value());
})
Python
from firebase_functions.core import init
from firebase_functions.params import StringParam, PROJECT_ID
import firebase_admin
import vertexai
location = StringParam("LOCATION")
x = "hello"
@init
def initialize():
# Note: to write back to a global, you'll need to use the "global" keyword
# to avoid creating a new local with the same name.
global x
x = "world"
firebase_admin.initialize_app()
vertexai.init(PROJECT_ID.value, location.value)
หากคุณใช้พารามิเตอร์ประเภท Secret
โปรดทราบว่าพารามิเตอร์เหล่านี้ใช้ได้ในกระบวนการของฟังก์ชันที่ผูกข้อมูลลับเท่านั้น หากมีการเชื่อมโยงข้อมูลลับเฉพาะในบางฟังก์ชัน ให้ตรวจสอบว่า secret.value()
ล้มเหลวก่อนใช้งานหรือไม่
กำหนดค่าลักษณะการทำงาน CLI
คุณกำหนดค่าพารามิเตอร์ได้ด้วยออบเจ็กต์ Options
ที่ควบคุมวิธีที่ CLI จะแสดงค่าต่างๆ ตัวอย่างต่อไปนี้กำหนดตัวเลือกต่างๆ เพื่อตรวจสอบรูปแบบของหมายเลขโทรศัพท์ มอบตัวเลือกการเลือกง่ายๆ และป้อนข้อมูลตัวเลือกตัวเลือกโดยอัตโนมัติจากโปรเจ็กต์ Firebase
Node.js
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: params.select(["odd", "even"])});
const memory = defineInt("MEMORY", {
description: "How much memory do you need?",
input: params.select({ "micro": 256, "chonky": 2048 }),
});
const extensions = defineList("EXTENSIONS", {
description: "Which file types should be processed?",
input: params.multiSelect(["jpg", "tiff", "png", "webp"]),
});
const storageBucket = defineString('BUCKET', {
description: "This will automatically
populate the selector field with the deploying Cloud Project’s
storage buckets",
input: params.PICK_STORAGE_BUCKET,
});
Python
from firebase_functions.params import (
StringParam,
ListParam,
TextInput,
SelectInput,
SelectOptions,
ResourceInput,
ResourceType,
)
MIN_INSTANCES = IntParam("HELLO_WORLD_MIN_INSTANCES")
WELCOME_MESSAGE = StringParam(
"WELCOME_MESSAGE",
default="Hello World",
description="The greeting that is returned to the caller of this function",
)
ONLY_PHONE_NUMBERS = StringParam(
"PHONE_NUMBER",
input=TextInput(
validation_regex="\d{3}-\d{3}-\d{4}",
validation_error_message="Please enter a phone number in the format XXX-YYY-XXX",
),
)
SELECT_OPTION = StringParam(
"PARITY",
input=SelectInput([SelectOptions(value="odd"), SelectOptions(value="even")]),
)
STORAGE_BUCKET = StringParam(
"BUCKET",
input=ResourceInput(type=ResourceType.STORAGE_BUCKET),
description="This will automatically populate the selector field with the deploying Cloud Project's storage buckets",
)
ประเภทพารามิเตอร์
การกำหนดค่าที่มีพารามิเตอร์ทำให้สามารถพิมพ์ค่าพารามิเตอร์ได้อย่างถูกต้อง และรองรับข้อมูลลับจาก Secret Manager ของ Cloud ด้วย ประเภทที่รองรับ ได้แก่
- ข้อมูลลับ
- สตริง
- บูลีน
- จำนวนเต็ม
- FLOAT
- รายการ (Node.js)
ค่าและนิพจน์พารามิเตอร์
Firebase จะประเมินพารามิเตอร์ทั้งในขณะที่ติดตั้งใช้งานและขณะที่ฟังก์ชันกำลังทำงาน เนื่องจากสภาพแวดล้อมแบบคู่เหล่านี้ คุณจึงต้องระมัดระวังเป็นพิเศษเมื่อเปรียบเทียบค่าพารามิเตอร์ และเมื่อใช้ค่าเหล่านี้เพื่อตั้งค่าตัวเลือกรันไทม์สำหรับฟังก์ชัน
หากต้องการส่งพารามิเตอร์ไปยังฟังก์ชันเป็นตัวเลือกรันไทม์ ให้ส่งพารามิเตอร์โดยตรงดังนี้
Node.js
const { onRequest } = require('firebase-functions/v2/https');
const { defineInt } = require('firebase-functions/params');
const minInstancesConfig = defineInt('HELLO\_WORLD\_MININSTANCES');
export const helloWorld = onRequest(
{ minInstances: minInstancesConfig },
(req, res) => {
//…
Python
from firebase_functions import https_fn
from firebase_functions.params import IntParam
MIN_INSTANCES = IntParam("HELLO_WORLD_MIN_INSTANCES")
@https_fn.on_request(min_instances=MIN_INSTANCES)
def hello_world(req):
...
นอกจากนี้ หากคุณต้องการเปรียบเทียบกับพารามิเตอร์เพื่อให้ทราบว่าควรเลือกตัวเลือกใด คุณจะต้องใช้การเปรียบเทียบในตัวแทนการตรวจสอบค่า ดังนี้
Node.js
const { onRequest } = require('firebase-functions/v2/https');
const environment = params.defineString(‘ENVIRONMENT’, {default: 'dev'});
// use built-in comparators
const minInstancesConfig = environment.equals('PRODUCTION').thenElse(10, 1);
export const helloWorld = onRequest(
{ minInstances: minInstancesConfig },
(req, res) => {
//…
Python
from firebase_functions import https_fn
from firebase_functions.params import IntParam, StringParam
ENVIRONMENT = StringParam("ENVIRONMENT", default="dev")
MIN_INSTANCES = ENVIRONMENT.equals("PRODUCTION").then(10, 0)
@https_fn.on_request(min_instances=MIN_INSTANCES)
def hello_world(req):
...
คุณจะเข้าถึงพารามิเตอร์และนิพจน์พารามิเตอร์ที่ใช้ขณะรันไทม์เท่านั้นได้ด้วยฟังก์ชัน value
ดังนี้
Node.js
const { onRequest } = require('firebase-functions/v2/https');
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 = onRequest(
(req, res) => {
res.send(`${welcomeMessage.value()}! I am a function.`);
}
);
Python
from firebase_functions import https_fn
from firebase_functions.params import StringParam
WELCOME_MESSAGE = StringParam("WELCOME_MESSAGE")
@https_fn.on_request()
def hello_world(req):
return https_fn.Response(f'{WELCOME_MESSAGE.value()}! I am a function!')
พารามิเตอร์ในตัว
Cloud Functions SDK มีพารามิเตอร์ที่กำหนดไว้ล่วงหน้า 3 รายการซึ่งพร้อมใช้งานจากแพ็กเกจย่อย firebase-functions/params
ดังนี้
Node.js
projectID
— โปรเจ็กต์ระบบคลาวด์ที่ฟังก์ชันทำงานอยู่databaseURL
— URL ของอินสแตนซ์ Realtime Database ที่เชื่อมโยงกับฟังก์ชัน (หากเปิดใช้ในโปรเจ็กต์ Firebase)storageBucket
— ที่เก็บข้อมูล Cloud Storage ที่เชื่อมโยงกับฟังก์ชัน (หากเปิดใช้ในโปรเจ็กต์ Firebase)
Python
PROJECT_ID
— โปรเจ็กต์ระบบคลาวด์ที่ฟังก์ชันทำงานอยู่DATABASE_URL
— URL ของอินสแตนซ์ Realtime Database ที่เชื่อมโยงกับฟังก์ชัน (หากเปิดใช้ในโปรเจ็กต์ Firebase)STORAGE_BUCKET
— ที่เก็บข้อมูล Cloud Storage ที่เชื่อมโยงกับฟังก์ชัน (หากเปิดใช้ในโปรเจ็กต์ Firebase)
ฟังก์ชันเหล่านี้เหมือนกับพารามิเตอร์สตริงที่ผู้ใช้กำหนดในทุกๆ ด้าน ยกเว้นเนื่องจาก Firebase CLI เป็นค่าของพารามิเตอร์เหล่านี้เสมอ ระบบจึงจะไม่แจ้งเตือนค่าในการทำให้ใช้งานได้หรือบันทึกลงในไฟล์ .env
พารามิเตอร์ลับ
พารามิเตอร์ประเภท Secret
ที่กำหนดโดยใช้ defineSecret()
แสดงถึงพารามิเตอร์สตริงที่มีค่าที่จัดเก็บไว้ใน Secret Manager ของ Cloud แทนที่จะตรวจสอบไฟล์ .env
ในเครื่องและเขียนค่าใหม่ลงในไฟล์หากไม่มี พารามิเตอร์ลับจะตรวจสอบการมีอยู่ใน Secret Manager ของ Cloud และแจ้งเตือนค่าของข้อมูลลับใหม่แบบอินเทอร์แอกทีฟในระหว่างการทำให้ใช้งานได้
พารามิเตอร์ลับที่กำหนดด้วยวิธีนี้ต้องเชื่อมโยงกับแต่ละฟังก์ชันที่ควรมีสิทธิ์เข้าถึง
Node.js
const { onRequest } = require('firebase-functions/v2/https');
const { defineSecret } = require('firebase-functions/params');
const discordApiKey = defineSecret('DISCORD_API_KEY');
export const postToDiscord = onRequest(
{ secrets: [discordApiKey] },
(req, res) => {
const apiKey = discordApiKey.value();
//…
Python
from firebase_functions import https_fn
from firebase_functions.params import SecretParam
DISCORD_API_KEY = SecretParam('DISCORD_API_KEY');
@https_fn.on_request(secrets=[DISCORD_API_KEY])
def post_to_discord(req):
api_key = DISCORD_API_KEY.value()
เนื่องจากค่าของข้อมูลลับจะถูกซ่อนไว้จนกว่าจะมีการเรียกใช้ฟังก์ชัน คุณจึงไม่สามารถใช้ค่าเหล่านี้ขณะที่กำหนดค่าฟังก์ชันได้
ตัวแปรสภาพแวดล้อม
Cloud Functions for Firebase รองรับรูปแบบไฟล์ dotenv สำหรับการโหลดตัวแปรสภาพแวดล้อมการโหลดที่ระบุในไฟล์ .env
ไปยังรันไทม์ของแอปพลิเคชัน เมื่อทำให้ใช้งานได้แล้ว คุณจะอ่านตัวแปรสภาพแวดล้อมได้ผ่านอินเทอร์เฟซ process.env
(ในโปรเจ็กต์ที่ใช้ Node.js) หรือ os.environ
(ในโปรเจ็กต์ที่ใช้ Python)
หากต้องการกำหนดค่าสภาพแวดล้อมด้วยวิธีนี้ ให้สร้างไฟล์ .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. # ...
เมื่อทำให้ตัวแปรสภาพแวดล้อมที่กำหนดเองใช้งานได้แล้ว โค้ดฟังก์ชันจะเข้าถึงตัวแปรดังกล่าวได้ ดังนี้
Node.js
// Responds with "Hello Earth and Humans"
exports.hello = onRequest((request, response) => {
response.send(`Hello ${process.env.PLANET} and ${process.env.AUDIENCE}`);
});
Python
import os
@https_fn.on_request()
def hello(req):
return https_fn.Response(
f"Hello {os.environ.get('PLANET')} and {os.environ.get('AUDIENCE')}"
)
การทำให้ตัวแปรสภาพแวดล้อมหลายชุดใช้งานได้
หากต้องการตัวแปรสภาพแวดล้อมชุดอื่นสำหรับโปรเจ็กต์ Firebase (เช่น การทดลองใช้กับเวอร์ชันที่ใช้งานจริง) ให้สร้างไฟล์ .env.<project or
alias>
แล้วเขียนตัวแปรสภาพแวดล้อมเฉพาะโปรเจ็กต์ไว้ที่นั่น ตัวแปรสภาพแวดล้อมจากไฟล์ .env
และไฟล์ .env
เฉพาะโปรเจ็กต์ (หากมี) จะรวมอยู่ในฟังก์ชันที่ทำให้ใช้งานได้ทั้งหมด
ตัวอย่างเช่น โปรเจ็กต์อาจรวมไฟล์ 3 ไฟล์นี้ซึ่งมีค่าที่แตกต่างกันเล็กน้อยสำหรับการพัฒนาและเวอร์ชันที่ใช้งานจริง
.env
|
.env.dev
|
.env.prod
|
PLANET=โลก
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_
- คีย์จากรายการต่อไปนี้
- การกำหนดค่า Cloud RUNTIME
- ENTRY_POINT
- โปรเจ็กต์ GCP
- โปรเจ็กต์ GCLOUD
- Google Cloud
- ประเภททริกเกอร์ฟังก์ชัน
- FUNCTION_NAME
- ฟังก์ชัน MEMORY_MB
- เวลาฟังก์ชัน OUT_วินาที
- รหัสฟังก์ชัน
- ภูมิภาคฟังก์ชัน
- ฟังก์ชันเป้าหมาย
- ประเภทลายเซ็นของฟังก์ชัน
- K_SERVICE
- K_การแก้ไข
- พอร์ต
- K_การกำหนดค่า
จัดเก็บและเข้าถึงข้อมูลการกำหนดค่าที่มีความละเอียดอ่อน
ตัวแปรสภาพแวดล้อมที่จัดเก็บไว้ในไฟล์ .env
สามารถใช้สำหรับการกำหนดค่าฟังก์ชันได้ แต่คุณไม่ควรพิจารณาว่าตัวแปรเหล่านี้เป็นวิธีที่ปลอดภัยในการจัดเก็บข้อมูลที่ละเอียดอ่อน เช่น ข้อมูลเข้าสู่ระบบฐานข้อมูลหรือคีย์ API การดำเนินการนี้มีความสำคัญอย่างยิ่งหากคุณตรวจสอบไฟล์ .env
ในการควบคุมแหล่งที่มา
Cloud Functions for Firebase จะผสานรวมกับ Secret Manager ของ Google Cloud เพื่อช่วยให้คุณจัดเก็บข้อมูลการกำหนดค่าที่มีความละเอียดอ่อนได้ บริการที่เข้ารหัสนี้จะจัดเก็บค่าของการกำหนดค่าไว้อย่างปลอดภัย ในขณะเดียวกันก็ยังอนุญาตให้ฟังก์ชันต่างๆ เข้าถึงได้โดยง่ายเมื่อจำเป็น
สร้างและใช้ข้อมูลลับ
หากต้องการสร้างข้อมูลลับ ให้ใช้ Firebase CLI
หากต้องการสร้างและใช้ข้อมูลลับ ให้ทำดังนี้
เรียกใช้คำสั่งต่อไปนี้จากรูทของไดเรกทอรีโปรเจ็กต์ในเครื่อง
firebase functions:secrets:set SECRET_NAME
ป้อนค่า SECRET_NAME
CLI จะแสดงข้อความดำเนินการสำเร็จและเตือนว่าคุณต้องทำให้ฟังก์ชันใช้งานได้เพื่อให้การเปลี่ยนแปลงมีผล
ก่อนทำให้ใช้งานได้ โปรดตรวจสอบว่าโค้ดฟังก์ชันอนุญาตให้ฟังก์ชันเข้าถึงข้อมูลลับโดยใช้พารามิเตอร์
runWith
ดังนี้Node.js
const { onRequest } = require('firebase-functions/v2/https'); exports.processPayment = onRequest( { secrets: ["SECRET_NAME"] }, (req, res) => { const myBillingService = initializeBillingService( // reference the secret value process.env.SECRET_NAME ); // Process the payment } );
Python
import os from firebase_functions import https_fn @https_fn.on_request(secrets=["SECRET_NAME"]) def process_payment(req): myBillingService = initialize_billing(key=os.environ.get('SECRET_NAME')) # Process the payment ...
ทำให้ Cloud Function ใช้งานได้:
firebase deploy --only functions
ตอนนี้คุณจะเข้าถึงได้เช่นเดียวกับตัวแปรสภาพแวดล้อมอื่นๆ ในทางกลับกัน หากฟังก์ชันอื่นที่ไม่ได้ระบุข้อมูลลับใน
runWith
พยายามเข้าถึงข้อมูลลับ ฟังก์ชันดังกล่าวจะได้รับค่าที่ไม่ได้กำหนดไว้ดังนี้Node.js
exports.anotherEndpoint = 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 });
Python
@https_fn.on_request() def another_endpoint(req): return https_fn.Response(f"The secret API key is {os.environ.get("SECRET_NAME")}") # Responds with "The secret API key is None" because the `secrets` 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=มนุษย์ในท้องถิ่น |
เมื่อเริ่มต้นในบริบทในเครื่อง โปรแกรมจำลองจะโหลดตัวแปรสภาพแวดล้อมตามที่แสดงไว้
$ 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
แทน ดังที่แสดงในตัวแปรสภาพแวดล้อม