กำหนดค่าสภาพแวดล้อม


โดยส่วนใหญ่แล้ว คุณจะต้องกำหนดค่าเพิ่มเติมสำหรับฟังก์ชัน เช่น คีย์ API ของบุคคลที่สามหรือการตั้งค่าที่ปรับได้ Firebase SDK สำหรับ Cloud Functions มีการกำหนดค่าสภาพแวดล้อมในตัวเพื่อให้จัดเก็บและเรียกข้อมูลประเภทนี้สำหรับโปรเจ็กต์ของคุณได้ง่าย

คุณสามารถเลือกตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้

  • การกำหนดค่าแบบพารามิเตอร์ (แนะนําสําหรับสถานการณ์ส่วนใหญ่) ซึ่งจะให้การกำหนดค่าสภาพแวดล้อมที่มีการพิมพ์อย่างเข้มงวด พร้อมพารามิเตอร์ที่ได้รับการตรวจสอบในเวลาที่ทำการติดตั้งใช้งาน ซึ่ง จะช่วยป้องกันข้อผิดพลาดและลดความซับซ้อนในการแก้ไขข้อบกพร่อง
  • การกำหนดค่าตัวแปรสภาพแวดล้อมตามไฟล์ ในวิธีนี้ คุณจะต้องสร้างไฟล์ dotenv ด้วยตนเองเพื่อโหลด ตัวแปรสภาพแวดล้อม

สําหรับกรณีการใช้งานส่วนใหญ่ เราขอแนะนําให้ใช้การกําหนดค่าแบบพารามิเตอร์ แนวทางนี้ ทำให้ค่าการกำหนดค่าพร้อมใช้งานทั้งในเวลาที่รันไทม์และเวลาที่ทำการติดตั้งใช้งาน และ การติดตั้งใช้งานจะถูกบล็อกจนกว่าพารามิเตอร์ทั้งหมดจะมีค่าที่ถูกต้อง ในทางกลับกัน การกำหนดค่าด้วยตัวแปรสภาพแวดล้อมจะไม่พร้อมใช้งานในเวลาที่ทำการ Deploy

การกำหนดค่าที่มีพารามิเตอร์

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 ด้วย ประเภทที่รองรับมีดังนี้

  • ข้อมูลลับ
  • สตริง
  • บูลีน
  • จำนวนเต็ม
  • ทศนิยม
  • แสดงรายการ (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 พารามิเตอร์ลับจะตรวจสอบว่ามีอยู่ใน Secret Manager ของ Cloud หรือไม่ และจะแจ้งให้ป้อนค่าของข้อมูลลับใหม่แบบอินเทอร์แอกทีฟในระหว่างการติดตั้งใช้งาน แทนที่จะตรวจสอบกับไฟล์ .env ในเครื่องและเขียนค่าใหม่ลงในไฟล์หากไม่มี

พารามิเตอร์ลับที่กำหนดด้วยวิธีนี้ต้องเชื่อมโยงกับฟังก์ชันแต่ละรายการที่ ควรมีสิทธิ์เข้าถึงพารามิเตอร์เหล่านั้น

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 ในโปรเจ็กต์ เพิ่มตัวแปรที่ต้องการ แล้วทำการติดตั้งใช้งาน

  1. สร้างไฟล์ .env ในไดเรกทอรี functions/ ดังนี้

    # Directory layout:
    #   my-project/
    #     firebase.json
    #     functions/
    #       .env
    #       package.json
    #       index.js
    
  2. เปิด.envไฟล์เพื่อแก้ไข แล้วเพิ่มคีย์ที่ต้องการ เช่น

    PLANET=Earth
    AUDIENCE=Humans
    
  3. ทําให้ฟังก์ชันใช้งานได้และยืนยันว่าระบบโหลดตัวแปรสภาพแวดล้อมแล้ว

    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=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

วิธีสร้างและใช้ข้อมูลลับ

  1. เรียกใช้คำสั่งต่อไปนี้จากรูทของไดเรกทอรีโปรเจ็กต์ในเครื่อง

    firebase functions:secrets:set SECRET_NAME

  2. ป้อนค่าสำหรับ SECRET_NAME

    CLI จะแสดงข้อความว่าดำเนินการสำเร็จและเตือนว่าคุณต้องติดตั้งใช้งานฟังก์ชัน เพื่อให้การเปลี่ยนแปลงมีผล

  3. ก่อนที่จะติดตั้งใช้งาน โปรดตรวจสอบว่าโค้ดฟังก์ชันอนุญาตให้ฟังก์ชันเข้าถึงข้อมูลลับโดยใช้พารามิเตอร์ 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
        ...
    
  4. ทำให้ Cloud Functions ใช้งานได้

    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 รายการโดยไม่มีค่าใช้จ่าย ซึ่งหมายความว่าคุณสามารถมี 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 จะหยุดให้บริการ หลังจากเดือนธันวาคม 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 แทน ดังที่แสดงใน ตัวแปรสภาพแวดล้อม