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


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

โดยเลือกได้ระหว่างตัวเลือกต่อไปนี้

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

สําหรับ 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() Callback นี้จะทำงานก่อนฟังก์ชันใดๆ จะทำงานในเวอร์ชันที่ใช้งานจริง แต่จะไม่เรียกใช้ในระหว่างเวลาการทำให้ใช้งานได้ ดังนั้นจึงเป็นที่ที่ปลอดภัยสำหรับการเข้าถึงค่าของพารามิเตอร์

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 จะประเมินพารามิเตอร์ทั้งในเวลาที่ติดตั้งใช้งานและขณะที่ฟังก์ชันทำงาน เนื่องจากมี 2 สภาพแวดล้อมดังกล่าว คุณจึงต้องระมัดระวังเป็นพิเศษเมื่อเปรียบเทียบค่าพารามิเตอร์และเมื่อใช้ค่าเหล่านั้นเพื่อตั้งค่าตัวเลือกรันไทม์สําหรับฟังก์ชัน

หากต้องการส่งพารามิเตอร์ไปยังฟังก์ชันเป็นตัวเลือกรันไทม์ ให้ส่งพารามิเตอร์นั้นโดยตรง ดังนี้

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 — โปรเจ็กต์ Cloud ที่ฟังก์ชันทำงานอยู่
  • databaseURL — URL ของอินสแตนซ์ Realtime Database ที่เชื่อมโยงกับฟังก์ชัน (หากเปิดใช้ในโปรเจ็กต์ Firebase)
  • storageBucket — ที่เก็บข้อมูล Cloud Storage ที่เชื่อมโยงกับฟังก์ชัน (หากเปิดใช้ในโปรเจ็กต์ Firebase)

Python

  • PROJECT_ID — โปรเจ็กต์ Cloud ที่ฟังก์ชันทำงานอยู่
  • 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 ในโปรเจ็กต์ แล้วเพิ่มตัวแปรที่ต้องการ จากนั้นทําให้การเผยแพร่ใช้งานได้

  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_ภูมิภาค
  • FUNCTION_TARGET
  • FUNCTION_SIGNATURE_TYPE
  • K_SERVICE
  • K_REVISION
  • พอร์ต
  • 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 โดยเฉพาะเท่านั้นที่จะมีสิทธิ์เข้าถึงข้อมูลลับนั้นในฐานะตัวแปรสภาพแวดล้อม วิธีนี้ช่วยให้มั่นใจได้ว่าค่าข้อมูลลับจะพร้อมใช้งานเฉพาะในที่ที่จำเป็นเท่านั้น ซึ่งจะช่วยลดความเสี่ยงในการรั่วไหลข้อมูลลับโดยไม่ตั้งใจ

การจัดการข้อมูลลับ

ใช้ CLI ของ Firebase เพื่อจัดการข้อมูลลับ ขณะจัดการข้อมูลลับด้วยวิธีนี้ โปรดทราบว่าการเปลี่ยนแปลง 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 ครั้งใน Secret อินสแตนซ์ฟังก์ชันจะอ่านเฉพาะข้อมูลลับที่ระบุในพารามิเตอร์ runWith ทุกครั้งที่ Cold Start หากคุณมีอินสแตนซ์ฟังก์ชันจำนวนมากที่อ่านข้อมูลลับจำนวนมาก โปรเจ็กต์ของคุณอาจใช้สิทธิ์เกินจำนวนที่อนุญาต ซึ่งในกรณีนี้ ระบบจะเรียกเก็บเงินจากคุณ $0.03 ต่อการดำเนินการเข้าถึง 10,000 ครั้ง

ดูข้อมูลเพิ่มเติมได้ที่Secret Manager Pricing

การรองรับโปรแกรมจำลอง

การกําหนดค่าสภาพแวดล้อมด้วย dotenv ออกแบบมาเพื่อทํางานร่วมกับCloud Functionsโปรแกรมจําลองในเครื่อง

เมื่อใช้โปรแกรมจำลอง Cloud Functions ในเครื่อง คุณลบล้างตัวแปรสภาพแวดล้อมสำหรับโปรเจ็กต์ได้โดยการตั้งค่าไฟล์ .env.local เนื้อหาของ .env.local จะมีความสําคัญเหนือกว่า .env และไฟล์ .env เฉพาะโปรเจ็กต์

ตัวอย่างเช่น โปรเจ็กต์อาจมีไฟล์ 3 ไฟล์ต่อไปนี้ซึ่งมีค่าแตกต่างกันเล็กน้อยสําหรับการพัฒนาและการทดสอบในเครื่อง

.env .env.dev .env.local
PLANET=Earth

AUDIENCE=Humans

AUDIENCE=มนุษย์พัฒนา 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) 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 แทน ดังที่แสดงในตัวแปรสภาพแวดล้อม