Belajar LocalStack - Core Service: Lambda
Episode 7 of 23

Belajar LocalStack - Core Service: Lambda

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.

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

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.

Membangun Function Pertama dengan Python

Struktur Proyek

Sebelum deploy, kalian butuh kode handler. Lambda Python mengekspektasikan fungsi dengan signature (event, context) yang mengembalikan nilai JSON-serializable:

Pythonhandler.py
def handler(event, context):
    print("event diterima:", event)
    return {
        "statusCode": 200,
        "body": "Halo dari LocalStack Lambda!"
    }

ZIP dulu folder handler-nya, lalu deploy:

Pack dan deploy fungsi Python
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.zip

Role 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.

Invoke

Invoke fungsi dan lihat hasilnya
awslocal lambda invoke --function-name hello \
  --payload '{"nama": "Arman"}' output.json
cat output.json

LocalStack mengeksekusi fungsi secara nyata dalam container, bukan sekadar mock. Untuk menelusuri proses internalnya, jalankan localstack logs sambil memicu invoke.

Mendukung Banyak Runtime

Salah satu kekuatan LocalStack adalah parity runtime: kalian bisa deploy kode untuk stack bahasa apa pun tanpa men-download emulator khusus:

RuntimeNilai runtimeCatatan
Pythonpython3.12 / python3.13Paling cepat untuk prototyping
Node.jsnodejs22.xRuntime populer untuk API
Javajava21Perlu build JAR/zip
.NET 10dotnet10Runtime terbaru, didukung sejak 2026.x
Goprovided.al2023Compile binary, pakai custom runtime

Perintahnya sama persis, tinggal ganti flag --runtime dan handler. Untuk Go, handler diarahkan ke binary executable, bukan nama fungsi:

Deploy fungsi Go
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.zip

Cold Start & Hot Reload

Apa itu Cold Start

Saat 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.

Hot Reload Tanpa Redeploy

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:

docker-compose.yml dengan hot reload
services:
  localstack:
    image: localstack/localstack:latest
    ports:
      - "4566:4566"
    environment:
      - LAMBDA_MOUNT_CWD=/code
    volumes:
      - ./functions:/code

Sekarang 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.

Environment Variables & Layers

Variabel Lingkungan

Setiap fungsi butuh konfigurasi seperti nama tabel atau log level. Kirim lewat --environment:

Set env vars saat deploy
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 untuk Berbagi Dependency

Layer membagikan dependency antar fungsi (misal library boto3 ekstra atau utilitas internal). Publikasikan layer sekali, lalu pasang di banyak fungsi:

Publish dan pasang layer
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"

Men-trigger Lambda dari S3 & SQS

Lambda jarang dipanggil manual; ia dijalankan oleh event. Dua trigger paling umum adalah S3 (object dibuat/dihapus) dan SQS (pesan masuk).

Trigger dari S3

Pasang notifikasi S3 ke Lambda
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.jpg

Event Source Mapping dari SQS

Untuk SQS, pakai event source mapping. LocalStack menarik pesan dari queue dan meng-invoke fungsi secara otomatis:

Hubungkan SQS ke Lambda
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.

Penutup

Rangkuman episode ini:

  • Deploy fungsi dengan awslocal lambda create-function dan jalankan dengan awslocal lambda invoke; role IAM fiktif sudah cukup untuk emulasi.
  • Lima runtime siap pakai: Python, Node, Java, .NET 10, dan Go via provided.al2023.
  • Cold start terjadi pada invoke pertama; gunakan LAMBDA_MOUNT_CWD untuk hot reload.
  • Environment variables dan layer berfungsi penuh dan identik sintaksnya dengan produksi.
  • Trigger S3 dan SQS memanggil fungsi secara otomatis melalui notifikasi dan event source mapping.

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!

Belajar LocalStack - Core Service: Lambda | Belajar LocalStack