Firebase KSA komutlarını kullanarak veya işlevlerinizin kaynak kodunda ç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 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 işlev varsa 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ını aşmanı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 işlev içeren gruplar halinde dağıtın.
Kullanılabilir komutların tam listesi için Firebase KSA referansına bakın.
Firebase KSA, varsayılan olarak kaynak kodu functions/
klasöründe arar. İsterseniz işlevleri kod tabanlarında veya birden fazla dosya grubunda düzenleyebilirsiniz.
Dağıtım yapılarını temizleme
İşlev dağıtımı kapsamında container görüntüleri oluşturulur ve Artifact Registry içinde depolanır. Bu resimler, dağıtılan işlevlerinizin çalışması için gerekli değildir. Cloud Functions İlk dağıtım sırasında resmin bir kopyasını getirip saklar ancak saklanan yapılar, işlevin çalışma zamanında çalışması için gerekli değildir.
Bu kapsayıcı görüntüleri genellikle küçük olsa da zaman içinde birikebilir ve depolama maliyetlerinize katkıda bulunabilir. Derleme yapılarını incelemeyi veya kapsayıcı güvenlik açığı taramaları çalıştırmayı planlıyorsanız bunları belirli bir süre boyunca saklamayı tercih edebilirsiniz.
Depolama maliyetlerini yönetmeye yardımcı olmak için Firebase CLI 14.0.0 ve sonraki sürümler, her işlev dağıtımından sonra dağıtım yapılarını depolayan depolar için Artifact Registry temizleme politikası yapılandırmanıza olanak tanır.
functions:artifacts:setpolicy
komutunu kullanarak temizleme politikasını manuel olarak ayarlayabilir veya düzenleyebilirsiniz:
firebase functions:artifacts:setpolicy
Bu komut, varsayılan olarak Artifact Registry'yı 1 günden eski kapsayıcı görüntülerini otomatik olarak silecek şekilde yapılandırır. Bu sayede, depolama maliyetleri en aza indirilirken son derlemelerin olası incelemesine olanak tanınarak makul bir denge sağlanır.
--days
seçeneğini kullanarak saklama süresini özelleştirebilirsiniz:
firebase functions:artifacts:setpolicy --days 7 # Delete images older than 7 days
İşlevleri birden fazla bölgeye dağıtırsanız --location
seçeneğini kullanarak belirli bir konum için temizleme politikası ayarlayabilirsiniz:
$ firebase functions:artifacts:setpolicy --location europe-west1
Yapı temizlemeyi devre dışı bırakma
Resim temizleme işlemini manuel olarak yönetmeyi tercih ediyorsanız veya herhangi bir resmin silinmesini istemiyorsanız temizleme politikalarını tamamen devre dışı bırakabilirsiniz:
$ firebase functions:artifacts:setpolicy --none
Bu komut, Firebase CLI'nın ayarladığı mevcut tüm temizleme politikalarını kaldırır ve Firebase'in işlev dağıtımlarından sonra temizleme politikası ayarlamasını engeller.
İşlevleri silin
Daha önce dağıtılan işlevleri aşağıdaki yöntemlerle silebilirsiniz:
- Firebase KSA'da
functions:delete
ile açıkça - Google Cloud konsolunda açıkça belirtilmelidir.
- İşlevi dağıtımdan önce kaynaktan kaldırarak dolaylı olarak.
Tüm silme işlemleri, işlevi üretimden kaldırmadan önce onaylamanızı ister.
Firebase CLI'da işlevlerin açıkça silinmesi, birden fazla bağımsız değişkenin yanı sıra işlev gruplarını da 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
Örtülü işlev silme işlemiyle firebase deploy
, kaynağınızı ayrıştırır ve dosyadan kaldırılan işlevleri üretimden kaldırır.
Bir işlevin adını, bölgesini veya tetikleyicisini değiştirme
Üretim trafiğini işleyen işlevlerin bölgelerini veya tetikleyicilerini 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, değişikliğin yapıldığı sırada işlevinizin hem yeni hem de eski sürümü aynı anda çalışacağından işlevinizin idempotent olduğundan emin olun.
İş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 komutu çalıştırın. İlk komut, yeni adlandırılmış işlevi dağıtır. İkinci komut ise daha önce dağıtılmış sürümü kaldırır. Örneğin, webhook
adlı bir Node.js işleviniz olduğunu ve bunu webhookNew
olarak değiştirmek istediğinizi varsayalım. Bu durumda kodu aşağıdaki gibi düzenleyin:
// 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 işleyen 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 istediğiniz gibi bölgelerini değiştirin.
- Yeniden adlandırılan işlevi dağıtın. Bu işlem, aynı kodun her iki bölge grubunda da geçici olarak çalıştırılmasına neden olur.
- Önceki işlevi silin.
Örneğin, şu anda us-central1
bölgesinin varsayılan işlevler bölgesinde bulunan webhook
adlı bir işleviniz varsa ve bunu asia-northeast1
bölgesine taşımak istiyorsanız önce kaynak kodunuzu değiştirerek işlevi yeniden adlandırmanız ve bölgeyi düzeltmeniz 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
Şimdi iki özdeş işlev çalışıyor: webhook
, us-central1
içinde ve webhookAsia
, asia-northeast1
içinde çalışıyor.
Ardından webhook
öğesini silin:
firebase functions:delete webhook
Artık yalnızca asia-northeast1
içinde çalışan webhookAsia
işlevi var.
İşlevin tetikleyici türünü değiştirme
Cloud Functions for Firebase dağıtımınızı zaman içinde geliştirirken çeşitli nedenlerle bir işlevin tetikleyici türünü değiştirmeniz gerekebilir. Örneğin, bir Firebase Realtime Database veya Cloud Firestore etkinliği türünden başka bir türe geçmek isteyebilirsiniz.
Bir işlevin etkinlik türünü yalnızca kaynak kodu değiştirip firebase deploy
komutunu çalıştırarak değiştirmek mümkün değildir. Hataları önlemek için,
bir işlevin tetikleyici türünü aşağıdaki prosedürle değiştirin:
- Kaynak kodu, istenen tetikleyici türüne sahip yeni bir işlevi 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.
- Firebase KSA'yı kullanarak eski işlevi üretimden açıkça silin.
Örneğin, objectChanged
adlı bir Node.js işleviniz varsa ve bu işlevde eski onChange
etkinlik türü kullanılıyorsa ve bunu onFinalize
olarak değiştirmek istiyorsanız önce işlevi yeniden adlandırın ve onFinalize
etkinlik türünü kullanacak ş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 ç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 belirlemenize olanak tanır.
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
nesnesi, işlevinizin çalışma zamanı seçenekleriyle ilgili tek doğru kaynaktır ve başka 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ızda Google Cloud Console veya gcloud CLI aracılığıyla çalışma zamanı seçeneklerini manuel olarak ayarlama yer alıyorsa 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 öncelik sırasına göre birleştirir:
- Seçenek, işlevler kodunda ayarlanır: Harici değişiklikleri geçersiz kılın.
- İşlev kodunda seçenek
RESET_VALUE
olarak ayarlanır: Harici değişiklikleri varsayılan değerle geçersiz kılın. - Seçenek, işlev kodunda ayarlanmamış ancak şu anda dağıtılan işlevde ayarlanmış: Dağıtılan işlevde belirtilen seçeneği kullanın.
preserveExternalChanges: true
seçeneğinin kullanılması, kodunuz artık işlevlerinizin çalışma zamanı seçenekleri için tam doğru kaynak olmayacağından çoğu senaryoda önerilmez. Bu özelliği kullanıyorsanız Google Cloud Console'u kontrol edin veya bir işlevin tam yapılandırmasını görüntülemek için gcloud CLI'yı kullanın.
Node.js sürümünü ayarlama
Firebase SDK'sı, Cloud Functions için Node.js çalışma zamanı seçimine 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
- Node.js 18 (kullanımdan kaldırıldı)
Node.js'nin bu sürümlerine yönelik devam eden destekle ilgili önemli bilgiler için destek programına bakın.
Node.js sürümünü ayarlamak için:
Başlatma sırasında functions/
dizininizde oluşturulan package.json
dosyasındaki engines
alanında sürümü ayarlayabilirsiniz.
Örneğin, yalnızca 20. sürümü kullanmak için package.json
dosyasında şu satırı düzenleyin:
"engines": {"node": "20"}
Yarn paket yöneticisini kullanıyorsanız veya engines
alanı için başka özel gereksinimleriniz varsa Firebase SDK'sının çalışma zamanını Cloud Functions için firebase.json
içinde ayarlayabilirsiniz:
{
"functions": {
"runtime": "nodejs20"
}
}
CLI, firebase.json
içinde ayarlanan değeri package.json
içinde ayrı olarak ayarladığınız herhangi bir değer veya aralığa tercih eder.
Node.js çalışma zamanınızı yükseltme
Node.js çalışma zamanınızı yükseltmek için:
- Projenizin Blaze fiyatlandırma planı kapsamında olduğundan emin olun.
- Firebase CLI v11.18.0 veya sonraki bir sürümü kullandığınızdan emin olun.
- İlk kullanıma hazırlama sırasında
functions/
dizininizde oluşturulanpackage.json
dosyasındakiengines
değerini değiştirin. Örneğin, 16. sürümden 18. sürüme yükseltiyorsanız giriş şu şekilde görünmelidir:"engines": {"node": "18"}
- İsteğe bağlı olarak, Firebase Local Emulator Suite kullanarak değişikliklerinizi test edin.
- Tüm işlevleri yeniden dağıtın.
Ölçeklendirme davranışını denetleme
Varsayılan olarak, Cloud Functions for Firebase, çalışan örneklerin sayısını gelen isteklerin sayısına göre ölçeklendirir. Bu işlem, trafik azaldığında örnek sayısını sıfıra düşürecek şekilde de yapılabilir. Ancak uygulamanızın gecikmenin azaltılmasını gerektirmesi ve baştan başlatma sayısını sınırlamak istemeniz durumunda, sıcak tutulacak ve isteklere hizmet vermeye hazır olacak minimum sayıda kapsayıcı örneği belirterek bu varsayılan davranışı değiştirebilirsiniz.
Benzer şekilde, gelen isteklere yanıt olarak örneklerin ölçeklendirilmesini sınırlamak için maksimum sayı belirleyebilirsiniz. Bu ayarı, maliyetlerinizi kontrol etmek veya bir veritabanı gibi destekleyici bir hizmete yapılan bağlantı sayısını sınırlamak için kullanın.
Yavaş gerçekleşen baştan başlatma sayısını azaltma
Kaynak kodundaki bir işlev için minimum örnek sayısını ayarlamak üzere runWith
yöntemini kullanın. Bu yöntem, RuntimeOptions
arayüzüne uygun bir JSON nesnesi kabul eder. Bu arayüz, minInstances
değerini tanımlar. Örneğin, bu işlev, hazır tutulacak minimum örnek sayısını 5 olarak 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çeklendirirse bu eşiğin üzerindeki her örnek için baştan başlatma deneyimi yaşarsınız. - Baştan başlatma, trafiği ani artışlar gösteren uygulamaları en çok etkiler. Uygulamanızda ani trafik artışları varsa ve
minInstances
değerini, her trafik artışında soğuk başlatmaların azaltılacağı kadar yüksek ayarlarsanız gecikme süresinin önemli ölçüde azaldığını görürsünüz. Sürekli trafiğe sahip uygulamalarda sıfırdan başlatmaların performansı ciddi şekilde etkilemesi olası değildir. Minimum örnek sayısını ayarlamak üretim ortamları için mantıklı olabilir ancak genellikle test ortamlarında bundan kaçınılmalıdır. Test projenizde sıfıra ölçeklendirmek ancak üretim projenizdeki soğuk başlatmaları yine de azaltmak için
minInstances
ortam değişkenine göreFIREBASE_CONFIG
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, RuntimeOptions
arayüzüne uygun bir JSON nesnesi kabul eder. Bu arayüz, maxInstances
değerlerini tanımlar. Örneğin, bu işlev, varsayımsal bir eski veritabanını aşırı yüklememek için 100 örnek 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 saniye boyunca sıraya alınır ve bu süre içinde herhangi bir örnek kullanılamazsa 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
kullanmayla ilgili en iyi uygulamalar başlıklı makaleyi inceleyin.
Zaman aşımı ve bellek ayırma süresini ayarlama
Bazı durumlarda, işlevleriniz için uzun bir zaman aşımı değeri veya büyük bir bellek ayırma işlemi gerekebilir. 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ını ayarlamak için Cloud Functions 2.0.0 sürümü için Firebase SDK'sında kullanıma sunulan runWith
parametresini kullanın. Bu çalışma zamanı seçeneği, RuntimeOptions
arayüzüne uygun bir JSON nesnesi kabul eder. Bu arayüz, timeoutSeconds
ve memory
değerlerini tanımlar.
Ö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ğerlerin bu listesinde ayrıntılı olarak açıklandığı gibi, işleve ayrılan CPU ile orantılıdır:
128MB
— 200MHz256MB
— 400MHz512MB
— 800MHz1GB
— 1,4 GHz2GB
— 2,4 GHz4GB
— 4,8 GHz8GB
— 4,8 GHz
Google Cloud konsolunda bellek tahsisini ve zaman aşımını ayarlamak için:
- Google Google Cloud konsolunda, sol menüden Cloud Functions simgesini seçin.
- İşlevler listesinde adını 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 işlemi 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 cinsinden bir sayı girin.
- İşlevi güncellemek için Kaydet'i tıklayın.