Định cấu hình môi trường của bạn


Thông thường, bạn sẽ cần cấu hình bổ sung cho các chức năng của mình, chẳng hạn như khoá API của bên thứ ba hoặc các chế độ cài đặt có thể điều chỉnh. SDK Firebase cho Cloud Functions cung cấp cấu hình môi trường tích hợp sẵn để giúp bạn dễ dàng lưu trữ và truy xuất loại dữ liệu này cho dự án.

Bạn có thể chọn một trong ba tùy chọn sau:

  • Cấu hình có tham số (nên dùng cho hầu hết các trường hợp). Điều này cung cấp cấu hình môi trường được định kiểu mạnh với các tham số được xác thực tại thời điểm triển khai, giúp ngăn ngừa lỗi và đơn giản hoá việc gỡ lỗi.
  • Cấu hình dựa trên tệp của biến môi trường. Với phương pháp này, bạn sẽ tạo một tệp dotenv theo cách thủ công để tải các biến môi trường.
  • Cấu hình môi trường thời gian chạy bằng Giao diện dòng lệnh (CLI) của Firebase và functions.config (chỉ dành cho các Chức năng đám mây (thế hệ thứ 1).

Đối với hầu hết các trường hợp sử dụng, bạn nên sử dụng cấu hình có tham số. Phương pháp này giúp bạn cung cấp các giá trị cấu hình ở cả thời gian chạy và thời gian triển khai. Đồng thời, quá trình triển khai sẽ bị chặn trừ phi tất cả tham số đều có giá trị hợp lệ. Ngược lại, cấu hình với các biến môi trường không có sẵn tại thời điểm triển khai.

Cấu hình tham số

Cloud Functions cho Firebase cung cấp một giao diện để xác định các tham số cấu hình theo cách khai báo bên trong cơ sở mã của bạn. Giá trị của các tham số này có sẵn cả trong quá trình triển khai hàm, khi thiết lập tuỳ chọn triển khai và thời gian chạy, cũng như trong quá trình thực thi. Điều này có nghĩa là CLI sẽ chặn việc triển khai trừ phi tất cả tham số đều có giá trị hợp lệ.

Để xác định các tham số trong mã của bạn, hãy làm theo mô hình sau:

const functions = require('firebase-functions');
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.`);
  }
);

Khi triển khai một hàm có các biến cấu hình có tham số, trước tiên, Firebase CLI sẽ cố gắng tải các giá trị của các biến đó từ các tệp .env cục bộ. Nếu các giá trị đó không có trong các tệp đó và bạn không đặt default nào, CLI sẽ nhắc về các giá trị trong quá trình triển khai, sau đó tự động lưu các giá trị đó vào tệp .env có tên .env.<project_ID> trong thư mục functions/ của bạn:

$ 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

Tuỳ thuộc vào quy trình phát triển, bạn nên thêm tệp .env.<project_ID> đã tạo vào hệ thống quản lý phiên bản.

Sử dụng thông số trong phạm vi toàn cầu

Trong quá trình triển khai, mã hàm của bạn sẽ được tải và kiểm tra trước khi các tham số của bạn có giá trị thực tế. Điều này có nghĩa là việc tìm nạp các giá trị thông số trong phạm vi toàn cầu sẽ dẫn đến lỗi triển khai. Đối với các trường hợp mà bạn muốn dùng một tham số để khởi tạo giá trị chung, hãy sử dụng lệnh gọi lại khởi tạo onInit(). Lệnh gọi lại này chạy trước khi bất kỳ hàm nào chạy trong phiên bản chính thức nhưng không được gọi trong thời gian triển khai. Vì vậy, đây là nơi an toàn để truy cập vào giá trị của tham số.

  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());
  })

Định cấu hình hành vi của CLI

Bạn có thể định cấu hình các tham số bằng đối tượng Options kiểm soát cách CLI nhắc nhập các giá trị. Ví dụ sau đây đặt các tuỳ chọn để xác thực định dạng số điện thoại, cung cấp một tuỳ chọn lựa chọn đơn giản và tự động điền sẵn tuỳ chọn lựa chọn từ dự án 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"})

Loại thông số

Cấu hình tham số hoá cung cấp khả năng nhập mạnh mẽ cho các giá trị tham số, đồng thời hỗ trợ các khoá bí mật từ Cloud Secret Manager. Các loại được hỗ trợ là:

  • Bí mật
  • Chuỗi
  • Boolean
  • Số nguyên
  • Số thực dấu phẩy động

Giá trị tham số và biểu thức

Firebase đánh giá các thông số của bạn cả tại thời điểm triển khai và khi hàm đang thực thi. Do các môi trường kép này, bạn phải hết sức cẩn trọng khi so sánh các giá trị tham số và khi sử dụng các môi trường đó để đặt tuỳ chọn thời gian chạy cho các hàm của mình.

Để truyền một tham số vào hàm của bạn dưới dạng tuỳ chọn thời gian chạy, hãy truyền trực tiếp tham số đó:

const functions = require('firebase-functions');
const { defineInt} = require('firebase-functions/params');
const minInstancesConfig = defineInt('HELLO\_WORLD\_MININSTANCES');

export const helloWorld = functions.runWith({ minInstances: minInstancesConfig}).https.onRequest(
  (req, res) => {
    //…

Ngoài ra, nếu cần so sánh với một tham số để biết nên chọn lựa chọn nào, bạn cần sử dụng các trình so sánh tích hợp thay vì kiểm tra giá trị:

const functions = require('firebase-functions');
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) => {
    //…

Có thể truy cập các tham số và biểu thức tham số chỉ được dùng trong thời gian chạy bằng hàm value:

const functions = require('firebase-functions');
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.`);
  }
);

Tham số tích hợp

SDK Chức năng đám mây cung cấp 3 tham số được xác định trước, có trong gói con firebase-functions/params:

  • projectID — dự án trên đám mây mà hàm này đang chạy.
  • databaseURL – URL của thực thể Cơ sở dữ liệu theo thời gian thực được liên kết với hàm này (nếu được bật trong dự án Firebase).
  • storageBucket – bộ chứa Cloud Storage được liên kết với hàm (nếu được bật trong dự án Firebase).

Các hàm này giống như các tham số chuỗi do người dùng xác định trong mọi khía cạnh, ngoại trừ do Firebase CLI biết rõ các giá trị của những tham số này nên giá trị của những tham số này sẽ không bao giờ được nhắc khi triển khai cũng như không được lưu vào tệp .env.

Tham số bí mật

Các tham số thuộc loại Secret, được xác định bằng defineSecret(), biểu thị các tham số chuỗi có giá trị được lưu trữ trong Cloud Secret Manager. Thay vì kiểm tra tệp .env cục bộ và ghi giá trị mới vào tệp nếu thiếu, các tham số bí mật sẽ kiểm tra sự tồn tại trong Cloud Secret Manager và nhắc tương tác về giá trị của khoá bí mật mới trong quá trình triển khai.

Các tham số bí mật được xác định theo cách này phải được liên kết với từng hàm riêng lẻ có quyền truy cập vào các tham số đó:

const functions = require('firebase-functions');
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();
    //…

Vì giá trị của khoá bí mật bị ẩn cho đến khi thực thi hàm, nên bạn không thể sử dụng các giá trị đó trong khi định cấu hình hàm.

Biến môi trường

Chức năng đám mây cho Firebase hỗ trợ định dạng tệp dotenv để tải các biến môi trường được chỉ định trong tệp .env vào thời gian chạy ứng dụng của bạn. Sau khi triển khai, bạn có thể đọc các biến môi trường thông qua giao diện process.env.

Để định cấu hình môi trường theo cách này, hãy tạo tệp .env trong dự án, thêm các biến mong muốn và triển khai:

  1. Tạo tệp .env trong thư mục functions/:

    # Directory layout:
    #   my-project/
    #     firebase.json
    #     functions/
    #       .env
    #       package.json
    #       index.js
    
  2. Mở tệp .env để chỉnh sửa rồi thêm các khoá mong muốn. Ví dụ:

    PLANET=Earth
    AUDIENCE=Humans
    
  3. Triển khai các hàm và xác minh rằng các biến môi trường đã được tải:

    firebase deploy --only functions
    # ...
    # i functions: Loaded environment variables from .env.
    # ...
    

Sau khi bạn triển khai các biến môi trường tuỳ chỉnh, mã hàm có thể truy cập vào các biến đó bằng cú pháp 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}`);
});

Triển khai nhiều tập hợp biến môi trường

Nếu bạn cần một tập hợp các biến môi trường thay thế cho các dự án Firebase (chẳng hạn như thử nghiệm so với phiên bản chính thức), hãy tạo một tệp .env.<project or alias> và ghi các biến môi trường dành riêng cho dự án vào đó. Các biến môi trường từ các tệp .env và các tệp .env dành riêng cho dự án (nếu có) sẽ được đưa vào tất cả các hàm đã triển khai.

Ví dụ: một dự án có thể bao gồm ba tệp này, chứa các giá trị hơi khác nhau cho việc phát triển và sản xuất:

.env .env.dev .env.prod
PLANET=Trái đất

KHÁN GIẢ=Con người

KHÁN GIẢ=Nhà phát triển KHÁN GIẢ=Người sản xuất

Với các giá trị trong các tệp riêng biệt đó, tập hợp các biến môi trường được triển khai bằng các hàm sẽ thay đổi tuỳ thuộc vào dự án mục tiêu của bạn:

$ 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

Biến môi trường dành riêng

Một số khoá biến môi trường được dành riêng để sử dụng nội bộ. Không sử dụng bất kỳ khoá nào trong số các khoá này trong tệp .env của bạn:

  • Tất cả các khóa bắt đầu bằng X_GOOGLE_
  • Tất cả các khóa bắt đầu EXT_
  • Tất cả các khóa bắt đầu bằng FIREBASE_
  • Bất kỳ khoá nào trong danh sách sau:
  • 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

Lưu trữ và truy cập vào thông tin cấu hình nhạy cảm

Bạn có thể sử dụng các biến môi trường lưu trữ trong tệp .env để định cấu hình hàm, nhưng bạn không nên coi đây là một cách an toàn để lưu trữ thông tin nhạy cảm như thông tin xác thực cơ sở dữ liệu hoặc khoá API. Điều này đặc biệt quan trọng nếu bạn kiểm tra các tệp .env của mình trong chế độ kiểm soát nguồn.

Để giúp bạn lưu trữ thông tin cấu hình nhạy cảm, Cloud Functions cho Firebase sẽ tích hợp với Secret Manager (Trình quản lý bí mật) của Google Cloud. Dịch vụ đã mã hoá này lưu trữ các giá trị cấu hình một cách an toàn, trong khi vẫn cho phép bạn dễ dàng truy cập vào các hàm của mình khi cần.

Tạo và sử dụng khoá bí mật

Để tạo khoá bí mật, hãy sử dụng Giao diện dòng lệnh (CLI) của Firebase.

Cách tạo và sử dụng khoá bí mật:

  1. Từ gốc của thư mục dự án cục bộ, hãy chạy lệnh sau:

    firebase functions:secrets:set SECRET_NAME

  2. Nhập giá trị cho SECRET_NAME.

    CLI sẽ hiển thị một thông báo thành công và cảnh báo rằng bạn phải triển khai các hàm để thay đổi có hiệu lực.

  3. Trước khi triển khai, hãy đảm bảo mã hàm của bạn cho phép hàm truy cập vào khoá bí mật bằng cách sử dụng tham số 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. Triển khai Chức năng đám mây:

    firebase deploy --only functions

Giờ đây, bạn có thể truy cập công cụ này như mọi biến môi trường khác. Ngược lại, nếu một hàm khác không chỉ định khoá bí mật trong runWith cố gắng truy cập vào khoá bí mật, thì hàm đó sẽ nhận được một giá trị không xác định:

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

Sau khi được triển khai, hàm của bạn sẽ có quyền truy cập vào giá trị bí mật. Chỉ các hàm có chứa cụ thể một khoá bí mật trong tham số runWith mới có quyền truy cập vào khoá bí mật đó dưới dạng biến môi trường. Điều này giúp bạn đảm bảo rằng các giá trị bí mật chỉ có sẵn khi cần thiết, giảm nguy cơ vô tình làm rò rỉ khoá bí mật.

Quản lý khoá bí mật

Sử dụng Giao diện dòng lệnh (CLI) của Firebase để quản lý các mã thông báo bí mật của bạn. Trong khi quản lý khoá bí mật theo cách này, hãy lưu ý rằng một số thay đổi của CLI sẽ yêu cầu bạn sửa đổi và/hoặc triển khai lại các chức năng được liên kết. Cụ thể:

  • Mỗi khi đặt giá trị mới cho một khoá bí mật, bạn phải triển khai lại tất cả các hàm tham chiếu đến khoá bí mật đó để chúng nhận giá trị mới nhất.
  • Nếu bạn xoá một khoá bí mật, hãy đảm bảo rằng không hàm đã triển khai nào tham chiếu đến khoá bí mật đó. Các hàm sử dụng giá trị bí mật đã bị xoá sẽ tự động không hoạt động.

Dưới đây là thông tin tóm tắt về các lệnh Giao diện dòng lệnh (CLI) của Firebase để quản lý bí mật:

# 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

Đối với các lệnh accessdestroy, bạn có thể cung cấp tham số phiên bản không bắt buộc để quản lý một phiên bản cụ thể. Ví dụ:

functions:secrets:access SECRET_NAME[@VERSION]

Để biết thêm thông tin về các thao tác này, hãy truyền -h bằng lệnh để xem nội dung trợ giúp về CLI.

Cách tính phí của bí mật

Secret Manager cho phép 6 versions bí mật đang hoạt động mà không tốn phí. Điều này có nghĩa là bạn có thể có 6 bí mật mỗi tháng trong một dự án Firebase mà không tốn phí.

Theo mặc định, Firebase CLI sẽ cố gắng tự động huỷ các phiên bản bí mật không dùng đến khi thích hợp, chẳng hạn như khi bạn triển khai các hàm có phiên bản khoá bí mật mới. Ngoài ra, bạn có thể chủ động xoá các mã bí mật không dùng đến bằng cách sử dụng functions:secrets:destroyfunctions:secrets:prune.

Secret Manager cho phép 10.000 hoạt động truy cập hằng tháng không lập hoá đơn trên một khoá bí mật. Các thực thể hàm chỉ đọc các mã bí mật được chỉ định trong tham số runWith mỗi khi chúng khởi động nguội. Nếu bạn có nhiều thực thể hàm đọc nhiều bí mật, dự án của bạn có thể vượt quá hạn mức này. Khi đó, bạn sẽ bị tính phí 0,03 USD cho mỗi 10.000 thao tác truy cập.

Để biết thêm thông tin, hãy xem phần Giá của Trình quản lý bí mật.

Hỗ trợ trình mô phỏng

Cấu hình môi trường có dotenv được thiết kế để tương tác với một trình mô phỏng Hàm đám mây cục bộ.

Khi sử dụng trình mô phỏng Chức năng đám mây cục bộ, bạn có thể ghi đè các biến môi trường cho dự án bằng cách thiết lập tệp .env.local. Nội dung của .env.local được ưu tiên hơn .env và tệp .env dành riêng cho dự án.

Ví dụ: một dự án có thể bao gồm 3 tệp này, chứa các giá trị hơi khác nhau để phát triển và kiểm thử cục bộ:

.env .env.dev .env.local
PLANET=Trái đất

KHÁN GIẢ=Con người

KHÁN GIẢ=Nhà phát triển KHÁN GIẢ=Nhân viên địa phương

Khi khởi động trong bối cảnh cục bộ, trình mô phỏng sẽ tải các biến môi trường như sau:

  $ firebase emulators:start
  i  emulators: Starting emulators: functions
  # Starts emulator with following environment variables:
  #  PLANET=Earth
  #  AUDIENCE=Local Humans

Khoá bí mật và thông tin xác thực trong trình mô phỏng Chức năng đám mây

Trình mô phỏng Cloud Functions hỗ trợ việc sử dụng các khoá bí mật để lưu trữ và truy cập vào thông tin cấu hình nhạy cảm. Theo mặc định, trình mô phỏng sẽ cố gắng truy cập vào mã bí mật phát hành công khai của bạn bằng cách sử dụng thông tin xác thực mặc định của ứng dụng. Trong một số trường hợp như môi trường CI, trình mô phỏng có thể không truy cập được vào các giá trị bí mật do các hạn chế về quyền.

Tương tự như tính năng hỗ trợ trình mô phỏng Cloud Functions cho các biến môi trường, bạn có thể ghi đè các giá trị bí mật bằng cách thiết lập tệp .secret.local. Điều này giúp bạn dễ dàng kiểm thử các hàm của mình trên máy, đặc biệt khi bạn không có quyền truy cập vào giá trị bí mật.

Di chuyển từ cấu hình môi trường

Nếu đang sử dụng cấu hình môi trường bằng functions.config, bạn có thể di chuyển cấu hình hiện tại dưới dạng các biến môi trường (ở định dạng dotenv). Firebase CLI cung cấp một lệnh xuất để xuất cấu hình của từng bí danh hoặc dự án được liệt kê trong tệp .firebaserc của thư mục (trong ví dụ bên dưới là local, devprod) dưới dạng tệp .env.

Để di chuyển, hãy xuất các cấu hình môi trường hiện có của bạn bằng lệnh 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

Lưu ý rằng trong một số trường hợp, bạn sẽ được nhắc nhập tiền tố để đổi tên các khoá biến môi trường đã xuất. Lý do là không phải cấu hình nào cũng có thể được tự động chuyển đổi vì các cấu hình đó có thể không hợp lệ hoặc là một khoá biến môi trường dành riêng.

Bạn nên xem xét kỹ nội dung của các tệp .env đã tạo trước khi triển khai các hàm hoặc kiểm tra các tệp .env ở chế độ kiểm soát nguồn. Nếu có bất kỳ giá trị nào nhạy cảm và không nên bị rò rỉ, hãy xoá các giá trị đó khỏi tệp .env rồi lưu trữ an toàn trong Trình quản lý bí mật.

Bạn cũng cần cập nhật mã hàm. Giờ đây, mọi hàm sử dụng functions.config sẽ cần phải sử dụng process.env, như minh hoạ trong bài viết Nâng cấp lên thế hệ thứ 2.

Cấu hình môi trường

Trước khi phát hành tính năng hỗ trợ biến môi trường trong firebase-functions v3.18.0, phương pháp đề xuất là sử dụng functions.config() cho cấu hình môi trường. Phương pháp này vẫn được hỗ trợ nhưng chúng tôi khuyến khích tất cả dự án mới sử dụng biến môi trường, vì các biến này dễ sử dụng hơn và cải thiện khả năng di chuyển mã của bạn.

Thiết lập cấu hình môi trường bằng CLI

Để lưu trữ dữ liệu môi trường, bạn có thể sử dụng lệnh firebase functions:config:set trong Giao diện dòng lệnh (CLI) của Firebase. Mỗi khoá có thể được đặt tên bằng dấu chấm để nhóm các cấu hình có liên quan lại với nhau. Xin lưu ý rằng chỉ chấp nhận các ký tự viết thường trong khoá; không được phép sử dụng ký tự viết hoa.

Ví dụ: để lưu trữ Mã ứng dụng khách và khoá API cho "Một số dịch vụ", bạn có thể chạy:

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

Truy xuất cấu hình môi trường hiện tại

Để kiểm tra nội dung hiện đang được lưu trữ trong cấu hình môi trường cho dự án, bạn có thể sử dụng firebase functions:config:get. Thao tác này sẽ xuất JSON như sau:

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

Chức năng này dựa trên Google Cloud Runtime Configuration API.

Dùng functions.config để truy cập vào cấu hình môi trường trong một hàm

Một số cấu hình được tự động cung cấp trong không gian tên firebase dành riêng. Cấu hình môi trường được cung cấp bên trong hàm đang chạy thông qua functions.config(). Để sử dụng cấu hình ở trên, mã của bạn có thể có dạng như sau:

const functions = require('firebase-functions');
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}
  });
});

Sử dụng cấu hình môi trường để khởi chạy mô-đun

Một số mô-đun nút đã sẵn sàng mà không cần cấu hình. Các mô-đun khác cần cấu hình bổ sung để khởi chạy chính xác. Bạn nên lưu trữ cấu hình này trong các biến cấu hình môi trường thay vì mã hoá cứng nó. Điều này giúp bạn giữ cho mã linh hoạt hơn nhiều, cho phép bạn mở nguồn cho ứng dụng hoặc dễ dàng chuyển đổi giữa phiên bản chính thức và phiên bản thử nghiệm.

Ví dụ: để sử dụng mô-đun SDK nút Slack, bạn có thể viết như sau:

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

Trước khi triển khai, hãy đặt biến cấu hình môi trường slack.url:

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

Các lệnh môi trường bổ sung

  • firebase functions:config:unset key1 key2 xoá các khoá đã chỉ định khỏi cấu hình
  • firebase functions:config:clone --from <fromProject> sao chép môi trường của một dự án khác vào dự án đang hoạt động.

Các biến môi trường được điền tự động

Có các biến môi trường được tự động điền vào thời gian chạy của hàm và trong các hàm được mô phỏng cục bộ. Những sự kiện này bao gồm những sự kiện do Google Cloud điền sẵn, cũng như một biến môi trường dành riêng cho Firebase:

process.env.FIREBASE_CONFIG: Cung cấp thông tin sau đây về cấu hình dự án Firebase:

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

Cấu hình này được tự động áp dụng khi bạn khởi chạy SDK quản trị Firebase mà không có đối số. Nếu bạn đang viết các hàm trong JavaScript, hãy khởi động như sau:

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

Nếu bạn đang viết các hàm trong TypeScript, hãy khởi chạy như sau:

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import 'firebase-functions';
admin.initializeApp();

Nếu cần khởi chạy SDK quản trị với cấu hình dự án mặc định bằng cách sử dụng thông tin đăng nhập tài khoản dịch vụ, bạn có thể tải thông tin đăng nhập từ một tệp và thêm thông tin đó vào FIREBASE_CONFIG như sau:

serviceAccount = require('./serviceAccount.json');

const adminConfig = JSON.parse(process.env.FIREBASE_CONFIG);
adminConfig.credential = admin.credential.cert(serviceAccount);
admin.initializeApp(adminConfig);