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 KSA, 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 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. Ö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 kişilik gruplar halinde dağıtın.
Kullanılabilir komutların tam listesi için Firebase CLI referansını inceleyin.
Varsayılan olarak Firebase CLI, kaynak kodu için functions/
klasörüne bakar. Dilerseniz kod tabanlarını veya birden fazla dosya grubunu işlevlere göre düzenleyebilirsiniz.
İşlevleri silin
Önceden dağıtılmış işlevleri şu yöntemlerle silebilirsiniz:
functions:delete
ile Firebase KSA'sında açıkça- Google Cloud konsolunda açıkça gönderin.
- dolaylı olarak kaldırabilirsiniz.
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
, işlevleri örtülü olarak sildiğinde 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ş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 ve ikinci komut, daha önce dağıtılan 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/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 işlem, her iki bölge grubunda da geçici olarak aynı kodun çalıştırılmasına neden olur.
- Ö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/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
Şimdi yalnızca bir işlev vardır: asia-northeast1
işlevinde ç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 işlevin tetikleyici türünü çeşitli nedenlerle değiştirmeniz gerekebilir. Örneğin, bir Firebase Realtime Database veya Cloud Firestore etkinlik türünü 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:
- Kaynak kodu, 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.
- Firebase İTŞ'yi 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/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 seçmenize 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ç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 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:
- İşlev kodunda seçenek ayarlanır: harici değişiklikleri geçersiz kıl.
- Seçenek, işlev kodunda
RESET_VALUE
olarak ayarlanır: Harici değişiklikleri varsayılan değerle geçersiz kılar. - 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. 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 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ünü, başlatma sırasında functions/
dizininizde oluşturulan package.json
dosyasında 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öneticisini kullanıyorsanız veya engines
alanı için başka özel gereksinimleriniz varsa Firebase SDK'sının çalışma zamanını firebase.json
yerine Cloud Functions için ayarlayabilirsiniz:
{
"functions": {
"runtime": "nodejs18" // or nodejs14, nodejs16 or nodejs20
}
}
CLI, package.json
'te ayrı olarak ayarladığınız herhangi bir değere veya aralığa kıyasla firebase.json
'te ayarlanan değeri kullanır.
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 KSA 11.18.0 veya sonraki bir sürümü kullandığınızdan emin olun.
- Başlatma sırasında
functions/
dizininizde oluşturulanpackage.json
dosyasındakiengines
değerini değiştirin. Örneğin, 16 sürümünden 18 sürümüne yükseltme yapıyorsanız giriş şu şekilde görünmelidir:"engines": {"node": "18"}
- İsterseniz Firebase Local Emulator Suite simgesini kullanarak değişikliklerinizi test edebilirsiniz.
- Tüm işlevleri yeniden dağıtın.
Ölçeklendirme davranışını kontrol etme
Varsayılan olarak Cloud Functions for Firebase, ç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. Ancak uygulamanız düşük gecikmeli bir deneyim gerektiriyorsa ve soğuk başlatma sayısını sınırlamak istiyorsanız, etkin durumda tutulacak ve istek yayınlamaya hazır olacak minimum sayıda kapsayıcı örneği belirleyerek bu varsayılan davranışı değiştirebilirsiniz.
Benzer şekilde, gelen isteklere yanıt olarak örneklerin ölçeklendirilmesini sınırlamak için maksimum bir sayı belirleyebilirsiniz. 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 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 ö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 dikkate almanız gereken bazı noktalar şunlardır:
- Cloud Functions for Firebase, uygulamanızı
minInstances
ayarınızın üzerine çıkarırsa bu eşiğin üzerindeki her örnek için baştan başlatma işlemi yapılır. - Soğuk başlatmalar, trafiği ani artışlar gösteren uygulamalar üzerinde 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ği olan uygulamalarda sıfırdan başlatmanın performansı ciddi şekilde etkilemesi 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öreminInstances
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
için değerleri tanımlayan RuntimeOptions
arayüzüne uygun bir JSON nesnesi kabul eder. Ö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 zarfında kullanılabilir ö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 uygulamalar başlıklı makaleyi inceleyin.
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.
İşlevlerin kaynak kodunda bellek ayırma ve zaman aşımını ayarlamak için Cloud Functions 2.0.0 için Firebase SDK'sında 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
});
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 MHz256MB
- 400 MHz512MB
— 800 MHz1GB
- 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'ı seçin.
- İş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 süreyi saniye cinsinden girin.
- İşlevi güncellemek için Kaydet'i tıklayın.