Ikuti semua informasi yang diumumkan di Firebase Summit, dan pelajari bagaimana Firebase dapat membantu Anda mempercepat pengembangan aplikasi dan menjalankan aplikasi dengan percaya diri. Pelajari Lebih Lanjut

Kelola fungsi

Anda dapat menerapkan, menghapus, dan mengubah fungsi menggunakan perintah Firebase CLI atau dengan menyetel opsi runtime di kode sumber fungsi Anda.

Menyebarkan fungsi

Untuk men-deploy fungsi, jalankan perintah Firebase CLI ini:

firebase deploy --only functions

Secara default, Firebase CLI menerapkan semua fungsi di dalam index.js secara bersamaan. Jika proyek Anda berisi lebih dari 5 fungsi, kami menyarankan Anda menggunakan tanda --only dengan nama fungsi tertentu untuk menerapkan hanya fungsi yang telah Anda edit. Menerapkan fungsi tertentu dengan cara ini mempercepat proses penerapan dan membantu Anda menghindari kuota penerapan. Sebagai contoh:

firebase deploy --only functions:addMessage,functions:makeUppercase

Saat menerapkan sejumlah besar fungsi, Anda mungkin melebihi kuota standar dan menerima pesan kesalahan HTTP 429 atau 500. Untuk mengatasi ini, terapkan fungsi dalam grup yang terdiri dari 10 orang atau kurang.

Lihat referensi Firebase CLI untuk daftar lengkap perintah yang tersedia.

Secara default, Firebase CLI mencari kode sumber di folder functions/ . Jika mau, Anda dapat mengatur fungsi dalam basis kode atau beberapa kumpulan file.

Hapus fungsi

Anda dapat menghapus fungsi yang diterapkan sebelumnya dengan cara berikut:

  • secara eksplisit di Firebase CLI dengan functions:delete
  • secara eksplisit di Google Cloud Console .
  • secara implisit dengan menghapus fungsi dari index.js sebelum penerapan.

Semua operasi penghapusan meminta Anda untuk mengonfirmasi sebelum menghapus fungsi dari produksi.

Penghapusan fungsi eksplisit di Firebase CLI mendukung banyak argumen serta grup fungsi, dan memungkinkan Anda menentukan fungsi yang berjalan di wilayah tertentu. Juga, Anda dapat mengesampingkan permintaan konfirmasi.

# 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

Dengan penghapusan fungsi implisit, firebase deploy index.js dan menghapus dari produksi semua fungsi yang telah dihapus dari file.

Ubah nama, wilayah, atau pemicu fungsi

Jika Anda mengganti nama atau mengubah wilayah atau pemicu untuk fungsi yang menangani lalu lintas produksi, ikuti langkah-langkah di bagian ini untuk menghindari hilangnya peristiwa selama modifikasi. Sebelum Anda mengikuti langkah-langkah ini, pertama-tama pastikan fungsi Anda idempoten , karena versi baru dan versi lama fungsi Anda akan berjalan pada waktu yang sama selama perubahan.

Ganti nama fungsi

Untuk mengganti nama fungsi, buat versi fungsi baru yang diganti namanya di index.js , lalu jalankan dua perintah penerapan terpisah. Perintah pertama menyebarkan fungsi yang baru dinamai, dan perintah kedua menghapus versi yang diterapkan sebelumnya. Misalnya, jika Anda memiliki fungsi bernama webhook yang ingin diubah menjadi webhookNew , revisi kode sebagai berikut:

// before
const functions = require('firebase-functions');

exports.webhook = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

// after
const functions = require('firebase-functions');

exports.webhookNew = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

Kemudian jalankan perintah berikut untuk menerapkan fungsi baru:

# 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

Mengubah wilayah atau wilayah fungsi

Jika Anda mengubah wilayah yang ditentukan untuk fungsi yang menangani lalu lintas produksi, Anda dapat mencegah hilangnya peristiwa dengan melakukan langkah berikut secara berurutan:

  1. Ganti nama fungsi, dan ubah wilayah atau wilayahnya sesuai keinginan.
  2. Terapkan fungsi yang diubah namanya, yang menghasilkan sementara menjalankan kode yang sama di kedua set wilayah.
  3. Hapus fungsi sebelumnya.

Misalnya, jika Anda memiliki fungsi bernama webhook yang saat ini berada di wilayah fungsi default us-central1 , dan Anda ingin memigrasikannya ke asia-northeast1 northeast1 , Anda harus memodifikasi kode sumber terlebih dahulu untuk mengganti nama fungsi dan merevisi wilayah .

// before
const functions = require('firebase-functions');

exports.webhook = functions
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

// after
const functions = require('firebase-functions');

exports.webhookAsia = functions
    .region('asia-northeast1')
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

Kemudian gunakan dengan menjalankan:

firebase deploy --only functions:webhookAsia

Sekarang ada dua fungsi identik yang berjalan: webhook berjalan di us-central1 , dan webhookAsia berjalan di asia-northeast1 northeast1 .

Kemudian, hapus webhook :

firebase functions:delete webhook

Sekarang hanya ada satu fungsi - webhookAsia , yang berjalan di asia-northeast1 northeast1 .

Mengubah jenis pemicu fungsi

Saat mengembangkan penerapan Cloud Functions for Firebase dari waktu ke waktu, Anda mungkin perlu mengubah jenis pemicu fungsi karena berbagai alasan. Misalnya, Anda mungkin ingin mengubah dari satu jenis kejadian Firebase Realtime Database atau Cloud Firestore ke kejadian lainnya, seperti kejadian onWrite umum ke kejadian onCreate yang lebih terperinci.

Tidak mungkin mengubah jenis peristiwa fungsi hanya dengan mengubah kode sumber dan menjalankan firebase deploy . Untuk menghindari kesalahan, ubah jenis pemicu fungsi dengan prosedur ini:

  1. Ubah kode sumber untuk menyertakan fungsi baru dengan jenis pemicu yang diinginkan.
  2. Terapkan fungsi, yang menghasilkan untuk sementara menjalankan fungsi lama dan baru.
  3. Hapus secara eksplisit fungsi lama dari produksi menggunakan Firebase CLI.

Misalnya, jika Anda memiliki fungsi objectChanged yang memiliki jenis peristiwa onChange lama, dan Anda ingin mengubahnya menjadi onFinalize , pertama-tama ganti nama fungsi dan edit untuk memiliki jenis peristiwa onFinalize .

// before
const functions = require('firebase-functions');

exports.objectChanged = functions.storage.object().onChange((object) => {
    return console.log('File name is: ', object.name);
});

// after
const functions = require('firebase-functions');

exports.objectFinalized = functions.storage.object().onFinalize((object) => {
    return console.log('File name is: ', object.name);
});

Kemudian jalankan perintah berikut untuk membuat fungsi baru terlebih dahulu, sebelum menghapus fungsi lama:

# 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

Setel opsi waktu proses

Cloud Functions for Firebase memungkinkan Anda memilih opsi waktu proses seperti versi waktu proses Node.js dan waktu tunggu per fungsi, alokasi memori, dan instance fungsi minimum/maksimum.

Sebagai praktik terbaik, opsi ini (kecuali untuk versi Node.js) harus disetel pada objek konfigurasi di dalam kode fungsi. Objek RuntimeOptions ini adalah sumber kebenaran untuk opsi runtime fungsi Anda, dan akan menggantikan opsi yang ditetapkan melalui metode lain (seperti melalui Google Cloud Console atau gcloud CLI).

Jika alur kerja pengembangan Anda melibatkan penyetelan opsi waktu proses secara manual melalui Google Cloud Console atau gcloud CLI dan Anda tidak ingin nilai ini diganti pada setiap penerapan, setel opsi preserveExternalChanges ke true . Dengan menyetel opsi ini ke true , Firebase menggabungkan opsi runtime yang disetel dalam kode Anda dengan setelan versi fungsi yang saat ini diterapkan dengan prioritas berikut:

  1. Opsi diatur dalam kode fungsi: timpa perubahan eksternal.
  2. Opsi diatur ke RESET_VALUE dalam kode fungsi: timpa perubahan eksternal dengan nilai default.
  3. Opsi tidak diatur dalam kode fungsi, tetapi diatur dalam fungsi yang saat ini diterapkan: gunakan opsi yang ditentukan dalam fungsi yang diterapkan.

Menggunakan opsi preserveExternalChanges: true tidak disarankan untuk sebagian besar skenario karena kode Anda tidak akan lagi menjadi sumber penuh kebenaran untuk opsi runtime untuk fungsi Anda. Jika Anda menggunakannya, periksa Google Cloud Console atau gunakan gcloud CLI untuk melihat konfigurasi lengkap suatu fungsi.

Tetapkan versi Node.js

Firebase SDK untuk Cloud Functions 2.0.0 dan yang lebih tinggi memungkinkan pemilihan runtime Node.js. Anda dapat memilih untuk menjalankan semua fungsi dalam proyek secara eksklusif di lingkungan runtime yang sesuai dengan salah satu versi Node.js yang didukung ini:

  • Node.js 16
  • Node.js 14

Untuk menyetel versi Node.js:

Setel versi di kolom engines di file package.json yang dibuat di direktori functions/ Anda selama inisialisasi. Misalnya, untuk hanya menggunakan versi 16, edit baris ini di package.json :

  "engines": {"node": "16"}

Bidang engines diperlukan; itu harus menentukan salah satu versi Node.js yang didukung agar Anda dapat menerapkan dan menjalankan fungsi. Saat ini firebase init functions menyetel kolom ini ke 16 .

Tingkatkan runtime Node.js Anda

Untuk mengupgrade runtime Node.js Anda:

  1. Pastikan proyek Anda menggunakan paket harga Blaze .
  2. Pastikan Anda menggunakan Firebase CLI v9.17.0 atau yang lebih baru.
  3. Ubah nilai engines di file package.json yang dibuat di direktori functions/ Anda selama inisialisasi. Misalnya, jika Anda mengupgrade dari versi 10 ke versi 16, entri akan terlihat seperti ini: "engines": {"node": "16"}
  4. Secara opsional, uji perubahan Anda menggunakan Firebase Local Emulator Suite .
  5. Terapkan ulang fungsi menggunakan Firebase CLI v9.17.0 atau yang lebih baru.

Mengontrol perilaku penskalaan

Secara default, Cloud Functions for Firebase menskalakan jumlah instance yang berjalan berdasarkan jumlah permintaan yang masuk, berpotensi menurunkan ke nol instance saat traffic berkurang. Namun, jika aplikasi Anda memerlukan pengurangan latensi dan Anda ingin membatasi jumlah cold start, Anda dapat mengubah perilaku default ini dengan menentukan jumlah minimum instance container agar tetap hangat dan siap melayani permintaan.

Demikian pula, Anda dapat menetapkan jumlah maksimum untuk membatasi penskalaan instans sebagai tanggapan atas permintaan yang masuk. Gunakan pengaturan ini sebagai cara untuk mengontrol biaya Anda atau untuk membatasi jumlah koneksi ke layanan pendukung seperti ke database.

Kurangi jumlah cold start

Untuk menetapkan jumlah minimum instance untuk suatu fungsi dalam kode sumber, gunakan metode runWith . Metode ini menerima objek JSON yang sesuai dengan antarmuka RuntimeOptions , yang menentukan nilai untuk minInstances . Misalnya, fungsi ini menyetel minimal 5 instans agar tetap hangat:

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
    });

Berikut adalah beberapa hal yang perlu dipertimbangkan saat menetapkan nilai untuk minInstances :

  • Jika Cloud Functions for Firebase menskalakan aplikasi Anda di atas setelan minInstances , Anda akan mengalami cold start untuk setiap instance di atas ambang tersebut.
  • Cold start memiliki efek paling parah pada aplikasi dengan lalu lintas yang padat. Jika aplikasi Anda memiliki lalu lintas yang melonjak dan Anda menetapkan nilai minInstances cukup tinggi sehingga cold start berkurang pada setiap peningkatan lalu lintas, Anda akan melihat latensi yang berkurang secara signifikan. Untuk aplikasi dengan lalu lintas konstan, cold start kemungkinan besar tidak akan terlalu memengaruhi kinerja.
  • Menetapkan instans minimum dapat masuk akal untuk lingkungan produksi, tetapi biasanya harus dihindari dalam lingkungan pengujian. Untuk menskalakan ke nol dalam proyek pengujian Anda tetapi tetap mengurangi cold start dalam proyek produksi Anda, Anda dapat menetapkan minInstances berdasarkan variabel lingkungan FIREBASE_CONFIG :

    // 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
        });
    

Batasi jumlah maksimum instance untuk suatu fungsi

Untuk menyetel instance maksimum dalam kode sumber fungsi, gunakan metode runWith . Metode ini menerima objek JSON yang sesuai dengan antarmuka RuntimeOptions , yang menentukan nilai untuk maxInstances . Misalnya, fungsi ini menetapkan batas 100 instans agar tidak membanjiri basis data warisan hipotetis:

exports.mirrorOrdersToLegacyDatabase = functions
    .runWith({
      // Legacy database only supports 100 simultaneous connections
      maxInstances: 100,
    })
    .firestore.document("orders/{orderId}")
    .onWrite((change, context) => {
      // Connect to legacy database
    });

Jika fungsi HTTP ditingkatkan hingga batas maxInstances , permintaan baru akan diantrekan selama 30 detik, lalu ditolak dengan kode respons 429 Too Many Requests jika tidak ada instans yang tersedia saat itu.

Untuk mempelajari lebih lanjut tentang praktik terbaik untuk menggunakan setelan instance maksimum, lihat praktik terbaik ini untuk menggunakan maxInstances .

Tetapkan batas waktu dan alokasi memori

Dalam beberapa kasus, fungsi Anda mungkin memiliki persyaratan khusus untuk nilai batas waktu yang lama atau alokasi memori yang besar. Anda dapat menyetel nilai ini di Google Cloud Console atau di kode sumber fungsi (khusus Firebase).

Untuk mengatur alokasi memori dan waktu tunggu dalam kode sumber fungsi, gunakan parameter runWith yang diperkenalkan di Firebase SDK untuk Cloud Functions 2.0.0. Opsi runtime ini menerima objek JSON yang sesuai dengan antarmuka RuntimeOptions , yang menentukan nilai untuk timeoutSeconds dan memory . Misalnya, fungsi penyimpanan ini menggunakan memori 1 GB dan waktu habis setelah 300 detik:

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
    });

Nilai maksimum timeoutSeconds adalah 540 , atau 9 menit. Jumlah memori yang diberikan ke suatu fungsi sesuai dengan CPU yang dialokasikan untuk fungsi tersebut, sebagaimana dirinci dalam daftar nilai yang valid untuk memory ini :

  • 128MB — 200MHz
  • 256MB — 400MHz
  • 512MB — 800MHz
  • 1GB — 1,4 GHz
  • 2 2GB — 2,4 GHz
  • 4GB — 4,8 GHz
  • 8GB — 4,8 GHz

Untuk mengatur alokasi memori dan waktu tunggu di Google Cloud Console:

  1. Di Google Google Cloud Console pilih Cloud Functions dari menu sebelah kiri.
  2. Pilih fungsi dengan mengklik namanya di daftar fungsi.
  3. Klik ikon Edit di menu atas.
  4. Pilih alokasi memori dari menu tarik-turun berlabel Alokasi memori .
  5. Klik Lainnya untuk menampilkan opsi lanjutan, dan masukkan jumlah detik dalam kotak teks Timeout .
  6. Klik Simpan untuk memperbarui fungsi.