← Semua pembelajaran / AWS untuk AI Engineer
Fase 2 · IaC & CI/CD

AWS CodeBuild

CodeBuild menjalankan perintah di dalam container sementara, sesuai buildspec. Ia adalah tempat lint, test, build image, dan evaluasi LLM benar-benar dieksekusi.

Intisari

  • Satu build project = image, tipe compute, dan buildspec.yml.
  • Buildspec punya fase: install, pre_build, build, post_build.
  • Caching dependensi memangkas waktu build drastis — atur cache.paths.
  • Rahasia diambil lewat secrets-manager di blok env, tidak pernah ditulis literal.
  • Build punya IAM role sendiri — di sinilah izin memanggil Bedrock untuk evaluasi diberikan.

buildspec.yml

version: 0.2

env:
  variables:
    AWS_REGION: us-east-1
  secrets-manager:
    TOKEN_EVAL: prod/eval:token          # nama-rahasia:kunci-json

phases:
  install:
    runtime-versions:
      python: 3.13
    commands:
      - curl -LsSf https://astral.sh/uv/install.sh | sh
      - export PATH="$HOME/.local/bin:$PATH"

  pre_build:
    commands:
      - uv sync --frozen
      - uv run ruff check .
      - uv run mypy .

  build:
    commands:
      - uv run pytest --junitxml=laporan/unit.xml
      - uv run python eval/jalankan.py --keluaran laporan/eval.json

  post_build:
    commands:
      - uv run python eval/gerbang.py --laporan laporan/eval.json --minimum 0.85

reports:
  unit:
    files: [laporan/unit.xml]
    file-format: JUNITXML

cache:
  paths:
    - /root/.cache/uv/**/*

artifacts:
  files:
    - laporan/**/*
FaseIsi yang wajar
installRuntime dan toolchain
pre_buildDependensi, lint, type check, login ECR
buildTes, build image, evaluasi
post_buildPush image, gerbang kualitas, unggah laporan

Menjalankan evaluasi LLM di dalam build

Ini penerapan konkret gerbang kualitas dari materi CodePipeline. Skrip eval/jalankan.py memanggil Bedrock untuk sekumpulan pertanyaan uji, lalu eval/gerbang.py keluar dengan status bukan-nol kalau skornya turun — dan build gagal.

# eval/gerbang.py — inti gerbangnya cuma beberapa baris
import json, sys, argparse

p = argparse.ArgumentParser()
p.add_argument("--laporan")
p.add_argument("--minimum", type=float)
a = p.parse_args()

skor = json.load(open(a.laporan))["skor_rata2"]
print(f"skor evaluasi: {skor:.3f} (minimum {a.minimum})")
sys.exit(0 if skor >= a.minimum else 1)

Role build butuh izin Bedrock. Kalau evaluasi memanggil model, service role CodeBuild-lah yang memanggilnya — bukan identitasmu. Kesalahan AccessDeniedException di stage evaluasi hampir selalu berarti kamu menambahkan izin ke role yang salah.

Yang memengaruhi kecepatan dan biaya

SetelanDampak
Cache dependensiPaling besar. Tanpa cache, tiap build mengunduh ulang semuanya.
Ukuran computeInstance lebih besar sering lebih murah karena durasinya jauh lebih pendek
Docker layer cachePenting kalau kamu mem-build container image tiap commit
TimeoutSetel wajar; build yang menggantung tetap ditagih
Batch buildMenjalankan beberapa varian paralel, mis. dua model sekaligus

Latihan: tambahkan buildspec.yml ke proyekmu dengan fase lint dan test, hubungkan ke pipeline Fase 2 sebelumnya, lalu sengaja buat satu tes gagal dan buktikan pipeline berhenti sebelum deploy. Terakhir, nyalakan cache dan bandingkan durasi build sebelum dan sesudahnya.

Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.