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


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

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

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

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

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

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

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

پایتون

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

هنگام استقرار یک تابع با متغیرهای پیکربندی پارامتر شده، 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> ایجاد شده را به کنترل نسخه اضافه کنید.

استفاده از پارامترها در گستره جهانی

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

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

پایتون

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.value() آن را بررسی کنید.

پیکربندی رفتار CLI

پارامترها را می توان با یک شی Options پیکربندی کرد که کنترل می کند CLI چگونه مقادیر را درخواست می کند. مثال زیر گزینه هایی را برای تأیید فرمت شماره تلفن، ارائه یک گزینه انتخاب ساده و پر کردن یک گزینه انتخاب به طور خودکار از پروژه 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 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)

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

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

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

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

پایتون

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

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

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

پایتون

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 در دسترس قرار داد:

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

پایتون

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 موجود است:

Node.js

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

پایتون

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

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

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

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

پارامترهای مخفی تعریف شده به این روش باید به توابع جداگانه ای که باید به آنها دسترسی داشته باشند متصل شوند:

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

پایتون

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

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

Node.js

// 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 خود نیاز دارید (مانند مرحله‌بندی در مقابل تولید)، یک .env. <project or alias > را فایل کنید و متغیرهای محیطی خاص پروژه خود را در آنجا بنویسید. متغیرهای محیطی از .env و فایل‌های .env خاص پروژه (در صورت وجود) در همه توابع مستقر شده گنجانده می‌شوند.

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

.env .env.dev .env.prod
PLANET=زمین

AUDIENCE=انسان

AUDIENCE = Dev Humans AUDIENCE=انسانهای تولیدکننده

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

$ firebase use dev
$ firebase deploy --only functions
i functions: Loaded environment variables from .env, .env.dev.
# Deploys functions with following user-defined environment variables:
#   PLANET=Earth
#   AUDIENCE=Dev Humans

$ firebase use prod
$ firebase deploy --only functions
i functions: Loaded environment variables from .env, .env.prod.
# Deploys functions with following user-defined environment variables:
#   PLANET=Earth
#   AUDIENCE=Prod Humans

متغیرهای محیطی رزرو شده

برخی از کلیدهای متغیر محیطی برای استفاده داخلی رزرو شده اند. از هیچ یک از این کلیدها در فایل های .env خود استفاده نکنید:

  • همه کلیدها با X_GOOGLE_ شروع می شوند
  • شروع همه کلیدها EXT_
  • همه کلیدها با FIREBASE_ شروع می شوند
  • هر کلید از لیست زیر:
  • CLOUD_RUNTIME_CONFIG
  • ENTRY_POINT
  • GCP_PROJECT
  • GCLOUD_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
  • بندر
  • K_CONFIGURATION

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

متغیرهای محیطی ذخیره شده در فایل‌های .env می‌توانند برای پیکربندی عملکرد استفاده شوند، اما نباید آنها را راهی امن برای ذخیره اطلاعات حساس مانند اعتبار پایگاه داده یا کلیدهای API در نظر بگیرید. اگر فایل‌های .env خود را در کنترل منبع بررسی کنید، به ویژه مهم است.

برای کمک به ذخیره اطلاعات پیکربندی حساس، Cloud Functions for Firebase با Google Cloud Secret Manager ادغام می‌شود. این سرویس رمزگذاری شده مقادیر پیکربندی را به صورت ایمن ذخیره می کند، در حالی که همچنان در صورت نیاز امکان دسترسی آسان به عملکردهای شما را فراهم می کند.

یک راز ایجاد و استفاده کنید

برای ایجاد یک راز، از Firebase CLI استفاده کنید.

برای ایجاد و استفاده از یک راز:

  1. از ریشه دایرکتوری پروژه محلی خود، دستور زیر را اجرا کنید:

    firebase functions:secrets:set SECRET_NAME

  2. یک مقدار برای SECRET_NAME وارد کنید.

    CLI یک پیام موفقیت آمیز را بازتاب می دهد و هشدار می دهد که باید توابع را برای اعمال تغییر مستقر کنید.

  3. قبل از استقرار، مطمئن شوید که کد توابع شما به تابع اجازه می دهد تا با استفاده از پارامتر runWith به رمز دسترسی پیدا کند:

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

    پایتون

    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

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

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

    پایتون

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

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

مدیریت اسرار

از 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 ، می توانید پارامتر نسخه اختیاری را برای مدیریت یک نسخه خاص ارائه دهید. به عنوان مثال:

functions:secrets:access SECRET_NAME[@VERSION]

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

اسرار چگونه صورتحساب می شوند

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

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

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

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

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

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

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

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

.env .env.dev .env.local
PLANET=زمین

AUDIENCE=انسان

AUDIENCE = Dev Humans AUDIENCE=انسان های محلی

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

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

اسرار و اعتبار در شبیه ساز Cloud Functions

شبیه ساز Cloud Functions از استفاده از اسرار برای ذخیره و دسترسی به اطلاعات پیکربندی حساس پشتیبانی می کند. به‌طور پیش‌فرض، شبیه‌ساز سعی می‌کند با استفاده از اعتبار پیش‌فرض برنامه به اسرار تولید شما دسترسی پیدا کند. در شرایط خاصی مانند محیط های CI، شبیه ساز ممکن است به دلیل محدودیت های مجوز، به مقادیر مخفی دسترسی پیدا نکند.

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

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

اگر از پیکربندی محیط با functions.config استفاده کرده اید، می توانید پیکربندی موجود خود را به عنوان متغیرهای محیطی (در قالب dotenv ) منتقل کنید. 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 استفاده کند، همانطور که در متغیرهای Environment نشان داده شده است.