Menghubungkan aplikasi ke Emulator Cloud Functions

Sebelum menghubungkan aplikasi ke emulator Cloud Functions, pastikan Anda memahami keseluruhan alur kerja Firebase Local Emulator Suite, dan sudah menginstal serta mengonfigurasi Local Emulator Suite dan mengetahui perintah CLI-nya.

Memilih project Firebase

Firebase Local Emulator Suite mengemulasi produk untuk satu project Firebase.

Untuk memilih project yang akan digunakan, sebelum memulai emulator, jalankan firebase use di CLI di direktori kerja Anda. Atau, Anda dapat meneruskan flag --project ke setiap perintah emulator.

Local Emulator Suite mendukung emulasi project Firebase sungguhan dan project demo.

Jenis project Fitur Penggunaan dengan emulator
Sungguhan

Project Firebase sungguhan adalah project yang Anda buat dan konfigurasikan (kemungkinan besar melalui Firebase console).

Project sungguhan memiliki resource live, seperti instance database, bucket penyimpanan, fungsi, atau resource lain yang Anda siapkan untuk project Firebase tersebut.

Jika mengerjakan project Firebase sungguhan, Anda dapat menjalankan emulator untuk salah satu atau semua produk yang didukung.

Untuk produk yang tidak diemulasi, aplikasi dan kode Anda akan berinteraksi dengan resource live (instance database, bucket penyimpanan, fungsi, dsb.).

Demo

Project Firebase demo tidak memiliki konfigurasi Firebase sungguhan dan tidak memiliki resource live. Project ini biasanya diakses melalui codelab atau tutorial lainnya.

Project ID untuk project demo memiliki awalan demo-.

Jika menggunakan project Firebase demo, aplikasi dan kode Anda hanya berinteraksi dengan emulator. Jika aplikasi Anda mencoba berinteraksi dengan resource yang tidak dijalankan dengan emulator, kode tersebut akan gagal.

Jika memungkinkan, sebaiknya gunakan project demo. Manfaatnya meliputi:

  • Penyiapan yang lebih mudah karena Anda dapat menjalankan emulator tanpa perlu membuat project Firebase
  • Keamanan yang lebih tangguh karena jika kode Anda tidak sengaja memanggil resource yang tidak diemulasi (production), tidak akan terjadi perubahan data, penggunaan, dan penagihan
  • Dukungan offline yang lebih baik karena Anda tidak perlu mengakses internet untuk mendownload konfigurasi SDK.

Melengkapi aplikasi untuk berkomunikasi dengan emulator

Melengkapi aplikasi untuk fungsi callable

Jika prototipe dan aktivitas pengujian Anda melibatkan fungsi backend callable, konfigurasikan interaksi dengan emulator Cloud Functions for Firebase seperti ini:

Kotlin+KTX
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
val functions = Firebase.functions
functions.useEmulator("10.0.2.2", 5001)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFunctions functions = FirebaseFunctions.getInstance();
functions.useEmulator("10.0.2.2", 5001);
Swift
Functions.functions().useFunctionsEmulator(origin: "http://127.0.0.1:5001")

API modular web

import { getApp } from "firebase/app";
import { getFunctions, connectFunctionsEmulator } from "firebase/functions";

const functions = getFunctions(getApp());
connectFunctionsEmulator(functions, "127.0.0.1", 5001);

API dengan namespace web

firebase.functions().useEmulator("127.0.0.1", 5001);

Melengkapi aplikasi untuk emulasi fungsi HTTPS

Setiap fungsi HTTPS dalam kode Anda akan disalurkan dari emulator lokal menggunakan format URL berikut:

http://$HOST:$PORT/$PROJECT/$REGION/$NAME

Misalnya, fungsi helloWorld sederhana dengan port host dan region default akan disalurkan di:

https://localhost:5001/$PROJECT/us-central1/helloWorld

Melengkapi aplikasi untuk emulasi fungsi yang dipicu latar belakang

Emulator Cloud Functions mendukung fungsi yang dipicu latar belakang dari sumber berikut:

  • Emulator Realtime Database
  • Emulator Cloud Firestore
  • Emulator Authentication
  • Emulator Pub/Sub

Untuk memicu peristiwa latar belakang, ubah resource backend menggunakan UI Emulator Suite, atau dengan menghubungkan aplikasi atau kode pengujian ke emulator menggunakan SDK untuk platform Anda.

Menguji pengendali untuk peristiwa kustom yang dikeluarkan oleh Extensions

Untuk fungsi yang Anda terapkan guna menangani peristiwa kustom Firebase Extensions dengan Cloud Functions v2, emulator Cloud Functions bisa digunakan berpasangan dengan emulator Eventarc untuk mendukung pemicu Eventarc.

Untuk menguji pengendali peristiwa kustom bagi ekstensi yang memunculkan peristiwa, Anda harus menginstal emulator Cloud Functions dan emulator Eventarc.

Runtime Cloud Functions menetapkan variabel lingkungan EVENTARC_EMULATOR ke localhost:9299 dalam proses saat ini jika emulator Eventarc berjalan. Firebase Admin SDK secara otomatis terhubung ke emulator Eventarc jika variabel lingkungan EVENTARC_EMULATOR ditetapkan. Anda dapat mengubah port default seperti yang dibahas di bagian Mengonfigurasi Local Emulator Suite.

Jika variabel lingkungan dikonfigurasi dengan benar, Firebase Admin SDK akan otomatis mengirimkan peristiwa ke emulator Eventarc. Selanjutnya, emulator Eventarc membuat panggilan kembali ke emulator Cloud Functions untuk memicu pengendali terdaftar apa pun.

Anda dapat memeriksa log Functions di UI Emulator Suite untuk mengetahui detail tentang eksekusi pengendali.

Mengonfigurasi lingkungan pengujian lokal

Jika fungsi Anda mengandalkan konfigurasi lingkungan berbasis dotenv, Anda dapat mengemulasikan perilaku tersebut di lingkungan pengujian lokal.

Saat menggunakan emulator Cloud Functions lokal, Anda dapat mengganti variabel lingkungan untuk project dengan menyiapkan file .env.local. Konten .env.local lebih diutamakan daripada .env dan file .env khusus project.

Misalnya, project dapat menyertakan tiga file ini yang berisi nilai yang sedikit berbeda untuk pengembangan dan pengujian lokal:

.env .env.dev .env.local
PLANET=Earth

AUDIENCE=Humans

AUDIENCE=Dev Humans AUDIENCE=Local Humans

Saat dimulai dalam konteks lokal, emulator akan memuat variabel lingkungan seperti yang ditunjukkan berikut ini:

  $ firebase emulators:start
  i  emulators: Starting emulators: functions
  # Starts emulator with following environment variables:
  #  PLANET=Earth
  #  AUDIENCE=Local Humans

Secret dan kredensial di emulator Cloud Functions

Emulator Cloud Functions mendukung penggunaan secret untuk menyimpan dan mengakses informasi konfigurasi yang sensitif. Secara default, emulator akan mencoba mengakses secret production Anda menggunakan kredensial default aplikasi. Dalam situasi tertentu seperti lingkungan CI, emulator mungkin gagal mengakses nilai secret karena pembatasan izin.

Serupa dengan dukungan emulator Cloud Functions untuk variabel lingkungan, Anda dapat mengganti nilai secret dengan menyiapkan file .secret.local. Hal ini memudahkan Anda untuk menguji fungsi secara lokal, terutama jika Anda tidak memiliki akses ke nilai secret.

Apa saja alat lain yang ada untuk menguji Cloud Functions?

Emulator Cloud Functions dilengkapi dengan alat pengujian dan prototipe lainnya:

  • Shell Cloud Functions yang dapat digunakan untuk pembuatan prototipe dan pengembangan fungsi yang iteratif dan interaktif. Shell ini menggunakan emulator Cloud Functions dengan antarmuka gaya REPL untuk pengembangan. Tidak disediakan integrasi dengan emulator Cloud Firestore atau emulator Realtime Database. Dengan menggunakan shell ini, Anda dapat membuat data fiktif dan melakukan panggilan fungsi untuk menyimulasikan interaksi dengan produk yang saat ini tidak didukung oleh Local Emulator Suite: Analytics, Remote Config, dan Crashlytics.
  • Firebase Test SDK untuk Cloud Functions, yang merupakan Node.js dengan framework mocha untuk pengembangan fungsi. Saat diterapkan, Cloud Functions Test SDK akan menyediakan otomatisasi di atas shell Cloud Functions.

Anda dapat mempelajari shell Cloud Functions dan Cloud Functions Test SDK lebih lanjut di artikel Menguji fungsi secara interaktif dan Pengujian unit Cloud Functions.

Perbedaan emulator Cloud Functions dengan layanan production

Untuk sebagian besar kasus penggunaan, emulator Cloud Functions sudah cukup mirip dengan lingkungan production. Kami telah berupaya keras untuk memastikan semua fitur pada runtime Node dapat semirip mungkin dengan layanan production. Namun, emulator tidak meniru lingkungan production dalam container secara penuh, sehingga meskipun kode fungsi Anda akan dijalankan secara realistis, aspek lain di lingkungan Anda (yaitu file lokal, perilaku setelah fungsi mengalami error, dll.) akan berbeda.

Cloud IAM

Firebase Emulator Suite tidak berupaya mereplikasi atau mematuhi perilaku terkait IAM dalam beroperasi. Emulator mematuhi Aturan Keamanan Firebase yang diberikan. Namun, dalam situasi saat IAM biasanya digunakan, misalnya untuk menyetel akun layanan yang memanggil Cloud Functions serta izinnya, emulator tidak dapat dikonfigurasi dan akan menggunakan akun yang tersedia secara global di mesin developer Anda, seperti menjalankan skrip lokal secara langsung.

Pembatasan memori dan prosesor

Emulator tidak menerapkan pembatasan memori atau prosesor untuk fungsi Anda. Namun, emulator mendukung fungsi waktu habis melalui argumen runtime timeoutSeconds.

Perhatikan bahwa saat fungsi dijalankan di emulator, waktu eksekusinya dapat berbeda dengan saat di layanan production. Setelah Anda mendesain dan menguji fungsi dengan emulator, sebaiknya jalankan pengujian terbatas dalam production untuk mengonfirmasi waktu eksekusi.

Mengantisipasi perbedaan dalam lingkungan lokal dan lingkungan production

Karena berjalan pada mesin lokal, emulator bergantung pada lingkungan lokal untuk aplikasi, program bawaan, dan utilitas bawaan.

Perhatikan bahwa lingkungan lokal yang Anda gunakan untuk pengembangan Cloud Functions mungkin berbeda dengan lingkungan production Google:

  • Aplikasi yang Anda instal secara lokal untuk menyimulasikan lingkungan production (misalnya, ImageMagick dari tutorial ini) mungkin memiliki perilaku yang berbeda dari layanan production, terutama jika Anda memerlukan versi berbeda atau melakukan pengembangan dalam lingkungan non-Linux. Ketika melakukan deployment fungsi, Anda dapat sekaligus men-deploy salinan biner program yang hilang.

  • Demikian pula, utilitas bawaan (misalnya, perintah shell seperti ls, mkdir) mungkin berbeda dari versi yang tersedia dalam production, terutama jika Anda melakukan pengembangan di lingkungan non-Linux (misalnya, macOS). Anda dapat mengatasi masalah ini menggunakan alternatif khusus Node untuk perintah native, atau dengan membangun biner Linux untuk dipaketkan dengan deployment Anda.

Percobaan ulang

Emulator Cloud Functions tidak mendukung percobaan ulang fungsi jika gagal.

Apa selanjutnya?