Firebase CLI komutlarını kullanarak işlevleri dağıtabilir, silebilir ve değiştirebilirsiniz veya işlevlerinizin kaynak kodunda çalışma zamanı seçeneklerini ayarlayın.
İşlev dağıtma
İşlevleri dağıtmak için şu Firebase KSA 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 fonksiyon varsa
--only
işaretini belirli işlev adlarıyla kullanmanızı öneririz.
fonksiyonları dağıtıp
tıklayın. Bu şekilde belirli işlevleri dağıtmak dağıtım sürecini hızlandırır ve dağıtım kotalarına takılmanızı önler. Örneğin:
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 sayıda grup halinde dağıtın.
Kullanılabilir komutların tam listesi için Firebase CLI referansına göz atın.
Varsayılan olarak Firebase CLI, functions/
kaynak kodudur. İsterseniz fonksiyonları düzenleyebilirsiniz
veya birden fazla dosya setinde
kullanabilirsiniz.
İşlevleri silin
Daha önce dağıtılan işlevleri aşağıdaki yöntemlerle silebilirsiniz:
functions:delete
ile Firebase KSA'da açıkça- Google Cloud konsolunda açıkça gönderin.
- Dağıtım öncesinde işlevi kaynaktan kaldırarak dolaylı olarak.
Tüm silme işlemleri işlevi üretimden kaldırmadan önce onaylamanızı ister.
Firebase CLI'de açık işlev silme, işlev gruplarının yanı sıra birden fazla bağımsız değişkeni 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
firebase deploy
, örtülü işlev silme özelliğiyle 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
Üretim trafiğini yöneten işlevlerin bölgelerini veya tetikleyicisini yeniden adlandırıyor ya da 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şlevi idempotent'tir, çünkü işlevinizin hem yeni sürümü hem de eski sürümü zaman alabilir.
İşlevleri 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 komutu çalıştırın. İlk komut,
işlevi, ikinci komut ise önceden dağıtılmış olan
sürümünü değil. Örneğin, bir Node.js fonksiyonunuz varsa
istediğiniz webhook
adını
webhookNew
olarak değiştirmek için, kodu aşağıdaki gibi revize edin:
// before
const functions = require('firebase-functions/v1');
exports.webhook = functions.https.onRequest((req, res) => {
res.send("Hello");
});
// after
const functions = require('firebase-functions/v1');
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:
- İş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 durumda, aynı kod her iki bölge grubunda da geçici olarak çalıştırılır.
- Önceki işlevi silin.
Örneğin, şu anda us-central1
'un varsayılan işlev bölgesinde bulunan webhook
adlı bir işleviniz varsa ve bu işlevi asia-northeast1
'ye taşımak istiyorsanız önce işlevi yeniden adlandırmak ve bölgeyi düzeltmek için kaynak kodunuzu değiştirmeniz gerekir.
// before
const functions = require('firebase-functions/v1');
exports.webhook = functions
.https.onRequest((req, res) => {
res.send("Hello");
});
// after
const functions = require('firebase-functions/v1');
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
Artık çalışan iki aynı işlev var: webhook
, us-central1
'te, webhookAsia
ise asia-northeast1
'te çalışıyor.
Ardından, webhook
öğesini silin:
firebase functions:delete webhook
Artık yalnızca bir işlev var: asia-northeast1
'te çalışan webhookAsia
.
İşlevin tetikleyici türünü değiştirme
Cloud Functions for Firebase dağıtımınızı zaman içinde geliştirdikçe fonksiyonun tetikleyici türünü çeşitli nedenlerle değiştirmem gerekiyor. Örneğin, Firebase Realtime Database türünü değiştirmek isteyebilirsiniz veya Cloud Firestore etkinliği başka türe.
Bir işlevin etkinlik türü, yalnızca
firebase deploy
çalıştırmanız gerekir. Hataları önlemek için bir işlevin tetikleyici türünü şu şekilde değiştirin:
- Kaynak kodunu, istenen tetikleyici türüne sahip yeni bir işlev içerecek şekilde değiştirin.
- İşlevi dağıtın. Bu işlem, hem eski hem de yeni işlevlerin geçici olarak çalıştırılmasına neden olur.
- Eski işlevi Firebase KSA'yı kullanarak üretimden açık bir şekilde 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 önce işlevi yeniden adlandırın ve onFinalize
etkinlik türüne sahip olacak şekilde düzenleyin.
// before
const functions = require('firebase-functions/v1');
exports.objectChanged = functions.storage.object().onChange((object) => {
return console.log('File name is: ', object.name);
});
// after
const functions = require('firebase-functions/v1');
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, Node.js gibi çalışma zamanı seçeneklerini belirlemenize olanak tanır. çalışma zamanı sürümü ve işlev başına zaman aşımı, bellek ayırma ve minimum/maksimum işlev örneklerini anlatacağım.
En iyi uygulama olarak bu seçenekler (Node.js sürümü hariç) işlev kodunun içindeki bir yapılandırma nesnesinde ayarlanmalıdır. Bu
RuntimeOptions
nesne, fonksiyonunuzun çalışma zamanı seçenekleri için doğru kaynaktır ve
Başka bir yöntemle (ör. Google Cloud Console aracılığıyla) belirlenen geçersiz kılma seçenekleri
veya gcloud CLI) aracını kullanın.
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 ayarlanan çalışma zamanı seçeneklerini işlevinizin şu anda dağıtılmış sürümünün ayarlarıyla aşağıdaki önceliğe göre birleştirir:
- Seçenek, işlev kodunda ayarlandı: Harici değişiklikleri geçersiz kıl.
- Seçenek, işlev kodunda
RESET_VALUE
olarak ayarlandı: Harici değişiklikleri varsayılan değerle geçersiz kılın. - Seçenek, işlev kodunda değil, şu anda dağıtılan işlevde ayarlanmıştır: Dağıtılan işlevde belirtilen seçeneği kullanın.
preserveExternalChanges: true
seçeneği, kodunuz artık işlevlerinizin çalışma zamanı seçenekleri için tam doğruluk kaynağı olmayacağından çoğu senaryo için önerilmez. Bu özelliği kullanıyorsanız bir işlevin tam yapılandırmasını görüntülemek için Google Cloud Console'u kontrol edin veya gcloud CLI'yi kullanın.
Node.js sürümünü ayarlama
Cloud Functions için Firebase SDK'sı, Node.js çalışma zamanı seçimine izin verir. Bir projedeki tüm işlevleri yalnızca çalışma zamanında çalıştırmayı seçebilirsiniz ortama nasıl aktarabilirsiniz?
- Node.js 20 (önizleme)
- Node.js 18
- Node.js 16
- Düğüm.js 14
Node.js sürümünü ayarlamak için:
Sürümünü, 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 package.json
'teki şu satırı düzenleyin:
"engines": {"node": "18"}
Yarn paket yöneticisi kullanıyorsanız veya
engines
alanında, Cloud Functions için Firebase SDK'sının çalışma zamanını şurada ayarlayabilirsiniz:
Bunun yerine firebase.json
:
{
"functions": {
"runtime": "nodejs18" // or nodejs14, nodejs16 or nodejs20
}
}
CLI, herhangi bir değer yerine firebase.json
içinde ayarlanan değeri kullanır veya
package.json
içinde ayrı olarak ayarladığınız aralık.
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 sonraki bir sürümü kullandığınızdan emin olun.
- Şu konumda oluşturulan
package.json
dosyasındakiengines
değerini değiştirin: başlatma sırasındafunctions/
dizininiz. Örneğin sürüm 16'dan sürüm 18'e yükseltiyorsanız giriş şöyle görünmelidir:"engines": {"node": "18"}
- İsteğe bağlı olarak, değişikliklerinizi Firebase Local Emulator Suite.
- Tüm işlevleri yeniden dağıtın.
Ölçeklendirme davranışını kontrol etme
Varsayılan olarak Cloud Functions for Firebase, çalışan örneklerin sayısını gelen isteklerin sayısına göre ölçeklendirir. Trafik azaldığında örnek sayısını sıfıra kadar düşürebilir. Ancak, uygulamanız gereken yerlerde ve baştan başlatma sayısını sınırlamak isterseniz bunu değiştirebilirsiniz. görüntülenebilecek minimum container örneği sayısını belirterek ve talepleri karşılamaya hazır tutulduğundan emin olun.
Benzer şekilde, örneklerin ölçeklenmesini sınırlamak için bir maksimum sayı ayarlayabilirsiniz: yanıt verebilir. Maliyetlerinizi kontrol etmenin bir yolu olarak bu ayarı kullanın veya bir
Baştan başlatma sayısını azaltma
Kaynak kodunda bir işlev için minimum örnek sayısını ayarlamak üzere runWith
yöntemini kullanın. Bu yöntem, minInstances
değerini tanımlayan RuntimeOptions
arayüzüne uygun bir JSON nesnesi kabul eder. Örneğin,
bu işlev, sıcak tutmak için en az 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 değer belirlerken dikkate almanız gereken bazı noktalar şunlardır:
- Cloud Functions for Firebase, uygulamanızı
minInstances
ayarınızın üzerinde ölçeklendiriyorsa bu eşiğin üzerindeki her örnek için baştan başlatmayla karşılaşırsınız. - Soğuk başlatmalar, trafiği ani artışlar gösteren uygulamalar üzerinde en ciddi etkiye sahiptir. Eğer
uygulamanızın ani trafiğe sahip olduğunu ve
minInstances
değerini, uygulamanızın soğuk başlatmalar her trafik artışında azalmaya başladığında, daha az gecikme. Sürekli trafiğe sahip uygulamalarda soğuk başlatmalara performansı önemli ölçüde etkileyebilir. 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 yapmak ancak üretim projenizdeki soğuk başlatmaları azaltmak için
minInstances
'yiFIREBASE_CONFIG
ortam değişkenine göre 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öntemidir. Bu yöntem, maxInstances
için değerleri tanımlayan RuntimeOptions
arayüzüne uygun bir JSON nesnesi kabul eder. Örneğin, bu işlev 100'lük bir sınır belirler.
örneklerden kaçının:
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 bir örnek yoksa 429 Too Many Requests
yanıt koduyla reddedilir.
Maksimum örnek sayısı ayarlarını kullanmayla ilgili en iyi uygulamalar hakkında daha fazla bilgi edinmek için maxInstances
'i kullanmayla ilgili en iyi uygulamalara göz atın.
Zaman aşımı ve bellek tahsisi ayarlama
Bazı durumlarda, işlevleriniz için uzun bir zaman aşımı değeri veya büyük bir bellek tahsisi gibi özel şartlar olabilir. Bu değerleri Google Cloud Console'da veya işlev kaynak kodunda (yalnızca Firebase) ayarlayabilirsiniz.
İşlevlerin kaynak kodunda bellek ayırma ve zaman aşımı 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
şuna uyan bir JSON nesnesidir:
RuntimeOptions
timeoutSeconds
ve memory
değerlerini tanımlayan arayüzdür.
Ö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ğerler listesinde ayrıntılı olarak açıklandığı gibi işlev için ayrılan CPU'ya karşılık gelir:
128MB
— 200 MHz256MB
— 400 MHz512MB
- 800 MHz1GB
— 1,4 GHz2GB
- 2,4 GHz4GB
— 4,8 GHz8GB
- 4,8 GHz
Google Cloud konsolunda bellek ayırmayı ve zaman aşımını ayarlamak için:
- Google Google Cloud konsolunda şu menüden Cloud Functions'ı seçin: sol menü.
- İşlev listesinde adını tıklayarak bir işlev seçin.
- Üst menüde Düzenle simgesini tıklayın.
- Ayrılan bellek etiketli açılır menüden bir bellek tahsisi seçin.
- Gelişmiş seçenekleri görüntülemek için Diğer'i tıklayın ve Zaman aşımı metin kutusuna bir saniye sayısı girin.
- İşlevi güncellemek için Kaydet'i tıklayın.