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 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. Projenizde 5'ten fazla işlev varsa yalnızca düzenlediğiniz işlevleri dağıtmak için belirli işlev adlarıyla --only işaretini kullanmanızı öneririz. Belirli işlevleri bu şekilde dağıtmak, dağıtım sürecini hızlandırır ve dağıtım kotalarıyla karşılaş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 sayıda gruplar halinde dağıtın.
Kullanılabilir komutların tam listesi için Firebase KSA referansına bakın.
Varsayılan olarak Firebase CLI, kaynak kodu için functions/ klasörüne bakar. Dilerseniz kod tabanlarında veya birden fazla dosya grubunda işlevleri düzenleyebilirsiniz.
İşlevleri silin
Daha önce dağıtılan işlevleri şu yöntemlerle silebilirsiniz:
- Firebase CLI'da
functions:deleteile açıkça - Google Cloud Console'da açıkça belirtmeniz gerekir.
- İş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 açık işlev silme, birden fazla bağımsız değişkenin yanı sıra işlev gruplarını 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 belirli bir işlevi siler:
firebase functions:delete FUNCTION-1_NAME --region REGION_NAME
Birden fazla işlevi siler:
firebase functions:delete FUNCTION-1_NAME FUNCTION-2_NAME
Belirtilen işlev grubunu siler:
firebase functions:delete GROUP_NAME
Onay istemini atlar:
firebase functions:delete FUNCTION-1_NAME --force
Dolaylı işlev silme özelliğiyle firebase deploy, 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ş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 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ışı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ılan 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 şu ş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 bölgesini veya bölgelerini istediğiniz gibi 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 siler.
Örneğin, şu anda us-central1 bölgesinde dağıtılmış olan webhook adlı bir işleviniz varsa ve bu işlevi 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 aşağıdaki komutu çalıştırarak dağıtın:
firebase deploy --only functions:webhookAsia
Artık çalışan iki özdeş işlev var: webhook, us-central1 bölgesinde çalışıyor ve webhookAsia, asia-northeast1 bölgesinde çalışıyor.
Ardından webhook silin:
firebase functions:delete webhook
Artık asia-northeast1 içinde çalışan tek bir işlev (webhookAsia) var.
Bir işlevin tetikleyici türünü değiştirme
Zaman içinde Cloud Functions for Firebase dağıtımınızı 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.
Yalnızca kaynak kodunu değiştirip firebase deploy komutunu çalıştırarak bir 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ü uygulayarak 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.
- Firebase CLI'yı 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 ö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 ç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çenekleri için doğru bilgi kaynağıdır ve diğer yöntemler (ör. Google Cloud konsolu veya gcloud CLI) kullanılarak ayarlanan seçenekleri geçersiz kılar.
Geliştirme iş akışınızda çalışma zamanı seçeneklerini Google Cloud konsolu veya gcloud CLI kullanarak 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ılmış 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.
- Seçenek, işlev kodunda
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ışsa: Dağıtılan işlevde belirtilen seçeneği kullanın.
preserveExternalChanges: true seçeneğinin kullanılması çoğu senaryo için önerilmez. Bunun nedeni, kodunuzun artık işlevlerinizin çalışma zamanı seçenekleri için tam doğruluk kaynağı olmayacak olmasıdır. Kullanıyorsanız bir işlevin tam yapılandırmasını görüntülemek için Google Cloud konsoluna bakın veya gcloud CLI aracını kullanın.
Node.js sürümünü ayarlama
Cloud Functions için Firebase SDK'sı, Node.js çalışma zamanı seçimine olanak tanır. Bir projedeki tüm işlevleri, desteklenen Node.js sürümlerinden birine karşılık gelen çalışma zamanı ortamında çalıştırabilirsiniz:
- Node.js 22
- Node.js 20
- Node.js 18 (desteği sonlandırıldı)
Node.js'nin bu sürümlerine yönelik devam eden destekle ilgili önemli bilgiler için destek takvimine bakın.
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 20. sürümü kullanmak için package.json dosyasındaki ş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 Cloud Functions için Firebase SDK'sının çalışma zamanını firebase.json içinde ayarlayabilirsiniz:
{
"functions": {
"runtime": "nodejs22"
}
}
CLI, package.json içinde ayrı olarak ayarladığınız herhangi bir değer veya aralık yerine firebase.json içinde 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ı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ükseltme yapıyorsanız giriş şu şekilde görünmelidir:"engines": {"node": "18"} - İsterseniz değişikliklerinizi Firebase Local Emulator Suite kullanarak test edebilirsiniz.
- Tüm işlevleri yeniden dağıtın.
Node.js modül sistemi seçme
Node.js'deki varsayılan modül sistemi CommonJS'dir (CJS). Ancak mevcut Node.js sürümleri ECMAScript Modüllerini (ESM) de destekler. Cloud Functions her ikisini de destekler.
İşlevleriniz varsayılan olarak CommonJS 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 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. Modüllerle ilgili Node.js belgelerinden daha fazla bilgi edinebilirsiniz.
Ölçeklendirme davranışını kontrol etme
Cloud Functions for Firebase, çalışan örneklerin sayısını varsayılan olarak gelen isteklerin sayısına göre ölçeklendirir. Trafiğin azaldığı zamanlarda örnek sayısını sıfıra kadar ölçeği azaltabilir. Ancak uygulamanız daha düşük gecikme süresi gerektiriyorsa ve soğuk başlatma sayısını sınırlamak istiyorsanız etkin durumda tutulacak ve istekleri karşılamaya 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 bir sayı belirleyebilirsiniz. Bu ayarı, maliyetlerinizi kontrol etmek veya veritabanı gibi bir destek hizmetine yapılan bağlantı sayısını sınırlamak için kullanabilirsiniz.
Baştan başlatma sayısını azaltma
Kaynak kodundaki bir işlev için minimum örnek sayısını ayarlamak istiyorsanız 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 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 dikkat etmeniz gereken bazı noktalar şunlardır:
- Cloud Functions for Firebase, uygulamanızı
minInstancesayarınızın üzerine ölçeklendirirse bu eşiğin üzerindeki her örnek için baştan başlatma deneyimi yaşarsınız. - Soğuk başlatmalar, trafiği düzensiz olan uygulamaları en ciddi şekilde etkiler. Uygulamanızın trafiğinde ani artışlar oluyorsa ve her trafik artışında soğuk başlatmaların azalacağı kadar yüksek bir
minInstancesdeğeri ayarlarsanız gecikmenin önemli ölçüde azaldığını görürsünüz. Sürekli trafiği olan uygulamalarda, baştan 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çeklendirme yaparken üretim projenizde soğuk başlatmaları 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ş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, RuntimeOptions arayüzüne uygun bir JSON nesnesini kabul eder. Bu arayüz, maxInstances için değerleri 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 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 kullanımıyla ilgili en iyi uygulamalar başlıklı makaleyi inceleyin.
Hizmet hesabı ayarlama
1. nesil işlevler için 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. Bunu yapmak için özel bir hizmet hesabı oluşturup .runWith() yöntemini kullanarak uygun işleve atayabilirsiniz.
Bu yöntem, serviceAccount özelliği de dahil olmak üzere yapılandırma seçenekleri içeren 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, uzun bir zaman aşımı değeri veya büyük bir bellek ayırma için özel gereksinimlere sahip 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ı değerlerini ayarlamak için Cloud Functions 2.0.0 için Firebase SDK'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 ayrılan bellek miktarı, işlev için ayrılan CPU'ya karşılık gelir. memory için geçerli değerlerin listesinde bu konuyla ilgili ayrıntılı bilgi verilmiştir:
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'i 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 Save'i (Kaydet) tıklayın.