Catch up on everything we announced at this year's Firebase Summit. Learn more

Mengelola deployment fungsi dan opsi runtime

Anda dapat men-deploy, menghapus, dan mengubah fungsi menggunakan perintah Firebase CLI atau dengan menyetel opsi runtime dalam kode sumber fungsi Anda.

Men-deploy fungsi

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

$ firebase deploy --only functions

Secara default, Firebase CLI men-deploy semua fungsi di dalam index.js pada saat bersamaan. Jika project Anda berisi lebih dari 5 fungsi, sebaiknya gunakan flag --only dengan nama fungsi tertentu untuk men-deploy fungsi yang sudah diedit saja. Men-deploy fungsi tertentu dengan cara ini akan mempercepat proses deployment dan membantu agar Anda tidak melampaui kuota deployment. Contoh:

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

Saat men-deploy fungsi dalam jumlah besar, Anda mungkin melebihi kuota standar dan menerima pesan error HTTP 429 atau 500. Untuk mengatasi hal ini, deploy fungsi secara berkelompok, yang setiap kelompoknya berisi maksimal 10 fungsi.

Baca referensi Firebase CLI untuk melihat daftar lengkap perintah yang tersedia.

Secara default, Firebase CLI akan mencari kode sumber di folder functions/. Anda bisa menentukan folder lain dengan menambahkan baris berikut di firebase.json:

"functions": {
  "source": "another-folder"
}

Menghapus fungsi

Anda dapat menghapus fungsi yang telah di-deploy sebelumnya dengan cara berikut:

  • secara eksplisit di Firebase CLI dengan functions:delete
  • secara eksplisit menggunakan menu konteks dalam daftar fungsi di Firebase console
  • secara implisit dengan menghapus fungsi dari index.js sebelum deployment.

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

Penghapusan fungsi secara eksplisit di Firebase CLI mendukung banyak argumen serta grup fungsi, dan dapat Anda gunakan untuk menentukan fungsi yang dijalankan di region tertentu. Selain itu, Anda juga dapat mengganti 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 secara implisit, firebase deploy akan mengurai index.js dan menghapus dari produksi semua fungsi yang telah dihapus dari file.

Mengubah nama, region, atau pemicu fungsi

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

Mengganti nama fungsi

Untuk mengganti nama fungsi, buat versi baru fungsi dengan nama yang baru di index.js lalu jalankan dua perintah deployment yang berbeda. Perintah pertama men-deploy fungsi dengan nama yang baru, dan perintah kedua menghapus versi yang di-deploy sebelumnya. Misalnya, jika Anda memiliki fungsi bernama webhook yang ingin diganti namanya 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");
});

Lalu, jalankan perintah berikut untuk men-deploy fungsi yang 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

Mengganti region fungsi

Jika Anda mengganti region yang ditentukan untuk fungsi yang menangani traffic produksi, Anda dapat mencegah kehilangan peristiwa dengan melakukan langkah-langkah berikut secara berurutan:

  1. Ubah nama fungsi, dan ubah regionnya sesuai keinginan.
  2. Deploy fungsi dengan nama yang baru, sehingga untuk sementara kode yang sama akan dijalankan di kedua region.
  3. Hapus fungsi sebelumnya.

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

// 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 deploy dengan menjalankan:

$ firebase deploy --only functions:webhookAsia

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

Selanjutnya, hapus webhook:

$ firebase functions:delete webhook

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

Mengganti jenis pemicu fungsi

Selama pengembangan deployment Cloud Functions for Firebase dari waktu ke waktu, Anda mungkin perlu mengganti jenis pemicu fungsi karena berbagai alasan. Misalnya, Anda mungkin ingin:

  • Mengganti dari peristiwa onChange penyimpanan lama ke onFinalize, onDelete, onArchive, dan onMetadataUpdate. (Pelajari hal tersebut lebih lanjut pada panduan upgrade versi beta ke v1 atau v2).
  • Mengganti dari satu jenis peristiwa Firebase Realtime Database atau Cloud Firestore ke yang lain, misalnya dari peristiwa onWrite yang umum ke peristiwa onCreate yang terperinci.

Anda tidak dapat mengganti jenis peristiwa fungsi hanya dengan mengganti kode sumber dan menjalankan firebase deploy. Untuk menghindari error, ganti jenis pemicu fungsi dengan prosedur ini:

  1. Ubah kode sumber untuk menyertakan fungsi baru dengan jenis pemicu yang diinginkan.
  2. Deploy fungsi, sehingga untuk sementara fungsi lama dan fungsi baru akan dijalankan bersama-sama.
  3. Hapus fungsi lama secara eksplisit dari produksi menggunakan Firebase CLI.

Misalnya, jika Anda memiliki fungsi objectChanged yang memiliki jenis peristiwa onChange lama, dan Anda ingin menggantinya menjadi onFinalize, ganti nama fungsi terlebih dahulu dan edit agar 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);
});

Lalu, 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

Menetapkan opsi runtime

Cloud Functions for Firebase dapat Anda gunakan untuk memilih opsi runtime, misalnya versi runtime Node.js, serta waktu tunggu per fungsi, alokasi memori, dan instance fungsi minimum/maksimum.

Menetapkan versi Node.js

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

  • Node.js 16 (beta)
  • Node.js 14
  • Node.js 12
  • Node.js 10
  • Node.js 8 (tidak digunakan lagi sejak 8 Juni 2020) Deployment fungsi ke runtime Node.js 8 telah dinonaktifkan di Firebase CLI pada tanggal 15 Desember 2020. Eksekusi fungsi yang sudah di-deploy akan berhenti di masa mendatang. Jika Anda telah men-deploy fungsi ke runtime Node.js 8, sebaiknya upgrade ke runtime Node.js 14.

Untuk menetapkan versi Node.js:

Tetapkan versi di kolom engines pada file package.json yang dibuat dalam direktori functions/ selama inisialisasi. Misalnya, agar hanya menggunakan versi 14, edit baris berikut di package.json:

  "engines": {"node": "14"}

Kolom engines wajib ada. Kolom ini harus menentukan salah satu versi Node.js yang didukung agar Anda dapat men-deploy dan menjalankan fungsi. Saat ini, firebase init functions menetapkan kolom ini ke 14.

Mengupgrade runtime Node.js Anda

Untuk mengupgrade runtime Node.js:

  1. Pastikan project Anda menggunakan paket harga Blaze.
  2. Pastikan Anda menggunakan Firebase CLI v8.6.0 atau yang lebih baru.
  3. Ubah nilai engines pada file package.json yang dibuat dalam direktori functions/ selama inisialisasi. Misalnya, jika Anda melakukan upgrade dari versi 10 ke versi 14, entrinya akan terlihat seperti ini: "engines": {"node": "14"}
  4. Jika ingin, Anda dapat menguji perubahan menggunakan Firebase Local Emulator Suite.
  5. Deploy ulang fungsi menggunakan Firebase CLI v8.1.0 atau yang lebih baru.

Mengontrol perilaku penskalaan

Secara default, Cloud Functions for Firebase menskalakan jumlah instance yang berjalan berdasarkan jumlah permintaan masuk, dan berpotensi untuk memperkecil skala hingga nol instance pada saat traffic berkurang. Namun, jika aplikasi Anda memerlukan latensi yang lebih rendah dan Anda ingin membatasi jumlah start cold, perilaku default ini dapat diubah dengan menentukan jumlah minimum instance container yang harus tetap aktif dan siap untuk menyalurkan permintaan.

Demikian pula, Anda dapat menetapkan jumlah maksimum untuk membatasi penskalaan instance sebagai respons terhadap permintaan masuk. Gunakan setelan ini sebagai salah satu cara untuk mengontrol biaya Anda atau untuk membatasi jumlah koneksi ke layanan pendukung seperti ke database.

Mengurangi jumlah start cold

Untuk menetapkan jumlah minimum instance untuk fungsi dalam kode sumber, gunakan parameter runWith. Opsi runtime ini menerima objek JSON yang sesuai dengan antarmuka RuntimeOptions, yang menentukan nilai untuk minInstances. Misalnya, fungsi ini menetapkan minimum 5 instance yang harus tetap aktif:

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 beberapa hal yang perlu dipertimbangkan saat menetapkan nilai untuk minInstances:

  • Jika penskalaan aplikasi oleh Cloud Functions for Firebase melampaui setelan minInstances, Anda akan mengalami start cold untuk setiap instance yang melampaui batas tersebut.
  • Start cold memiliki dampak yang paling signifikan pada aplikasi dengan lonjakan traffic yang tajam. Jika aplikasi Anda memiliki lonjakan traffic yang tajam, dan nilai minInstances yang Anda tetapkan cukup tinggi sehingga start cold berkurang pada setiap peningkatan traffic, akan terjadi penurunan latensi yang signifikan. Untuk aplikasi dengan traffic yang konstan, start cold kemungkinan tidak akan memengaruhi performa secara signifikan.
  • Menetapkan instance minimum dapat dilakukan untuk lingkungan produksi, tetapi biasanya sebaiknya dihindari di lingkungan pengujian. Untuk melakukan penskalaan hingga nol dalam project pengujian, tetapi tetap mengurangi start cold di project produksi, 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
        });
    

Membatasi jumlah maksimum instance untuk fungsi

Untuk menetapkan instance maksimum dalam kode sumber fungsi, gunakan parameter runWith. Opsi runtime ini menerima objek JSON yang sesuai dengan antarmuka RuntimeOptions, yang menentukan nilai untuk maxInstances. Misalnya, fungsi ini menetapkan batas 100 instance agar tidak membebani suatu database lama fiktif:

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 skalanya hingga batas maxInstances, permintaan baru akan dimasukkan ke dalam antrean selama 30 detik, lalu ditolak dengan kode respons 429 Too Many Requests jika tidak ada instance yang tersedia saat itu.

Untuk mempelajari lebih lanjut praktik terbaik dalam menggunakan setelan instance maksimum, baca praktik terbaik dalam menggunakan maxInstances ini.

Menetapkan waktu tunggu dan alokasi memori

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

Untuk menetapkan 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 akan berakhir 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 untuk timeoutSeconds adalah 540, atau 9 menit. Jumlah memori yang diberikan ke fungsi sesuai dengan CPU yang dialokasikan untuk fungsi, seperti yang dijelaskan dalam daftar nilai yang valid untuk memory ini:

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

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

  1. Di Google Cloud Console, pilih Cloud Functions dari menu kiri.
  2. Pilih fungsi dengan mengklik namanya di daftar fungsi.
  3. Klik ikon Edit di menu atas.
  4. Pilih alokasi memori dari menu drop-down berlabel Memory allocated.
  5. Klik More untuk menampilkan opsi lanjutan, dan masukkan jumlah detik di kotak teks Timeout.
  6. Klik Save untuk mengubah fungsi.