Định cấu hình môi trường


Thông thường, bạn 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 chế độ cài đặt có thể điều chỉnh. SDK Firebase dành cho Cloud Functions cung cấp cấu hình môi trường tích hợp sẵn để giúp dễ dàng lưu trữ và truy xuất dữ liệu cho dự án của bạn.

Bạn có thể chọn một trong các lựa chọn sau:

  • Cấu hình được tham số hoá (nên dùng cho hầu hết các trường hợp). Thao tác này cung cấp môi trường được định kiểu mạnh có các tham số được xác thực tại thời điểm triển khai, ngăn chặn lỗi và đơn giản hoá việc gỡ lỗi.
  • Cấu hình dựa trên tệp của các biến môi trường. Với phương pháp này, bạn có thể tạo dotenv để tải biến môi trường.

Đố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 cung cấp các giá trị cấu hình cả tại thời gian chạy và thời gian triển khai, đồng thời chặn quá trình triển khai trừ phi tất cả các tham số đều có giá trị hợp lệ. Ngược lại, cấu hình với biến môi trường sẽ không có sẵn tại thời điểm triển khai.

Cấu hình có tham số

Cloud Functions for Firebase cung cấp một giao diện để xác định các thông 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 trong cả quá trình triển khai hàm, khi thiết lập các 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 quá trình triển khai trừ khi tất cả các tham số đều có giá trị hợp lệ.

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!')

Khi triển khai hàm có các biến cấu hình có tham số, Trước tiên, CLI của Firebase cố gắng tải các giá trị từ các tệp .env cục bộ. Nếu không có trong các tệp đó và không có default nào được đặt, CLI sẽ nhắc các giá trị trong quá trình triển khai, sau đó tự động lưu 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 của bạn, bạn có thể thêm tệp .env.<project_ID> đã tạo vào phần quản lý phiên bản.

Sử dụng tham số trong phạm vi toàn cục

Trong quá trình triển khai, mã hàm sẽ được tải và kiểm tra trước khi tham số 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 khoảng thời gian phạm vi toàn cầu dẫn đến lỗi triển khai. Đối với trường hợp bạn muốn sử dụng để khởi tạo giá trị toàn cục, hãy sử dụng lệnh gọi lại khởi chạy 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ố.

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)

Nếu bạn sử dụng các tham số thuộc loại Secret, hãy lưu ý rằng các tham số này chỉ có sẵn trong quá trình các hàm đã liên kết với khoá bí mật. Nếu một khoá bí mật bị ràng buộc chỉ trong một số hàm, hãy kiểm tra xem secret.value() có bị giả mạo hay không trước khi sử dụng.

Đị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 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 một tuỳ chọn lựa chọn từ dự án 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 Projects
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",
)

Loại thông số

Cấu hình tham số hóa giúp nhập mạnh các giá trị tham số và cũng 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
  • Nổi
  • Danh sách (Node.js)

Biểu thức và giá trị tham số

Firebase đánh giá các thông số của bạn cả tại thời điểm triển khai và trong khi hàm của bạn đang thực thi. Do có hai môi trường này, bạn cần phải thận trọng hơn khi so sánh các giá trị thông số và khi sử dụng các giá trị đó để đặt tuỳ chọn thời gian chạy cho .

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

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):
    ...

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

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):
    ...

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

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!')

Tham số tích hợp

SDK của Cloud Functions cung cấp 3 tham số được xác định trước, có trong gói con firebase-functions/params:

Node.js

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

Python

  • PROJECT_ID – dự án trên Cloud nơi hàm đang chạy.
  • DATABASE_URL – 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ếu được bật trên dự án Firebase).
  • STORAGE_BUCKET — bộ chứa Cloud Storage liên kết với hàm (nếu được bật trong dự án Firebase).

Các tham số này hoạt động như các tham số chuỗi do người dùng xác định ở mọi khía cạnh, ngoại trừ việc vì giá trị của các tham số này luôn được CLI Firebase biết, nên giá trị của các 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(), đại diện cho các tham số chuỗi có giá trị được lưu trữ trong Trình quản lý bí mật trên đám mây. Thay vì kiểm tra đối chiếu với tệp .env cục bộ và ghi một giá trị mới vào tệp nếu thiếu, các tham số bí mật kiểm tra sự tồn tại trong Cloud Secret Manager, và nhắc theo cách tương tác về giá trị của một khoá bí mật mới trong quá trình triển khai.

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

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

Vì các giá trị của thông tin bảo 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

Cloud Functions for Firebase hỗ trợ 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 của ứng dụng. 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 (trong các dự án dựa trên Node.js) hoặc os.environ (trong các dự án dựa trên Python).

Để định cấu hình môi trường theo cách này, hãy tạo một 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 và 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ủa bạn có thể truy cập vào các thông báo này:

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

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

Nếu bạn cần một nhóm biến môi trường thay thế cho Firebase các dự án (chẳng hạn như thử nghiệm và sản xuất), hãy tạo một .env.<project or alias> tệp và ghi biến môi trường của dự án cụ thể. Các biến môi trường từ .env và 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 3 tệp này chứa các giá trị khác nhau một chút cho hoạt động phát triển và phát hành công khai:

.env .env.dev .env.prod
PLANET=Earth

KHÁN GIẢ=Con người

KHÁN GIẢ=Nhà phát triển AUDIENCE=Nhân viên 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ẽ khác nhau 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 được đặt trước

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ỳ sau đây là các khoá trong tệp .env của bạn:

  • Tất cả các khoá bắt đầu bằng X_GOOGLE_
  • Tất cả các khoá bắt đầu từ EXT_
  • Tất cả các khoá 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
  • TÊN_Hàm
  • FUNCTION_MEMORY_MB
  • FUNCTION_TIMEOUT_SEC
  • FUNCTION_IDENTITY (Mã nhận dạng cho các chức năng)
  • FUNCTION_REGION
  • FUNCTION_TARGET
  • FUNCTION_SIGNATURE_TYPE (Hàm FUNCTION_SIGNATURE_TYPE)
  • DỊCH VỤ K
  • K_REVISION
  • PORT
  • K_CONFIGURATION (Cấu hình K)

Lưu trữ và truy cập 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 được lưu trữ trong tệp .env để định cấu hình hàm, nhưng không nên coi đó là 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 rất quan trọng nếu bạn kiểm tra các tệp .env của mình ở 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 for Firebase tích hợp với Google Cloud Secret Manager. Dịch vụ được mã hoá này lưu trữ các giá trị cấu hình một cách an toàn, đồng thời vẫn cho phép bạn dễ dàng truy cập từ các hàm của mình khi cần.

Tạo và sử dụng một giá trị bí mật

Để tạo một khoá bí mật, hãy sử dụng CLI Firebase.

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

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

    firebase functions:secrets:set SECRET_NAME

  2. Nhập một giá trị cho SECRET_NAME.

    CLI lặp lại 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 để sự thay đổi này 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 giá trị bí mật bằng cách sử dụng tham số 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. Triển khai Cloud Functions:

    firebase deploy --only functions

    Bây giờ, bạn sẽ có thể truy cập biến 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:

    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.
    

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 thông tin bí mật cụ thể trong tham số runWith mới có quyền truy cập vào thông tin 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, giảm nguy cơ vô tình rò rỉ thông tin bí mật.

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

Sử dụng CLI Firebase để quản lý các thông tin bí mật. Khi quản lý các bí mật theo cách này, xin lưu ý rằng một số thay đổi về CLI yêu cầu bạn phải sửa đổi và/hoặc triển khai lại hàm liên kết. Cụ thể:

  • Mỗi khi thiết lập giá trị mới cho giá trị bí mật, bạn phải triển khai lại tất cả các giá trị bí mật các hàm tham chiếu bí mật đó để họ nắm bắt 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 có hàm nào đã triển khai tham chiếu đến khoá bí mật đó. Các hàm sử dụng giá trị bí mật đã được bị xoá sẽ tự động không thành công.

Sau đây là phần tóm tắt các lệnh CLI Firebase để quản lý khoá 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 phiên bản tuỳ chọn để 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 phần trợ giúp về CLI.

Cách tính phí bí mật

Secret Manager cho phép 6 khoá bí mật hoạt động phiên bản miễn phí. Tức là bạn có thể có 6 khoá bí mật mỗi tháng trong một Firebase dự án miễn phí.

Theo mặc định, CLI Firebase cố gắng tự động huỷ khoá bí mật không dùng đến các phiên bản khi thích hợp, chẳng hạn như khi bạn triển khai các hàm bằng một phiên bản mới bí mật. Ngoài ra, bạn có thể chủ động dọn dẹp các 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 thao tác truy cập hằng tháng chưa tính phí 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 runWith mỗi khi thiết bị khởi động nguội. Nếu bạn có nhiều thực thể hàm đọc nhiều bí mật, thì dự án của bạn có thể vượt quá mức cho phép này, khi đó bạn sẽ bị tính phí 0,03 USD cho mỗi 10.000 hoạt động truy cập.

Để biết thêm thông tin, hãy xem Giá Secret Manager.

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

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

Khi sử dụng trình mô phỏng Cloud Functions 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 ba tệp này chứa hơi các giá trị khác nhau để phát triển và kiểm thử cục bộ:

.env .env.dev .env.local
PLANET=Earth

KHÁN GIẢ=Con người

AUDIENCE=Dev Humans KHÁN GIẢ=Người địa phương

Khi khởi động trong ngữ 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

Thông tin bí mật và thông tin xác thực trong trình mô phỏng Cloud Functions

Trình mô phỏng Cloud Functions hỗ trợ việc sử dụng khoá bí mật để lưu trữ và truy cập 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 các bí mật sản xuất bằ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 các giá trị bí mật do các quy định hạn chế về quyền.

Tương tự như 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ị của khoá 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 trên máy, đặc biệt là 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 của mình dưới dạng các biến môi trường (trong định dạng dotenv). CLI Firebase 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, 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ó 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 khoá biến môi trường đã xuất. Điều này là do không phải mọi cấu hình đều có thể được tự động chuyển đổi vì chúng có thể không hợp lệ hoặc có thể là 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 tệp .env trong chế độ kiểm soát nguồn. Nếu có giá trị nào nhạy cảm và không được rò rỉ, hãy xoá các giá trị đó khỏi tệp .env và lưu trữ an toàn trong Secret Manager.

Bạn cũng cần cập nhật mã hàm. Bất kỳ hàm nào sử dụng Thay vào đó, functions.config sẽ cần sử dụng process.env, như minh hoạ trong Biến môi trường.