Lambda — handler Python
Handler adalah satu fungsi Python dengan dua argumen. Yang perlu dipelajari bukan sintaksnya, melainkan apa yang boleh dan tidak boleh dikerjakan di dalamnya.
Intisari
- Tanda tangannya
def handler(event, context); namanya bebas, tapi harus cocok dengan setelan Handler (file.fungsi). eventadalahdictPython hasil parse JSON — bentuknya berbeda-beda per sumber pemicu.contextmemberiaws_request_id, sisa waktu, dan nama fungsi — pakai untuk logging dan batas waktu.- Buat client boto3 di luar handler; impor pun sebaiknya seminimal mungkin.
- Nilai balik harus bisa di-JSON-kan. Untuk API Gateway, bentuknya harus persis (
statusCode,body).
Bentuk minimal
import json
import logging
import os
import boto3
# ── Init: sekali per lingkungan eksekusi ─────────────────────────────
logger = logging.getLogger()
logger.setLevel(os.environ.get("LOG_LEVEL", "INFO"))
bedrock = boto3.client("bedrock-runtime")
MODEL_ID = os.environ["MODEL_ID"] # gagal cepat kalau lupa di-set
def handler(event, context):
logger.info("permintaan masuk", extra={"request_id": context.aws_request_id})
pertanyaan = event.get("pertanyaan", "")
if not pertanyaan:
return {"statusCode": 400, "body": json.dumps({"error": "pertanyaan kosong"})}
resp = bedrock.converse(
modelId=MODEL_ID,
messages=[{"role": "user", "content": [{"text": pertanyaan}]}],
)
jawaban = resp["output"]["message"]["content"][0]["text"]
return {
"statusCode": 200,
"headers": {"Content-Type": "application/json"},
"body": json.dumps({"jawaban": jawaban}, ensure_ascii=False),
}
Setelan Handler adalah modul.fungsi. Kalau file-mu app.py dan
fungsinya handler, isinya app.handler. Salah di sini menghasilkan
Unable to import module — error yang terlihat seperti masalah dependensi padahal cuma salah nama.
event: bentuknya tergantung siapa yang memanggil
Ini sumber kebingungan terbesar bagi pendatang baru. Tidak ada satu bentuk event; ia adalah
JSON apa pun yang dikirim pemicu. Bandingkan:
// Pemanggilan langsung (aws lambda invoke) — persis yang kamu kirim
{ "pertanyaan": "apa itu RAG?" }
// API Gateway HTTP API — permintaanmu terbungkus amplop
{
"version": "2.0",
"rawPath": "/tanya",
"headers": { "content-type": "application/json" },
"body": "{\"pertanyaan\":\"apa itu RAG?\"}",
"isBase64Encoded": false
}
// SQS — beberapa pesan sekaligus dalam satu pemanggilan
{ "Records": [ { "messageId": "…", "body": "{\"pertanyaan\":\"…\"}" } ] }
Perhatikan API Gateway: body adalah string, bukan objek. Melewatkan
json.loads() di sini adalah kesalahan hari pertama yang hampir universal.
def handler(event, context):
body = json.loads(event.get("body") or "{}") # API Gateway
pertanyaan = body.get("pertanyaan", "")
context: yang berguna cuma tiga
| Atribut | Gunanya |
|---|---|
aws_request_id | Menghubungkan log dengan satu permintaan. Selalu ikutkan di setiap baris log. |
get_remaining_time_in_millis() | Sisa waktu sebelum timeout — untuk memutuskan berhenti dengan rapi alih-alih dibunuh paksa. |
function_name, memory_limit_in_mb | Metadata untuk log dan metrik. |
SISA_AMAN_MS = 5_000
def handler(event, context):
for dokumen in daftar_dokumen:
if context.get_remaining_time_in_millis() < SISA_AMAN_MS:
# Berhenti rapi: kembalikan sisa pekerjaan supaya bisa dilanjutkan,
# daripada dibunuh di tengah jalan tanpa jejak.
return {"sisa": daftar_dokumen[dokumen.index:]}
proses(dokumen)
Praktik kode yang berdampak besar
| Praktik | Kenapa |
|---|---|
| Client boto3 di luar handler | Dipakai ulang antar pemanggilan; menghemat pembuatan koneksi TLS |
| Impor seperlunya | Setiap paket besar menambah cold start |
| Konfigurasi lewat environment variable | Satu artefak, banyak lingkungan |
| Rahasia dari Secrets Manager, bukan env var | Env var terlihat di konsol dan di CloudFormation |
| Handler tipis, logika di modul terpisah | Logikanya bisa diuji dengan pytest tanpa Lambda sama sekali |
logger, bukan print | Level dan format terstruktur; jauh lebih enak di CloudWatch Logs Insights |
Latihan: ubah fungsi Fase 1 sebelumnya jadi dua file: app.py berisi handler tipis, dan
logika.py berisi fungsi murni yang menerima string dan mengembalikan string. Tulis satu tes
pytest untuk logika.py yang berjalan di laptopmu tanpa menyentuh AWS sama sekali.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.