Membangun fungsi serverless dengan runtime Python, Node, Java, .NET 10, dan Go, menguasai create-function dan invoke, memahami cold start serta hot reload, lalu men-trigger Lambda dari event S3 dan SQS.

Di episode 6 kita membedah DynamoDB sebagai penyimpanan, dan di episode 5 S3 sebagai object store. Kali ini kita masuk ke otak dari arsitektur serverless: AWS Lambda. Lambda adalah tulang punggung hampir semua pola event-driven di AWS — dari memproses file upload, membaca message queue, sampai melayani request API Gateway. Karena itu, memahami cara kerja Lambda di LocalStack adalah keterampilan paling berharga di seri ini.
Di episode ini kalian akan membangun fungsi dari nol, menjalankannya di lima runtime berbeda, membedah perilaku cold start, dan menyambungkannya ke trigger S3 serta SQS.
Sebelum deploy, kalian butuh kode handler. Lambda Python mengekspektasikan fungsi dengan signature (event, context) yang mengembalikan nilai JSON-serializable:
def handler(event, context):
print("event diterima:", event)
return {
"statusCode": 200,
"body": "Halo dari LocalStack Lambda!"
}ZIP dulu folder handler-nya, lalu deploy:
zip -r function.zip handler.py
awslocal lambda create-function \
--function-name hello \
--runtime python3.12 \
--role arn:aws:iam::000000000000:role/lambda-role \
--handler handler.handler \
--zip-file fileb://function.zipRole yang dipakai adalah ARN fiktif. LocalStack tidak memvalidasi IAM seketat AWS asli — tujuannya agar perintah terlihat identik dengan produksi. Endpoint tujuan tetap http://localhost:4566 karena semua perintah dipancarkan lewat awslocal, wrapper dari aws --endpoint-url.
awslocal lambda invoke --function-name hello \
--payload '{"nama": "Arman"}' output.json
cat output.jsonLocalStack mengeksekusi fungsi secara nyata dalam container, bukan sekadar mock. Untuk menelusuri proses internalnya, jalankan localstack logs sambil memicu invoke.
Salah satu kekuatan LocalStack adalah parity runtime: kalian bisa deploy kode untuk stack bahasa apa pun tanpa men-download emulator khusus:
| Runtime | Nilai runtime | Catatan |
|---|---|---|
| Python | python3.12 / python3.13 | Paling cepat untuk prototyping |
| Node.js | nodejs22.x | Runtime populer untuk API |
| Java | java21 | Perlu build JAR/zip |
| .NET 10 | dotnet10 | Runtime terbaru, didukung sejak 2026.x |
| Go | provided.al2023 | Compile binary, pakai custom runtime |
Perintahnya sama persis, tinggal ganti flag --runtime dan handler. Untuk Go, handler diarahkan ke binary executable, bukan nama fungsi:
GOOS=linux GOARCH=amd64 go build -o bootstrap main.go
zip -r go-function.zip bootstrap
awslocal lambda create-function \
--function-name go-fn --runtime provided.al2023 \
--role arn:aws:iam::000000000000:role/lambda-role \
--handler bootstrap --zip-file fileb://go-function.zipSaat fungsi dipanggil setelah lama idle, runtime harus "dinyalakan" dulu: pull image, inisialisasi runtime, lalu jalankan handler. Ini disebut cold start dan menambah latensi hingga beberapa detik. Panggilan berikutnya memakai instance hangat (warm) sehingga jauh lebih cepat. Di LocalStack, invoke pertama hampir selalu cold — ini mengajarkan kalian menulis kode yang tidak mengasumsikan state antar invoke.
Redeploy dengan ZIP setiap kali ganti satu baris itu lambat. Untuk dev loop cepat, LocalStack menyediakan hot reload via volume mount. Jalankan container dengan env var LAMBDA_MOUNT_CWD yang menunjuk ke folder kode:
services:
localstack:
image: localstack/localstack:latest
ports:
- "4566:4566"
environment:
- LAMBDA_MOUNT_CWD=/code
volumes:
- ./functions:/codeSekarang edit functions/handler.py, dan fungsi yang menunjuk ke folder itu akan langsung memakai kode terbaru tanpa update-function-code. Ini pola yang dipakai tim untuk iterasi cepat.
Warning
Hot reload hanya menyegarkan kode yang di-mount. Perubahan runtime, environment variables, atau handler tetap butuh awslocal lambda update-function-configuration.
Setiap fungsi butuh konfigurasi seperti nama tabel atau log level. Kirim lewat --environment:
awslocal lambda create-function \
--function-name config-fn --runtime python3.12 \
--role arn:aws:iam::000000000000:role/lambda-role \
--handler handler.handler --zip-file fileb://function.zip \
--environment 'Variables={ENV=dev,LOG_LEVEL=debug}'Di dalam handler, baca lewat os.environ.get("ENV") seperti biasa — sintaksnya identik dengan AWS asli.
Layer membagikan dependency antar fungsi (misal library boto3 ekstra atau utilitas internal). Publikasikan layer sekali, lalu pasang di banyak fungsi:
zip -r layer.zip python/
awslocal lambda publish-layer-version \
--layer-name deps --zip-file fileb://layer.zip
awslocal lambda create-function \
--function-name with-layer --runtime python3.12 \
--role arn:aws:iam::000000000000:role/lambda-role \
--handler handler.handler --zip-file fileb://function.zip \
--layers "arn:aws:lambda:us-east-1:000000000000:layer:deps:1"Lambda jarang dipanggil manual; ia dijalankan oleh event. Dua trigger paling umum adalah S3 (object dibuat/dihapus) dan SQS (pesan masuk).
awslocal s3 mb s3://uploads
awslocal lambda create-function \
--function-name resize --runtime python3.12 \
--role arn:aws:iam::000000000000:role/lambda-role \
--handler handler.handler --zip-file fileb://function.zip
awslocal s3api put-bucket-notification-configuration \
--bucket uploads --notification-configuration \
'{"LambdaFunctionConfigurations":[{"LambdaFunctionArn":"arn:aws:lambda:us-east-1:000000000000:function:resize","Events":["s3:ObjectCreated:*"]}]}'
awslocal s3 cp image.jpg s3://uploads/image.jpgUntuk SQS, pakai event source mapping. LocalStack menarik pesan dari queue dan meng-invoke fungsi secara otomatis:
awslocal sqs create-queue --queue-name jobs
awslocal lambda create-event-source-mapping \
--function-name worker \
--event-source-arn arn:aws:sqs:us-east-1:000000000000:jobs
awslocal sqs send-message --queue-url http://localhost:4566/000000000000/jobs \
--message-body '{"id": 42}'Cek log fungsi dengan localstack logs — kalian akan melihat payload pesan masuk sebagai event.
Tip
Teliti ARN saat event source mapping: formatnya arn:aws:sqs:<region>:<account>:<queue-name>. Salah account atau region membuat mapping tidak pernah memicu invoke.
Rangkuman episode ini:
awslocal lambda create-function dan jalankan dengan awslocal lambda invoke; role IAM fiktif sudah cukup untuk emulasi.provided.al2023.LAMBDA_MOUNT_CWD untuk hot reload.Lambda kini menyala di emulator kalian. Tapi fungsi yang dipanggil satu-satu tidak banyak berguna — arsitektur event-driven butuh pipa pesan. Di episode 8 kita membedah SQS dan SNS: membuat queue dan topic, mengirim-menerima pesan, dead-letter queue, visibility timeout, hingga pola fan-out. Sampai jumpa!