Lambda — container image
Lambda bisa menjalankan container image, bukan cuma zip. Ini jalan keluar untuk dependensi berat, dan sekaligus menyamakan lingkungan lokal dengan production.
Intisari
- Batas image 10 GB, jauh di atas 250 MB (terurai) untuk paket zip.
- Image harus mengimplementasikan Lambda Runtime API — cara termudah: pakai base image resmi AWS.
- Image disimpan di Amazon ECR, di region dan akun yang sama dengan fungsinya.
- Arsitektur harus cocok: build
linux/amd64(atauarm64) — Mac Apple Silicon adalah jebakan klasik. - Cold start image besar lebih lambat; taruh dependensi di layer yang jarang berubah.
Kapan pindah dari zip ke image
| Situasi | Pilih |
|---|---|
| Cuma boto3 dan beberapa paket kecil | Zip — lebih cepat di-deploy dan cold start-nya lebih ringan |
Butuh numpy, pandas, parser PDF, tokenizer | Image |
Perlu biner sistem (mis. poppler, libmagic) | Image |
| Ingin menjalankan hal yang sama di lokal dan di Lambda | Image |
Dockerfile minimal
FROM public.ecr.aws/lambda/python:3.13
# Dependensi lebih dulu — layer ini di-cache selama requirements tidak berubah
COPY requirements.txt ${LAMBDA_TASK_ROOT}/
RUN pip install --no-cache-dir -r requirements.txt
# Baru kode aplikasi, yang berubah tiap commit
COPY app.py ${LAMBDA_TASK_ROOT}/
# CMD berisi handler, formatnya sama seperti setelan Handler pada zip
CMD [ "app.handler" ]
LAMBDA_TASK_ROOT sudah disetel oleh base image (/var/task). Base image resmi juga sudah
membawa runtime interface client, jadi kamu tidak perlu menulis loop Runtime API sendiri.
Build dan deploy
# PENTING di Mac Apple Silicon: sebutkan platform, atau fungsinya gagal jalan
docker build --platform linux/amd64 -t tanya-bedrock .
aws ecr create-repository --repository-name tanya-bedrock
aws ecr get-login-password --region us-east-1 \
| docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
docker tag tanya-bedrock:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/tanya-bedrock:latest
docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/tanya-bedrock:latest
aws lambda update-function-code \
--function-name tanya-bedrock \
--image-uri 123456789012.dkr.ecr.us-east-1.amazonaws.com/tanya-bedrock:latest
Jebakan arsitektur. Kalau kamu build di Mac Apple Silicon tanpa --platform, hasilnya
arm64. Fungsi Lambda yang disetel x86_64 akan menolaknya dengan pesan yang tidak
menyebut kata "arsitektur" sama sekali — biasanya Runtime.InvalidEntrypoint atau fungsi yang
mati tanpa log. Samakan keduanya secara eksplisit.
Menjalankan di lokal
Base image membawa runtime interface emulator, jadi image yang sama bisa diuji di laptop:
docker run --rm -p 9000:8080 \
-e AWS_REGION=us-east-1 \
-e MODEL_ID=... \
tanya-bedrock
curl -s "http://localhost:9000/2015-03-31/functions/function/invocations" \
-d '{"pertanyaan":"halo"}'
Ini keuntungan terbesar container image yang jarang disebut: siklus umpan balik lokal. Kamu bisa menjalankan handler yang sama persis, dengan dependensi yang sama persis, tanpa deploy.
Menjaga cold start tetap waras
- Pisahkan layer dependensi dari layer kode — Lambda meng-cache layer, jadi deploy kode kecil tetap cepat.
- Buang yang tidak dipakai:
--no-cache-dir, tanpa toolchain build di image akhir. - Impor paket berat di dalam fungsi kalau hanya sebagian jalur kode yang memakainya.
- Kalau cold start tetap kritis, pertimbangkan provisioned concurrency — dengan konsekuensi biaya tetap.
Latihan: kemas fungsi tanya-bedrock dari materi sebelumnya sebagai container image,
jalankan lokal dengan emulator, lalu deploy ke Lambda. Bandingkan durasi Init di CloudWatch antara versi zip
dan versi image — catat selisihnya, karena angka ini yang menentukan pilihanmu di proyek nyata.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.