← Semua pembelajaran / AWS untuk AI Engineer
Fase 1 · Serverless & Integrasi

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 (atau arm64) — 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

SituasiPilih
Cuma boto3 dan beberapa paket kecilZip — lebih cepat di-deploy dan cold start-nya lebih ringan
Butuh numpy, pandas, parser PDF, tokenizerImage
Perlu biner sistem (mis. poppler, libmagic)Image
Ingin menjalankan hal yang sama di lokal dan di LambdaImage

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

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.