Belajar Floci - Lambda Emulation
Episode 7 of 28

Belajar Floci - Lambda Emulation

Emulasi Lambda di Floci: CreateFunction dan update code, invoke sync/async, event sources SQS/SNS/API Gateway, environment variables & layers, perilaku cold start — plus deploy fungsi image-resize yang dipicu event S3

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

Pendahuluan

Lambda adalah layanan yang paling menentukan kualitas sebuah AWS emulator — ia harus menjalankan kode sungguhan kalian (bukan mock), menerima event dengan format presisi, dan mengembalikan hasil sesuai runtime. Floci menjalankan fungsi Node.js, Python, dan Go secara lokal end-to-end.

Episode ini membahas lifecycle fungsi di Floci: create/update, dua mode invoke, event sources, environment & layers, hingga perilaku cold start yang perlu kalian pahami untuk interpretasi hasil test.

Fitur

CreateFunction & Update Code

Deploy fungsi Python
mkdir -p fn && cat > fn/handler.py <<'EOF'
def handler(event, context):
    print("dipanggil:", event)
    return {"statusCode": 200, "body": f"halo {event.get('name','dunia')}"}
EOF
 
cd fn && zip -q ../fn.zip handler.py && cd ..
 
aws --endpoint-url=http://localhost:4566 lambda create-function \
  --function-name hello \
  --runtime python3.12 \
  --handler handler.handler \
  --zip-file fileb://fn.zip \
  --role arn:aws:iam::000000000000:role/dummy

Perhatikan --role tetap wajib secara API (format ARN valid) namun tidak divalidasi terhadap policy — konsisten dengan model credential longgar Floci (episode 9). Update iteratif memakai update-function-code --zip-file.

Invoke Sync & Async

Dua mode invoke
# Sync: response langsung berisi hasil handler
aws --endpoint-url=http://localhost:4566 lambda invoke \
  --function-name hello \
  --payload '{"name":"floci"}' out.json && cat out.json
 
# Async: langsung 202 Accepted, eksekusi berjalan di belakang
aws --endpoint-url=http://localhost:4566 lambda invoke \
  --function-name hello \
  --invocation-type Event \
  --payload '{"name":"async"}' /dev/null

Log print() handler dapat diamati via docker compose logs -f floci — satu log stream terpusat adalah salah satu keuntungan arsitektur in-process dari episode 2.

Event Sources, Environment & Layers

Fungsi bisa dipicu otomatis oleh:

SourcePerilaku
SQSBatch message dikirim sebagai event standar
SNSEnvelope notification sebagai payload
S3Event s3:ObjectCreated saat object masuk
API GatewayProxy integration (episode 8)

Environment variables diset via --environment 'Variables={STAGE=local}'; layers didukung untuk paket dependensi bersama. Cold start terjadi ketika worker runtime belum siap — invoke pertama lebih lambat dari berikutnya, persis semantik AWS (meski magnitudonya jauh lebih kecil tanpa infrastruktur microVM).

Note

Karena cold start lokal jauh lebih murah daripada produksi, jangan gunakan pengukuran latensi emulator sebagai proyeksi performa AWS — gunakan hanya untuk kebenaran logika.

Real-World

Handler Node.js/Python/Go End-to-End

Pola uji parity yang disarankan: satu handler sederhana per runtime, dipicu manual + via event source, dicek outputnya:

Matriks smoke test runtime
python3.12 -> invoke sync -> body JSON benar      [x]
nodejs20.x  -> invoke sync -> body JSON benar     [x]
provided.al2023 (Go) -> invoke sync -> OK         [x]
python3.12 <- trigger SQS batch -> log terlihat   [x]

Runtime spesifik yang didukung mengikuti rilis Floci — cek matrix resmi bila tim memakai runtime eksotis.

Praktik

Target outline: deploy fungsi image-resize yang dipicu event S3.

import json, boto3, urllib.parse
 
s3 = boto3.client("s3", endpoint_url="http://localhost:4566")
 
def handler(event, context):
    for rec in event["Records"]:
        bucket = rec["s3"]["bucket"]["name"]
        key = urllib.parse.unquote_plus(rec["s3"]["object"]["key"])
        body = s3.get_object(Bucket=bucket, Key=key)["Body"].read()
        # simulasi resize: tulis versi thumbnail
        s3.put_object(Bucket=bucket, Key=key.replace("original/", "thumb/"),
                      Body=body[:100], ContentType="image/png")
        print(f"resized {key}")
    return {"ok": True}

Alur ini — upload → event → fungsi → tulis hasil → verifikasi log — adalah replika persis pipeline produksi image-processing, berjalan sepenuhnya di laptop.

Penutup

Rangkuman episode ini:

  • Lifecycle Lambda: create/update via zip, invoke sync (return value) vs async (202 + background).
  • Event sources SQS/SNS/S3/API GW; env vars & layers didukung; cold start ada tapi magnitudo beda dari produksi.
  • Praktik: fungsi resize terpicu event S3 — pola serverless klasik end-to-end lokal.

Episode 8 melengkapi trio serverless: emulasi API Gateway v1 (REST) & v2 (HTTP) — routing, proxy integration ke Lambda, stage, dan custom domain lokal. Sampai jumpa!

Belajar Floci - Lambda Emulation | Belajar Floci