Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

Ortamınızı yapılandırın

Genellikle işlevleriniz için üçüncü taraf API anahtarları veya ayarlanabilir ayarlar gibi ek yapılandırmaya ihtiyacınız olacaktır. Cloud Functions için Firebase SDK, projeniz için bu tür verileri depolamayı ve almayı kolaylaştırmak için yerleşik ortam yapılandırması sunar.

Ortam değişkenlerinin dosya tabanlı yapılandırması (önerilen) veya Firebase CLI ve functions.config ile çalışma zamanı ortam yapılandırması arasında seçim yapabilirsiniz. Her iki yaklaşım da bu kılavuzda açıklanmıştır.

Ortam Değişkenleri

Firebase için Cloud Functions, bir .env dosyasında belirtilen ortam değişkenlerini uygulama çalışma zamanınıza yüklemek için dotenv dosya biçimini destekler. Bir kez konuşlandırıldıktan sonra, ortam değişkenleri process.env arabirimi aracılığıyla 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. 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 process.env sözdizimi ile erişebilir:

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

Birden çok ortam değişkeni kümesi dağıtma

Firebase projeleriniz için alternatif bir ortam değişkenleri grubuna ihtiyacınız varsa (hazırlama ve üretim gibi), bir .env. <project or alias > dosyası oluşturun ve projeye özel ortam değişkenlerinizi buraya yazın. .env ve projeye özgü .env dosyalarından (varsa) ortam değişkenleri, dağıtılan tüm işlevlere dahil edilecektir.

Ö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

İZLEYİCİ=İnsanlar

İZLEYİCİ=Dev İnsanlar İZLEYİCİ=Üretici İnsanlar

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şecektir:

$ 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şken anahtarları dahili kullanım için ayrılmıştır. .env dosyalarınızda bu anahtarlardan hiçbirini kullanmayın:

  • X_GOOGLE_ ile başlayan tüm tuşlar
  • EXT_ ile başlayan tüm tuşlar
  • FIREBASE_ ile başlayan tüm tuşlar
  • Aşağıdaki listeden herhangi bir anahtar:
  • CLOUD_RUNTIME_CONFIG
  • GİRİŞ NOKTASI
  • GCP_PROJECT
  • GCLOUD_PROJECT
  • GOOGLE_CLOUD_PROJECT
  • FUNCTION_TRIGGER_TYPE
  • FONKSİYON ADI
  • FUNCTION_MEMORY_MB
  • FUNCTION_TIMEOUT_SEC
  • FUNCTION_IDENTITY
  • FUNCTION_REGION
  • FUNCTION_TARGET
  • FUNCTION_SIGNATURE_TYPE
  • K_SERVICE
  • K_REVISION
  • LİMAN
  • K_CONFIGURATION

Hassas yapılandırma bilgilerini depolayın ve erişin

.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 düşünmemelisiniz. Bu, özellikle .env dosyalarınızı kaynak denetiminde denetlerseniz önemlidir.

Firebase için Cloud Functions, hassas yapılandırma bilgilerini depolamanıza yardımcı olmak için Google Cloud Secret Manager ile entegre olur. Bu şifreli hizmet, yapılandırma değerlerini güvenli bir şekilde saklarken, gerektiğinde işlevlerinizden kolay erişime izin verir.

Bir sır oluştur ve kullan

Bir sır oluşturmak için Firebase CLI'yi kullanın.

Bir sır oluşturmak ve kullanmak için:

  1. Yerel proje dizininizin kökünden şu 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ını tekrarlar ve değişikliğin etkili 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 gizli anahtara erişmesine izin verdiğinden emin olun:

    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. Bulut İşlevlerini Dağıtın:

    firebase deploy --only functions

Artık buna diğer herhangi bir ortam değişkeni gibi erişebileceksiniz. Tersine, runWith sırrı belirtmeyen başka bir işlev sırra erişmeye çalışırsa, tanımsız bir değer alır:

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

İşleviniz dağıtıldığında, gizli değere erişimi olacaktır. Yalnızca runWith parametresinde özel olarak bir gizli anahtar içeren işlevler, bu gizli anahtara ortam değişkeni olarak erişebilir. Bu, gizli değerlerin yalnızca ihtiyaç duyuldukları yerde kullanılabilir olduğundan emin olmanıza yardımcı olur ve yanlışlıkla bir sırrın sızdırılması riskini azaltır.

Sırları yönetme

Sırlarınızı yönetmek için Firebase CLI'yi 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ı gerektirdiğini unutmayın. özellikle:

  • Bir sır için yeni bir değer ayarladığınızda, en son değeri almaları için o sırra başvuran tüm işlevleri yeniden konuşlandırmanız gerekir.
  • Bir sırrı silerseniz, dağıtılan işlevlerinizden hiçbirinin bu gizli anahtara başvurmadığından emin olun. Silinmiş bir gizli değer kullanan işlevler sessizce başarısız olur.

Gizli yönetim için Firebase CLI komutlarının bir özetini burada bulabilirsiniz:

# 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 için 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, CLI yardımını görüntülemek için -h komutunu iletin.

Gizli bilgiler nasıl faturalandırılır?

Secret Manager, hiçbir ücret ödemeden 6 aktif gizli sürüme izin verir. Bu, bir Firebase projesinde ücretsiz olarak ayda 6 sırrınız olabileceği anlamına gelir.

Varsayılan olarak, Firebase CLI, uygun olduğunda, örneğin yeni bir sır sürümüyle işlevleri dağıttığınızda olduğu gibi, kullanılmayan gizli sürümlerini otomatik olarak yok etmeye çalışır. Ayrıca, functions:secrets:destroy ve functions:secrets:prune kullanarak kullanılmayan sırları aktif olarak temizleyebilirsiniz.

Secret Manager, bir sır üzerinde aylık 10.000 faturasız erişim işlemine izin verir. İşlev örnekleri, her soğuk başlatmada yalnızca runWith parametresinde belirtilen gizli dizileri okur. Çok sayıda sır okuyan çok sayıda işlev örneğiniz varsa, projeniz bu ödeneği aşabilir ve bu noktada 10.000 erişim işlemi başına 0,03 ABD doları ücretlendirilirsiniz.

Daha fazla bilgi için bkz. Secret Manager Fiyatlandırması .

Emülatör desteği

dotenv ile ortam yapılandırması, yerel bir Cloud Functions öykünücüsü ile birlikte çalışacak şekilde tasarlanmıştır.

Yerel bir Cloud Functions öykünücüsü kullanırken, bir .env.local dosyası ayarlayarak projeniz için ortam değişkenlerini geçersiz kılabilirsiniz. .env içeriği, .env.local ve projeye özgü .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

İZLEYİCİ=İnsanlar

İZLEYİCİ=Dev İnsanlar İZLEYİCİ=Yerel İnsanlar

Yerel bağlamda başlatıldığında, öykünücü 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 öykünücüsünde gizli diziler ve kimlik bilgileri

Cloud Functions öykünücüsü, hassas yapılandırma bilgilerini depolamak ve bunlara erişmek için gizli dizilerin kullanımını destekler. Varsayılan olarak öykünücü, 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 öykünücü gizli değerlere erişemeyebilir.

Ortam değişkenleri için Cloud Functions öykünücü desteğine benzer şekilde, bir .secret.local dosyası ayarlayarak gizli dizi 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

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

Geçiş 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 önek girmenizin isteneceğini unutmayın. Bunun nedeni, geçersiz olabilecekleri veya ayrılmış bir ortam değişkeni anahtarı olabilecekleri için tüm yapılandırmaların otomatik olarak dönüştürülenememesidir.

İşlevlerinizi dağıtmadan veya .env dosyalarını kaynak denetiminde kontrol etmeden önce oluşturulan .env dosyalarının içeriğini dikkatlice incelemenizi öneririz. Herhangi bir değer hassassa ve sızdırılmaması gerekiyorsa, bunları .env dosyalarınızdan kaldırın ve bunun yerine Secret Manager'da güvenli bir şekilde saklayın.

Ayrıca işlev kodunuzu güncellemeniz gerekir. Function.config'i kullanan tüm functions.config , Environment değişkenlerinde gösterildiği gibi artık bunun yerine process.env kullanması gerekecektir.

Ortam yapılandırması

firebase-functions v3.18.0 ortam değişkeni desteği yayınlanmadan önce, ortam yapılandırması için functions.config() kullanılması önerilen yaklaşımdı. Bu yaklaşım hala desteklenmektedir, ancak kullanımı daha basit olduğundan ve kodunuzun taşınabilirliğini iyileştirdiğinden, tüm yeni projelerin bunun yerine ortam değişkenlerini kullanmasını öneririz.

CLI ile ortam yapılandırmasını ayarlayın

Ortam verilerini depolamak için, Firebase CLI'deki firebase functions:config:set komutunu kullanabilirsiniz. Her bir anahtar, ilgili yapılandırmayı birlikte gruplandırmak için noktalar kullanılarak ad alanlı olabilir. Anahtarlarda yalnızca küçük harfli karakterlerin kabul edildiğini unutmayın; büyük harflere izin verilmez.

Örneğin, "Bazı Hizmetler" için İstemci Kimliği ve API anahtarını depolamak için şunları çalıştırabilirsiniz:

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

Geçerli ortam yapılandırmasını al

Projeniz için ortam yapılandırmasında şu anda nelerin depolandığını incelemek için firebase functions:config:get kullanabilirsiniz. JSON'a şöyle bir çıktı verecektir:

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

Bu işlevsellik, Google Cloud Runtime Configuration API'yi temel alır.

Bir işlevde ortam yapılandırmasına erişmek için functions.config kullanın

Bazı yapılandırmalar, ayrılmış firebase ad alanı altında otomatik olarak sağlanır. Ortam yapılandırması, functions.config() aracılığıyla çalışan işlevinizin içinde kullanılabilir hale getirilir. Yukarıdaki yapılandırmayı kullanmak için kodunuz şöyle görünebilir:

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

Bir modülü başlatmak için ortam yapılandırmasını kullanın

Bazı Düğüm modülleri herhangi bir yapılandırma olmadan hazırdır. Diğer modüllerin doğru şekilde başlatılması için ekstra yapılandırmaya ihtiyacı vardır. Bu yapılandırmayı, sabit kodlamak yerine ortam yapılandırma değişkenlerinde saklamanızı öneririz. Bu, kodunuzu çok daha taşınabilir tutmanıza yardımcı olur, bu da uygulamanızı açık kaynaklı hale getirmenize veya üretim ve hazırlama sürümleri arasında kolayca geçiş yapmanıza olanak tanır.

Örneğin, Slack Node SDK modülünü kullanmak için şunu yazabilirsiniz:

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

Dağıtımdan önce slack.url ortam yapılandırma değişkenini ayarlayın:

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

Ek Ortam Komutları

  • firebase functions:config:unset key1 key2 , belirtilen anahtarları yapılandırmadan kaldırır
  • firebase functions:config:clone --from <fromProject> , başka bir projenin ortamını o anda etkin olan projeye kopyalar.

Otomatik olarak doldurulmuş ortam değişkenleri

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

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

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

Bu yapılandırma, Firebase Admin SDK'sını 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';
import * as admin from 'firebase-admin';
import 'firebase-functions';
admin.initializeApp();

Yönetici SDK'sını hizmet hesabı kimlik bilgilerini kullanarak varsayılan proje yapılandırmasıyla başlatmanız gerekirse, kimlik bilgilerini bir dosyadan yükleyebilir ve bunları şu şekilde FIREBASE_CONFIG ekleyebilirsiniz:

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

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