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


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

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

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

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

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

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

برای تعریف پارامترها در کد خود، این مدل را دنبال کنید:

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

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

  const { GoogleGenerativeAI } = require('@google/generative-ai');
  const { defineSecret } = require('firebase-functions/params');
  const { onInit } = require('firebase-functions/v1');

  const apiKey = defineSecret('GOOGLE_API_KEY');

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

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

پارامترها را می توان با یک شی Options پیکربندی کرد که کنترل می کند CLI چگونه مقادیر را درخواست می کند. مثال زیر گزینه هایی را برای تأیید فرمت شماره تلفن، ارائه یک گزینه انتخاب ساده و پر کردن یک گزینه انتخاب به طور خودکار از پروژه Firebase تنظیم می کند:

const { defineString } = require('firebase-functions/params');

const welcomeMessage = defineString('WELCOME_MESSAGE', {default: 'Hello World',
description: 'The greeting that is returned to the caller of this function'});

const onlyPhoneNumbers = defineString('PHONE_NUMBER', {input: {text:
{validationRegex: /\d{3}-\d{3}-\d{4}/, validationErrorMessage: "Please enter
a phone number in the format XXX-YYY-ZZZZ"}}});

const selectedOption = defineString('PARITY', {input: {select: {options:
[{value: "odd"}, {value: "even"}]}}})

const storageBucket = defineString('BUCKET', {input: {resource: {type:
"storage.googleapis.com/Bucket"}}, description: "This will automatically
populate the selector field with the deploying Cloud Project’s
storage buckets"})

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

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

  • راز
  • رشته
  • بولی
  • عدد صحیح
  • شناور

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

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

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

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

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

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

پارامترها و عبارات پارامتری که فقط در زمان اجرا مورد استفاده قرار می‌گیرند را می‌توان با تابع 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.`);
  }
);

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

Cloud Functions SDK سه پارامتر از پیش تعریف شده را ارائه می دهد که در زیر بسته firebase-functions/params موجود است:

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

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

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

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

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

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

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

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

Cloud Functions for Firebase از فرمت فایل dotenv برای بارگیری متغیرهای محیطی مشخص شده در فایل .env در زمان اجرای برنامه شما پشتیبانی می کند. پس از استقرار، متغیرهای محیطی را می توان از طریق رابط process.env خواند.

برای پیکربندی محیط خود به این روش، یک فایل .env در پروژه خود ایجاد کنید، متغیرهای مورد نظر را اضافه کنید و اجرا کنید:

  1. یک فایل .env در functions/ دایرکتوری خود ایجاد کنید:

    # Directory layout:
    #   my-project/
    #     firebase.json
    #     functions/
    #       .env
    #       package.json
    #       index.js
    
  2. فایل .env را برای ویرایش باز کرده و کلیدهای مورد نظر را اضافه کنید. مثلا:

    PLANET=Earth
    AUDIENCE=Humans
    
  3. توابع را مستقر کنید و بررسی کنید که متغیرهای محیط بارگذاری شده اند:

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

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

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

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

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

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

.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
  • نقطه ورود
  • 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 به رمز دسترسی پیدا کند:

    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. استقرار توابع ابری:

    firebase deploy --only functions

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

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

هنگامی که تابع شما مستقر شد، به مقدار مخفی دسترسی خواهد داشت. فقط توابعی که به طور خاص یک 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 دلار از شما دریافت می شود.

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

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

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

هنگام استفاده از شبیه ساز توابع Cloud محلی، می توانید با تنظیم یک فایل .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 استفاده کند، همانطور که در ارتقا به نسل دوم نشان داده شده است.

پیکربندی محیط

قبل از انتشار پشتیبانی از متغیرهای محیطی در firebase-functions v3.18.0 ، استفاده از functions.config() رویکرد توصیه شده برای پیکربندی محیط بود. این رویکرد همچنان پشتیبانی می‌شود، اما ما به همه پروژه‌های جدید توصیه می‌کنیم به جای آن از متغیرهای محیطی استفاده کنند، زیرا استفاده از آنها ساده‌تر است و قابلیت حمل کد شما را بهبود می‌بخشد.

تنظیمات محیط را با CLI تنظیم کنید

برای ذخیره داده های محیطی، می توانید از فرمان firebase functions:config:set در Firebase CLI استفاده کنید. هر کلید را می توان با استفاده از نقطه ها برای گروه بندی پیکربندی های مرتبط با هم، در فضای نام قرار داد. به خاطر داشته باشید که فقط حروف کوچک در کلیدها پذیرفته می شوند . حروف بزرگ مجاز نیستند.

به عنوان مثال، برای ذخیره شناسه مشتری و کلید API برای "Some Service"، ممکن است اجرا کنید:

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

پیکربندی محیط فعلی را بازیابی کنید

برای بررسی آنچه در حال حاضر در پیکربندی محیط برای پروژه شما ذخیره شده است، می توانید firebase functions:config:get استفاده کنید. خروجی JSON چیزی شبیه به این است:

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

این عملکرد بر اساس Google Cloud Runtime Configuration API است.

از functions.config برای دسترسی به پیکربندی محیط در یک تابع استفاده کنید

برخی از تنظیمات به طور خودکار در فضای نام firebase رزرو شده ارائه می شود. پیکربندی محیط در داخل تابع در حال اجرا از طریق functions.config() در دسترس است. برای استفاده از پیکربندی بالا، کد شما ممکن است به شکل زیر باشد:

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

از پیکربندی محیط برای مقداردهی اولیه یک ماژول استفاده کنید

برخی از ماژول های Node بدون هیچ گونه پیکربندی آماده هستند. ماژول‌های دیگر برای تنظیم اولیه به تنظیمات بیشتری نیاز دارند. توصیه می کنیم این پیکربندی را به جای کدگذاری سخت، در متغیرهای پیکربندی محیط ذخیره کنید. این به شما کمک می کند تا کد خود را بسیار قابل حمل تر نگه دارید، که به شما امکان می دهد برنامه خود را منبع باز کنید یا به راحتی بین نسخه های تولیدی و مرحله بندی جابجا شوید.

به عنوان مثال، برای استفاده از ماژول Slack Node SDK ، ممکن است این را بنویسید:

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

قبل از استقرار، متغیر پیکربندی محیط slack.url را تنظیم کنید:

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

دستورات محیطی اضافی

  • firebase functions:config:unset key1 key2 کلیدهای مشخص شده را از پیکربندی حذف می کند
  • firebase functions:config:clone --from <fromProject> محیط پروژه دیگری را در پروژه فعال فعلی شبیه سازی می کند.

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

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

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

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

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

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

اگر توابع را در TypeScript می نویسید، به صورت زیر مقداردهی اولیه کنید:

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

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

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

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