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


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

  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=โลก

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

หากต้องการสร้างและใช้ข้อมูลลับ ให้ทำดังนี้

  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 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 แทน ดังที่แสดงในตัวแปรสภาพแวดล้อม