הגדרת הסביבה


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

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

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

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

הגדרות אישיות

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

כדי להגדיר פרמטרים בקוד, צריך לפעול לפי המודל הבא:

const functions = require('firebase-functions/v1');
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> שנוצר למערכת בקרת הגרסאות.

שימוש בפרמטרים ברמת ה-global

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

  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 Projects
storage buckets"})

סוגי פרמטרים

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

  • סודי
  • String
  • בוליאני
  • מספר שלם
  • Float

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

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

כדי להעביר פרמטר לפונקציה כאפשרות בסביבת זמן ריצה, צריך להעביר אותו ישירות:

const functions = require('firebase-functions/v1');
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/v1');
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/v1');
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 של המכונה של Realtime Database שמשויכת לפונקציה (אם היא מופעלת בפרויקט Firebase).
  • storageBucket – הקטגוריה של Cloud Storage שמשויכת לפונקציה (אם היא מופעלת בפרויקט Firebase).

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

פרמטרים סודיים

פרמטרים מסוג Secret, שהוגדרו באמצעות defineSecret(), מייצגים מחרוזת פרמטרים שמכילים ערך שמאוחסן ב-Cloud Secret Manager. במקום בדיקת מול קובץ .env מקומי וכתיבת ערך חדש לקובץ אם חסרים, פרמטרים סודיים בודקים אם קיימים ב-Cloud Secret Manager להציג באופן אינטראקטיבי את הערך של סוד חדש במהלך הפריסה.

פרמטרים סודיים שמוגדרים בדרך הזו חייבים להיות מקושרים לפונקציות נפרדות לקבל גישה אליהם:

const functions = require('firebase-functions/v1');
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 Humans AUDIENCE=בני אדם פרועים

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

$ 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 (פרויקט GCLOUD_PROJECT)
  • פרויקט_GOOGLE_CLOUD_PROJECT
  • FUNCTION_TRIGGER_TYPE
  • FUNCTION_NAME
  • FUNCTION_MEMORY_MB
  • FUNCTION_TIMEOUT_SEC
  • FUNCTION_IDENTITY
  • פונקציית FUNCTION_REGION
  • FUNCTION_TARGET (פונקציית FUNCTION_TARGET)
  • FUNCTION_SIGNATURE_TYPE
  • K_SERVICE
  • K_REVISION
  • PORT
  • K_CONFIGURATION

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

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

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

יצירה של סוד ושימוש בו

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

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

  1. ברמה הבסיסית (root) של ספריית הפרויקט המקומית, מריצים את הפקודה הבאה:

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

functions:secrets:access SECRET_NAME[@VERSION]

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

איך מתבצע החיוב על סודות

ב-Secret Manager אפשר ליצור 6 גרסאות סודיות פעילות ללא עלות. המשמעות היא שתוכלו לשמור 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 תומך בשימוש בסודות כדי לשמור מידע הגדרות רגיש ולגשת אליו. כברירת מחדל, הסימולטור ינסה לגשת לסודות הייצור באמצעות Application Default Credentials. במצבים מסוימים, כמו סביבות 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, כפי שמוצג ב: משדרגים לדור שני.

הגדרת הסביבה

הגדרת התצורה של הסביבה באמצעות CLI

כדי לאחסן את נתוני הסביבה, אפשר להשתמש בפקודה firebase functions:config:set ב-CLI של Firebase. אפשר להקצות לכל מפתח מרחבים שמות באמצעות נקודות כדי לקבץ יחד הגדרות קשורות. חשוב לזכור שרק אותיות קטנות אפשר להשתמש בהם במפתחות; אי אפשר להשתמש באותיות רישיות.

לדוגמה, כדי לאחסן את מזהה הלקוח ומפתח ה-API של 'שירות כלשהו', אפשר להריץ את הפקודה הבאה:

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/v1');
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/v1');
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 ללא ארגומנטים. אם כותבים פונקציות ב-JavaScript, צריך לבצע את האיניציאליזציה באופן הבא:

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

אם צריך לאתחל את 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);