Firebase CLI 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 CLI, varsayılan olarak kaynak kodu için functions/ klasörüne bakar. İsterseniz işlevleri kod tabanlarında veya birden fazla dosya grubunda düzenleyebilirsiniz.
İşlevleri silin
Daha önce dağıtılan işlevleri aşağıdaki yöntemlerle silebilirsiniz:
- Firebase CLI'da
functions:deleteile açıkça - Google Cloud konsolunda açıkça belirtilmelidir.
- 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 KSA'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.
Tüm bölgelerde belirtilen adla eşleşen tüm işlevleri siler:
firebase functions:delete FUNCTION-1_NAME
Varsayılan olmayan bir bölgede çalışan belirtilen işlevi siler:
firebase functions:delete FUNCTION-1_NAME --region REGION_NAME
Birden fazla işlevi silme:
firebase functions:delete FUNCTION-1_NAME FUNCTION-2_NAME
Belirtilen bir işlev grubunu siler:
firebase functions:delete GROUP_NAME
Onay istemini atlar:
firebase functions:delete FUNCTION-1_NAME --force
Örtülü işlev silme işleminde firebase deploy, kaynağınızı ayrıştırır ve dosyadan kaldırılan tüm işlevleri üretimden kaldırır.
İşlevin adını, bölgesini veya tetikleyicisini değiştirme
Üretim trafiğini işleyen 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 idempotent olduğundan emin olun. Değişiklik sırasında işlevinizin hem yeni hem de eski sürümü aynı anda çalışacaktır.
İş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, 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 varsa ve bunu webhookNew olarak değiştirmek istiyorsanız kodu aşağıdaki şekilde 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 içinde dağıtılan webhook adlı bir işleviniz varsa ve bunu asia-northeast1'ye 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 aşağıdaki komutu çalıştırarak dağıtın:
firebase deploy --only functions:webhookAsia
Şimdi iki özdeş işlev çalışıyor: webhook, us-central1 içinde, webhookAsia ise asia-northeast1 içinde çalışıyor.
Ardından webhook simgesini silin:
firebase functions:delete webhook
Artık yalnızca asia-northeast1 içinde çalışan webhookAsia işlevi vardır.
Bir iş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 tür Firebase Realtime Database veya Cloud Firestore etkinliğinden başka bir türe geçmek isteyebilirsiniz.
Bir işlevin etkinlik türünü yalnızca kaynak kodunu 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ş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 CLI'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
nesne, işlevinizin çalışma zamanı seçenekleri için veri kaynağıdır ve başka bir yöntemle (ör. Google Cloud konsolu veya gcloud CLI) ayarlanan seçenekleri geçersiz kılar.
Geliştirme iş akışınızda Google Cloud konsolunu veya gcloud CLI kullanarak çalışma zamanı seçeneklerini manuel olarak ayarlıyorsanız 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şlev kodunda ayarlanır: Harici değişiklikleri geçersiz kılın.
- İşlev kodunda seçenek
RESET_VALUEolarak ayarlanmış: 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. Kullanıyorsanız Google Cloud konsolunu kontrol edin veya bir işlevin tam yapılandırmasını görüntülemek için gcloud CLI simgesini 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 22
- 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": "22"}
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": "nodejs22"
}
}
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.
- Başlatma sırasında
functions/dizininizde oluşturulanpackage.jsondosyasındakienginesdeğ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.
Node.js modül sistemi seçme
Node.js'deki varsayılan modül sistemi CommonJS (CJS) olsa da mevcut Node.js sürümleri ECMAScript Modülleri'ni (ESM) de destekler. Cloud Functions her ikisini de destekler.
İşlevleriniz varsayılan olarak CommonJS'yi kullanır. Bu durumda, içe ve dışa aktarma işlemleri şu şekilde görünür:
const functions = require("firebase-functions/v1");
exports.helloWorld = functions.https.onRequest(async (req, res) => res.send("Hello from Firebase!"));
Bunun yerine ESM'yi kullanmak için package.json dosyanızda "type": "module" alanını ayarlayın:
{
...
"type": "module",
...
}
Bu ayarı yaptıktan sonra ESM import ve export söz dizimini kullanın:
import functions from "firebase-functions/v1";
export const helloWorld = functions.https.onRequest(async (req, res) => res.send("Hello from Firebase!"));
Her iki modül sistemi de tam olarak desteklenir. Projenize en uygun olanı seçebilirsiniz. Daha fazla bilgi için Node.js modül belgelerine göz atı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 örnek sayısı sıfıra düşebilir. Ancak uygulamanızın gecikmenin azaltılmasını gerektirmesi ve soğuk başlatma sayısını sınırlamak istemeniz durumunda, sıcak tutulacak ve isteklere hizmet vermeye hazır olacak minimum kapsayıcı örneği 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 maksimum sayı belirleyebilirsiniz. Bu ayarı, maliyetlerinizi kontrol etmek veya bir veritabanı gibi destekleyici hizmetlere yönelik 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ı 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 minimum 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ı
minInstancesayarınızın üzerinde ölçeklendirirse bu eşiğin üzerindeki her örnek için baştan başlatma deneyimi yaşarsınız. - Soğuk başlatmalar, trafik artışlarının yaşandığı uygulamaları en ciddi şekilde etkiler. Uygulamanızın trafiği ani artışlar gösteriyorsa ve her trafik artışında soğuk başlatmaların azaltılmasını sağlayacak kadar yüksek bir
minInstancesdeğeri ayarlarsanız gecikme süresinin önemli ölçüde azaldığını görürsünüz. Sürekli trafiğe sahip uygulamalarda, baştan başlatma işlemleri performansı ciddi şekilde etkilemez. 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çeklendirme yaparken üretim projenizdeki baştan başlatma işlemlerini azaltmak için
minInstancesdeğeriniFIREBASE_CONFIGortam 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ş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, 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ı 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.
Hizmet hesabı ayarlama
1. nesil işlevlerin varsayılan hizmet hesabı olan PROJECT_ID@
Varsayılan hizmet hesabını geçersiz kılmak ve bir işlevi tam olarak gereken kaynaklarla sınırlamak isteyebilirsiniz. Özel bir hizmet hesabı oluşturup .runWith() yöntemini kullanarak bu hesabı uygun işleve atayarak bunu yapabilirsiniz.
Bu yöntem, serviceAccount özelliği de dahil olmak üzere yapılandırma seçeneklerine sahip bir nesne alır.
const functions = require("firebase-functions/v1");
exports.helloWorld = functions
.runWith({
// This function doesn't access other Firebase project resources, so it uses a limited service account.
serviceAccount:
"my-limited-access-sa@", // or prefer the full form: "my-limited-access-sa@my-project.iam.gserviceaccount.com"
})
.https.onRequest((request, response) => {
response.send("Hello from Firebase!");
});
Zaman aşımı ve bellek ayırma ayarlarını yapma
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
});
timeoutSeconds için maksimum değer 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 ayırma ve zaman aşımı ayarlarını yapmak için:
- 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 seçeneği belirleyin.
- 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.