הגדרת הסביבה


לעיתים קרובות צריך לקבוע הגדרות נוספות לפונקציות, כמו מפתחות API של צד שלישי או הגדרות שאפשר לכוונן. ב-Firebase SDK for Cloud Functions יש אפשרות מובנית להגדיר את הסביבה כדי שתוכלו לאחסן ולאחזר בקלות את סוג הנתונים הזה לפרויקט שלכם.

אפשר לבחור מבין שלוש אפשרויות:

  • הגדרה שמכילה פרמטרים (מומלץ לרוב התרחישים). כך אפשר לקבוע הגדרות של סביבה עם הקלדה חזקה, עם פרמטרים שמאומתים בזמן הפריסה, וכך למנוע שגיאות ולפשט את ניפוי הבאגים.
  • הגדרה מבוססת-קבצים של משתני סביבה. בשיטה הזו אפשר ליצור באופן ידני קובץ dotenv לטעינת משתני סביבה.
  • הגדרת סביבת זמן ריצה באמצעות ה-CLI של Firebase ו-functions.config (Cloud Functions (דור ראשון) בלבד).

ברוב התרחישים לדוגמה מומלץ להשתמש בהגדרות עם פרמטרים. כך ערכי ההגדרות יהיו זמינים גם בזמן ריצה וגם בזמן הפריסה, והפריסה חסומה אלא אם לכל הפרמטרים יש ערך חוקי. לעומת זאת, הגדרה עם משתני סביבה לא זמינה בזמן הפריסה.

הגדרה שמכילה פרמטרים

ב-Cloud Functions for Firebase יש ממשק להגדרת פרמטרים של הגדרה באופן הצהרתי בתוך ה-codebase. הערך של הפרמטרים האלה זמין גם במהלך פריסת הפונקציה, וגם כשמגדירים את אפשרויות הפריסה וזמן הריצה, וגם במהלך הביצוע. כלומר, ה-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.`);
  }
);

כשפורסים פונקציה עם משתני תצורה עם פרמטרים, ה-CLI של Firebase מנסה קודם לטעון את הערכים שלו מקובצי .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. הסוגים הנתמכים הם:

  • סוד
  • מחרוזת
  • ערך בוליאני
  • מספר שלם
  • Float

ערכים וביטויים של פרמטרים

מערכת 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 – הפרויקט ב-Cloud שבו הפונקציה פועלת.
  • databaseURL – כתובת ה-URL של המופע של מסד הנתונים בזמן אמת שמשויך לפונקציה (אם היא הופעלה בפרויקט Firebase).
  • storageBucket - הקטגוריה של Cloud Storage שמשויכת לפונקציה (אם הופעלה בפרויקט Firebase).

הפונקציות האלה יכולות להיות, כמו פרמטרים של מחרוזת בהגדרת המשתמש, בכל המקרים, אבל מכיוון שהערכים שלהם תמיד ידועים ל-CLI של Firebase, הערכים שלהם אף פעם לא יוצגו בפריסה ולא יישמרו בקובצי .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();
    //…

מכיוון שהערכים של הסודות מוסתרים עד לביצוע הפונקציה, אי אפשר להשתמש בהם במהלך הגדרת הפונקציה.

משתני סביבה

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 (למשל, Staging לעומת ייצור), כדאי ליצור קובץ .env.<project or alias> ולכתוב בו את משתני הסביבה הספציפיים לפרויקט. משתני הסביבה מ-.env ומקובצי .env ספציפיים לפרויקט (אם הם קיימים) ייכללו בכל הפונקציות שנפרסו.

לדוגמה, פרויקט יכול לכלול את שלושת הקבצים האלו עם ערכים מעט שונים של פיתוח וייצור:

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

AUDIENCE=בני אדם

AUDIENCE=Dev משאבי אנוש AUDIENCE=בני אדם 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_
  • כל מפתח מהרשימה הבאה:
  • CLOUD_RUNTIME_CONFIG
  • ENTRY_POINT
  • GCP_PROJECT
  • GCLOUD_PROJECT
  • GOOGLE_CLOUD_PROJECT
  • FUNCTION_TRIGGER_TYPE
  • FUNCTION_NAME
  • FUNCTION_MEMORY_MB
  • FUNCTION_TIMEOUT_SEC
  • FUNCTION_IDENTITY
  • FUNCTION_REGION
  • FUNCTION_TARGET
  • FUNCTION_SIGNATURE_TYPE
  • K_SERVICE
  • K_REVISION
  • PORT
  • K_CONFIGURATION

אחסון מידע תצורה רגיש וגישה אליו

משתני סביבה שמאוחסנים בקובצי .env יכולים לשמש להגדרת פונקציות, אבל לא כדאי להתייחס אליהם כדרך מאובטחת לאחסן מידע רגיש כמו פרטי כניסה של מסד נתונים או מפתחות API. חשוב מאוד לעשות זאת אם בודקים את בקרת המקור בקובצי .env.

כדי לעזור לכם לאחסן מידע רגיש בהגדרות, Cloud Functions for Firebase משתלב עם Secret Manager של Google Cloud. השירות המוצפן הזה שומר את ערכי ההגדרות האישיות באופן מאובטח, ועדיין מאפשר גישה קלה לפונקציות במקרה הצורך.

יצירת סוד ושימוש בו

כדי ליצור סוד, משתמשים ב-CLI של Firebase.

כדי ליצור סוד ולהשתמש בו:

  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. פריסת Cloud Functions:

    firebase deploy --only functions

עכשיו תוכלו לגשת אליו כמו לכל משתנה סביבה אחר. לעומת זאת, אם פונקציה אחרת שלא מציינת את הסוד ב-runWith מנסה לגשת לסוד, היא מקבלת ערך לא מוגדר:

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

אחרי שהפונקציה פרוסה, תהיה לה גישה לערך הסוד. רק לפונקציות שכוללות סוד באופן ספציפי בפרמטר runWith תהיה גישה לסוד הזה בתור משתנה סביבה. כך תוכלו לוודא שהערכים הסודיים זמינים רק במקומות שבהם הם נחוצים, כדי להפחית את הסיכון להדלפה בטעות של סוד.

ניהול סודות

משתמשים ב-CLI של Firebase כדי לנהל את הסודות. בזמן ניהול סודות באופן הזה, חשוב לזכור ששינויים מסוימים ב-CLI מחייבים שינוי ו/או פריסה מחדש של הפונקציות המשויכות. פרטים נוספים:

  • בכל פעם שמגדירים ערך חדש לסוד, צריך לפרוס מחדש את כל הפונקציות שמפנות לסוד הזה כדי שהן יוכלו לקבל את הערך העדכני ביותר.
  • אם מוחקים סוד, צריך לוודא שאף אחת מהפונקציות שנפרסו לא מפנה לאותו הסוד. פונקציות שמשתמשות בערך סודי שנמחק ייכשלו באופן שקט.

סיכום של הפקודות ב-CLI של Firebase לניהול סודות:

# 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 versions של סודות פעילים ללא עלות. זה אומר שאפשר לשמור 6 סודות בכל חודש בפרויקט Firebase ללא עלות.

כברירת מחדל, ה-CLI של Firebase מנסה להשמיד באופן אוטומטי גרסאות סודות שלא בשימוש במקרים הרלוונטיים, למשל כשפורסים פונקציות עם גרסה חדשה של הסוד. בנוסף, תוכלו לנקות באופן פעיל סודות שלא נמצאים בשימוש באמצעות functions:secrets:destroy ו-functions:secrets:prune.

באמצעות Secret Manager אפשר לבצע 10,000 פעולות גישה חודשיות ללא חיוב לסודות. במכונות של הפונקציות, קריאה רק של הסודות שצוינו בפרמטר runWith בכל פעם שהן מתחילות לפעול במצב התחלתי (cold start). אם יש לכם הרבה מכונות של פונקציות שקוראות הרבה סודות, הפרויקט עשוי לחרוג מהמכסה הזו, ובשלב הזה תחויבו ב-0.03 $לכל 10,000 פעולות גישה.

למידע נוסף קראו את המחירון של Secret Manager.

תמיכה באמולטור

הגדרת הסביבה באמצעות dotenv מיועדת לפעול בשילוב עם אמולטור Cloud Functions.

כשמשתמשים באמולטור מקומי של Cloud Functions, אפשר להגדיר קובץ .env.local כדי לשנות את משתני הסביבה של הפרויקט. התוכן של .env.local מקבל קדימות על פני .env ועל קובץ .env הספציפי לפרויקט.

לדוגמה, פרויקט יכול לכלול את שלושת הקבצים הבאים שמכילים ערכים מעט שונים לפיתוח ולבדיקה מקומית:

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

AUDIENCE=בני אדם

AUDIENCE=Dev משאבי אנוש 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). ה-CLI של Firebase מספק פקודת ייצוא שמפיקה את התצורה של כל כינוי או פרויקט שרשומים בקובץ .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 ב-CLI של Firebase. אפשר להקצות מרחב שמות לכל מפתח באמצעות נקודות כדי לקבץ יחד הגדרות קשורות. חשוב לזכור שבמפתחות אפשר להשתמש רק בתווים קטנים. אי אפשר להשתמש באותיות גדולות.

לדוגמה, כדי לאחסן את Client-ID ומפתח ה-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}
  });
});

שימוש בהגדרת סביבה כדי לאתחל מודול

חלק מהמודולים של הצמתים מוכנים ללא צורך בהגדרות אישיות. למודולים אחרים נדרשת הגדרה נוספת כדי לאתחל בצורה נכונה. מומלץ לאחסן את ההגדרות האלה במשתני תצורה בסביבה במקום לכתוב בתוך הקוד. כך הקוד שלכם נשאר הרבה יותר נייד, שמאפשר לכם להפעיל את האפליקציה בקוד פתוח או לעבור בקלות בין גרסאות ייצור ו-Staging.

לדוגמה, כדי להשתמש במודול Slack Node SDK, אפשר לכתוב כך:

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

לפני הפריסה, מגדירים את משתנה config של הסביבה 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'
}

ההגדרות האלה מוחלות באופן אוטומטי כשמפעילים את ה-SDK לניהול של Firebase ללא ארגומנטים. אם כותבים פונקציות ב-JavaScript, צריך לאתחל כך:

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