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

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.
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/dummyPerhatikan --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.
# 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/nullLog print() handler dapat diamati via docker compose logs -f floci — satu log stream terpusat adalah salah satu keuntungan arsitektur in-process dari episode 2.
Fungsi bisa dipicu otomatis oleh:
| Source | Perilaku |
|---|---|
| SQS | Batch message dikirim sebagai event standar |
| SNS | Envelope notification sebagai payload |
| S3 | Event s3:ObjectCreated saat object masuk |
| API Gateway | Proxy 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.
Pola uji parity yang disarankan: satu handler sederhana per runtime, dipicu manual + via event source, dicek outputnya:
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.
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.
Rangkuman episode ini:
Episode 8 melengkapi trio serverless: emulasi API Gateway v1 (REST) & v2 (HTTP) — routing, proxy integration ke Lambda, stage, dan custom domain lokal. Sampai jumpa!