İş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

Varsayılan olarak Firebase CLI, kaynağınızdaki tüm işlevleri aynı anda dağıtır. Projenizde 5'ten fazla işlev bulunuyorsa yalnızca düzenlediğiniz işlevleri dağıtmak için --only işaretini belirli işlev adlarıyla kullanmanızı öneririz. Belirli işlevlerin dağıtılması bu şekilde dağıtım sürecini hızlandırır ve dağıtım kotalarıyla karşılaşmaktan kaçınmanıza 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ını inceleyin.

Firebase CLI, varsayılan olarak kaynak kodu için functions/ klasörüne bakar. İsterseniz işlevleri kod tabanlarında veya birden fazla dosya grubunda organize edebilirsiniz.

İşlevleri silme

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

  • functions:delete ile Firebase CLI'da açık bir şekilde
  • Google Cloud Console'dan açıkça.
  • dolaylı olarak devre dışı bırakabilirsiniz.

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

Firebase CLI'daki açık işlev silme, işlev gruplarının yanı sıra birden çok bağımsız değişkeni de destekler ve belirli bir bölgede çalışan bir işlev 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

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

Bir iş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 yeniden adlandırıyorsanı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 ihtiyatlı olduğundan emin olun. Çünkü değişiklik sırasında hem yeni sürüm hem de işlevinizin eski sürümü aynı anda çalışacaktı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, ikinci komut ise daha önce dağıtılmış olan sürümü kaldırır. Örneğin, webhookNew olarak değiştirmek istediğiniz webhook adlı bir Node.js işleviniz varsa kodu aşağıdaki gibi revize edin:

// 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 durumda, aynı kod her iki bölge grubunda da geçici olarak çalıştırılır.
  3. Önceki işlevi silin.

Örneğin, us-central1 ürününün varsayılan işlevler bölgesinde bulunan webhook adlı bir işleviniz varsa ve bu işlevi asia-northeast1 bölgesine taşımak istiyorsanız öncelikle işlevi yeniden adlandırıp bölgeyi düzeltmek için kaynak kodunuzu değiştirmeniz 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

Şimdi birbirinin aynı olan iki işlev çalışıyor: webhook us-central1 içinde, webhookAsia ise asia-northeast1 içinde çalışıyor.

Ardından, webhook öğesini silin:

firebase functions:delete webhook

Şimdi yalnızca bir işlev vardır: asia-northeast1 işlevinde çalışan webhookAsia.

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

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

Yalnızca kaynak kodu değiştirip firebase deploy çalıştırarak işlevin etkinlik türünü değiştirmek mümkün değildir. Hataları önlemek için bir işlevin tetikleyici türünü şu prosedürü kullanarak değiştirin:

  1. Kaynak kodu, istenen tetikleyici türüne sahip yeni bir işlev içerecek şekilde değiştirin.
  2. İşlevi dağıtma. Bu işlem, hem eski hem de yeni işlevleri geçici olarak çalıştırmanızı sağlar.
  3. Firebase CLI'ı kullanarak eski işlevi üretimden açıkça silin.

Örneğin, eski onChange etkinlik türüne sahip objectChanged adlı bir Node.js işleviniz varsa ve bunu onFinalize olarak değiştirmek istiyorsanız öncelikle 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 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 sayesinde Node.js çalışma zamanı sürümü ve işlev başına zaman aşımı, bellek ayırma ve minimum/maksimum işlev örnekleri gibi çalışma zamanı seçeneklerini belirleyebilirsiniz.

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 CLI aracılığıyla) ayarlanan seçenekleri geçersiz kılar.

Geliştirme iş akışınız, Google Cloud Console veya gcloud CLI aracılığıyla çalışma zamanı seçeneklerini manuel olarak ayarlamayı 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 belirtilen çalışma zamanı seçeneklerini işlevinizin şu anda dağıtılan sürümünün ayarlarıyla aşağıdaki önceliğe sahip olan ayarlarla birleştirir:

  1. Seçenek, işlev kodunda ayarlandı: 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ın.
  3. Seçenek, işlev kodunda ayarlanmamış ancak şu anda dağıtılmış olan işlevde ayarlanmış: Dağıtılan işlevde belirtilen seçeneği kullanın.

Kodunuz artık işlevlerinizin çalışma zamanı seçenekleri için tam doğru kaynak olmayacağından, çoğu senaryoda preserveExternalChanges: true seçeneğinin kullanılması önerilmez. Kullanıyorsanız bir işlevin tam yapılandırmasını görüntülemek için Google Cloud konsolunu kontrol edin veya gcloud KSA'yı kullanın.

Node.js sürümünü ayarlama

Cloud Functions için Firebase SDK'sı, bir Node.js çalışma zamanı seçimine 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)
  • Düğüm.js 18
  • Düğüm.js 16
  • Düğüm.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 18 sürümünü kullanmak için bu satırı package.json içinde düzenleyin:

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

Yarn paket yöneticisi kullanıyorsanız veya engines alanı için başka özel gereksinimleriniz varsa bunun yerine firebase.json bölgesinde 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ı olarak 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çiş yapıyorsanız giriş şöyle 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. Trafiğin azaldığı zamanlarda potansiyel olarak sıfır örneğe indirgenir. Bununla birlikte, uygulamanız daha düşük gecikme gerektiriyorsa ve baştan başlatma sayısını sınırlamak istiyorsanız çalışır durumda ve istek hizmet vermeye 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çeklendirmesini sınırlamak için bir maksimum sayı ayarlayabilirsiniz. Bu ayarı, maliyetlerinizi kontrol etmek veya veritabanı gibi bir destek hizmetiyle olan bağlantı sayısını sınırlamak için kullanın.

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

Kaynak koddaki bir işlev için minimum örnek sayısını ayarlamak istiyorsanız 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 sıcak tutmak için en az 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 ayarlarken göz önünde bulundurmanız gereken bazı noktalar aşağıda belirtilmiştir:

  • Cloud Functions for Firebase, uygulamanızı minInstances ayarınızın üzerine çıkarırsa ilgili eşiğin üzerindeki her örnek için baştan başlatma işlemi gerçekleşir.
  • Soğuk başlatma, ani trafik çeken uygulamalar üzerindeki en ciddi etkiye sahiptir. Uygulamanızın trafiği yoğunsa ve her trafik artışında soğuk başlatmaların azaltılacağı kadar yüksek bir minInstances değeri ayarlarsanız gecikmenin önemli ölçüde azaldığını görürsünüz. Sürekli trafiğe sahip uygulamalarda soğuk başlatmanın performansı önemli ölçüde etkilemesi pek olası değildir.
  • Minimum örnek belirlemek, üretim ortamları için mantıklı olabilir ancak genellikle test ortamlarında kaçınılmalıdır. Test projenizde sıfıra ölçeklendirme yaparken üretim projenizde baştan başlatma sayısını azaltmak için FIREBASE_CONFIG ortam değişkenine göre minInstances değerini 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şlev için 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 değerlerini tanımlayan RuntimeOptions arayüzüne uygun bir JSON nesnesi kabul eder. Örneğin, bu işlev, varsayımsal bir eski veritabanını yormamak için 100 örneklik bir sınır ayarlar:

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 saniye boyunca sıraya alınır ve bu süre zarfında kullanılabilir örnek yoksa 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ı ve bellek ayırmayı ayarlama

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

Cloud Functions 2.0.0 için Firebase SDK'sında sunulan runWith parametresini kullanarak işlev kaynak kodunda bellek ayırmayı ve zaman aşımını ayarlayı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, bu 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 aşağıdaki listede ayrıntılı olarak açıklandığı gibi, 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 Console'da bellek ayırmayı ve zaman aşımını ayarlamak için:

  1. Google Cloud konsolunda soldaki menüden Cloud Functions'ı seçin.
  2. İşlev listesinde adını tıklayarak bir işlev seçin.
  3. Üst menüde Düzenle simgesini tıklayın.
  4. Ayrılan bellek etiketli açılır menüden bir bellek tahsisi 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 süreyi saniye cinsinden girin.
  6. İşlevi güncellemek için Kaydet'i tıklayın.