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


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

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

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

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

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

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

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

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

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

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

หากต้องการสร้างข้อมูลลับ ให้ใช้ CLI ของ Firebase

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

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

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

ต่อไปนี้เป็นข้อมูลสรุปเกี่ยวกับคำสั่ง 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 แทน ดังที่แสดงในหัวข้ออัปเกรดเป็นรุ่นที่ 2

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

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

หากต้องการจัดเก็บข้อมูลสภาพแวดล้อม คุณสามารถใช้คำสั่ง firebase functions:config:set ใน 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}
  });
});

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

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

เช่น หากต้องการใช้โมดูล 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);