Wednesday

18-06-2025 Vol 19

Deploy Each NestJS Module as a Separate Firebase Function. NestFire

Deploy Setiap Modul NestJS Sebagai Fungsi Firebase Terpisah: NestFire

Dalam dunia pengembangan backend modern, NestJS telah muncul sebagai framework progresif untuk membangun aplikasi Node.js yang efisien, andal, dan terukur. Sementara itu, Firebase menawarkan platform pengembangan komprehensif yang disederhanakan oleh Google, menyediakan berbagai layanan termasuk Functions, Firestore, Authentication, dan Hosting.

Menggabungkan keunggulan NestJS dan Firebase dapat menghasilkan arsitektur yang kuat dan hemat biaya. Salah satu pendekatan yang menarik adalah dengan *men-deploy setiap modul NestJS sebagai Fungsi Firebase yang terpisah*. Teknik ini memungkinkan Anda untuk:

  • Memaksimalkan Efisiensi Sumber Daya: Hanya gunakan sumber daya yang dibutuhkan oleh setiap fungsi.
  • Meningkatkan Skalabilitas: Fungsi-fungsi dapat ditingkatkan skalanya secara individual sesuai dengan permintaan.
  • Meminimalkan Biaya: Bayar hanya untuk eksekusi fungsi yang Anda gunakan.
  • Memperbaiki Waktu Deployment: Deployment menjadi lebih cepat karena perubahan terbatas pada modul tertentu.
  • Memudahkan Isolasi dan Pemeliharaan: Modul-modul yang terisolasi lebih mudah dikelola dan di-debug.

Artikel ini akan memandu Anda melalui proses deployment setiap modul NestJS sebagai Fungsi Firebase terpisah menggunakan pustaka NestFire. Kita akan membahas langkah-langkah konfigurasi, praktik terbaik, dan pertimbangan yang perlu diingat.

Daftar Isi

  1. Pendahuluan
  2. Prasyarat
  3. Konfigurasi Awal
  4. Struktur Proyek NestJS Modular
  5. Instalasi dan Konfigurasi NestFire
  6. Membuat Fungsi Firebase dari Modul NestJS
  7. Deploy Fungsi Firebase
  8. Konfigurasi Lanjutan
  9. Praktik Terbaik
  10. Pertimbangan
  11. Pemecahan Masalah
  12. Kesimpulan

1. Pendahuluan

Arsitektur microservices telah menjadi populer dalam beberapa tahun terakhir, memungkinkan pengembang untuk memecah aplikasi monolitik menjadi layanan-layanan kecil yang independen. Deployment modul NestJS sebagai Fungsi Firebase yang terpisah adalah bentuk arsitektur microservices yang hemat biaya dan skalabel.

NestJS, dengan arsitektur modularnya, sangat cocok untuk pendekatan ini. Setiap modul dapat dienkapsulasi dan di-deploy secara independen, meminimalkan dampak perubahan dan meningkatkan kecepatan deployment.

Firebase Functions menyediakan lingkungan tanpa server untuk mengeksekusi kode backend sebagai respons terhadap peristiwa yang dipicu oleh fitur Firebase dan permintaan HTTPS. Ini adalah solusi ideal untuk deployment modul NestJS individual.

NestFire menyederhanakan integrasi NestJS dengan Firebase Functions dengan menyediakan serangkaian utilitas dan konvensi untuk mengotomatiskan proses deployment.

2. Prasyarat

Sebelum kita mulai, pastikan Anda memiliki prasyarat berikut:

  • Node.js dan npm: Pastikan Anda memiliki Node.js dan npm (Node Package Manager) terinstal di sistem Anda.
  • Firebase CLI: Instal Firebase CLI untuk berinteraksi dengan Firebase dari baris perintah: npm install -g firebase-tools.
  • Akun Google dan Proyek Firebase: Anda memerlukan akun Google dan proyek Firebase yang dikonfigurasi. Buat proyek Firebase baru di Firebase Console.
  • NestJS CLI: Instal NestJS CLI untuk membuat dan mengelola proyek NestJS: npm install -g @nestjs/cli.

3. Konfigurasi Awal

Mari kita mulai dengan menyiapkan proyek NestJS baru. Gunakan NestJS CLI untuk menghasilkan proyek dasar:

nest new nest-firebase-functions

Pilih manajer paket yang Anda sukai (npm, yarn, atau pnpm). Setelah proyek dibuat, navigasikan ke direktori proyek:

cd nest-firebase-functions

Selanjutnya, kita perlu menginisialisasi Firebase di proyek kita. Jalankan perintah berikut:

firebase login

Ini akan membuka browser tempat Anda dapat masuk ke akun Google Anda dan memberikan izin ke Firebase CLI.

firebase init

Pilih “Functions: Configure and deploy Cloud Functions” dari daftar fitur Firebase. Kemudian, pilih proyek Firebase yang Anda buat sebelumnya. Pilih JavaScript atau TypeScript sebagai bahasa untuk fungsi Anda. Untuk konsistensi, kita akan menggunakan TypeScript dalam tutorial ini. Terakhir, pilih untuk menggunakan ESLint dan menginstal dependensi dengan npm.

Ini akan membuat direktori functions di proyek Anda, yang akan berisi kode untuk Fungsi Firebase Anda.

4. Struktur Proyek NestJS Modular

Untuk mendemonstrasikan deployment modul NestJS yang terpisah, kita akan membuat struktur proyek modular sederhana. Kita akan memiliki dua modul: UsersModule dan ProductsModule.

Buat modul UsersModule:

nest generate module users

Buat controller UsersController:

nest generate controller users

Buat service UsersService:

nest generate service users

Ulangi langkah-langkah yang sama untuk membuat ProductsModule, ProductsController, dan ProductsService.

Sekarang, struktur proyek Anda seharusnya terlihat seperti ini:


  nest-firebase-functions/
  ├── src/
  │   ├── app.controller.ts
  │   ├── app.module.ts
  │   ├── app.service.ts
  │   ├── users/
  │   │   ├── users.controller.ts
  │   │   ├── users.module.ts
  │   │   └── users.service.ts
  │   └── products/
  │       ├── products.controller.ts
  │       ├── products.module.ts
  │       └── products.service.ts
  ├── functions/
  │   ├── src/
  │   ├── package.json
  │   └── tsconfig.json
  ├── nest-cli.json
  ├── package.json
  ├── tsconfig.json
  └── ...
  

Mari kita tambahkan beberapa kode dummy ke controller dan service kita. Di src/users/users.controller.ts:


  import { Controller, Get } from '@nestjs/common';
  import { UsersService } from './users.service';

  @Controller('users')
  export class UsersController {
    constructor(private readonly usersService: UsersService) {}

    @Get()
    findAll(): string {
      return this.usersService.findAll();
    }
  }
  

Di src/users/users.service.ts:


  import { Injectable } from '@nestjs/common';

  @Injectable()
  export class UsersService {
    findAll(): string {
      return 'List of users';
    }
  }
  

Di src/products/products.controller.ts:


  import { Controller, Get } from '@nestjs/common';
  import { ProductsService } from './products.service';

  @Controller('products')
  export class ProductsController {
    constructor(private readonly productsService: ProductsService) {}

    @Get()
    findAll(): string {
      return this.productsService.findAll();
    }
  }
  

Di src/products/products.service.ts:


  import { Injectable } from '@nestjs/common';

  @Injectable()
  export class ProductsService {
    findAll(): string {
      return 'List of products';
    }
  }
  

Terakhir, pastikan modul-modul ini diimpor dalam app.module.ts:


  import { Module } from '@nestjs/common';
  import { AppController } from './app.controller';
  import { AppService } from './app.service';
  import { UsersModule } from './users/users.module';
  import { ProductsModule } from './products/products.module';

  @Module({
    imports: [UsersModule, ProductsModule],
    controllers: [AppController],
    providers: [AppService],
  })
  export class AppModule {}
  

5. Instalasi dan Konfigurasi NestFire

Sekarang, mari kita instal NestFire. Navigasikan ke direktori functions:

cd functions

Instal NestFire sebagai dependensi:

npm install nestfire @nestjs/platform-express firebase-admin firebase-functions

Anda juga perlu menginstal reflect-metadata karena NestJS menggunakannya secara internal:

npm install reflect-metadata

Penting: Anda perlu menginstal `@nestjs/platform-express` karena NestFire saat ini mengandalkan Express untuk menangani permintaan HTTP.

6. Membuat Fungsi Firebase dari Modul NestJS

Di direktori functions/src, buat file baru bernama users.ts:


  import { NestFactory } from '@nestjs/core';
  import { ExpressAdapter } from '@nestjs/platform-express';
  import { UsersModule } from '../../src/users/users.module';
  import * as functions from 'firebase-functions';
  import * as express from 'express';
  import 'reflect-metadata';

  const server = express();

  export const users = functions.https.onRequest(async (request, response) => {
    const app = await NestFactory.create(UsersModule, new ExpressAdapter(server));
    await app.init();
    return server(request, response);
  });
  

Penjelasan:

  • Impor yang diperlukan: Kami mengimpor NestFactory, ExpressAdapter, UsersModule, firebase-functions, dan express.
  • Buat instans Express: Kami membuat instance server Express.
  • Definisikan Fungsi Firebase: Kami mendefinisikan Fungsi Firebase bernama users yang dipicu oleh permintaan HTTPS.
  • Buat Aplikasi NestJS: Di dalam fungsi, kami membuat aplikasi NestJS menggunakan NestFactory.create dan melewati UsersModule dan instance ExpressAdapter kita.
  • Inisialisasi Aplikasi: Kami menginisialisasi aplikasi NestJS dengan app.init().
  • Kembalikan Server Express: Kami mengembalikan server Express, yang menangani permintaan HTTP.

Ulangi proses ini untuk ProductsModule. Buat file baru bernama products.ts di direktori functions/src:


  import { NestFactory } from '@nestjs/core';
  import { ExpressAdapter } from '@nestjs/platform-express';
  import { ProductsModule } from '../../src/products/products.module';
  import * as functions from 'firebase-functions';
  import * as express from 'express';
  import 'reflect-metadata';

  const server = express();

  export const products = functions.https.onRequest(async (request, response) => {
    const app = await NestFactory.create(ProductsModule, new ExpressAdapter(server));
    await app.init();
    return server(request, response);
  });
  

Terakhir, di functions/src/index.ts, ekspor fungsi yang baru dibuat:


  export { users } from './users';
  export { products } from './products';
  

7. Deploy Fungsi Firebase

Sekarang kita siap untuk men-deploy Fungsi Firebase kita. Pastikan Anda berada di direktori functions dan jalankan perintah berikut:

firebase deploy --only functions

Ini akan men-deploy fungsi users dan products ke Firebase. Setelah deployment selesai, Firebase CLI akan memberikan URL untuk setiap fungsi.

Anda dapat menguji fungsi Anda dengan mengirimkan permintaan GET ke URL yang disediakan. Misalnya:

curl [URL fungsi pengguna]
  curl [URL fungsi produk]
  

Anda akan melihat respons “List of users” dan “List of products”, masing-masing.

8. Konfigurasi Lanjutan

Bagian ini membahas beberapa konfigurasi lanjutan yang dapat meningkatkan arsitektur Anda.

8.1. Variabel Lingkungan

Anda dapat menggunakan variabel lingkungan untuk mengonfigurasi aplikasi NestJS Anda di lingkungan Firebase. Tetapkan variabel lingkungan di Firebase Console dan aksesnya di aplikasi NestJS Anda menggunakan process.env.

Misalnya, untuk menetapkan variabel lingkungan bernama DATABASE_URL:

firebase functions:config:set database.url="your-database-url"
  firebase deploy --only functions
  

Di aplikasi NestJS Anda:


  const databaseUrl = process.env.DATABASE_URL;
  

8.2. CORS (Cross-Origin Resource Sharing)

Jika aplikasi NestJS Anda akan diakses dari domain yang berbeda, Anda perlu mengonfigurasi CORS. Anda dapat menggunakan middleware cors Express untuk mengaktifkan CORS.

Instal paket cors:

npm install cors
  

Di file users.ts dan products.ts:


  import * as cors from 'cors';

  const server = express();
  server.use(cors());

  export const users = functions.https.onRequest(async (request, response) => {
    // ...
  });

  export const products = functions.https.onRequest(async (request, response) => {
    // ...
  });
  

8.3. Custom Domain

Anda dapat memetakan domain kustom ke Fungsi Firebase Anda. Ini memungkinkan Anda untuk mengakses fungsi Anda menggunakan domain Anda sendiri alih-alih URL yang dihasilkan Firebase.

Lihat dokumentasi Firebase untuk informasi lebih lanjut tentang mengonfigurasi domain kustom.

9. Praktik Terbaik

Berikut adalah beberapa praktik terbaik untuk deployment modul NestJS sebagai Fungsi Firebase terpisah:

  • Kode Modular: Pastikan kode NestJS Anda modular dan terstruktur dengan baik. Ini memudahkan deployment dan pemeliharaan modul individual.
  • Minimalkan Dependensi: Kurangi jumlah dependensi di setiap modul untuk mengurangi ukuran bundle dan meningkatkan waktu startup.
  • Gunakan Variabel Lingkungan: Gunakan variabel lingkungan untuk mengonfigurasi aplikasi Anda di berbagai lingkungan.
  • Pemantauan dan Pencatatan Log: Implementasikan pemantauan dan pencatatan log yang komprehensif untuk melacak performa dan kesalahan fungsi Anda. Firebase menyediakan alat bawaan untuk pemantauan dan pencatatan log.
  • Keamanan: Amankan Fungsi Firebase Anda dengan memvalidasi input, mengotorisasi permintaan, dan melindungi data sensitif.
  • Uji: Tulis pengujian unit dan integrasi untuk memastikan fungsi Anda berfungsi dengan benar.

10. Pertimbangan

Ada beberapa pertimbangan yang perlu diingat saat men-deploy modul NestJS sebagai Fungsi Firebase terpisah:

  • Cold Starts: Fungsi Firebase dapat mengalami cold starts, yang dapat menyebabkan latensi saat fungsi dipanggil untuk pertama kalinya setelah periode tidak aktif. Anda dapat mengurangi cold starts dengan menjaga fungsi Anda tetap hangat dan menggunakan fungsi yang disediakan untuk permintaan yang sering.
  • Batas: Fungsi Firebase memiliki batasan pada alokasi memori, waktu eksekusi, dan ukuran bundle. Pastikan fungsi Anda sesuai dengan batasan ini.
  • State Management: Fungsi Firebase tanpa server, yang berarti mereka tidak menyimpan state di antara permintaan. Jika Anda membutuhkan state management, Anda dapat menggunakan database eksternal seperti Firestore atau Cloud SQL.
  • Komunikasi Antar Layanan: Jika modul Anda perlu berkomunikasi satu sama lain, Anda dapat menggunakan mekanisme seperti Pub/Sub, HTTP request, atau antrean pesan.
  • Kompleksitas Deployment: Deployment beberapa fungsi dapat meningkatkan kompleksitas deployment Anda. Otomatiskan proses deployment Anda menggunakan alat seperti Firebase CLI atau CI/CD pipeline.

11. Pemecahan Masalah

Berikut adalah beberapa masalah umum dan solusinya:

  • “Function invocation was interrupted” atau Timeout: Ini mungkin disebabkan oleh waktu eksekusi fungsi yang terlalu lama. Tingkatkan batas waktu fungsi di Firebase Console atau optimalkan kode Anda untuk mengurangi waktu eksekusi.
  • “Cannot find module” errors: Pastikan semua dependensi diinstal di direktori functions. Periksa juga jalur impor dalam kode Anda.
  • CORS errors: Pastikan CORS dikonfigurasi dengan benar.
  • Deployment errors: Periksa log deployment di Firebase Console untuk informasi lebih lanjut. Pastikan Anda memiliki izin yang diperlukan untuk men-deploy fungsi.

12. Kesimpulan

Deployment setiap modul NestJS sebagai Fungsi Firebase terpisah adalah pendekatan yang ampuh dan hemat biaya untuk membangun aplikasi backend yang skalabel. Dengan menggunakan NestFire, Anda dapat menyederhanakan proses deployment dan memanfaatkan keunggulan NestJS dan Firebase.

Ingatlah untuk mempertimbangkan praktik terbaik dan pertimbangan yang dibahas dalam artikel ini untuk memastikan keberhasilan deployment Anda. Dengan perencanaan dan implementasi yang cermat, Anda dapat membangun arsitektur backend yang kuat dan fleksibel yang memenuhi kebutuhan Anda.

“`

omcoding

Leave a Reply

Your email address will not be published. Required fields are marked *