Roadmap Belajar

AWS untuk AI Engineer

Lanjutan dari Python untuk AI Engineer. Kamu sudah bisa membangun RAG chatbot di laptopmu; roadmap ini tentang menjalankannya untuk orang lain — dengan izin yang benar, biaya yang terkendali, pengaman yang aktif, dan bukti bahwa kualitasnya tidak diam-diam menurun.

Tiga fase pertama menutup gap infrastruktur yang sering dilewati AI engineer: IAM, serverless, IaC. Enam fase berikutnya masuk ke Bedrock secara mendalam. Semuanya dipetakan ke domain AWS Certified Generative AI Developer – Professional (AIP-C01) beserta bobotnya.

Durasi
~12 minggu
Beban
~8 jam/minggu
Prasyarat
Bisa Python, paham HTTP
Target akhir
Lulus AIP-C01

Prinsip: AWS itu luas, ujiannya tidak

AWS punya lebih dari dua ratus layanan. Yang relevan untuk peran GenAI developer jauh lebih sedikit, dan exam guide AIP-C01 menyebutkan sendiri apa yang di luar cakupan. Daftar yang dilewati sama pentingnya dengan daftar yang dipelajari:

Bobot domain ujian — ini yang menentukan prioritas

DomainBobotFase
1 — Foundation Model Integration, Data Management, Compliance31%3, 4
2 — Implementation and Integration26%1, 2, 5
3 — AI Safety, Security, and Governance20%0, 6
4 — Operational Efficiency and Optimization12%7
5 — Testing, Validation, and Troubleshooting11%7

Domain 1 dan 2 menyumbang 57%. Kalau waktumu habis di tengah jalan, Fase 3, 4, dan 5 yang tidak boleh dilewati.

0

Fondasi AWS & IAM

1 minggu IAMIdentity Centerboto3budget

Tujuan: punya akses AWS yang aman dari laptopmu, tanpa satu pun kredensial permanen tersimpan — dan pagar tagihan yang sudah terpasang sebelum resource pertama dibuat.

Perhatian: banyak tutorial AWS masih mengajarkan "buat IAM user, buat access key, tempel di ~/.aws/credentials". Jangan ikuti. Pola itu sudah ditinggalkan — mulai langsung dari IAM Identity Center dengan kredensial berumur pendek.

Alur setup sekali jalan

# 1. Aktifkan IAM Identity Center di konsol, buat user + permission set PowerUserAccess
# 2. Sambungkan CLI
aws configure sso                     # isi portal URL, region, nama profil

# 3. Login harian
aws sso login --profile belajar
export AWS_PROFILE=belajar

# 4. Verifikasi — perintah diagnostik nomor satu
aws sts get-caller-identity

# 5. Lihat model yang tersedia
aws bedrock list-foundation-models --region us-east-1 \
  --query 'modelSummaries[].modelId' --output table

Empat hal yang harus benar sejak hari pertama

HalKenapa
MFA di root, root tidak dipakai lagiRoot tidak bisa dibatasi policy apa pun
Tidak ada access key jangka panjangMenghapus seluruh kelas masalah "key bocor"
Budget + alert forecastBedrock ditagih per token; loop yang kabur itu mahal
Tag proyek di setiap resourceLaporan biaya per-proyek, dan filter anomali di Fase 7

Materi

✓ Checkpoint

Kamu bisa login lewat SSO, menjalankan skrip Python yang memanggil AWS tanpa satu pun rahasia di disk, dan menjelaskan kenapa AccessDenied tertentu disebabkan Deny, bukan kurang Allow.

1

Serverless & Integrasi

1,5 minggu LambdaAPI GatewaySQSEventBridgeStep Functions

Tujuan: bisa menjalankan kode Python-mu di AWS sebagai respons atas permintaan HTTP, pesan antrean, atau jadwal — dan tahu kapan masing-masing dipakai.

Ini fondasi Domain 2 (26%). Semua yang kamu bangun di fase berikutnya berjalan di atas potongan-potongan ini: knowledge base disinkronkan oleh EventBridge, ingest besar dipecah lewat SQS, alur agent diorkestrasi Step Functions, dan chatbot-mu dilayani Lambda di balik API Gateway.

Memilih komponen

KebutuhanPakaiBatas yang mengikat
Jalankan kode atas suatu eventLambda15 menit, payload 6 MB
Endpoint HTTP publikAPI Gateway HTTP APITimeout integrasi 30 detik
Kerjakan nanti, serap lonjakanSQSVisibility timeout harus > durasi consumer
Beri tahu banyak pendengarEventBridgePengiriman asinkron, bisa berulang
Alur berlangkah dengan retryStep FunctionsStandard sampai 1 tahun
Jadwal berkalaEventBridge Scheduler—

Handler yang layak dicontoh

import json, os, logging
import boto3

# Init — sekali per lingkungan eksekusi, bukan per permintaan
logger = logging.getLogger()
logger.setLevel(os.environ.get("LOG_LEVEL", "INFO"))
bedrock = boto3.client("bedrock-runtime")
MODEL_ID = os.environ["MODEL_ID"]


def handler(event, context):
    body = json.loads(event.get("body") or "{}")     # API Gateway: body itu STRING
    pertanyaan = body.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}]}],
        inferenceConfig={"maxTokens": 512},
    )

    logger.info(json.dumps({
        "request_id": context.aws_request_id,
        "token_masuk": resp["usage"]["inputTokens"],
        "token_keluar": resp["usage"]["outputTokens"],
    }))

    return {
        "statusCode": 200,
        "headers": {"Content-Type": "application/json"},
        "body": json.dumps(
            {"jawaban": resp["output"]["message"]["content"][0]["text"]},
            ensure_ascii=False,
        ),
    }

Idempotensi bukan opsional di sini. SQS dan EventBridge mengirim ulang saat gagal, dan pada antrean Standard pesan bisa datang dua kali walau tidak ada yang gagal. Handler yang memanggil Bedrock lalu menulis ke database akan membayar token dua kali dan menyimpan data dobel. Turunkan kunci idempotensi dari messageId, dan cek sebelum bekerja.

Materi

✓ Checkpoint

Kamu punya endpoint HTTP yang memanggil Bedrock, sebuah antrean berisi DLQ yang memproses pekerjaan latar, dan satu state machine yang mengarahkan pertanyaan ke model berbeda berdasarkan panjangnya.

2

IaC & CI/CD

1 minggu CloudFormationCDKCodePipelineCodeBuild

Tujuan: semua yang kamu buat manual di Fase 1 berpindah ke kode, ter-review, dan bisa di-deploy ulang dari nol — termasuk gerbang kualitas sebelum rilis.

Alasannya bukan kerapian. Aplikasi GenAI punya banyak resource yang saling terkait — knowledge base, vector store, role, guardrail, alarm — dan mengurusnya lewat konsol berarti tidak ada seorang pun yang tahu keadaan sebenarnya setelah dua minggu.

Stack minimal dengan CDK

from aws_cdk import Duration, Stack, aws_lambda as lambda_, aws_iam as iam
from constructs import Construct


class TanyaBedrockStack(Stack):
    def __init__(self, scope: Construct, id: str, **kwargs):
        super().__init__(scope, id, **kwargs)

        fn = lambda_.Function(
            self, "FungsiTanya",
            runtime=lambda_.Runtime.PYTHON_3_13,
            handler="app.handler",
            code=lambda_.Code.from_asset("../src"),
            timeout=Duration.seconds(60),
            memory_size=1024,
            tracing=lambda_.Tracing.ACTIVE,          # X-Ray, dipakai di Fase 7
            environment={"MODEL_ID": MODEL_ID},
        )

        fn.add_to_role_policy(iam.PolicyStatement(
            actions=["bedrock:InvokeModel", "bedrock:InvokeModelWithResponseStream"],
            resources=[f"arn:aws:bedrock:{self.region}::foundation-model/{MODEL_ID}"],
        ))

Pipeline untuk aplikasi LLM

StageIsiGerbang gagal
Buildruff, mypyLint atau type check merah
Testpytest, Bedrock di-mockTes gagal
EvalDataset pertanyaan emas → modelSkor turun dari baseline
Deploy stagingcdk deploy ke akun devRollback CloudFormation
ApprovePersetujuan manualDitolak
Deploy prodcdk deploy ke akun prod—

Stage Eval adalah yang membedakan pipeline aplikasi LLM. Mengubah satu kalimat di prompt tidak membuat satu pun tes unit gagal, tapi bisa menjatuhkan kualitas jawaban. Isi teknisnya dibangun di Fase 7 — kerangkanya dipasang sekarang.

Materi

✓ Checkpoint

Seluruh infrastruktur Fase 1 hidup sebagai satu stack CDK, ter-deploy lewat pipeline yang berjalan otomatis dari git push, dan kamu bisa membaca keluaran cdk diff untuk mengenali resource mana yang akan diganti, bukan diperbarui.

3

Bedrock Dasar

1,5 minggu Conversestreaminginference profileprompt caching Domain 1 · 31%

Tujuan: memanggil foundation model dari kode dengan benar — termasuk streaming, pencatatan biaya, penanganan throttle, dan pemilihan strategi perutean.

Converse: satu bentuk untuk semua model

resp = runtime.converse(
    modelId=MODEL_ID,
    system=[{"text": "Jawab ringkas dan berbahasa Indonesia."}],
    messages=[{"role": "user", "content": [{"text": pertanyaan}]}],
    inferenceConfig={"maxTokens": 512, "temperature": 0.2},
)

jawaban = resp["output"]["message"]["content"][0]["text"]
pakai   = resp["usage"]          # inputTokens, outputTokens — CATAT SEJAK HARI PERTAMA

if resp["stopReason"] == "max_tokens":
    ...                          # jawaban TERPOTONG, jangan disimpan sebagai final

Tiga jebakan yang hampir semua orang temui di fase ini: (1) akses model harus diaktifkan per akun per region — ini terpisah dari IAM; (2) converse ada di client bedrock-runtime, bukan bedrock; (3) system prompt punya field sendiri, bukan pesan ber-role system.

Empat tombol yang menentukan biaya dan latensi

TombolEfekKapan
maxTokensBatas token keluaran — yang paling mahalSelalu
Pilihan modelSering perbedaan terbesarTugas sederhana → model kecil
Prompt cachingPrefiks panjang tidak dihitung ulangDokumen atau instruksi yang berulang
Inference profileKetersediaan naik; global ~10% lebih murahSering kena throttle

Materi

✓ Checkpoint

Kamu bisa mengalirkan jawaban model token demi token ke terminal, mencatat token masuk dan keluar setiap permintaan, dan menjelaskan kapan inference profile geografis wajib dipakai alih-alih yang global.

4

RAG & Knowledge Bases

2 minggu Knowledge Baseschunkingembeddingrerank Domain 1 · 31%

Tujuan: menjawab pertanyaan berdasarkan dokumenmu sendiri, dengan sitasi yang benar — dan tahu tombol mana yang diputar saat jawabannya salah.

Fase terberat sekaligus paling berbobot. Di learn-python kamu membangun RAG manual dengan ChromaDB; di sini setiap komponennya punya padanan terkelola, dan yang perlu dipelajari adalah keputusan-keputusannya, bukan kodenya.

Peta keputusan

KeputusanPilihanDampak
Jenis knowledge baseManaged vs customer-managedKendali vs beban operasional
ChunkingDefault, fixed, hierarchical, semanticTerbesar — dan mengubahnya berarti ingest ulang
Model embedding & dimensiTitan V2: 1.024 / 512 / 256Kualitas vs biaya; tidak bisa diganti tanpa ingest ulang
Vector storeOpenSearch, Aurora, Neptune, S3 vectorBiaya, filter, hybrid search
Jenis pencarianSemantic vs hybridHybrid menolong untuk kode produk dan singkatan
RerankerYa / tidakAmbil 25, kirim 5 — sering menurunkan total biaya

Retrieve, lalu susun sendiri

agen = boto3.client("bedrock-agent-runtime")

hasil = agen.retrieve(
    knowledgeBaseId=KB_ID,
    retrievalQuery={"text": pertanyaan},
    retrievalConfiguration={"vectorSearchConfiguration": {
        "numberOfResults": 10,
        "overrideSearchType": "HYBRID",
        "filter": {"equals": {"key": "departemen", "value": departemen_pengguna}},
    }},
)

for p in hasil["retrievalResults"]:
    print(round(p["score"], 3), p["content"]["text"][:80], "←", p["location"])

Filter metadata harus datang dari identitas, bukan dari permintaan. Kalau nilai departemen diambil dari body yang dikirim klien, pengguna bisa mengubahnya dan membaca dokumen tim lain. Ambil dari klaim token yang sudah diverifikasi authorizer.

Urutan menyetel saat jawaban salah

  1. Chunking — dampak terbesar, tapi butuh ingest ulang
  2. Filter metadata — murah dan langsung terasa
  3. Hybrid search — satu setelan
  4. Jumlah potongan — coba 5, 10, 20 lalu ukur
  5. Reranker — kalau jawaban benar sering ada di peringkat 6–15
  6. Prompt generasi — untuk nada dan pengendalian halusinasi

Materi

✓ Checkpoint

Knowledge base-mu menjawab sepuluh pertanyaan nyata dengan sitasi yang benar, filter metadata mencegah kebocoran antar departemen, dan kamu punya angka yang membandingkan dua strategi chunking — bukan sekadar kesan.

5

Agent, Tool Use & MCP

1,5 minggu tool useAgentCoreMCPStrands Domain 2 · 26%

Tujuan: model bisa memanggil fungsimu, dengan batas yang jelas — dan kamu tahu kapan agent bukan jawabannya.

Loop yang harus kamu pahami dulu

pesan = [{"role": "user", "content": [{"text": pertanyaan}]}]

for _ in range(MAKS_GILIRAN):                 # batas langkah — WAJIB ada
    resp = runtime.converse(modelId=MODEL_ID, messages=pesan, toolConfig=TOOLS)
    pesan.append(resp["output"]["message"])   # simpan jawaban model apa adanya

    if resp["stopReason"] != "tool_use":
        break

    hasil = []
    for blok in resp["output"]["message"]["content"]:
        if "toolUse" in blok:
            minta = blok["toolUse"]
            nilai = FUNGSI[minta["name"]](**minta["input"])
            hasil.append({"toolResult": {
                "toolUseId": minta["toolUseId"],       # harus persis
                "content": [{"json": nilai}],
            }})

    pesan.append({"role": "user", "content": hasil})   # role user, bukan assistant

Memilih tingkat abstraksi

PendekatanKendaliBebanUntuk
Loop tool use sendiriPenuhSemua kamuBelajar, alur sederhana
Step FunctionsTinggi, deklaratifRendahAlur dengan aturan tegas
Strands AgentsTinggiRendahAgent kustom dalam Python
AgentCore HarnessSedangSangat rendahAgent umum, cepat jadi
Bedrock Agents ClassicRendahRendahTertutup untuk pelanggan baru

Perubahan penting yang perlu kamu tahu: Bedrock Agents kini disebut Agents Classic dan tidak dibuka lagi untuk pelanggan baru. Untuk kemampuan serupa, AWS mengarahkan ke Amazon Bedrock AgentCore. Konsep Classic tetap dipelajari karena istilahnya masih muncul, tapi yang kamu bangun sebaiknya di atas AgentCore atau framework seperti Strands.

Pengaman yang tidak boleh dilewati

  • Batas jumlah giliran — tanpa ini, satu bug bisa berputar sampai timeout
  • Timeout per tool — satu tool menggantung tidak boleh menahan semuanya
  • IAM sempit untuk tiap tool — tool bukan pintu ke seluruh akun
  • Validasi argumen — skema JSON itu petunjuk untuk model, bukan jaminan keamanan
  • Persetujuan manusia untuk aksi yang mengubah keadaan — Step Functions task token

Materi

✓ Checkpoint

Agent-mu memanggil knowledge base sebagai tool, berhenti setelah batas giliran, menangani error tool tanpa jatuh, dan kamu bisa menjelaskan kenapa hasil tool dikirim dengan role user.

6

Safety, Security & Governance

1,5 minggu GuardrailsPIIPrivateLinkCloudTrail Domain 3 · 20%

Tujuan: aplikasimu punya pengaman yang aktif, data pribadi tidak bocor ke log maupun ke jawaban, dan setiap tindakan bisa ditelusuri.

Pertahanan berlapis

LapisAlatBekerja saat
Data tersimpanMacieBerkala, atas isi S3
Data yang lewatComprehendSaat ingest dan sebelum logging
Saat inferensiBedrock GuardrailsSetiap prompt dan respons
JaringanVPC endpoint + aws:SourceVpceSetiap panggilan API
JejakCloudTrailSetiap panggilan API

Guardrail yang layak dipasang

resp = runtime.converse(
    modelId=MODEL_ID,
    messages=pesan,
    guardrailConfig={
        "guardrailIdentifier": GUARDRAIL_ID,
        "guardrailVersion": "3",       # sebutkan versi — jangan DRAFT di produksi
        "trace": "enabled",
    },
)

if resp["stopReason"] == "guardrail_intervened":
    return "Maaf, pertanyaan itu di luar cakupan saya."
PengamanMenangkap
Content filtersHate, Insults, Sexual, Violence, Misconduct, Prompt Attack
Denied topicsTopik yang kamu definisikan sendiri
Sensitive informationPII standar dan regex kustom — blokir atau samarkan
Contextual groundingJawaban yang tidak berpijak pada sumber (halusinasi RAG)
Automated reasoningPelanggaran aturan logis yang kamu tetapkan

Ancaman yang khas aplikasi agentik: prompt injection lewat data. Dokumen yang dibaca agent bisa berisi instruksi jahat. Karena itu tool yang berdampak destruktif tidak boleh mengandalkan kebijaksanaan model — batasi di lapisan izin, dan kalau perlu minta persetujuan manusia.

Materi

✓ Checkpoint

Guardrail memblokir topik terlarang dan menyamarkan PII, log aplikasimu tidak memuat data pribadi, Bedrock hanya bisa dipanggil dari VPC-mu, dan ada alarm yang berbunyi kalau guardrail diubah.

7

Observability, Biaya & Evaluasi

1,5 minggu CloudWatchX-Raybatchevaluations Domain 4 + 5 · 23%

Tujuan: kamu tahu berapa biaya per percakapan, di mana waktunya habis, dan apakah kualitas jawaban membaik atau memburuk — dengan angka.

Tiga lapis deteksi biaya

LapisAlatKecepatanMenangkap
1Alarm CloudWatch atas OutputTokenCountMenitLoop kabur, penyalahgunaan
2Cost Anomaly DetectionBeberapa jamPola pengeluaran menyimpang
3AWS BudgetsBeberapa jamTotal bulanan lewat batas

Hanya lapis pertama yang cukup cepat menghentikan kejadian yang sedang berlangsung — data biaya AWS selalu tertunda. Pertahanan tercepat selalu berbasis metrik operasional.

Menurunkan biaya, urut dari yang paling murah dicoba

  1. Model lebih kecil untuk tugas sederhana — sering perbedaan terbesar
  2. Prompt caching untuk prefiks yang berulang
  3. Batch inference untuk pekerjaan yang tidak buru-buru
  4. maxTokens lebih ketat dan prompt yang dirapikan
  5. Provisioned Throughput — hanya setelah hitungan menunjukkan titik impasnya terlewati

Evaluasi: memisahkan dua kegagalan

Pertanyaan ──▶ Retrieval ──▶ Potongan ──▶ Generasi ──▶ Jawaban
                   │                          │
        job retrieve-only            job retrieve-and-generate

Tanpa memisahkan pengukuran, "potongan yang salah terambil" dan "jawaban buruk dari potongan yang benar" terlihat sama dari luar. Job retrieve only yang membedakannya — dan menentukan apakah kamu memperbaiki chunking atau memperbaiki prompt.

Perubahan prompt adalah perubahan produksi. Ia tidak membuat tes unit gagal, tidak memunculkan error, dan tidak terlihat di metrik operasional. Tanpa gerbang evaluasi di pipeline, satu-satunya alarmnya adalah keluhan pengguna beberapa minggu kemudian.

Materi

✓ Checkpoint

Ada dasbor yang menunjukkan token, p99 latensi, dan throttle; trace X-Ray menunjukkan berapa persen waktu habis di retrieval versus model; dan pipeline-mu menolak deploy kalau skor evaluasi turun dari baseline.

8

Capstone & Ujian AIP-C01

2 minggu capstoneexam guideGenAI Lens

Tujuan: satu aplikasi utuh yang menggabungkan seluruh fase — dan kebetulan persis bentuk yang diuji di sertifikasi.

Teori tanpa proyek akan hilang dalam sebulan. Kerjakan satu ini sampai tuntas: asisten dokumen internal, berjalan di AWS, siap dipakai orang lain.

Requirement

  1. Ingest — dokumen di S3 → Knowledge Base, dipicu event S3 dan disinkronkan berkala lewat EventBridge Scheduler
  2. Retrieval — Retrieve dengan hybrid search, filter metadata dari identitas pengguna, dan reranker
  3. Generasi — Converse dengan streaming, prompt yang memaksa menjawab hanya dari konteks
  4. Sitasi — setiap jawaban menyebut dokumen dan halaman sumbernya
  5. Tool — model bisa memanggil cari_dokumen() sendiri, dengan batas giliran
  6. API — API Gateway HTTP API + Lambda, dengan authorizer JWT dan throttling
  7. Guardrail — denied topics, filter PII bermode mask, contextual grounding aktif
  8. Jaringan — Lambda di VPC privat, Bedrock lewat interface endpoint, dikunci aws:SourceVpce
  9. IaC — semuanya satu stack CDK, ter-deploy lewat pipeline
  10. Observability — log terstruktur, X-Ray aktif, dasbor token dan latensi, alarm biaya
  11. Evaluasi — dataset 20 pertanyaan dengan ground truth, dijalankan sebagai gerbang di pipeline
  12. Dokumentasi — model card berisi maksud pemakaian, keterbatasan, dan skor evaluasi terakhir

Kenapa proyek ini: ia menyentuh keempat domain besar sekaligus — Domain 1 di ingest dan retrieval, Domain 2 di API dan tool, Domain 3 di guardrail dan jaringan, Domain 4 dan 5 di observability dan evaluasi. Kalau kamu bisa menjelaskan setiap keputusan di proyek ini, kamu siap ujian.

Bonus kalau masih semangat

  • Multi-tenant — satu knowledge base, isolasi lewat filter metadata dari klaim token
  • Human-in-the-loop — jawaban berisiko ditahan Step Functions sampai disetujui
  • MCP — tool disajikan lewat server MCP di Lambda, dipakai lewat AgentCore Gateway
  • Batch — klasifikasi topik pertanyaan historis dengan batch inference
  • Well-Architected review — jalankan Generative AI Lens atas aplikasi ini

Materi

✓ Checkpoint

Aplikasi berjalan end-to-end di AWS, di-deploy dari pipeline, dan kamu bisa menjawab kedelapan pertanyaan kesiapan di materi terakhir tanpa membuka dokumentasi. Lalu — jadwalkan ujiannya.

Aturan main

  1. Bangun, jangan cuma baca. Soal ujian berupa skenario; skenario cuma masuk akal kalau kamu pernah mengalaminya.
  2. Hapus resource setelah berlatih. OpenSearch Serverless dan Provisioned Throughput ditagih per jam, dipakai atau tidak.
  3. Catat usage sejak panggilan pertama. Tanpa data token, semua diskusi biaya jadi tebak-tebakan.
  4. Baca pesan error sampai habis. Bedakan masalah izin, masalah region, dan masalah akses model — ketiganya terlihat mirip.
  5. Satu perubahan pada satu waktu. Mengubah chunking dan prompt bersamaan membuat hasil evaluasi tidak bisa dibaca.
  6. Layanan terkelola dulu. Di ujian maupun di pekerjaan, jawabannya hampir selalu yang bebannya paling rendah — kecuali soal menyebut kendala lain.
  7. Jangan lompat ke Fase 3. Godaannya besar, tapi tanpa IAM dan IaC kamu akan membangun sesuatu yang tidak bisa dijaga.

Sebelum ini

Roadmap ini mengandaikan kamu sudah bisa Python secara nyaman: type hints, async, Pydantic, dan pernah memanggil LLM lewat SDK. Kalau belum, mulai dari Python untuk AI Engineer — atau dari Python Dasar untuk Pemula kalau kamu belum pernah ngoding sama sekali.