İşlevleri yönetin


Firebase CLI komutlarını kullanarak veya işlevlerin kaynak kodunda çalışma zamanı seçenekleri belirleyerek işlevleri dağıtabilir, silebilir ve değiştirebilirsiniz.

İşlevleri dağıtma

İşlevleri dağıtmak için şu Firebase CLI komutunu çalıştırın:

firebase deploy --only functions

Firebase CLI, varsayılan olarak kaynağınızdaki tüm işlevleri aynı anda dağıtır. Projenizde 5'ten fazla işlev varsa yalnızca düzenlediğiniz işlevleri dağıtmak için belirli işlev adlarıyla --only işaretini kullanmanızı öneririz. Belirli işlevlerin dağıtılması, dağıtım sürecini hızlandırır ve dağıtım kotalarıyla karşılaşmanızı önlemeye yardımcı olur. Örnek:

firebase deploy --only functions:addMessage,functions:makeUppercase

Çok sayıda işlev dağıtırken standart kotayı aşabilir ve HTTP 429 veya 500 hata mesajları alabilirsiniz. Bu sorunu çözmek için işlevleri 10 veya daha az kişilik gruplar halinde dağıtın.

Kullanılabilen komutların tam listesi için Firebase CLI referansına bakın.

Firebase CLI, varsayılan olarak kaynak kodu için functions/ klasörüne bakar. İsterseniz işlevleri kod tabanları veya birden fazla dosya kümesi halinde düzenleyebilirsiniz.

İşlevleri silme

Önceden dağıtılmış işlevleri şu yöntemlerle silebilirsiniz:

  • açık bir şekilde functions:delete ile Firebase CLI'da
  • açıkça Google Cloud Console'da bulabilirsiniz.
  • dolaylı olarak, işlevi dağıtımdan önce kaynaktan kaldırarak.

Tüm silme işlemlerinde, işlevi üretimden kaldırmadan önce işlemi onaylamanız istenir.

Firebase CLI'da açık işlev silme işlemi, işlev gruplarını ve birden çok bağımsız değişkeni destekler ve belirli bir bölgede çalışan bir işlevi belirtmenize olanak tanır. Ayrıca, onay istemini geçersiz kılabilirsiniz.

# Delete all functions that match the specified name in all regions.
firebase functions:delete myFunction
# Delete a specified function running in a specific region.
firebase functions:delete myFunction --region us-east-1
# Delete more than one function
firebase functions:delete myFunction myOtherFunction
# Delete a specified functions group.
firebase functions:delete groupA
# Bypass the confirmation prompt.
firebase functions:delete myFunction --force

Dolaylı işlev silme ile firebase deploy, kaynağınızı ayrıştırır ve dosyadan kaldırılan işlevleri üretimden kaldırır.

İşlevin adını, bölgesini veya tetikleyicisini değiştirin

Bölgeleri yeniden adlandırıyor veya değiştiriyorsanız ya da üretim trafiğini işleyen işlevler için tetikleyiciyi değiştiriyorsanız değişiklik sırasında etkinlikleri kaybetmemek için bu bölümdeki adımları uygulayın. Bu adımları uygulamadan önce işlevinizin eşsiz olduğundan emin olun. Değişiklik sırasında işlevinizin hem yeni hem de eski sürümü aynı anda çalışır.

İşlevi yeniden adlandırma

Bir işlevi yeniden adlandırmak için kaynağınızda işlevin yeniden adlandırılmış yeni bir sürümünü oluşturun ve ardından iki ayrı dağıtım komutunu çalıştırın. İlk komut yeni adlandırılmış işlevi dağıtır ve ikinci komut, önceden dağıtılmış olan sürümü kaldırır. Örneğin, webhookNew olarak değiştirmek istediğiniz webhook adında bir Node.js işleviniz varsa kodu aşağıdaki gibi düzenleyin:

// before
const functions = require('firebase-functions');

exports.webhook = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

// after
const functions = require('firebase-functions');

exports.webhookNew = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

Ardından yeni işlevi dağıtmak için aşağıdaki komutları çalıştırın:

# Deploy new function called webhookNew
firebase deploy --only functions:webhookNew

# Wait until deployment is done; now both webhookNew and webhook are running

# Delete webhook
firebase functions:delete webhook

Bir işlevin bölgesini veya bölgelerini değiştirme

Üretim trafiğini yöneten bir işlev için belirtilen bölgeleri değiştiriyorsanız aşağıdaki adımları sırayla uygulayarak etkinlik kaybını önleyebilirsiniz:

  1. İşlevi yeniden adlandırın ve bölgesini veya bölgelerini istediğiniz gibi değiştirin.
  2. Yeniden adlandırılan işlevi dağıtın. Bu işlem, aynı kodu her iki bölge grubunda geçici olarak çalıştırmayı sağlar.
  3. Önceki işlevi silin.

Örneğin, şu anda us-central1 adlı varsayılan işlevler bölgesinde bulunan webhook adında bir işleviniz varsa ve bu işlevi asia-northeast1 hizmetine taşımak istiyorsanız öncelikle kaynak kodunuzu değiştirerek işlevi yeniden adlandırmanız ve bölgeyi revize etmeniz gerekir.

// before
const functions = require('firebase-functions');

exports.webhook = functions
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

// after
const functions = require('firebase-functions');

exports.webhookAsia = functions
    .region('asia-northeast1')
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

Ardından şu komutu çalıştırarak dağıtın:

firebase deploy --only functions:webhookAsia

Şu anda birbiriyle aynı olan iki işlev çalışıyor: webhook us-central1 bölgesinde ve webhookAsia şurada çalışıyor: asia-northeast1.

Ardından webhook uygulamasını silin:

firebase functions:delete webhook

Şimdi tek bir işlev var: asia-northeast1 konumunda çalışan webhookAsia.

İşlevin tetikleyici türünü değiştirme

Cloud Functions for Firebase dağıtımınızı zaman içinde geliştirirken bir işlevin tetikleyici türünü çeşitli nedenlerle değiştirmeniz gerekebilir. Örneğin, bir Firebase Realtime Database veya Cloud Firestore etkinliği türünü başka bir türle değiştirmek isteyebilirsiniz.

Bir işlevin etkinlik türü, yalnızca kaynak kodu değiştirilip firebase deploy çalıştırılarak değiştirilemez. Hataları önlemek için işlevin tetikleyici türünü aşağıdaki prosedürü uygulayarak değiştirin:

  1. Kaynak kodunu, istediğiniz tetikleyici türünde yeni bir işlev içerecek şekilde değiştirin.
  2. İşlevi dağıtın. Bu işlem, hem eski hem de yeni işlevlerin geçici olarak çalıştırılmasını sağlar.
  3. Firebase KSA'yı kullanarak eski işlevi üretimden açıkça silin.

Örneğin, objectChanged adında eski onChange etkinlik türüne sahip bir Node.js işleviniz varsa ve bunu onFinalize olarak değiştirmek istiyorsanız, önce işlevi yeniden adlandırın ve onFinalize etkinlik türüne sahip olacak şekilde düzenleyin.

// before
const functions = require('firebase-functions');

exports.objectChanged = functions.storage.object().onChange((object) => {
    return console.log('File name is: ', object.name);
});

// after
const functions = require('firebase-functions');

exports.objectFinalized = functions.storage.object().onFinalize((object) => {
    return console.log('File name is: ', object.name);
});

Ardından, eski işlevi silmeden önce, ilk olarak yeni işlevi oluşturmak için aşağıdaki komutları çalıştırın:

# Create new function objectFinalized
firebase deploy --only functions:objectFinalized

# Wait until deployment is done; now both objectChanged and objectFinalized are running

# Delete objectChanged
firebase functions:delete objectChanged

Çalışma zamanı seçeneklerini ayarlama

Cloud Functions for Firebase, Node.js çalışma zamanı sürümü, işlev başına zaman aşımı, bellek ayırma ve minimum/maksimum işlev örnekleri gibi çalışma zamanı seçeneklerini belirlemenizi sağlar.

En iyi uygulama olarak, bu seçenekler (Node.js sürümü hariç) işlev kodu içindeki bir yapılandırma nesnesinde ayarlanmalıdır. Bu RuntimeOptions nesnesi, işlevinizin çalışma zamanı seçenekleri için bilgi kaynağıdır ve başka herhangi bir yöntemle (ör. Google Cloud Console veya gcloud KSA) belirlenen seçenekleri geçersiz kılar.

Geliştirme iş akışınız, çalışma zamanı seçeneklerinin Google Cloud Console veya gcloud CLI aracılığıyla manuel olarak ayarlanmasını içeriyorsa ve bu değerlerin her dağıtımda geçersiz kılınmasını istemiyorsanız preserveExternalChanges seçeneğini true olarak ayarlayın. Bu seçenek true olarak ayarlandığında Firebase, kodunuzda belirlenen çalışma zamanı seçeneklerini, işlevinizin halihazırda dağıtılan sürümünün ayarlarıyla aşağıdaki öncelikle birleştirir:

  1. Seçenek, işlev kodunda ayarlanmıştır: Harici değişiklikleri geçersiz kıl.
  2. Seçenek, işlev kodunda RESET_VALUE olarak ayarlandı: Harici değişiklikleri varsayılan değerle geçersiz kıl.
  3. Seçenek, işlev kodunda belirlenmedi ancak şu anda dağıtılan işlevde ayarlı: Dağıtılan işlevde belirtilen seçeneği kullanın.

Kodunuz artık işlevlerinize ilişkin çalışma zamanı seçenekleri için tam bilgi kaynağı olmayacağından preserveExternalChanges: true seçeneğinin kullanılması çoğu senaryo için önerilmez. Kullanıyorsanız bir işlevin tam yapılandırmasını görüntülemek için Google Cloud Console'a göz atın veya gcloud KSA'yı kullanın.

Node.js sürümünü ayarlayın

Cloud Functions için Firebase SDK'sı, belirli bir Node.js çalışma zamanına olanak tanır. Bir projedeki tüm işlevleri, yalnızca aşağıdaki desteklenen Node.js sürümlerinden birine karşılık gelen çalışma zamanı ortamında çalıştırmayı seçebilirsiniz:

  • Node.js 20 (önizleme)
  • Node.js 18
  • Node.js 16
  • Node.js 14

Node.js sürümünü ayarlamak için:

Sürümü, başlatma sırasında functions/ dizininizde oluşturulan package.json dosyasının engines alanında ayarlayabilirsiniz. Örneğin, yalnızca sürüm 18'i kullanmak için package.json içinde şu satırı düzenleyin:

  "engines": {"node": "18"}

Yarn paket yöneticisi kullanıyorsanız veya engines alanına yönelik başka özel gereksinimleriniz varsa bunun yerine firebase.json içinde Cloud Functions için Firebase SDK'sının çalışma zamanını ayarlayabilirsiniz:

  {
    "functions": {
      "runtime": "nodejs18" // or nodejs14, nodejs16 or nodejs20
    }
  }

KSA, package.json içinde ayrıca ayarladığınız herhangi bir değer veya aralık yerine firebase.json içinde ayarlanan değeri kullanır.

Node.js çalışma zamanınızı yükseltin

Node.js çalışma zamanınızı yükseltmek için:

  1. Projenizin Blaze fiyatlandırma planı kapsamında olduğundan emin olun.
  2. Firebase CLI 11.18.0 veya sonraki bir sürümü kullandığınızdan emin olun.
  3. Başlatma sırasında functions/ dizininizde oluşturulan package.json dosyasındaki engines değerini değiştirin. Örneğin, sürüm 16'dan sürüm 18'e geçiyorsanız giriş şu şekilde görünmelidir: "engines": {"node": "18"}
  4. İsteğe bağlı olarak, değişikliklerinizi Firebase Local Emulator Suite'i kullanarak test edin.
  5. Tüm işlevleri yeniden dağıtın.

Ölçeklendirme davranışını kontrol etme

Cloud Functions for Firebase varsayılan olarak, çalışan örnek sayısını gelen isteklerin sayısına göre ölçeklendirir. Böylece trafiğin az olduğu zamanlarda potansiyel olarak sıfır örneğe kadar ölçeklendirilir. Bununla birlikte, uygulamanız daha düşük gecikme gerektiriyorsa ve baştan başlatma sayısını sınırlandırmak istiyorsanız sıcak tutulacak ve istekleri yerine getirmeye hazır olacak minimum container örneği sayısını belirterek bu varsayılan davranışı değiştirebilirsiniz.

Benzer şekilde, gelen isteklere yanıt olarak örneklerin ölçeklenmesini sınırlamak için bir maksimum sayı belirleyebilirsiniz. Maliyetlerinizi kontrol etmek veya veritabanı gibi bir destek hizmeti için bağlantı sayısını sınırlamak amacıyla bu ayarı kullanın.

Baştan başlatma sayısını azaltın

Kaynak kodda bir işlevin minimum örnek sayısını ayarlamak için runWith yöntemini kullanın. Bu yöntem, minInstances değerini tanımlayan RuntimeOptions arayüzüne uygun bir JSON nesnesini kabul eder. Örneğin, bu işlev, çalışır durumda kalmak için minimum 5 örnek ayarlar:

exports.getAutocompleteResponse = functions
    .runWith({
      // Keep 5 instances warm for this latency-critical function
      minInstances: 5,
    })
    .https.onCall((data, context) => {
      // Autocomplete a user's search term
    });

minInstances için değer belirlerken göz önünde bulundurmanız gereken bazı noktalar şunlardır:

  • Cloud Functions for Firebase, uygulamanızı minInstances ayarınızın üzerine ölçeklendirirse bu eşiğin üzerindeki her örnek için bir baştan başlatma yaşarsınız.
  • Trafiğin yoğun olduğu uygulamalarda en ciddi etkiyi soğuk başlatmalar gerçekleştirir. Uygulamanızın trafiği yoğunsa ve minInstances değeri, trafikteki her artışta baştan başlatmaların azalmasını sağlayacak kadar yüksek bir değer ayarlarsanız gecikmenin önemli ölçüde azaldığını görürsünüz. Trafiği sabit olan uygulamalarda baştan başlatmalar, performansı önemli ölçüde etkilemez.
  • Minimum örnek sayısını ayarlamak, üretim ortamları için mantıklı olabilir, ancak test ortamlarında genellikle bundan kaçınılmalıdır. Test projenizde sıfıra ölçeklendirmek ancak üretim projenizde baştan başlatma sayısını azaltmak için FIREBASE_CONFIG ortam değişkenine göre minInstances ayarlayabilirsiniz:

    // Get Firebase project id from `FIREBASE_CONFIG` environment variable
    const envProjectId = JSON.parse(process.env.FIREBASE_CONFIG).projectId;
    
    exports.renderProfilePage = functions
        .runWith({
          // Keep 5 instances warm for this latency-critical function
          // in production only. Default to 0 for test projects.
          minInstances: envProjectId === "my-production-project" ? 5 : 0,
        })
        .https.onRequest((req, res) => {
          // render some html
        });
    

Bir işlevin maksimum örnek sayısını sınırlama

İşlev kaynak kodunda maksimum örnek sayısını ayarlamak için runWith yöntemini kullanın. Bu yöntem, maxInstances için değerleri tanımlayan RuntimeOptions arayüzüne uygun bir JSON nesnesini kabul eder. Örneğin, bu işlev, varsayımsal bir eski veritabanında aşırı yoğunluk oluşturmamak için 100 örneklik bir sınır belirler:

exports.mirrorOrdersToLegacyDatabase = functions
    .runWith({
      // Legacy database only supports 100 simultaneous connections
      maxInstances: 100,
    })
    .firestore.document("orders/{orderId}")
    .onWrite((change, context) => {
      // Connect to legacy database
    });

Bir HTTP işlevi maxInstances sınırına kadar ölçeklendirilirse yeni istekler 30 saniyeliğine sıraya alınır ve o zamana kadar kullanılabilir örnek olmazsa 429 Too Many Requests yanıt koduyla reddedilir.

Maksimum örnek ayarlarını kullanmayla ilgili en iyi uygulamalar hakkında daha fazla bilgi edinmek için maxInstances kullanımıyla ilgili en iyi uygulamalara göz atın.

Zaman aşımını ve bellek ayırmayı ayarlama

Bazı durumlarda, işlevlerinizin uzun zaman aşımı değeri veya büyük bir bellek ayırması için özel gereksinimleri olabilir. Bu değerleri Google Cloud Console'da veya işlev kaynak kodunda (yalnızca Firebase) ayarlayabilirsiniz.

İşlevlerin kaynak kodunda bellek ayırmayı ve zaman aşımını ayarlamak için Cloud Functions 2.0.0 için Firebase SDK'sında kullanıma sunulan runWith parametresini kullanın. Bu çalışma zamanı seçeneği, timeoutSeconds ve memory değerlerini tanımlayan RuntimeOptions arayüzüne uygun bir JSON nesnesini kabul eder. Örneğin, şu depolama işlevi 1 GB bellek kullanır ve 300 saniye sonra zaman aşımına uğrar:

exports.convertLargeFile = functions
    .runWith({
      // Ensure the function has enough memory and time
      // to process large files
      timeoutSeconds: 300,
      memory: "1GB",
    })
    .storage.object()
    .onFinalize((object) => {
      // Do some complicated things that take a lot of memory and time
    });

Maksimum timeoutSeconds değeri 540 veya 9 dakikadır. Bir işleve verilen bellek miktarı, memory için geçerli değerlerden oluşan bu listede ayrıntılı olarak açıklandığı şekilde işlev için ayrılan CPU'ya karşılık gelir:

  • 128MB - 200 MHz
  • 256MB - 400 MHz
  • 512MB - 800 MHz
  • 1GB - 1,4 GHz
  • 2GB - 2,4 GHz
  • 4GB - 4,8 GHz
  • 8GB - 4,8 GHz

Google Cloud konsolunda bellek ayırma ve zaman aşımını ayarlamak için:

  1. Google Cloud Console'daki sol menüden Cloud Functions'ı seçin.
  2. İşlevler listesinde bir işlevin adını tıklayarak seçin.
  3. Üst menüdeki Düzenle simgesini tıklayın.
  4. Ayrılan bellek etiketli açılır menüden bir bellek ayırma seçin.
  5. Gelişmiş seçenekleri görüntülemek için Diğer'i tıklayın ve Zaman aşımı metin kutusuna saniye cinsinden bir değer girin.
  6. İşlevi güncellemek için Kaydet'i tıklayın.