محیط خود را پیکربندی کنید

اغلب برای توابع خود به پیکربندی‌های اضافی مانند کلیدهای API شخص ثالث یا تنظیمات قابل تنظیم نیاز خواهید داشت. کیت توسعه نرم‌افزار Firebase برای Cloud Functions ، پیکربندی محیطی داخلی را ارائه می‌دهد تا ذخیره و بازیابی این نوع داده‌ها را برای پروژه شما آسان کند.

می‌توانید بین این گزینه‌ها انتخاب کنید:

  • پیکربندی پارامتری (برای اکثر سناریوها توصیه می‌شود). این پیکربندی محیطی با نوع‌بندی قوی (strongly-typed) را با پارامترهایی که در زمان استقرار اعتبارسنجی می‌شوند، فراهم می‌کند که از خطاها جلوگیری کرده و اشکال‌زدایی را ساده می‌کند.
  • پیکربندی مبتنی بر فایل متغیرهای محیطی . با این رویکرد، شما به صورت دستی یک فایل dotenv برای بارگذاری متغیرهای محیطی ایجاد می‌کنید.

برای اکثر موارد استفاده، پیکربندی پارامتری توصیه می‌شود. این رویکرد، مقادیر پیکربندی را هم در زمان اجرا و هم در زمان استقرار در دسترس قرار می‌دهد و استقرار مسدود می‌شود مگر اینکه همه پارامترها مقدار معتبری داشته باشند. برعکس، پیکربندی با متغیرهای محیطی در زمان استقرار در دسترس نیست.

پیکربندی پارامتری

Cloud Functions for Firebase رابطی برای تعریف پارامترهای پیکربندی به صورت اعلانی در داخل کدبیس شما فراهم می‌کند. مقدار این پارامترها هم در طول استقرار تابع، هم هنگام تنظیم گزینه‌های استقرار و زمان اجرا و هم در طول اجرا در دسترس است. این بدان معناست که رابط خط فرمان (CLI) استقرار را مسدود می‌کند مگر اینکه همه پارامترها مقدار معتبری داشته باشند.

نود جی اس

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

پایتون

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

هنگام استقرار یک تابع با متغیرهای پیکربندی پارامتری، رابط خط فرمان فایربیس ابتدا سعی می‌کند مقادیر آنها را از فایل‌های محلی .env بارگذاری کند. اگر این مقادیر در آن فایل‌ها موجود نباشند و هیچ default تنظیم نشده باشد، رابط خط فرمان در حین استقرار، مقادیر را درخواست می‌کند و سپس به طور خودکار مقادیر آنها را در یک فایل .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/v2/core');

const apiKey = defineSecret('GOOGLE_API_KEY');

let genAI;
onInit(() => {
  genAI = new GoogleGenerativeAI(apiKey.value());
})

پایتون

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)

اگر از پارامترهایی از نوع Secret استفاده می‌کنید، توجه داشته باشید که آنها فقط در فرآیند توابعی که secret را مقید کرده‌اند، در دسترس هستند. اگر یک secret فقط در برخی توابع مقید شده است، قبل از استفاده از آن، بررسی کنید که آیا secret.value() falsy است یا خیر.

پیکربندی رفتار 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: 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 Project’s
storage buckets",
  input: params.PICK_STORAGE_BUCKET,
});

پایتون

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

انواع پارامتر

پیکربندی پارامتری، تایپینگ قوی برای مقادیر پارامتر فراهم می‌کند و همچنین از اسرار Cloud Secret Manager پشتیبانی می‌کند. انواع پشتیبانی‌شده عبارتند از:

  • راز
  • رشته
  • بولی
  • عدد صحیح
  • شناور
  • لیست (Node.js)

برای اطلاعات بیشتر در مورد توابع تعریف پارامترها، به مرجع فضای نام params مراجعه کنید.

مقادیر و عبارات پارامتر

فایربیس پارامترهای شما را هم در زمان استقرار و هم در حین اجرای تابع ارزیابی می‌کند. با توجه به این محیط‌های دوگانه، هنگام مقایسه مقادیر پارامترها و هنگام استفاده از آنها برای تنظیم گزینه‌های زمان اجرا برای توابع خود، باید دقت بیشتری به خرج دهید.

برای ارسال پارامتر به تابع خود به عنوان یک گزینه زمان اجرا، آن را مستقیماً ارسال کنید:

نود جی اس

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) => {
    //…

پایتون

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

علاوه بر این، اگر نیاز دارید که یک پارامتر را با پارامتر دیگر مقایسه کنید تا بدانید چه گزینه‌ای را انتخاب کنید، باید به جای بررسی مقدار، از مقایسه‌کننده‌های داخلی استفاده کنید:

نود جی اس

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) => {
    //…

پایتون

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

پارامترها و عبارات پارامتری که فقط در زمان اجرا استفاده می‌شوند، می‌توانند با تابع value قابل دسترسی باشند:

نود جی اس

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

پایتون

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

پارامترهای داخلی

کیت توسعه نرم‌افزاری توابع ابری (Cloud Functions SDK) سه پارامتر از پیش تعریف‌شده ارائه می‌دهد که از زیربسته firebase-functions/params قابل دسترسی هستند:

نود جی اس

  • projectID — پروژه ابری که تابع در آن اجرا می‌شود.
  • databaseURL — آدرس اینترنتی (URL) نمونه پایگاه داده بلادرنگ (Realtime Database) مرتبط با تابع (در صورت فعال بودن در پروژه Firebase).
  • storageBucket — سطل ذخیره‌سازی ابری مرتبط با این تابع (در صورت فعال بودن در پروژه Firebase).

پایتون

  • PROJECT_ID — پروژه ابری که تابع در آن اجرا می‌شود.
  • DATABASE_URL - آدرس اینترنتی نمونه پایگاه داده Realtime مرتبط با تابع (در صورت فعال بودن در پروژه Firebase).
  • STORAGE_BUCKET - سطل ذخیره‌سازی ابری مرتبط با این تابع (در صورت فعال بودن در پروژه Firebase).

این‌ها از هر نظر مانند پارامترهای رشته‌ای تعریف‌شده توسط کاربر عمل می‌کنند، با این تفاوت که از آنجایی که مقادیر آن‌ها همیشه برای Firebase CLI شناخته شده است، مقادیر آن‌ها هرگز در هنگام استقرار درخواست نمی‌شوند و در فایل‌های .env ذخیره نمی‌شوند.

پارامترهای مخفی

پارامترهای نوع Secret که با استفاده از defineSecret() تعریف می‌شوند، پارامترهای رشته‌ای را نشان می‌دهند که مقداری در Cloud Secret Manager ذخیره می‌کنند. به جای بررسی در برابر یک فایل .env محلی و نوشتن مقدار جدید در فایل در صورت وجود نداشتن، پارامترهای secret وجود خود را در Cloud Secret Manager بررسی می‌کنند و به صورت تعاملی مقدار یک راز جدید را در حین استقرار درخواست می‌کنند.

پارامترهای مخفی تعریف شده به این روش باید به توابع منفردی که باید به آنها دسترسی داشته باشند، محدود شوند:

نود جی اس

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();
    //…

پایتون

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

از آنجا که مقادیر secretها تا زمان اجرای تابع پنهان هستند، نمی‌توانید هنگام پیکربندی تابع از آنها استفاده کنید.

متغیرهای محیطی

Cloud Functions for Firebase از فرمت فایل dotenv برای بارگذاری متغیرهای محیطی مشخص شده در یک فایل .env در زمان اجرای برنامه شما پشتیبانی می‌کنند. پس از استقرار، متغیرهای محیطی را می‌توان از طریق رابط process.env (در پروژه‌های مبتنی بر Node.js) یا os.environ (در پروژه‌های مبتنی بر پایتون) خواند.

برای پیکربندی محیط خود به این روش، یک فایل .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.
    # ...
    

پس از استقرار متغیرهای محیطی سفارشی شما، کد تابع شما می‌تواند به آنها دسترسی داشته باشد:

نود جی اس

// Responds with "Hello Earth and Humans"
exports.hello = onRequest((request, response) => {
  response.send(`Hello ${process.env.PLANET} and ${process.env.AUDIENCE}`);
});

پایتون

import os

@https_fn.on_request()
def hello(req):
    return https_fn.Response(
        f"Hello {os.environ.get('PLANET')} and {os.environ.get('AUDIENCE')}"
    )

استقرار چندین مجموعه از متغیرهای محیطی

اگر برای پروژه‌های Firebase خود به مجموعه‌ای جایگزین از متغیرهای محیطی نیاز دارید (مانند staging در مقابل production)، یک فایل .env. <project or alias > ایجاد کنید و متغیرهای محیطی مختص پروژه خود را در آنجا بنویسید. متغیرهای محیطی از فایل‌های .env و .env مختص پروژه (در صورت وجود) در تمام توابع پیاده‌سازی شده گنجانده خواهند شد.

برای مثال، یک پروژه می‌تواند شامل این سه فایل باشد که مقادیر کمی متفاوت برای توسعه و تولید دارند:

.env .env.dev .env.prod
سیاره = زمین

مخاطب = انسان‌ها

مخاطب= توسعه‌دهندگان انسان مخاطب=انسان‌های محرک

با توجه به مقادیر موجود در آن فایل‌های جداگانه، مجموعه متغیرهای محیطی که با توابع شما مستقر می‌شوند، بسته به پروژه هدف شما متفاوت خواهد بود:

$ 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_ شروع می‌شوند
  • هر کلیدی از لیست زیر:
  • پیکربندی زمان اجرای ابری
  • نقطه ورود
  • پروژه GCP
  • پروژه GCLOUD
  • پروژه گوگل کلود
  • نوع_راه‌انداز_عملکرد
  • نام_تابع
  • تابع_حافظه_MB
  • تابع_تایم_اوت_ثانیه
  • هویت_عملکرد
  • ناحیه تابع
  • تابع_هدف
  • نوع امضای تابع
  • خدمات K
  • K_REVISION
  • بندر
  • پیکربندی K

ذخیره و دسترسی به اطلاعات پیکربندی حساس

متغیرهای محیطی ذخیره شده در فایل‌های .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. قبل از استقرار، مطمئن شوید که کد توابع شما با استفاده از گزینه secrets به تابع اجازه دسترسی به راز را می‌دهد:

    نود جی اس

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

    پایتون

    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. استقرار Cloud Functions :

    firebase deploy --only functions

    حالا می‌توانید مانند هر متغیر محیطی دیگری به آن دسترسی داشته باشید. برعکس، اگر تابع دیگری که مقدار مخفی را مشخص نکرده است، سعی کند به مقدار مخفی دسترسی پیدا کند، یک مقدار نامشخص دریافت می‌کند:

    نود جی اس

    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 `secrets` option is missing
    });
    

    پایتون

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

پس از استقرار تابع شما، به مقدار مخفی دسترسی خواهد داشت. فقط توابعی که به طور خاص یک راز را در گزینه secrets خود قرار می‌دهند، به آن راز به عنوان یک متغیر محیطی دسترسی خواهند داشت. این به شما کمک می‌کند تا مطمئن شوید که مقادیر مخفی فقط در جایی که مورد نیاز هستند در دسترس هستند و خطر افشای تصادفی یک راز را کاهش می‌دهد.

مدیریت اسرار

از رابط خط فرمان Firebase (Firebase CLI) برای مدیریت رمزهای خود استفاده کنید. هنگام مدیریت رمزها به این روش، به خاطر داشته باشید که برخی از تغییرات در رابط خط فرمان (CLI) مستلزم تغییر و/یا استقرار مجدد توابع مرتبط است. به طور خاص:

  • هر زمان که مقدار جدیدی را برای یک راز تعیین می‌کنید، باید تمام توابعی که به آن راز ارجاع می‌دهند را مجدداً مستقر کنید تا بتوانند آخرین مقدار را دریافت کنند.
  • اگر یک راز را حذف می‌کنید، مطمئن شوید که هیچ یک از توابع مستقر شده شما به آن راز اشاره نمی‌کنند. توابعی که از یک مقدار راز حذف شده استفاده می‌کنند، بی‌صدا از کار می‌افتند.

در اینجا خلاصه‌ای از دستورات Firebase CLI برای مدیریت مخفی آورده شده است:

# Change the value of an existing secret
firebase functions:secrets:set SECRET_NAME

# View the value of a secret
functions:secrets:access SECRET_NAME

# Destroy a secret
functions:secrets:destroy SECRET_NAME

# View all secret versions and their state
functions:secrets:get SECRET_NAME

# Automatically clean up all secrets that aren't referenced by any of your functions
functions:secrets:prune

برای دستورات access و destroy ، می‌توانید پارامتر اختیاری version را برای مدیریت یک نسخه خاص ارائه دهید. برای مثال:

functions:secrets:access SECRET_NAME[@VERSION]

برای اطلاعات بیشتر در مورد این عملیات، برای مشاهده راهنمای CLI، -h به دستور اضافه کنید.

نحوه محاسبه هزینه اسرار

Secret Manager اجازه می‌دهد ۶ نسخه مخفی فعال بدون هیچ هزینه‌ای داشته باشید. این بدان معناست که می‌توانید ۶ مخفی در ماه را در یک پروژه Firebase بدون هیچ هزینه‌ای داشته باشید.

به طور پیش‌فرض، رابط خط فرمان Firebase (Firebase CLI) تلاش می‌کند تا در صورت لزوم، نسخه‌های مخفی استفاده نشده را به طور خودکار از بین ببرد، مانند زمانی که توابع را با نسخه جدیدی از مخفی مستقر می‌کنید. همچنین، می‌توانید با استفاده functions:secrets:destroy و functions:secrets:prune ، مخفی‌های استفاده نشده را به طور فعال پاک کنید.

Secret Manager اجازه می‌دهد ماهانه 10،000 عملیات دسترسی بدون صورتحساب روی یک راز انجام شود. نمونه‌های تابع فقط رازهای مشخص شده در گزینه secrets خود را هر بار که شروع به کار می‌کنند، می‌خوانند. اگر نمونه‌های تابع زیادی دارید که اسرار زیادی را می‌خوانند، پروژه شما ممکن است از این حد مجاز فراتر رود، که در آن صورت به ازای هر 10،000 عملیات دسترسی، 0.03 دلار از شما کسر خواهد شد.

برای اطلاعات بیشتر، به قیمت‌گذاری Secret Manager مراجعه کنید.

پشتیبانی از شبیه‌ساز

پیکربندی محیط با dotenv به گونه‌ای طراحی شده است که با یک شبیه‌ساز محلی Cloud Functions تعامل داشته باشد.

هنگام استفاده از یک شبیه‌ساز محلی Cloud Functions ، می‌توانید با تنظیم یک فایل .env.local ، متغیرهای محیطی را برای پروژه خود لغو کنید. محتویات .env.local بر .env و فایل .env مخصوص پروژه اولویت دارد.

برای مثال، یک پروژه می‌تواند شامل این سه فایل باشد که مقادیر کمی متفاوت برای توسعه و آزمایش محلی دارند:

.env .env.dev .env.local
سیاره = زمین

مخاطب = انسان‌ها

مخاطب= توسعه‌دهندگان انسان مخاطب = افراد محلی

وقتی شبیه‌ساز در زمینه محلی شروع به کار می‌کند، متغیرهای محیطی را مطابق شکل زیر بارگذاری می‌کند:

  $ 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 مقادیر secrets را لغو کنید. این کار آزمایش توابع شما را به صورت محلی آسان می‌کند، به خصوص اگر به مقدار secret دسترسی ندارید.

مهاجرت از پیکربندی زمان اجرا

اگر از پیکربندی محیط با functions.config استفاده می‌کرده‌اید، باید پیکربندی فعلی خود را قبل از پایان سال ۲۰۲۵، زمانی که functions.config از رده خارج می‌شود، به یک قالب پشتیبانی‌شده منتقل کنید. پس از دسامبر ۲۰۲۵، استقرارهای جدید با functions.config با شکست مواجه خواهند شد.

برای اکثر موارد استفاده، پیکربندی پارامتری توصیه می‌شود. این رویکرد، مقادیر پیکربندی را هم در زمان اجرا و هم در زمان استقرار در دسترس قرار می‌دهد و استقرار مسدود می‌شود مگر اینکه همه پارامترها مقدار معتبری داشته باشند.

مهاجرت به زیربسته params

اگر از پیکربندی محیط با functions.config استفاده کرده‌اید، می‌توانید پیکربندی موجود خود را با تغییر ساختار آن به عنوان پیکربندی پارامتری ، منتقل کنید. برای مثال:

قبل از: نسل اول

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

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

  // ...
});

بعد از: نسل دوم

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

const dateFormat = defineString("DATE_FORMAT");

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

  // ...
});

تنظیم مقادیر پارامترها

اولین باری که برنامه را مستقر می‌کنید، رابط خط فرمان فایربیس (Firebase CLI) از شما می‌خواهد که تمام مقادیر پارامترها را وارد کنید و آن‌ها را در یک فایل dotenv ذخیره کنید. برای خروجی گرفتن از مقادیر functions.config ، دستور firebase functions:config:export را اجرا کنید.

برای ایمنی بیشتر، می‌توانید انواع پارامترها و قوانین اعتبارسنجی را نیز مشخص کنید.

مورد خاص: کلیدهای API

ماژول params با Cloud Secret Manager ادغام می‌شود که کنترل دسترسی دقیقی را برای مقادیر حساس مانند کلیدهای API فراهم می‌کند. برای اطلاعات بیشتر به secret parameters مراجعه کنید.

متغیرهای محیطی به صورت خودکار پر می‌شوند

متغیرهای محیطی وجود دارند که به طور خودکار در زمان اجرای توابع و در توابع شبیه‌سازی شده محلی پر می‌شوند. این موارد شامل مواردی است که توسط Google Cloud پر می‌شوند ، و همچنین یک متغیر محیطی مخصوص Firebase:

process.env.FIREBASE_CONFIG : اطلاعات پیکربندی پروژه Firebase زیر را ارائه می‌دهد:

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

توجه داشته باشید که مقادیر موجود در پیکربندی واقعی Firebase شما ممکن است بسته به منابعی که در پروژه خود فراهم کرده‌اید، متفاوت باشد.

این پیکربندی به طور خودکار هنگام مقداردهی اولیه Firebase Admin SDK بدون هیچ آرگومانی اعمال می‌شود. اگر توابع را در جاوا اسکریپت می‌نویسید، به این صورت مقداردهی اولیه کنید:

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

اگر نیاز دارید که SDK مدیریت را با پیکربندی پیش‌فرض پروژه با استفاده از اعتبارنامه‌های حساب سرویس، مقداردهی اولیه کنید، می‌توانید اعتبارنامه‌ها را از یک فایل بارگذاری کرده و آنها را به FIREBASE_CONFIG مانند این اضافه کنید:

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

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