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

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).
  • event adalah dict Python hasil parse JSON — bentuknya berbeda-beda per sumber pemicu.
  • context memberi aws_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

AtributGunanya
aws_request_idMenghubungkan 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_mbMetadata 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

PraktikKenapa
Client boto3 di luar handlerDipakai ulang antar pemanggilan; menghemat pembuatan koneksi TLS
Impor seperlunyaSetiap paket besar menambah cold start
Konfigurasi lewat environment variableSatu artefak, banyak lingkungan
Rahasia dari Secrets Manager, bukan env varEnv var terlihat di konsol dan di CloudFormation
Handler tipis, logika di modul terpisahLogikanya bisa diuji dengan pytest tanpa Lambda sama sekali
logger, bukan printLevel 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.