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


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

โดยเลือกได้จากตัวเลือกต่อไปนี้

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

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

การกําหนดค่าแบบมีพารามิเตอร์

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 Projects
storage buckets"})

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

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

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

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

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

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

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.`);
  }
);

พารามิเตอร์ในตัว

SDK ของ Cloud Functions มีพารามิเตอร์ที่กําหนดไว้ล่วงหน้า 3 รายการจากแพ็กเกจย่อย firebase-functions/params ดังนี้

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

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

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

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

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

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 ผู้ชมที่เป็นมนุษย์

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

$ 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
  • GOOGLE_CLOUD_PROJECT
  • ประเภท FUNCTION_ทริกเกอร์
  • FUNCTION_NAME
  • FUNCTION_MEMORY_MB
  • FUNCTION_TIMEOUT_SEC
  • FUNCTION_IDENTITY
  • FUNCTION_ภูมิภาค
  • FUNCTION_เป้าหมาย
  • ประเภท 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 ดังนี้

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

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

ใช้ CLI ของ Firebase เพื่อจัดการข้อมูลลับ ขณะที่จัดการความลับด้วยวิธีนี้ โปรดทราบว่าคุณต้องแก้ไขและ/หรือทำให้ใช้งานได้อีกครั้งสำหรับการเปลี่ยนแปลง CLI ที่เกี่ยวข้อง กล่าวโดยละเอียดคือ

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

สรุปของคำสั่ง CLI ของ Firebase สำหรับการจัดการข้อมูลลับมีดังนี้

# 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 โดยไม่มีค่าใช้จ่าย

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

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

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 ค่าข้อมูลลับเนื่องจากข้อจำกัดด้านสิทธิ์

เช่นเดียวกับการรองรับโปรแกรมจำลอง Cloud Functions สำหรับตัวแปรสภาพแวดล้อม คุณสามารถ ลบล้างค่าข้อมูลลับด้วยการตั้งค่าไฟล์ .secret.local วิธีนี้ช่วยให้คุณทดสอบฟังก์ชันในเครื่องได้ง่ายขึ้น โดยเฉพาะในกรณีที่คุณไม่มีสิทธิ์เข้าถึงค่าลับ

การย้ายข้อมูลจากการกำหนดค่าสภาพแวดล้อม

หากคุณใช้การกำหนดค่าสภาพแวดล้อมกับ functions.config คุณจะทำสิ่งต่อไปนี้ได้ สามารถย้ายข้อมูลการกำหนดค่าที่มีอยู่เป็นตัวแปรสภาพแวดล้อมได้ (ใน dotenv) CLI ของ Firebase มีคำสั่งการส่งออกที่แสดงเอาต์พุตของการกำหนดค่า ของชื่อแทนหรือโครงการแต่ละรายการในไฟล์ .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 แทน ดังที่แสดงในหัวข้ออัปเกรดเป็นรุ่นที่ 2

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

ตั้งค่าการกำหนดค่าสภาพแวดล้อมด้วย CLI

หากต้องการจัดเก็บข้อมูลสภาพแวดล้อม คุณสามารถใช้firebase functions:config:set command ใน Firebase CLI แต่ละคีย์สามารถสร้างเนมสเปซโดยใช้จุดเพื่อจัดกลุ่มที่เกี่ยวข้องกัน การกำหนดค่าร่วมกัน โปรดทราบว่าเฉพาะอักขระตัวพิมพ์เล็กเท่านั้น ยอมรับในคีย์ ห้ามใช้อักขระตัวพิมพ์ใหญ่

เช่น หากต้องการจัดเก็บรหัสไคลเอ็นต์และคีย์ API สําหรับ "บริการบางอย่าง" คุณอาจเรียกใช้โค้ดต่อไปนี้

firebase functions:config:set someservice.key="THE API KEY" someservice.id="THE CLIENT ID"

เรียกข้อมูลการกำหนดค่าสภาพแวดล้อมปัจจุบัน

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

{
  "someservice": {
    "key":"THE API KEY",
    "id":"THE CLIENT ID"
  }
}

ฟังก์ชันการทำงานนี้อิงตาม Google Cloud Runtime Configuration API

ใช้ functions.config เพื่อเข้าถึงการกำหนดค่าสภาพแวดล้อมในฟังก์ชัน

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

const functions = require('firebase-functions/v1');
const request = require('request-promise');

exports.userCreated = functions.database.ref('/users/{id}').onWrite(event => {
  let email = event.data.child('email').val();

  return request({
    url: 'https://someservice.com/api/some/call',
    headers: {
      'X-Client-ID': functions.config().someservice.id,
      'Authorization': `Bearer ${functions.config().someservice.key}`
    },
    body: {email: email}
  });
});

ใช้การกําหนดค่าสภาพแวดล้อมเพื่อเริ่มต้นโมดูล

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

เช่น หากต้องการใช้โมดูล Slack Node SDK คุณอาจเขียนโค้ดดังนี้

const functions = require('firebase-functions/v1');
const IncomingWebhook = require('@slack/client').IncomingWebhook;
const webhook = new IncomingWebhook(functions.config().slack.url);

ก่อนที่จะทำให้ใช้งานได้ ให้ตั้งค่าตัวแปรการกำหนดค่าสภาพแวดล้อม slack.url ดังนี้

firebase functions:config:set slack.url=https://hooks.slack.com/services/XXX

คำสั่งเพิ่มเติมเกี่ยวกับสภาพแวดล้อม

  • firebase functions:config:unset key1 key2 นำคีย์ที่ระบุออกจากการกําหนดค่า
  • firebase functions:config:clone --from <fromProject> จะโคลนสภาพแวดล้อมของโปรเจ็กต์อื่นลงใน โปรเจ็กต์ที่ใช้งานอยู่ในปัจจุบัน

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

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

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

{
  databaseURL: 'https://databaseName.firebaseio.com',
  storageBucket: 'projectId.appspot.com',
  projectId: 'projectId'
}

ระบบจะใช้การกำหนดค่านี้โดยอัตโนมัติเมื่อคุณเริ่มต้น 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);