Firebase CLI komutlarını kullanarak veya işlevlerin kaynak kodundaki çalışma zamanı seçeneklerini ayarlayarak 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. Projeniz 5'ten fazla işlev içeriyorsa, yalnızca düzenlediğiniz işlevleri dağıtmak için --only
işaretini belirli işlev adlarıyla birlikte kullanmanızı öneririz. Belirli işlevleri bu şekilde dağıtmak, dağıtım sürecini hızlandırır ve dağıtım kotalarına girmekten kaçınmanıza yardımcı olur. Örneğin:
firebase deploy --only functions:addMessage,functions:makeUppercase
Çok sayıda işlevi dağıtırken standart kotayı aşabilir ve HTTP 429 veya 500 hata iletileri alabilirsiniz. Bunu çözmek için işlevleri 10 veya daha az kişiden oluşan gruplar halinde dağıtın.
Kullanılabilir 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ında veya birden fazla dosya kümesinde düzenleyebilirsiniz .
İşlevleri sil
Daha önce dağıtılan işlevleri şu yollarla silebilirsiniz:
- Firebase CLI'de açıkça
functions:delete
- açıkça Google Cloud Console'da .
- dağıtımdan önce işlevi kaynaktan kaldırarak örtülü olarak .
Tüm silme işlemleri, işlevi üretimden kaldırmadan önce onaylamanızı ister.
Firebase CLI'deki 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ş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
firebase deploy
dağıtımı, örtülü işlev silmeyle kaynağınızı ayrıştırır ve dosyadan kaldırılan tüm işlevleri üretimden kaldırır.
Bir fonksiyonun adını, bölgesini veya tetikleyicisini değiştirin
Üretim trafiğini yöneten işlevlerin bölgelerini veya tetikleyicilerini yeniden adlandırıyor veya değiştiriyorsanız, değişiklik sırasında etkinliklerin kaybolmasını önlemek için bu bölümdeki adımları izleyin. Bu adımları uygulamadan önce öncelikle fonksiyonunuzun idempotent olduğundan emin olun çünkü değişiklik sırasında fonksiyonunuzun hem yeni sürümü hem de eski sürümü aynı anda çalışacaktır.
Bir işlevi yeniden adlandırın
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ılan işlevi dağıtır ve ikinci komut önceden dağıtılan sürümü kaldırır. Örneğin, webhook
adında bir Node.js işleviniz varsa ve bunu webhookNew
olarak değiştirmek istiyorsanız 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 gerçekleştirerek olay kaybını önleyebilirsiniz:
- İşlevi yeniden adlandırın ve bölgesini veya bölgelerini istediğiniz gibi değiştirin.
- Yeniden adlandırılan işlevi dağıtın; bu, aynı kodun her iki bölge kümesinde de geçici olarak çalıştırılmasına neden olur.
- Önceki işlevi silin.
Örneğin, şu anda us-central1
varsayılan işlevler bölgesinde bulunan webhook
adlı bir işleviniz varsa ve bunu asia-northeast1
taşımak istiyorsanız, işlevi yeniden adlandırmak ve bölgeyi revize etmek için önce 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");
});
Daha sonra aşağıdakileri çalıştırarak dağıtın:
firebase deploy --only functions:webhookAsia
Artık çalışan iki özdeş işlev var: webhook
us-central1
çalışıyor ve webhookAsia
asia-northeast1
çalışıyor.
Ardından webhook
silin:
firebase functions:delete webhook
Artık tek bir işlev var - asia-northeast1
çalışan webhookAsia
.
Bir işlevin tetikleyici türünü değiştirme
Cloud Functions for Firebase dağıtımınızı zaman içinde geliştirdikçe çeşitli nedenlerden dolayı bir işlevin tetikleme türünü değiştirmeniz gerekebilir. Örneğin, bir Firebase Realtime Database veya Cloud Firestore olayı türünden başka bir türe geçmek isteyebilirsiniz.
Yalnızca kaynak kodunu değiştirerek ve firebase deploy
çalıştırarak bir işlevin olay türünü değiştirmek mümkün değildir. Hataları önlemek için bir işlevin tetikleme türünü şu prosedürle değiştirin:
- İstenilen tetikleyici türüne sahip yeni bir işlev eklemek için kaynak kodunu değiştirin.
- Hem eski hem de yeni işlevlerin geçici olarak çalıştırılmasına neden olan işlevi dağıtın.
- Firebase CLI'yi kullanarak eski işlevi üretimden açıkça silin.
Örneğin, eski onChange
olay türüne sahip objectChanged
adında bir Node.js işleviniz varsa ve bunu onFinalize
olarak değiştirmek istiyorsanız, önce işlevi yeniden adlandırın ve onFinalize
olay 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);
});
Daha sonra 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
Firebase için Cloud Functions, 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 seçmenize olanak tanır.
En iyi uygulama olarak, bu seçeneklerin (Node.js sürümü hariç) işlev kodunun içindeki bir yapılandırma nesnesinde ayarlanması gerekir. Bu RuntimeOptions
nesnesi, işlevinizin çalışma zamanı seçeneklerine ilişkin gerçeğin kaynağıdır ve başka herhangi bir yöntemle (örneğin, Google Cloud konsolu veya gcloud CLI aracılığıyla) ayarlanan seçenekleri geçersiz kılar.
Geliştirme iş akışınız, çalışma zamanı seçeneklerini Google Cloud konsolu veya gcloud CLI aracılığıyla 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 ayarlanan çalışma zamanı seçeneklerini işlevinizin şu anda dağıtılan sürümünün ayarlarıyla aşağıdaki önceliğe göre birleştirir:
- Seçenek, işlev kodunda ayarlanır: harici değişiklikleri geçersiz kıl.
- İşlev kodunda seçenek
RESET_VALUE
olarak ayarlandı: harici değişiklikleri varsayılan değerle geçersiz kılın. - Seçenek, işlev kodunda ayarlanmadı ancak şu anda dağıtılan işlevde ayarlandı: dağıtılan işlevde belirtilen seçeneği kullanın.
preserveExternalChanges: true
seçeneğinin kullanılması çoğu senaryo için önerilmez çünkü kodunuz artık işlevlerinizin çalışma zamanı seçenekleri için tam doğruluk kaynağı olmayacaktır. Kullanıyorsanız bir işlevin tam yapılandırmasını görüntülemek için Google Cloud konsolunu kontrol edin veya gcloud CLI'yi kullanın.
Node.js sürümünü ayarlayın
Cloud Functions için Firebase SDK'sı, Node.js çalışma zamanının seçilmesine olanak tanır. Bir projedeki tüm işlevleri yalnızca şu 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ındaki engines
alanında ayarlayabilirsiniz. Örneğin, yalnızca sürüm 18'i kullanmak için package.json
dosyasındaki bu satırı düzenleyin:
"engines": {"node": "18"}
Yarn paket yöneticisini kullanıyorsanız veya engines
alanı için başka özel gereksinimleriniz varsa, bunun yerine firebase.json
dosyasında Cloud Functions için Firebase SDK'sının çalışma zamanını ayarlayabilirsiniz:
{
"functions": {
"runtime": "nodejs18" // or nodejs14, nodejs16 or nodejs20
}
}
CLI, package.json
dosyasında ayrı olarak ayarladığınız herhangi bir değer veya aralık yerine firebase.json
dosyasında 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:
- Projenizin Blaze fiyatlandırma planında olduğundan emin olun.
- Firebase CLI v11.18.0 veya üstünü kullandığınızdan emin olun.
- Başlatma sırasında
functions/
dizininizde oluşturulanpackage.json
dosyasındakiengines
değerini değiştirin. Örneğin, sürüm 16'dan sürüm 18'e yükseltme yapıyorsanız giriş şu şekilde görünmelidir:"engines": {"node": "18"}
- İsteğe bağlı olarak değişikliklerinizi Firebase Local Emulator Suite'i kullanarak test edin.
- Tüm işlevleri yeniden konuşlandırın.
Ölçeklendirme davranışını kontrol etme
Varsayılan olarak Cloud Functions for Firebase, gelen isteklerin sayısına göre çalışan örneklerin sayısını ölçeklendirir; trafiğin azaldığı zamanlarda potansiyel olarak sıfır örneklere kadar ölçeklenebilir. Ancak uygulamanız daha az gecikme gerektiriyorsa ve soğuk başlatma sayısını sınırlamak istiyorsanız sıcak tutulacak ve isteklere hizmet etmeye hazır tutulacak konteyner örneklerinin minimum sayısını belirterek bu varsayılan davranışı değiştirebilirsiniz.
Benzer şekilde, gelen isteklere yanıt olarak örneklerin ölçeklendirilmesini sınırlamak için bir maksimum sayı ayarlayabilirsiniz. Bu ayarı maliyetlerinizi kontrol etmenin veya veritabanı gibi bir destek hizmetine olan bağlantı sayısını sınırlamanın bir yolu olarak kullanın.
Soğuk başlatma sayısını azaltın
Kaynak kodundaki bir işlev için 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 sıcak tutmak için minimum 5 örneği 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 bir değer ayarlarken göz önünde bulundurulması gereken bazı noktalar şunlardır:
- Cloud Functions for Firebase, uygulamanızı
minInstances
ayarınızın üzerinde ölçeklendirirse bu eşiğin üzerindeki her örnek için soğuk başlangıçla karşılaşırsınız. - Soğuk başlatmalar, ani trafiğe sahip uygulamalar üzerinde en ciddi etkiye sahiptir. Uygulamanızda ani trafik artışı varsa ve
minInstances
değerini her trafik artışında soğuk başlatmaların azaltılmasını sağlayacak kadar yüksek ayarlarsanız gecikmenin önemli ölçüde azaldığını görürsünüz. Sürekli trafiğe sahip uygulamalar için soğuk başlatmanın performansı ciddi şekilde etkilemesi muhtemel değildir. Minimum örneklerin ayarlanması üretim ortamları için anlamlı olabilir ancak test ortamlarında genellikle bundan kaçınılmalıdır. Test projenizi sıfıra ölçeklendirmek ancak yine de üretim projenizdeki soğuk başlatmaları azaltmak için,
FIREBASE_CONFIG
ortam değişkenine dayalı olarakminInstances
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 örnekleri ayarlamak için runWith
yöntemini kullanın. Bu yöntem, maxInstances
değerlerini tanımlayan RuntimeOptions
arabirimine uygun bir JSON nesnesini kabul eder. Örneğin, bu işlev, varsayımsal eski bir veritabanını bunaltmamak 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 ölçeklendirilirse, yeni istekler 30 saniye boyunca kuyruğa alınır ve o zamana kadar herhangi bir örnek mevcut değilse 429 Too Many Requests
yanıt koduyla reddedilir.
Maksimum örnek ayarlarını kullanmaya yönelik en iyi uygulamalar hakkında daha fazla bilgi edinmek için maxInstances
kullanımına ilişkin bu en iyi uygulamalara göz atın.
Zaman aşımı ve bellek tahsisini ayarlayın
Bazı durumlarda, işlevlerinizin uzun zaman aşımı değeri veya büyük miktarda bellek tahsisi gibi özel gereksinimleri olabilir. Bu değerleri Google Cloud Console'da veya işlevin kaynak kodunda (yalnızca Firebase) ayarlayabilirsiniz.
İşlevlerin kaynak kodunda bellek ayırmayı ve zaman aşımını ayarlamak için Firebase SDK for Cloud Functions 2.0.0'da 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, 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
});
timeoutSeconds
için maksimum değer 540
veya 9 dakikadır. Bir işleve verilen bellek miktarı, memory
için geçerli değerlerin yer aldığı bu listede ayrıntılı olarak belirtildiği gibi, işlev için ayrılan CPU'ya karşılık gelir:
-
128MB
— 200MHz -
256MB
— 400MHz -
512MB
— 800MHz -
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:
- Google Google Cloud Console'da soldaki menüden Bulut İşlevleri'ni seçin.
- İşlevler listesinde ismine tıklayarak bir işlev seçin.
- Üst menüdeki Düzenle simgesini tıklayın.
- Ayrılan bellek etiketli açılır menüden bir bellek ayırma seçin.
- Gelişmiş seçenekleri görüntülemek için Diğer'i tıklayın ve Zaman Aşımı metin kutusuna saniye sayısını girin.
- İşlevi güncellemek için Kaydet'e tıklayın.