L
Cloud Architecture & Serverless • Literally Web ID

Arsitektur Serverless Berbasis Event-Driven Menggunakan AWS Lambda dan EventBridge

⏱️ 20 menit baca • 📅 16 Oct 2026 • 👁️ 1 views
Arsitektur Serverless Berbasis Event-Driven Menggunakan AWS Lambda dan EventBridge

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap arsitektur sistem terdistribusi modern, transisi dari monolit terpusat ke ekosistem layanan mikro berbasis event-driven (Event-Driven Architecture / EDA) bukan lagi sekadar tren, melainkan sebuah keharusan operasional. Organisasi enterprise yang menangani jutaan permintaan per detik (RPS) kerap menghadapi bottleneck klasik pada pola komunikasi sinkron (synchronous blocking calls). Ketika layanan backend web (Node.js/Express, Go, PHP-FPM) saling memanggil secara langsung menggunakan REST HTTP atau gRPC, kegagalan jaringan atau lonjakan beban pada satu titik hilir (downstream service) akan memicu efek kaskade (cascading failure), menghabiskan koneksi database pool, dan melumpuhkan keseluruhan aplikasi.

Sebelum penerapan Event-Driven berbasis serverless, arsitektur enterprise umumnya mengandalkan infrastruktur berbasis server tradisional (Amazon EC2 atau Virtual Private Server mandiri) yang dikombinasikan dengan web server Nginx/Apache, queue worker lokal (seperti Supervisor yang mengeksekusi job PHP/Node), serta database relasional terpusat (MySQL/MariaDB). Masalah mendasar dari pendekatan ini terletak pada inefisiensi utilisasi sumber daya dan kerumitan manajemen kapasitas. Saat trafik sepi, server tetap menyala dan memakan biaya tetap; sebaliknya, saat trafik melonjak akibat kampanye pemasaran mendadak (flash sale), sistem sering kali tumbang karena keterbatasan batas thread, memori PHP-FPM, atau antrean Redis yang kelebihan muatan (buffer bloat).

[!WARNING] Ketergantungan pada pola sinkron dalam komunikasi antar layanan mikro meningkatkan tight coupling. Jika layanan pembayaran gagal merespons, layanan pemesanan tiket ikut tertahan, menyebabkan thread exhaustion pada web server Nginx/Apache.

Dengan mengadopsi arsitektur serverless menggunakan AWS Lambda dan Amazon EventBridge, sistem bertransformasi menjadi loosely coupled. Layanan produsen (producer) tidak perlu mengetahui siapa konsumen (consumer) dari event tersebut. Event dipublikasikan ke bus terpusat, dan Amazon EventBridge secara cerdas merutekan event tersebut ke target AWS Lambda secara asinkron. Pendekatan ini menghilangkan manajemen kapasitas server fisik, memangkas biaya operasional menjadi pay-as-you-go berdasarkan milidetik eksekusi, serta memberikan skalabilitas instan hingga ribuan eksekusi konkuren tanpa intervensi manual.


2. Konsep Inti & Deep Dive Arsitektur

Di balik layar, ekosistem EventBridge dan Lambda bekerja melalui mekanisme pub-sub terkelola penuh (fully managed). Amazon EventBridge bertindak sebagai Event Bus yang menerima aliran JSON event dari berbagai sumber—baik layanan AWS internal (seperti S3, DynamoDB Streams, CloudTrail), aplikasi kustom katering web, maupun webhook pihak ketiga.

Alur Eksekusi Data (Data Flow)

[Client/Web App] ---> HTTP POST ---> [API Gateway / ALB]
                                         |
                                    (Invoke)
                                         |
                                         v
[External SaaS] ---> Webhook ---> [Custom Event Bus]
                                         |
                          (Rule Match & Pattern Filter)
                                         |
            +----------------------------+----------------------------+
            | (Target 1)                                              | (Target 2)
            v                                                         v
    [AWS Lambda Function A]                                   [AWS Lambda Function B]
    (Proses Transaksi Pembayaran)                              (Kirim Email Konfirmasi)

Ketika sebuah event mendarat di Event Bus, EventBridge mengevaluasi aturan (Rules) menggunakan mesin pencocokan pola berbasis JSON (Event Pattern Matching). Jika event sesuai dengan aturan yang ditentukan, EventBridge meneruskannya ke target yang dikonfigurasi—dalam hal ini, fungsi AWS Lambda.

AWS Lambda mengeksekusi kode dalam lingkungan eksekusi terisolasi (MicroVM berbasis Firecracker). Proses ini melibatkan beberapa tahapan internal:

  1. Download Code: Mengambil deployment package dari Amazon S3.
  2. Init Phase: Menginisialisasi runtime (misalnya Node.js runtime atau Go binary), menjalankan fungsi di luar handler (cold start).
  3. Invoke Phase: Menjalankan handler function dengan payload event.

Jika fungsi dipanggil secara berulang dalam waktu singkat, Lambda menggunakan execution environment yang ada (warm start), memangkas latensi eksekusi secara drastis.


3. Perbandingan Komparatif / Analisis Pendekatan

Untuk memahami nilai tambah arsitektur ini secara objektif, mari kita bandingkan dengan pendekatan tradisional menggunakan VPS/EC2 mandiri:

Parameter Komparasi Tradisional (EC2 + Nginx + Node.js/Go + Supervisor) Serverless (AWS Lambda + EventBridge)
Manajemen Infrastruktur Membutuhkan OS patching, tuning Nginx/PHP-FPM, firewall, SSH. Sepenuhnya dikelola AWS (Managed Service).
Model Biaya Always-on (Bayar per jam/bulan berapapun trafiknya). Pay-as-you-go (Bayar per milidetik eksekusi dan jumlah request).
Skalabilitas Membutuhkan Auto Scaling Group (ASG) dengan latensi pemanasan menit. Instan, otomatis berskala hingga ribuan eksekusi konkuren dalam milidetik.
Toleransi Kesalahan Rentan terhadap memory leak aplikasi dan crash web server. Isolasi per eksekusi; kegagalan satu fungsi tidak memengaruhi fungsi lain.
Kompleksitas Debugging Akses SSH langsung, log lokal di /var/log/nginx/. Terpusat melalui Amazon CloudWatch Logs dan AWS X-Ray.
Pola Komunikasi Sering kali berbasis HTTP/REST sinkron atau antrean Redis manual. Murni Event-Driven asinkron berbasis bus terkelola.

[!TIP] Gunakan arsitektur serverless untuk beban kerja yang fluktuatif, pemrosesan latar belakang (background processing), atau webhook integration. Untuk aplikasi dengan heavy CPU rendering terus-menerus selama 24/7, pertimbangkan hybrid architecture dengan AWS ECS/Fargate.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum mulai merancang infrastruktur kode (Infrastructure as Code), pastikan environment lokal Anda memiliki perangkat pendukung berikut:

  • Node.js LTS (v18.x atau v20.x) atau Go (v1.21+) untuk runtime Lambda.
  • AWS CLI v2 terinstal dan terkonfigurasi dengan credential IAM yang memiliki hak akses penuh (AdministratorAccess untuk lab/pengembangan awal).
  • Terraform (v1.6+) atau AWS CDK untuk otomasi provisioning infrastruktur.
  • jq (command-line JSON processor) untuk mempermudah debugging CLI.

Verifikasi konfigurasi AWS CLI:

aws sts get-caller-identity

Output yang diharapkan menampilkan Account, UserId, dan Arn yang valid.


5. Panduan Implementasi Langkah demi Langkah

Kita akan membangun sistem pemrosesan pesanan e-commerce (Order Processing System) menggunakan Terraform untuk mendefinisikan EventBus, Event Rule, dan AWS Lambda function.

Struktur Direktori Proyek

├── main.tf
├── variables.tf
├── outputs.tf
└── lambdas/
    └── order-processor/
        ├── index.mjs
        └── package.json

1. Kode Fungsi Lambda (lambdas/order-processor/index.mjs)

// index.mjs - Lambda Handler untuk memproses event pesanan
export const handler = async (event) => {
    console.log("Event diterima dari EventBridge:", JSON.stringify(event, null, 2));
    
    const orderDetail = event.detail;
    
    try {
        // Simulasi logika bisnis backend (validasi stok, simpan ke database)
        if (!orderDetail.orderId || !orderDetail.amount) {
            throw new Error("Payload event tidak valid: orderId dan amount wajib diisi.");
        }

        console.log(`Memproses pesanan ${orderDetail.orderId} senilai $${orderDetail.amount}`);
        
        // Simulasi pemrosesan sukses
        return {
            statusCode: 200,
            body: JSON.stringify({
                message: "Pesanan berhasil diproses",
                orderId: orderDetail.orderId,
                processedAt: new Date().toISOString()
            }),
        };
    } catch (error) {
        console.error(`Gagal memproses pesanan: ${error.message}`);
        throw error; // Memicu retry atau DLQ jika dikonfigurasi
    }
};

2. Definisi Infrastruktur Terraform (main.tf)

terraform {
  required_version = ">= 1.6.0"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
    archive = {
      source  = "hashicorp/archive"
      version = "~> 2.4"
    }
  }
}

provider "aws" {
  region = "us-east-1"
}

# 1. IAM Role untuk Lambda
resource "aws_iam_role" "lambda_exec" {
  name = "order_processor_lambda_role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Principal = {
          Service = "lambda.amazonaws.com"
        }
      }
    ]
  })
}

resource "aws_iam_role_policy_attachment" "lambda_logs" {
  role       = aws_iam_role.lambda_exec.name
  policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
}

# 2. Arsip Kode Lambda
data "archive_file" "lambda_zip" {
  type        = "zip"
  source_dir  = "${path.module}/lambdas/order-processor"
  output_path = "${path.module}/lambda_function_payload.zip"
}

# 3. AWS Lambda Function
resource "aws_lambda_function" "order_processor" {
  filename      = data.archive_file.lambda_zip.output_path
  function_name = "OrderProcessorFunction"
  role          = aws_iam_role.lambda_exec.arn
  handler       = "index.handler"
  runtime       = "nodejs20.x"
  memory_size   = 256
  timeout       = 30

  source_code_hash = data.archive_file.lambda_zip.output_base64sha256
}

# 4. Custom EventBridge Bus
resource "aws_cloudwatch_event_bus" "ecommerce_bus" {
  name = "ecommerce-event-bus"
}

# 5. EventBridge Rule
resource "aws_cloudwatch_event_rule" "order_rule" {
  name           = "capture-order-created"
  event_bus_name = aws_cloudwatch_event_bus.ecommerce_bus.name

  event_pattern = jsonencode({
    "source": ["com.ecommerce.orders"],
    "detail-type": ["OrderCreated"]
  })
}

# 6. EventBridge Target ke Lambda
resource "aws_cloudwatch_event_target" "lambda_target" {
  rule           = aws_cloudwatch_event_rule.order_rule.name
  event_bus_name = aws_cloudwatch_event_bus.ecommerce_bus.name
  target_id      = "SendToOrderProcessorLambda"
  arn            = aws_lambda_function.order_processor.arn
}

# 7. Izin EventBridge memanggil Lambda
resource "aws_lambda_permission" "allow_eventbridge" {
  statement_id  = "AllowExecutionFromEventBridge"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.order_processor.function_name
  principal     = "events.amazonaws.com"
  source_arn    = aws_cloudwatch_event_rule.order_rule.arn
}

Menjalankan Provisioning:

terraform init
terraform plan
terraform apply --auto-approve

6. Bedah Kode & Penjelasan Detail Baris Kunci

  1. event_pattern pada EventBridge Rule:

    {
      "source": ["com.ecommerce.orders"],
      "detail-type": ["OrderCreated"]
    }
    

    Bagian ini menyaring event secara spesifik di tingkat edge sebelum menyentuh komputasi Lambda. Filter ini sangat efisien karena mencegah pemanggilan fungsi yang tidak perlu (menghemat biaya dan latensi).

  2. aws_lambda_permission (allow_eventbridge): Konfigurasi ini bertindak sebagai Access Control List (ACL) internal AWS. Tanpa izin eksplisit di mana prinsipnya adalah events.amazonaws.com, EventBridge akan ditolak (Access Denied) saat mencoba memicu fungsi Lambda meskipun IAM Role Lambda sudah benar.

  3. Memory Size & Timeout pada Lambda:

    memory_size   = 256
    timeout       = 30
    

    Alokasi memori di AWS Lambda berbanding lurus dengan alokasi daya CPU. Menyetel memori ke 256MB memberikan alokasi CPU yang lebih baik dibandingkan 128MB, sering kali mempercepat eksekusi dan secara total menurunkan biaya karena durasi eksekusi menjadi lebih singkat.


7. Skenario Produksi & Studi Kasus Dunia Nyata

Dalam skenario flash sale berskala enterprise dengan 50.000 transaksi per menit, arsitektur event-driven mencegah lonjakan koneksi langsung ke database utama.

  • Penerapan: Aplikasi frontend (React/Next.js) mengirim permintaan checkout ke API Gateway. API Gateway segera memvalidasi token dan menerbitkan event OrderCreated ke Amazon EventBridge Custom Bus, lalu merespons klien dalam < 50ms dengan status Accepted.
  • Dampak: Klien tidak perlu menunggu proses verifikasi pembayaran, pengecekan inventaris Redis, dan penulisan database relasional selesai. EventBridge menampung lonjakan event tersebut, dan Lambda melakukan scaling secara otomatis (concurrency hingga ribuan instans) untuk memproses antrean event secara paralel tanpa menyebabkan database lock contention.

8. Common Pitfalls, Anti-Patterns & Solusi

  • Anti-Pattern 1: Mengabaikan Dead Letter Queue (DLQ)

    • Masalah: Jika fungsi Lambda gagal memproses event (misalnya karena gangguan database eksternal), event akan terus diretry secara asinkron hingga batas maksimal, atau hilang jika terjadi kesalahan fatal.
    • Solusi: Selalu konfigurasi DLQ (menggunakan SQS Queue atau SNS Topic) pada konfigurasi asinkron Lambda atau EventBridge Target untuk menangkap event yang gagal diproses (poison pills).
  • Anti-Pattern 2: Cold Start yang Tidak Dioptimalkan pada Node.js/Go

    • Masalah: Meletakkan inisialisasi koneksi database di dalam handler function alih-alih di luar handler.
    • Solusi: Inisialisasi klien database (seperti pool koneksi MySQL atau Redis) di luar fungsi handler agar koneksi tersebut dapat digunakan kembali pada pemanggilan warm start berikutnya.
  • Anti-Pattern 3: Payload Event Terlalu Besar

    • Masalah: Mengirimkan objek data mentah berukuran 2MB (misalnya gambar base64) melalui EventBridge.
    • Solusi: EventBridge memiliki batas ukuran event 256 KB. Simpan objek besar ke Amazon S3, lalu kirim referensi URI/Pointer S3 di dalam payload event.

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk menguji ketahanan sistem, gunakan tool pengujian beban seperti k6 atau Artillery untuk menembakkan HTTP endpoint yang memicu EventBridge.

Contoh Skrip Pengujian k6 (load-test.js):

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
    stages: [
        { duration: '1m', target: 500 },  // Ramp up ke 500 virtual users
        { duration: '3m', target: 2000 }, // Pertahankan 2000 VU (High Concurrency)
        { duration: '1m', target: 0 },    // Ramp down
    ],
};

export default function () {
    const url = 'https://api.yourdomain.com/v1/checkout';
    const payload = JSON.stringify({
        orderId: `ord-${Math.random()}`,
        amount: Math.floor(Math.random() * 500) + 10,
    });

    const params = {
        headers: { 'Content-Type': 'application/json' },
    };

    const res = http.post(url, payload, params);
    check(res, {
        'status adalah 202': (r) => r.status === 202,
    });
    sleep(0.1);
}

Metrik Kunci CloudWatch yang Wajib Dipantau:

  1. Invocations: Total volume eksekusi fungsi.
  2. Duration: Waktu eksekusi rata-rata per request (p50, p95, p99).
  3. Throttling: Indikator apakah fungsi mencapai batas concurrency akun (ReservedConcurrentExecutions).
  4. IteratorAge / DeadLetterQueueInvocations: Memantau kegagalan asinkron.

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum meluncurkan arsitektur ini ke lingkungan produksi (Production-Ready), pastikan checklist berikut terpenuhi:

  • Konfigurasi IAM Least Privilege (Pastikan Lambda hanya memiliki izin ke resource AWS yang spesifik).
  • Aktifkan AWS X-Ray Tracing untuk mendiagnosis latensi end-to-end.
  • Konfigurasi Dead Letter Queue (DLQ) pada EventBridge Target / Lambda Async Config.
  • Atur Reserved Concurrency pada Lambda untuk melindungi database hilir dari kelebihan beban koneksi.
  • Terapkan Structured JSON Logging untuk memudahkan agregasi log ke ELK stack atau Datadog.
  • Lakukan pengujian beban (Load Testing) menggunakan k6 untuk memvalidasi batas skalabilitas.

Dengan memadukan Amazon EventBridge sebagai router event yang cerdas dan AWS Lambda sebagai mesin eksekusi komputasi tanpa server, organisasi Anda memiliki fondasi arsitektur enterprise yang tangguh, sangat skalibel, hemat biaya, dan tahan terhadap kegagalan kaskade.

🏷️ Tags: #Terraform #Aws #Serverless #Cloud Architecture #Event-Driven