Ortamınızı yapılandırma


Çoğu zaman, işlevleriniz için üçüncü taraf API anahtarları veya ayarlanabilir ayarlar gibi ek yapılandırmaya ihtiyacınız olur. Cloud Functions için Firebase SDK'sı, projeniz için bu tür verileri depolamayı ve almayı kolaylaştırmak amacıyla yerleşik ortam yapılandırması sunar.

Şu seçeneklerden birini belirleyebilirsiniz:

  • Parametreli yapılandırma (çoğu senaryo için önerilir). Bu, dağıtım sırasında doğrulanan parametrelerle güçlü şekilde yazılmış bir ortam yapılandırması sağlar. Bu sayede hataları önler ve hata ayıklamayı basitleştirir.
  • Ortam değişkenlerinin dosya tabanlı yapılandırması. Bu yaklaşımda, ortam değişkenlerini yüklemek için manuel olarak bir dotenv dosyası oluşturursunuz.

Çoğu kullanım durumu için parametre haline getirilmiş yapılandırma önerilir. Bu yaklaşım, yapılandırma değerlerini hem çalışma zamanında hem de dağıtım zamanında kullanılabilir hale getirir ve tüm parametreler geçerli bir değere sahip olmadığı sürece dağıtım engellenir. Buna karşılık, ortam değişkenleri içeren yapılandırma dağıtım sırasında kullanılamaz.

Parametreli yapılandırma

Cloud Functions for Firebase, yapılandırma parametrelerini kod tabanınızda bildirimli olarak tanımlamak için bir arayüz sağlar. Bu parametrelerin değeri hem işlev dağıtımı sırasında, hem de dağıtım ve çalışma zamanı seçenekleri belirlenirken ve yürütme sırasında kullanılabilir. Bu, tüm parametreler geçerli bir değere sahip olmadığı sürece KSA'nın, dağıtımı engelleyeceği anlamına gelir.

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

Python

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

Parametreleştirilmiş yapılandırma değişkenleriyle bir işlev dağıtırken Firebase CLI, önce yerel .env dosyalarından bunların değerlerini yüklemeye çalışır. Bu dosyalarda mevcut değilse ve default ayarlanmamışsa CLI, dağıtım sırasında değerleri ister ve ardından değerlerini functions/ dizininizdeki .env.<project_ID> adlı bir .env dosyasına otomatik olarak kaydeder:

$ 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

Geliştirme iş akışınıza bağlı olarak, oluşturulan .env.<project_ID> dosyasını sürüm kontrolüne eklemek yararlı olabilir.

Global kapsamda parametreleri kullanma

Dağıtım sırasında, parametreleriniz gerçek değerlere sahip olmadan önce işlev kodunuz yüklenir ve denetlenir. Bu, genel kapsam sırasında parametre değerlerinin getirilmesi dağıtımın başarısız olmasına neden olur. Bir global değeri başlatmak için parametre kullanmak istediğiniz durumlarda başlatma geri çağırma işlevini onInit() kullanın. Bu geri çağırma, herhangi bir işlev üretimde çalıştırılmadan önce çalışır ancak dağıtım sırasında çağrılmaz. Bu nedenle, bir parametrenin değerine erişmek için güvenli bir yerdir.

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

Python

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 türündeki parametreleri kullanıyorsanız bunların yalnızca gizliyi bağlayan işlevlerin sürecinde kullanılabileceğini unutmayın. Bir gizlilik yalnızca bazı işlevlerde bağlanmışsa kullanmadan önce secret.value() değerinin yanlış olup olmadığını kontrol edin.

CLI davranışını yapılandırma

Parametreler, KSA'nın değerleri nasıl isteyeceğini kontrol eden bir Options nesnesiyle yapılandırılabilir. Aşağıdaki örnekte, bir telefon numarasının biçimini doğrulamak, basit bir seçim seçeneği sunmak ve bir seçim seçeneğini Firebase projesinden otomatik olarak doldurmak için seçenekler belirlenmiştir:

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

Python

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

Parametre türleri

Parametreli yapılandırma, parametre değerlerinin güçlü bir şekilde yazılmasını sağlar ve Cloud Secret Manager'daki gizli anahtarları destekler. Desteklenen türler şunlardır:

  • Gizli Anahtar
  • Dize
  • Boole
  • Tamsayı
  • Kayan
  • List (Node.js)

Parametre değerleri ve ifadeleri

Firebase, parametrelerinizi hem dağıtım sırasında hem de işleviniz yürütülürken değerlendirir. Bu ikili ortamlar nedeniyle, parametre değerlerini karşılaştırırken ve işlevleriniz için çalışma zamanı seçeneklerini ayarlamak üzere bunları kullanırken biraz daha dikkatli olmanız gerekir.

Bir parametreyi işlevinize çalışma zamanı seçeneği olarak iletmek için doğrudan iletin:

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

Python

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

Ayrıca, hangi seçeneği seçeceğinizi öğrenmek için bir parametreyle karşılaştırma yapmanız gerekiyorsa değeri kontrol etmek yerine yerleşik karşılaştırıcılar kullanmanız gerekir:

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

Python

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

Yalnızca çalışma zamanında kullanılan parametrelere ve parametre ifadelerine value işlevleriyle erişilebilir:

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

Python

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

Yerleşik parametreler

Cloud Functions SDK'sı, firebase-functions/params alt paketinden kullanılabilen üç önceden tanımlanmış parametre sunar:

Node.js

  • projectID: İşlevin çalıştığı Cloud projesi.
  • databaseURL: İşlevle ilişkili Realtime Database örneğinin URL'si (Firebase projesinde etkinse).
  • storageBucket - işlevle ilişkili Cloud Storage paketi (Firebase projesinde etkinleştirilmişse).

Python

  • PROJECT_ID: İşlevin çalıştığı Cloud projesi.
  • DATABASE_URL - işlevle ilişkili Realtime Database örneğinin URL'si (Firebase projesinde etkinleştirilmişse).
  • STORAGE_BUCKET: İşlevle ilişkili Cloud Storage paketi (Firebase projesinde etkinse).

Bu parametreler, kullanıcı tanımlı dize parametreleri gibi her açıdan çalışır. Bununla birlikte, değerleri Firebase CLI tarafından her zaman bilindiği için dağıtım sırasında değerleri için hiçbir zaman istek gönderilmez ve .env dosyalarına kaydedilmez.

Gizli anahtar parametreleri

defineSecret() kullanılarak tanımlanan Secret türündeki parametreler, Cloud Secret Manager'da depolanan bir değeri olan dize parametrelerini temsil eder. Gizli parametreler, yerel bir .env dosyasını kontrol edip eksikse dosyaya yeni bir değer yazmak yerine Cloud Secret Manager'da varlığını kontrol eder ve dağıtım sırasında yeni bir gizli anahtarın değerini etkileşimli olarak ister.

Bu şekilde tanımlanan gizli parametreler, bunlara erişmesi gereken ayrı işlevlere bağlanmalıdır:

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

Python

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

Gizli bilgilerin değerleri, işlev yürütülene kadar gizli olduğundan işlevinizi yapılandırırken bunları kullanamazsınız.

Ortam değişkenleri

Cloud Functions for Firebase, .env dosyasında belirtilen ortam değişkenlerini uygulama çalışma zamanınıza yüklemek için dotenv dosya biçimini destekler. Ortam değişkenleri dağıtıldıktan sonra process.env arayüzü üzerinden (Node.js tabanlı projelerde) veya os.environ (Python tabanlı projelerde) üzerinden okunabilir.

Ortamınızı bu şekilde yapılandırmak için projenizde bir .env dosyası oluşturun, istediğiniz değişkenleri ekleyin ve dağıtın:

  1. functions/ dizininizde bir .env dosyası oluşturun:

    # Directory layout:
    #   my-project/
    #     firebase.json
    #     functions/
    #       .env
    #       package.json
    #       index.js
    
  2. .env dosyasını düzenlemek için açın ve istediğiniz anahtarları ekleyin. Örneğin:

    PLANET=Earth
    AUDIENCE=Humans
    
  3. İşlevleri dağıtın ve ortam değişkenlerinin yüklendiğini doğrulayın:

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

Özel ortam değişkenleriniz dağıtıldıktan sonra işlev kodunuz bunlara erişebilir:

Node.js

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

Python

import os

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

Birden fazla ortam değişkeni grubunu dağıtma

Firebase projeleriniz için alternatif bir ortam değişkeni grubuna (ör. hazırlık ve üretim) ihtiyacınız varsa bir .env.<project or alias> dosyası oluşturun ve projeye özel ortam değişkenlerinizi bu dosyaya yazın. .env dosyalarındaki ve projeye özel .env dosyalarındaki (varsa) ortam değişkenleri, dağıtılan tüm işlevlere dahil edilir.

Örneğin, bir proje; geliştirme ve üretim için biraz farklı değerler içeren şu üç dosyayı içerebilir:

.env .env.dev .env.prod
PLANET=Dünya

AUDIENCE=Humans

AUDIENCE=Dev Humans AUDIENCE=Prod Humans

Bu ayrı dosyalardaki değerlere bağlı olarak, işlevlerinizle birlikte dağıtılan ortam değişkenleri grubu hedef projenize göre değişir:

$ 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

Ayrılmış ortam değişkenleri

Bazı ortam değişkeni anahtarları şirket içi kullanım için ayrılmıştır. .env dosyalarınızda aşağıdaki anahtarlardan hiçbirini kullanmayın:

  • X_GOOGLE_ ile başlayan tüm anahtarlar
  • EXT_ ile başlayan tüm anahtarlar
  • FIREBASE_ ile başlayan tüm anahtarlar
  • Şu listedeki herhangi bir tuş:
  • 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
  • İŞLEV_HEDEFİ
  • FUNCTION_SIGNATURE_TYPE
  • K_SERVICE
  • K_REVISION
  • PORT
  • K_CONFIGURATION

Hassas yapılandırma bilgilerini depolama ve bunlara erişme

.env dosyalarında depolanan ortam değişkenleri, işlev yapılandırması için kullanılabilir ancak bunları, veritabanı kimlik bilgileri veya API anahtarları gibi hassas bilgileri depolamak için güvenli bir yol olarak düşünmemelisiniz. Bu, özellikle .env dosyalarınızı kaynak denetimine eklerseniz önemlidir.

Hassas yapılandırma bilgilerini saklamanıza yardımcı olmak için Cloud Functions for Firebase Google Cloud ile entegre olur Secret Manager. Bu şifrelenmiş hizmet, yapılandırma değerlerini güvenli bir şekilde depolar ve gerektiğinde işlevlerinizden kolayca erişmenize olanak tanır.

Gizli anahtar oluşturma ve kullanma

Gizli anahtar oluşturmak için Firebase CLI'yi kullanın.

Gizli anahtar oluşturmak ve kullanmak için:

  1. Yerel proje dizininizin kökünden aşağıdaki komutu çalıştırın:

    firebase functions:secrets:set SECRET_NAME

  2. SECRET_NAME için bir değer girin.

    CLI bir başarı mesajı döndürür ve değişikliğin geçerli olması için işlevleri dağıtmanız gerektiği konusunda uyarır.

  3. Dağıtmadan önce, işlev kodunuzun işlevin runWith parametresini kullanarak gizliye erişmesine izin verdiğinden emin olun:

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

    Python

    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 uygulamasını dağıtın:

    firebase deploy --only functions

    Artık bu değişkene diğer herhangi bir ortam değişkeni gibi erişebileceksiniz. Buna karşılık, runWith içinde gizli anahtarı belirtmeyen başka bir işlev gizli anahtara erişmeye çalışırsa işlev, tanımlanmamış bir değer alır:

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

    Python

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

İşleviniz dağıtıldığında gizli değere erişebilir. Yalnızca özel olarak runWith parametresinde bir gizli anahtar içeren işlevler, ortam değişkeni olarak söz konusu gizli anahtara erişebilir. Bu, gizli anahtar değerlerinin yalnızca gerekli yerlerde kullanılabildiğinden emin olmanıza yardımcı olarak gizli anahtarları yanlışlıkla sızdırma riskini azaltır.

Gizli anahtarları yönetme

Gizli anahtarlarınızı yönetmek için Firebase KSA'yı kullanın. Gizli bilgileri bu şekilde yönetirken bazı CLI değişikliklerinin, ilişkili işlevleri değiştirmenizi ve/veya yeniden dağıtmanızı gerektirdiğini unutmayın. Özellikle:

  • Bir gizli anahtar için yeni bir değer belirlediğinizde, en son değeri almaları için bu gizli anahtara atıfta bulunan tüm işlevleri yeniden dağıtmanız gerekir.
  • Bir gizli anahtarı silerseniz dağıtılan işlevlerinizden hiçbirinin bu gizli anahtara referans vermediğinden emin olun. Silinen bir gizli değer kullanan işlevler sessizce başarısız olur.

Gizli anahtar yönetimi için Firebase CLI komutlarının özeti aşağıda verilmiştir:

# 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 ve destroy komutları için belirli bir sürümü yönetmek üzere isteğe bağlı sürüm parametresini sağlayabilirsiniz. Örneğin:

functions:secrets:access SECRET_NAME[@VERSION]

Bu işlemler hakkında daha fazla bilgi edinmek için komutu -h ile birlikte göndererek CLI yardımını görüntüleyin.

Gizli anahtarların faturalandırılması

Secret Manager ücretsiz olarak 6 etkin gizli anahtar sürümüne izin verir. Bu, bir Firebase projesinde ayda 6 gizli anahtar kullanabileceğiniz anlamına gelir.

Varsayılan olarak Firebase CLI, kullanılmayan gizli anahtar sürümlerini uygun durumlarda (ör. gizli anahtarın yeni bir sürümüyle dağıttığınızda) otomatik olarak kaldırmayı dener. Ayrıca, functions:secrets:destroy ve functions:secrets:prune kullanarak kullanılmayan sırlar için aktif olarak yer açabilirsiniz.

Secret Manager, bir gizli anahtarda aylık 10.000 faturalandırılmayan erişim işlemine izin verir. İşlev örnekleri, her baştan başlatma işleminde runWith parametrelerinde belirtilen gizli anahtarları yalnızca okur. Çok sayıda gizli anahtar okuyan işlev örneğiniz varsa projeniz bu izinleri aşabilir. Bu durumda, 10.000 erişim işlemi başına 0,03 ABD doları ödersiniz.

Daha fazla bilgi için Secret Manager Fiyatlandırması başlıklı makaleyi inceleyin.

Emülatör desteği

dotenv ile ortam yapılandırması, yerel bir Cloud Functions emülatörüyle birlikte çalışacak şekilde tasarlanmıştır.

Yerel bir Cloud Functions emülatör kullanırken .env.local dosyası oluşturarak projenizin ortam değişkenlerini geçersiz kılabilirsiniz. .env.local içeriği, .env ve projeye özel .env dosyasına göre önceliklidir.

Örneğin, bir proje; geliştirme ve yerel test için biraz farklı değerler içeren şu üç dosyayı içerebilir:

.env .env.dev .env.local
PLANET=Dünya

AUDIENCE=Humans

KİTLE=Dev İnsanlar AUDIENCE=Local Humans

Emülatör, yerel bağlamda başlatıldığında ortam değişkenlerini gösterildiği gibi yükler:

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

Cloud Functions emülatöründe gizli anahtarlar ve kimlik bilgileri

Cloud Functions emülatörü, hassas yapılandırma bilgilerini depolamak ve bunlara erişmek için gizli anahtarların kullanılmasını destekler. Emülatör, varsayılan olarak uygulama varsayılan kimlik bilgilerini kullanarak üretim gizli anahtarlarınıza erişmeye çalışır. CI ortamları gibi belirli durumlarda emülatör, izin kısıtlamaları nedeniyle gizli değerlere erişemeyebilir.

Ortam değişkenleri için Cloud Functions emülatör desteğine benzer şekilde, bir .secret.local dosyası oluşturarak gizli anahtar değerlerini geçersiz kılabilirsiniz. Bu, özellikle gizli değere erişiminiz yoksa işlevlerinizi yerel olarak test etmenizi kolaylaştırır.

Ortam yapılandırmasından taşıma

Ortam yapılandırmasını functions.config ile kullanıyorsanız mevcut yapılandırmanızı ortam değişkenleri olarak taşıyabilirsiniz (dotenv biçiminde). Firebase CLI, dizininizdeki .firebaserc dosyasında listelenen her bir takma ad veya projenin yapılandırmasını (aşağıdaki örnekte local, dev ve prod) .env dosyaları olarak dışa aktaran bir dışa aktarma komutu sağlar.

Taşıma işlemini yapmak için firebase functions:config:export komutunu kullanarak mevcut ortam yapılandırmalarınızı dışa aktarın:

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

Bazı durumlarda, dışa aktarılan ortam değişkeni anahtarlarını yeniden adlandırmak için bir ön ek girmeniz istenebilir. Bunun nedeni, geçersiz veya ayrılmış ortam değişkeni anahtarı olabilecek tüm yapılandırmaların otomatik olarak dönüştürülememesidir.

İşlevlerinizi dağıtmadan veya .env dosyalarını kaynak kontrolüne kontrol etmeden önce, oluşturulan .env dosyalarının içeriğini dikkatlice incelemenizi öneririz. Hassas olan ve sızdırılmaması gereken değerleri .env dosyalarınızdan kaldırın ve Secret Manager dosyalarında güvenli bir şekilde saklayın.

İşlevler kodunuzu da güncellemeniz gerekir. functions.config kullanan işlevlerin artık ortam değişkenleri bölümünde gösterildiği gibi process.env kullanması gerekir.