Ortamınızı yapılandırma

Genellikle işlevleriniz için ek yapılandırma yapmanız gerekir. Örneğin, üçüncü taraf API anahtarları veya ayarlanabilir ayarlar. Firebase SDK'sı, Cloud Functions projenizde bu tür verileri depolamayı ve almayı kolaylaştırmak için yerleşik ortam yapılandırması sunar.

Aşağıdaki 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 türlenmiş bir ortam yapılandırması sağlar. Bu sayede hatalar önlenir ve hata ayıklama basitleştirilir.
  • Ortam değişkenlerinin dosya tabanlı yapılandırılması. Bu yaklaşımda, ortam değişkenlerini yüklemek için manuel olarak bir dotenv dosyası oluşturursunuz.

Çoğu kullanım alanı için parametreli 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 hâle getirir. Ayrıca, tüm parametreler geçerli bir değere sahip olmadığı sürece dağıtım engellenir. Bunun aksine, çevre değişkenleriyle yapılandırma dağıtım sırasında kullanılamaz.

Parametreli yapılandırma

Cloud Functions for Firebase, kod tabanınızda yapılandırma parametrelerini bildirimsel olarak tanımlamak için bir arayüz sağlar. Bu parametrelerin değeri hem işlev dağıtımı sırasında, dağıtım ve çalışma zamanı seçenekleri ayarlanırken hem de yürütme sırasında kullanılabilir. Bu, tüm parametreler geçerli bir değere sahip olmadığı sürece CLI'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!')

Parametreli yapılandırma değişkenlerine sahip bir işlevi dağıtırken Firebase CLI, önce değerlerini yerel .env dosyalarından yüklemeye çalışır. Bu dosyalar mevcut değilse ve default ayarlanmamışsa CLI, dağıtım sırasında değerleri ister ve ardından değerleri functions/ dizininizdeki .env.<project_ID> adlı .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 denetimine eklemek faydalı olabilir.

Parametreleri genel kapsamda kullanma

Dağıtım sırasında, parametreleriniz gerçek değerlere sahip olmadan önce işlevlerinizin kodu yüklenir ve incelenir. Bu, genel kapsam sırasında parametre değerlerinin getirilmesinin dağıtım hatasına neden olduğu anlamına gelir. Bir parametreyi kullanarak genel bir değeri başlatmak istediğiniz durumlarda başlatma geri çağırmasını onInit() kullanın. Bu geri çağırma, üretimde herhangi bir işlev ç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ünde parametreler kullanıyorsanız bu parametrelerin yalnızca gizliyi bağlayan işlevlerin sürecinde kullanılabildiğini unutmayın. Bir sır yalnızca bazı işlevlere bağlıysa kullanmadan önce secret.value() değerinin yanlış olup olmadığını kontrol edin.

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

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

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

Parametrelendirilmiş yapılandırma, parametre değerleri için güçlü türleme sağlar ve Cloud Secret Manager'daki gizli dizileri de destekler. Desteklenen türler:

  • Gizli Anahtar
  • Dize
  • Boole
  • Tam sayı
  • Kayan
  • Liste (Node.js)
  • JSON Secret (Node.js)

Parametreleri tanımlama işlevleri hakkında bilgi için params ad alanı referansına bakın.

Parametre değerleri ve ifadeler

Firebase, parametrelerinizi hem dağıtım sırasında hem de işleviniz yürütülürken değerlendirir. Bu iki ortam nedeniyle, parametre değerlerini karşılaştırırken ve bunları işlevleriniz için çalışma zamanı seçeneklerini ayarlamak üzere 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 belirleyeceğinizi bilmek 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şleviyle 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, firebase-functions/params alt paketinde bulunan üç ö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 etkinleştirilmişse).
  • storageBucket: İşlevle ilişkili Cloud Storage paketi (Firebase projesinde etkinleştirilmişse).

Python

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

Bu parametreler, değerleri her zaman Firebase CLI tarafından bilindiğinden dağıtım sırasında değerleri asla istenmez ve .env dosyalarına kaydedilmez. Bunun dışında, her açıdan kullanıcı tanımlı dize parametreleri gibi çalışır.

Gizli parametreler

Secret türündeki ve defineSecret() kullanılarak tanımlanan parametreler, Cloud Secret Manager'da depolanan bir değere sahip dize parametrelerini temsil eder. Gizli parametreler, yerel bir .env dosyasıyla karşılaştırma yapıp eksikse dosyaya yeni bir değer yazmak yerine Cloud Secret Manager'da var olup olmadığını kontrol eder ve dağıtım sırasında yeni bir gizli anahtarın değeri için etkileşimli olarak istemde bulunur.

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 dizilerin değerleri işlev yürütülene kadar gizlendiğinden, işlevinizi yapılandırırken bunları kullanamazsınız.

Yapılandırılmış JSON sırları

Mantıksal olarak ilişkili birden fazla yapılandırma değeriniz varsa (örneğin, üçüncü taraf hizmeti ayarları) bunları defineJsonSecret() kullanarak tek bir gizli içinde yapılandırılmış bir JSON nesnesi olarak birlikte saklayabilirsiniz. Bu yaklaşım, yapılandırmanızı düzenlemenize ve ilgili yapılandırma değerleri grubunu tek bir sırda saklayarak Cloud Secret Manager'ın ücretsiz katmanını daha verimli kullanmanıza yardımcı olabilir.

Secret Manager'da depolanan değer, geçerli bir JSON dizesi olmalıdır. SDK, .value() öğesine eriştiğinizde JSON dizesini otomatik olarak bir JavaScript nesnesine ayrıştırır.

Örnek:

const { onRequest } = require('firebase-functions/v2/https');
const { defineJsonSecret } = require('firebase-functions/params');

// Define a single secret to hold all configuration for some API
const someApiConfig = defineJsonSecret('SOMEAPI_CONFIG');

exports.myApi = onRequest(
  { secrets: [someApiConfig] },
  (req, res) => {
    // someApiConfig.value() automatically parses the JSON secret
    const { apiKey, webhookSecret, clientId } = someApiConfig.value();

    // Now you can use apiKey, webhookSecret, clientId
    // ...
  }
);

SOMEAPI_CONFIG sırrını oluşturmak için Secret Manager'daki değerini şu gibi bir JSON dizesi olarak ayarlarsınız:

{
  "apiKey": "key_...",
  "webhookSecret": "secret_...",
  "clientId": "client_..."
}

Gizli değer geçerli JSON değilse someApiConfig.value() öğesine erişim sırasında çalışma zamanında hata verilir.

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 (Node.js tabanlı projelerde) veya os.environ (Python tabanlı projelerde) arayüzü ü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 .env dosyası oluşturun:

    # Directory layout:
    #   my-project/
    #     firebase.json
    #     functions/
    #       .env
    #       package.json
    #       index.js
    
  2. Düzenlemek için .env dosyasını 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 grubu dağıtma

Firebase projeleriniz için alternatif bir ortam değişkenleri grubu (ör. hazırlık ve üretim) gerekiyorsa bir .env.<project or alias> dosyası oluşturun ve projeye özel ortam değişkenlerinizi buraya yazın. .env 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=Earth

AUDIENCE=Humans

AUDIENCE=Dev Humans AUDIENCE=Prod Humans

Bu ayrı dosyalardaki değerler göz önüne alındığında, işlevlerinizle dağıtılan ortam değişkenleri kümesi hedef projenize bağlı olarak 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ı dahili 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
  • Aşağıdaki listedeki tuşlardan herhangi biri:
  • 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

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 depolamanın güvenli bir yolu olarak görmemelisiniz. Bu durum, özellikle .env dosyalarınızı kaynak denetimine dahil ediyorsanız önemlidir.

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

Gizli oluşturma ve kullanma

Gizli dizi oluşturmak için Firebase CLI'yı kullanın.

Gizli dizi 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, başarılı bir mesajı yansıtı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 secrets seçeneğini kullanarak gizli değere 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 ortam değişkenleri gibi erişebilirsiniz. Bunun aksine, gizliyi belirtmeyen başka bir işlev gizliye erişmeye çalışırsa tanımsız 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 `secrets` option 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ıktan sonra gizli değere erişebilir. Yalnızca secrets seçeneğinde özellikle gizli anahtar bulunan işlevler, ortam değişkeni olarak bu gizli anahtara erişebilir. Bu sayede, gizli değerlerin yalnızca gerektiği yerlerde kullanılmasını sağlayarak gizli bilgilerin yanlışlıkla sızdırılma riskini azaltabilirsiniz.

Gizli anahtarları yönetme

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

  • Bir gizli anahtar için yeni bir değer ayarladığınızda, en son değeri alabilmeleri için bu gizli anahtara referans veren tüm işlevleri yeniden dağıtmanız gerekir.
  • Bir sırrı silerseniz dağıtılan işlevlerinizin hiçbirinin bu sırra başvurmadığından emin olun. Silinmiş bir gizli değeri kullanan işlevler sessizce başarısız olur.

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

# Change the value of an existing secret
firebase functions:secrets:set SECRET_NAME

# Set secret from file
firebase functions:secrets:set SECRET_NAME --data-file file.json

# Validate secret value as json
cat file.json | firebase functions:secrets:set SECRET_NAME --format=json

# Pipe from stdin and set secret
cat file.json | firebase functions:secrets:set SECRET_NAME --format=json

# 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 için komutla birlikte -h işaretini ileterek CLI yardımını görüntüleyin.

Gizli diziler için nasıl faturalandırılır?

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

Firebase KSA, varsayılan olarak uygun durumlarda (ör. işlevleri yeni bir Gizli Anahtar sürümüyle dağıttığınızda) kullanılmayan Gizli Anahtar sürümlerini otomatik olarak kaldırmaya çalışır. Ayrıca, functions:secrets:destroy ve functions:secrets:prune kullanarak kullanılmayan sırları aktif olarak temizleyebilirsiniz.

Secret Manager,bir gizli dizide 10.000 faturalandırılmamış aylık erişim işlemine izin verir. İşlev örnekleri, her soğuk başlatma işleminde yalnızca secrets seçeneğinde belirtilen sırları okur. Çok sayıda sır okuyan çok sayıda işlev örneğiniz varsa projeniz bu izni aşabilir. Bu durumda, 10.000 erişim işlemi başına 0,03 ABD doları ücretlendirilirsiniz.

Daha fazla bilgi için Secret Manager Fiyatlandırma bölümüne bakın.

Emülatör desteği

dotenv ile ortam yapılandırması, yerel bir Cloud Functions emülatörle 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=Earth

AUDIENCE=Humans

AUDIENCE=Dev Humans AUDIENCE=Local Humans

Yerel bağlamda başlatıldığında emülatör, 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ündeki gizli anahtarlar ve kimlik bilgileri

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

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

Çalışma zamanı yapılandırmasından taşıma

functions.config API'si kullanımdan kaldırıldı ve Mart 2027'de devre dışı bırakılacak. Bu tarihten sonra functions.config içeren dağıtımlar başarısız olur.

Dağıtım hatalarını önlemek için yapılandırmanızı Firebase KSA'yı kullanarak Cloud Secret Manager'a taşıyın. Yapılandırmanızı taşımanın en verimli ve güvenli yolu olduğundan bu seçenek kesinlikle önerilir.

  1. Firebase KSA ile yapılandırmayı dışa aktarma

    Mevcut ortam yapılandırmanızı Cloud Secret Manager'da yeni bir sır olarak dışa aktarmak için config export komutunu kullanın:

    $ firebase functions:config:export
    i  This command retrieves your Runtime Config values (accessed via functions.config())
       and exports them as a Secret Manager secret.
    
    i  Fetching your existing functions.config() from your project...  ✔
       Fetched your existing functions.config().
    
    i  Configuration to be exported:
    ⚠  This may contain sensitive data. Do not share this output.
    
    {
       ...
    }
    
    ✔ What would you like to name the new secret for your configuration? RUNTIME_CONFIG
    
    ✔  Created new secret version projects/project/secrets/RUNTIME_CONFIG/versions/1```
    
  2. Gizli dizileri bağlamak için işlev kodunu güncelleme

    Cloud Secret Manager'daki yeni gizli dizide depolanan yapılandırmayı kullanmak için işlev kaynağınızda defineJsonSecret API'sini kullanın. Ayrıca, sırların ihtiyaç duyulan tüm işlevlere bağlı olduğundan emin olun.

    Önce

    const functions = require("firebase-functions/v1");
    
    exports.myFunction = functions.https.onRequest((req, res) => {
      const apiKey = functions.config().someapi.key;
      // ...
    });
    

    Sonra

    const { onRequest } = require("firebase-functions/v2/https");
    const { defineJsonSecret } = require("firebase-functions/params");
    
    const config = defineJsonSecret("RUNTIME_CONFIG");
    
    exports.myFunction = onRequest(
      // Bind secret to your function
      { secrets: [config] },
      (req, res) => {
        // Access secret values via .value()
        const apiKey = config.value().someapi.key;
        // ...
    });
    
  3. İşlevleri dağıtma

    Değişiklikleri uygulamak ve gizli izinleri bağlamak için güncellenmiş işlevlerinizi dağıtın.

    firebase deploy --only functions:<your-function-name>
    

Otomatik olarak doldurulan ortam değişkenleri

İşlevlerin çalışma zamanında ve yerel olarak emüle edilen işlevlerde otomatik olarak doldurulan ortam değişkenleri vardır. Bunlar arasında Google Cloud tarafından doldurulanların yanı sıra Firebase'e özgü bir ortam değişkeni de bulunur:

process.env.FIREBASE_CONFIG: Aşağıdaki Firebase proje yapılandırma bilgilerini sağlar:

{
  databaseURL: 'https://DATABASE_NAME.firebaseio.com',
  storageBucket: 'PROJECT_ID.firebasestorage.app',
  projectId: 'PROJECT_ID'
}

Gerçek Firebase yapılandırmanızdaki değerlerin, projenizde sağladığınız kaynaklara bağlı olarak değişebileceğini unutmayın.

Bu yapılandırma, Firebase Admin SDK'sını herhangi bir bağımsız değişken olmadan başlattığınızda otomatik olarak uygulanır. JavaScript'te işlev yazıyorsanız şu şekilde başlatın:

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

TypeScript'te işlev yazıyorsanız şu şekilde başlatın:

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

Admin SDK'yı hizmet hesabı kimlik bilgilerini kullanarak varsayılan proje yapılandırmasıyla başlatmanız gerekiyorsa kimlik bilgilerini bir dosyadan yükleyip FIREBASE_CONFIG'ya şu şekilde ekleyebilirsiniz:

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

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