Pengantar
Project ini adalah implementasi infrastruktur cloud AWS yang menggabungkan beberapa layanan AWS untuk membuat sistem order processing yang scalable dan robust. Sistem ini dirancang untuk menangani order dari dua sumber berbeda (S3 upload dan ALB HTTP request) dan memproses data melalui pipeline yang melibatkan Lambda, DynamoDB, dan SNS.
Teknologi yang digunakan:
- AWS VPC untuk isolated network
- AWS Lambda untuk serverless processing
- AWS S3 untuk object storage
- AWS DynamoDB untuk NoSQL database
- AWS SQS untuk message queue
- AWS SNS untuk notification service
- AWS Application Load Balancer (ALB) untuk routing
- EC2 untuk monitoring dashboard

Arsitektur Sistem
Alur sistem secara umum:
- Input: Order masuk dari S3 upload atau HTTP request melalui ALB
- Queue: Pesan ditampung di SQS
- Processing: Lambda proses membaca dari SQS dan memproses order
- Storage: Data disimpan ke DynamoDB dan S3 Archive
- Notification: Notifikasi dikirim melalui SNS
- Monitoring: Dashboard EC2 menampilkan real-time status order
Konfigurasi VPC
VPC adalah virtual network yang akan menampung semua resource AWS kita.
Langkah-Langkah Membuat VPC:
- Buka AWS Console → VPC Dashboard
- Pilih VPC only (jangan menggunakan VPC Wizard)
- Atur konfigurasi berikut:
- Name tag: lks-26
- IPv4 CIDR block: 10.0.0.0/16
- Klik Create VPC
Mengaktifkan DNS:
- Pilih VPC lks-26 yang baru dibuat
- Klik Actions → Edit VPC Settings
- Aktifkan:
- Enable DNS Resolution: Yes
- Enable DNS hostname: Yes
- Klik Save
Konfigurasi Subnet
Subnet adalah pembagian IP address dalam VPC. Kita membuat 4 subnet dengan 2 di zona us-east-1 dan 2 di zona us-east-2 untuk high availability.
Detail Subnet:
| Subnet Name | Availability Zone | IPv4 CIDR Block | Tipe |
|---|---|---|---|
| lks-public-A | us-east-1a | 10.0.1.0/24 | Public |
| lks-private-A | us-east-1a | 10.0.2.0/24 | Private |
| lks-public-B | us-east-2a | 10.0.3.0/24 | Public |
| lks-private-B | us-east-2a | 10.0.4.0/24 | Private |
Langkah Membuat Subnet:
- Buka VPC Dashboard → Subnets
- Klik Create Subnet
- Pilih VPC ID: lks-26
- Isi nama dan CIDR block sesuai tabel di atas
- Pilih Availability Zone yang sesuai
- Ulangi untuk 4 subnet
Internet Gateway & Route Table
Internet Gateway
Gateway ini memungkinkan komunikasi antara public subnet dengan internet.
- Buka Internet Gateways di VPC Console
- Klik Create Internet Gateway
- Atur:
- Name tag: LKS-IGW
- Klik Create
- Pilih IGW yang baru dibuat → Attach to VPC → Pilih lks-26
Route Table - Public
Route table untuk public subnet yang terhubung ke internet.
- Buka Route Tables
- Klik Create Route Table
- Atur:
- Name: LKS-RT-PUBLIC
- VPC: lks-26
- Tambahkan route:
- Destination: 0.0.0.0/0
- Target: LKS-IGW
- Associate Subnet: Pilih lks-public-A dan lks-public-B
Route Table - Private
Route table untuk private subnet (tidak terhubung langsung ke internet).
- Ulangi membuat route table baru
- Atur:
- Name: LKS-RT-PRIVATE
- VPC: lks-26
- Jangan tambahkan route ke internet (traffic lokal saja)
- Associate Subnet: Pilih lks-private-A dan lks-private-B
Security Group
Security Group berperan sebagai firewall untuk mengontrol traffic inbound dan outbound.
1. ALB-SG (Security Group untuk Load Balancer)
Menerima traffic HTTP publik dan meneruskan ke Lambda.
Inbound Rules:
- Type: HTTP | Port: 80 | Source: 0.0.0.0/0 (allow all)
Outbound Rules:
- Type: All Traffic | Destination: Lambda-SG
2. Lambda-SG (Security Group untuk Lambda Functions)
Menerima traffic dari ALB dan mengirim ke endpoints.
Inbound Rules:
- Type: HTTP | Port: 80 | Source: ALB-SG
Outbound Rules:
- Type: HTTPS | Port: 443 | Destination: Endpoint-SG (untuk SQS)
- Type: HTTPS | Port: 443 | Destination: 0.0.0.0/0 (untuk S3/DynamoDB)
3. Endpoint-SG (Security Group untuk VPC Endpoints)
Melindungi akses ke SQS endpoint dari Lambda.
Inbound Rules:
- Type: HTTPS | Port: 443 | Source: Lambda-SG
Outbound Rules:
- Allow all (default)
4. EC2-SG (Security Group untuk Monitoring & Grader)
Menerima traffic untuk dashboard monitoring dan API grader.
Inbound Rules:
- Type: HTTP | Port: 80 | Source: 0.0.0.0/0 (dashboard)
- Type: Custom TCP | Port: 5000 | Source: 0.0.0.0/0 (API grader)
- Type: SSH | Port: 22 | Source: Your IP (opsional, untuk remote)
Outbound Rules:
- Allow all (default)
VPC Endpoints
Endpoints memungkinkan akses ke AWS services dari private subnet tanpa melalui internet.
1. Gateway Endpoints (S3 & DynamoDB)
Langkah-langkah membuat Gateway Endpoint:
- Buka VPC Dashboard → Endpoints
- Klik Create Endpoint
- Cari service: com.amazonaws.us-east-1.s3 (type: Gateway)
- Pilih:
- VPC: lks-26
- Route Tables: Pilih LKS-RT-PRIVATE
- Klik Create Endpoint
- Ulangi untuk DynamoDB: com.amazonaws.us-east-1.dynamodb
2. Interface Endpoint (SQS)
Endpoint untuk akses SQS dari Lambda di private subnet.
- Buka Create Endpoint
- Cari service: com.amazonaws.us-east-1.sqs (type: Interface)
- Pilih:
- VPC: lks-26
- Subnets: lks-private-A dan lks-private-B
- Security Groups: Endpoint-SG
- PENTING: Aktifkan Enable DNS name → Ini memungkinkan Lambda menemukan SQS via DNS
- Klik Create Endpoint
AWS Services Setup
S3 Bucket
Buat 2 bucket S3 untuk menangani order files:
lks-orders (atau custom name) - Upload bucket
- Gunakan untuk upload file order
- Enable S3 Event Notification → Kirim event ke SQS
lks-archive (atau custom name) - Archive bucket
- Gunakan untuk menyimpan archive order yang sudah diproses
Cara setting S3 Event Notification:
- Pilih Upload Bucket → Properties → Event Notifications
- Buat notif event:
- Event types: All object create events
- Destination: SQS Queue
- Queue: OrdersQueue
DynamoDB
Database NoSQL untuk menyimpan data order.
- Buka DynamoDB → Create Table
- Atur:
- Table name: Orders
- Partition Key: OrderId (String)
- Klik Create Table
SQS
Message queue untuk komunikasi antara S3/ALB dan Lambda processor.
Buka SQS → Create Queue
Buat queue:
- OrdersQueue - Untuk menerima order dari S3
Set Queue Policy untuk OrdersQueue (allow S3 to send message):
| |
SNS
Notification service untuk mengirim email ketika order selesai diproses.
- Buka SNS → Create Topic
- Atur:
- Topic name: OrderNotification
- Display name: LKS Order Notification
- Klik Create Topic
- Masuk ke topic → Create Subscription
- Pilih Protocol: Email
- Isi Endpoint: Email kamu untuk menerima notifikasi
- Confirm subscription dari email yang dikirim SNS
Lambda Functions
Buat 2 Lambda function untuk processing:
Lambda 1: Ingest Function (menerima order dari ALB)
- Buka Lambda → Create Function
- Atur:
- Function name: LambdaIngest
- Runtime: Python 3.12
- Execution role: LabRole
- Klik Create
- Copy kode di bawah dan deploy
- Add trigger: ALB → Target group: LKS-TG
Lambda 2: Process Function (memproses order dari SQS)
- Ulangi membuat Lambda
- Atur:
- Function name: LambdaProses
- Runtime: Python 3.12
- Execution role: LabRole
- Klik Create
- Copy kode di bawah dan deploy
- Add trigger: SQS → Queue: OrdersQueue
Load Balancer & Target Group
Target Group
Target group menghubungkan ALB dengan Lambda Ingest.
- Buka EC2 → Target Groups
- Klik Create Target Group
- Atur:
- Target type: Lambda Function
- Target Group name: LKS-TG
- Lambda function: LambdaIngest
- Klik Create
Application Load Balancer
- Buka EC2 → Load Balancers
- Klik Create Load Balancer → Application Load Balancer
- Atur:
- Name: lks-alb
- Scheme: Internet-facing
- VPC: lks-26
- Availability Zones: Pilih subnets public (lks-public-A, lks-public-B)
- Security Groups: ALB-SG
- Konfigurasi Listener:
- Protocol: HTTP | Port: 80
- Forward to: Target Group LKS-TG
- Klik Create
- Tunggu hingga provisioning selesai
- Copy DNS Name untuk testing
Lambda Functions - Kode
Kode Lambda Ingest
Function ini menerima HTTP request dari ALB dan memasukkan pesan ke SQS OrderQueue.
| |
Penjelasan:
- Function ini menerima HTTP request dari ALB
- Parse body dari request sebagai JSON
- Kirim pesan ke OrderQueue di SQS untuk diproses kemudian
- Return response dengan status 201 (Created) jika berhasil menerima order
Kode Lambda Process
Function ini memproses order dari SQS, menyimpan ke DynamoDB, mengarsipkan ke S3, dan mengirim notifikasi SNS.
PENTING: Ganti variabel berikut dengan informasi actual Anda:
ARCHIVE_BUCKET: Nama S3 bucket archive AndaSNS_TOPIC_ARN: ARN dari SNS topic Anda
| |
Penjelasan:
- Membaca batch message dari SQS OrdersQueue
- Mengidentifikasi apakah order berasal dari S3 atau ALB berdasarkan struktur message
- Mengekstrak Order ID dan Item name
- Menyimpan order ke tabel DynamoDB Orders dengan status PROCESSED
- Mengarsipkan original message ke S3 Archive bucket dalam folder
archive/ - Mengirim notifikasi ke SNS Topic untuk subscriber (email)
- Handle error dengan logging detail
EC2 Monitoring
Buat instansi EC2 untuk menampilkan real-time monitoring dashboard dan API grader.
Persiapan EC2
- Buka AWS Console → EC2
- Klik Instances → Launch Instance
- Pilih konfigurasi:
- AMI: Amazon Linux 2 atau Fedora (yang support dnf package manager)
- Instance Type: t3.micro atau t2.micro
- VPC: lks-26
- Subnet: Public subnet (lks-public-A atau lks-public-B)
- Security Group: EC2-SG
- Storage: Default (8GB)
- Klik Launch
- Download private key (.pem file) untuk SSH access
Instalasi Dependencies di EC2
Setelah EC2 running, SSH ke instance dan jalankan commands berikut:
| |
Deploy Flask Monitoring App
- Buat file
app.pypada EC2 instance - Copy kode di bawah ke file tersebut
- Jalankan dengan sudo (karena port 80 memerlukan elevated privileges):
| |
Catatan Penting:
- Dashboard monitoring akan berjalan pada port 80 (HTTP)
- API Grader akan berjalan pada port 5000
- Dashboard auto-refresh setiap 5 detik
- Gunakan
sudokarena port 80 memerlukan root privileges
Kode Flask Monitoring App
| |
Penjelasan:
dashboard(): Route utama yang menampilkan HTML dashboard, auto-refresh setiap 5 detikgrader_api(): API endpoint untuk grader/penilaian, return data dalam format JSONrun_api(): Menjalankan Flask server untuk API di port 5000 dalam thread terpisah- Dashboard port 80 berjalan di thread utama (memerlukan sudo)
- Aplikasi membaca real-time data dari DynamoDB Orders table
Testing & Troubleshooting
Testing Flow
Test Upload ke S3:
1 2# Upload file ke S3 lks-orders bucket aws s3 cp test.txt s3://lks-orders/test.txt- File akan trigger S3 event notification
- Event dikirim ke SQS OrdersQueue
- Lambda process akan membaca dan memproses
Test via ALB HTTP:
1 2 3curl -X POST http://<ALB-DNS-NAME> \ -H "Content-Type: application/json" \ -d '{"orderId": "ORDER-001", "item": "Sample Item"}'- Request diterima ALB → Lambda Ingest
- Lambda Ingest memasukkan ke SQS OrderQueue
- Lambda process membaca dan memproses
Check Monitoring Dashboard:
- Buka browser ke
http://<EC2-PUBLIC-IP> - Lihat real-time order status
- Atau akses API via
http://<EC2-PUBLIC-IP>:5000/api/orders
- Buka browser ke