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


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

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

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

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

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

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

หากต้องการกำหนดพารามิเตอร์ในโค้ด ให้ทำตามรูปแบบนี้

const functions = require('firebase-functions/v1');
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> ที่สร้างขึ้นลงในการควบคุมเวอร์ชันอาจมีประโยชน์ ทั้งนี้ขึ้นอยู่กับเวิร์กโฟลว์การพัฒนา

การใช้พารามิเตอร์ในขอบเขตส่วนกลาง

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

  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"})

ประเภทพารามิเตอร์

การกำหนดค่าแบบพารามิเตอร์จะให้การพิมพ์ที่รัดกุมสำหรับค่าพารามิเตอร์ และยังรองรับข้อมูลลับจาก Secret Manager ของ Cloud ด้วย ประเภทที่รองรับมีดังนี้

  • ข้อมูลลับ
  • สตริง
  • บูลีน
  • จำนวนเต็ม
  • ทศนิยม

ดูข้อมูลเกี่ยวกับฟังก์ชันสำหรับการกำหนดพารามิเตอร์ได้ที่paramsข้อมูลอ้างอิงเนมสเปซ

ค่าและนิพจน์ของพารามิเตอร์

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

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

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

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

พารามิเตอร์ลับ

พารามิเตอร์ประเภท Secret ซึ่งกำหนดโดยใช้ defineSecret() แสดงถึงพารามิเตอร์สตริง ซึ่งมีค่าที่จัดเก็บไว้ใน Secret Manager ของ Cloud พารามิเตอร์ลับจะตรวจสอบว่ามีอยู่ใน Secret Manager ของ Cloud หรือไม่ และจะแจ้งให้ป้อนค่าของข้อมูลลับใหม่แบบอินเทอร์แอกทีฟในระหว่างการติดตั้งใช้งาน แทนที่จะตรวจสอบกับไฟล์ .env ในเครื่องและเขียนค่าใหม่ลงในไฟล์หากไม่มี

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

const functions = require('firebase-functions/v1');
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 ในโปรเจ็กต์ เพิ่มตัวแปรที่ต้องการ แล้วทำการติดตั้งใช้งาน

  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.
    # ...
    

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

    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
      });
  4. ทำให้ 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 รายการโดยไม่มีค่าใช้จ่าย ซึ่งหมายความว่าคุณสามารถมี Secret 6 รายการต่อเดือนในโปรเจ็กต์ Firebase ได้โดยไม่มีค่าใช้จ่าย

โดยค่าเริ่มต้น Firebase CLI จะพยายามทำลายเวอร์ชันลับที่ไม่ได้ใช้โดยอัตโนมัติ ในกรณีที่เหมาะสม เช่น เมื่อคุณติดตั้งใช้งานฟังก์ชันที่มีเวอร์ชันใหม่ ของข้อมูลลับ นอกจากนี้ คุณยังล้างข้อมูลลับที่ไม่ได้ใช้ได้โดยใช้ functions:secrets:destroy และ functions:secrets:prune

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

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

ย้ายข้อมูลไปยังแพ็กเกจย่อย params

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

ก่อน: รุ่นที่ 1

const functions = require("firebase-functions/v1");

exports.date = functions.https.onRequest((req, res) => {
  const date = new Date();
  const formattedDate =
date.toLocaleDateString(functions.config().dateformat);

  // ...
});

หลัง: รุ่นที่ 2

const {onRequest} = require("firebase-functions/v2/https");
const {defineString} = require("firebase-functions/params");

const dateFormat = defineString("DATE_FORMAT");

exports.date = onRequest((req, res) => {
  const date = new Date();
  const formattedDate = date.toLocaleDateString(dateFormat.value());

  // ...
});

ตั้งค่าพารามิเตอร์

เมื่อทำการติดตั้งใช้งานครั้งแรก Firebase CLI จะแจ้งให้ป้อนค่าทั้งหมดของ พารามิเตอร์ และบันทึกค่าในไฟล์ dotenv หากต้องการส่งออกfunctions.configค่าfirebase functions:config:export ให้เรียกใช้

นอกจากนี้ คุณยังระบุประเภทพารามิเตอร์และกฎการตรวจสอบเพื่อเพิ่มความปลอดภัยได้ด้วย

กรณีพิเศษ: คีย์ API

params โมดูลผสานรวมกับ Secret Manager ของ Cloud ซึ่งให้การควบคุมการเข้าถึงแบบละเอียดสำหรับค่าที่ละเอียดอ่อน เช่น คีย์ API ดูข้อมูลเพิ่มเติมได้ที่ พารามิเตอร์ลับ

ตัวแปรสภาพแวดล้อมที่สร้างขึ้นโดยอัตโนมัติ

มีตัวแปรสภาพแวดล้อมที่จะได้รับการป้อนค่าโดยอัตโนมัติใน รันไทม์ของฟังก์ชันและในฟังก์ชันที่จำลองในเครื่อง ซึ่งรวมถึง รายการที่สร้างโดย Google Cloud รวมถึงตัวแปรสภาพแวดล้อมเฉพาะของ Firebase

process.env.FIREBASE_CONFIG: ให้ข้อมูลการกำหนดค่าโปรเจ็กต์ Firebase ต่อไปนี้

{
  databaseURL: 'https://DATABASE_NAME.firebaseio.com',
  storageBucket: 'PROJECT_ID.firebasestorage.app',
  projectId: 'PROJECT_ID'
}

โปรดทราบว่าค่าในการกำหนดค่า Firebase จริงอาจแตกต่างกันไปตาม ทรัพยากรที่คุณจัดสรรไว้ในโปรเจ็กต์

การกำหนดค่านี้จะมีผลโดยอัตโนมัติเมื่อคุณเริ่มต้น Firebase Admin SDK โดยไม่มีอาร์กิวเมนต์ หากคุณเขียนฟังก์ชันใน JavaScript ให้เริ่มต้นใช้งานดังนี้

const admin = require('firebase-admin');
admin.initializeApp();

หากคุณเขียนฟังก์ชันใน TypeScript ให้เริ่มต้นใช้งานดังนี้

import * as functions from 'firebase-functions/v1';
import * as admin from 'firebase-admin';
import 'firebase-functions/v1';
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);