← Semua pembelajaran / AWS untuk AI Engineer
Fase 0 · Fondasi AWS & IAM

Boto3 — Quickstart

boto3 adalah cara Python bicara ke AWS. Ada beberapa pola yang kalau tidak diketahui sejak awal akan menghantui: paginasi, bentuk exception, dan perbedaan client dengan resource.

Intisari

  • boto3.client("nama-layanan") adalah 95% pemakaianmu. Nama layanan itu string, bukan modul.
  • Bedrock punya dua client: bedrock (kelola) dan bedrock-runtime (panggil model).
  • Respons selalu dict biasa — tidak ada objek berjenis khusus, jadi baca dokumentasinya untuk bentuknya.
  • Hasil list terpaginasi. Pakai paginator, atau kamu akan diam-diam kehilangan data setelah halaman pertama.
  • Error datang sebagai botocore.exceptions.ClientError; kode aslinya ada di e.response["Error"]["Code"].

Pasang dan panggil

uv add boto3
uv add --dev boto3-stubs[bedrock-runtime,s3,lambda]   # type hints, sangat layak dipasang
import boto3

s3 = boto3.client("s3")
resp = s3.list_buckets()
for b in resp["Buckets"]:
    print(b["Name"], b["CreationDate"])

Perhatikan bentuknya: nama layanan adalah string, dan hasilnya dict biasa. boto3 dibangun dari deskripsi API yang di-generate, jadi tidak ada kelas khusus per respons. Itu sebabnya boto3-stubs berharga — tanpa itu, editormu tidak tahu apa isi resp.

Client vs resource vs session

BentukKapan dipakai
boto3.client(…)Default. Memetakan operasi API satu-satu. Semua layanan punya ini.
boto3.resource(…)API berorientasi objek untuk sebagian layanan lama. Tidak dikembangkan lagi — jangan mulai dari sini.
boto3.Session(…)Saat perlu profil, region, atau kredensial yang berbeda dalam satu proses.
sesi = boto3.Session(profile_name="belajar", region_name="us-east-1")
bedrock = sesi.client("bedrock-runtime")

Dua client Bedrock — jangan tertukar

ClientUntukContoh operasi
bedrockBidang kelolalist_foundation_models, create_guardrail
bedrock-runtimeMemanggil modelconverse, converse_stream
bedrock-agentKelola knowledge base & agentcreate_knowledge_base
bedrock-agent-runtimePakai knowledge base & agentretrieve, retrieve_and_generate

Ini penyebab error membingungkan yang paling sering di Fase 3–5. boto3.client("bedrock").converse(...) akan gagal dengan pesan bahwa operasinya tidak ada — bukan karena izinmu kurang, tapi karena converse memang tinggal di client yang berbeda.

Paginasi — bagian yang paling sering dilewatkan

Operasi list_* mengembalikan maksimal sekian item per panggilan. Kalau kamu hanya membaca halaman pertama, kodenya terlihat berjalan sampai datanya bertambah banyak:

# SALAH — diam-diam kehilangan objek setelah halaman pertama
objek = s3.list_objects_v2(Bucket="dokumen-ku")["Contents"]

# BENAR — paginator mengurus token halaman untukmu
paginator = s3.get_paginator("list_objects_v2")
for halaman in paginator.paginate(Bucket="dokumen-ku"):
    for obj in halaman.get("Contents", []):
        print(obj["Key"])

Perhatikan juga halaman.get("Contents", []): kalau tidak ada objek sama sekali, kunci Contents tidak muncul — bukan berisi list kosong. Pola "kunci hilang saat kosong" ini berulang di banyak API AWS.

Menangani error

from botocore.exceptions import ClientError

try:
    resp = bedrock.converse(modelId=MODEL, messages=pesan)
except ClientError as e:
    kode = e.response["Error"]["Code"]
    if kode == "ThrottlingException":
        ...            # backoff lalu coba lagi
    elif kode == "AccessDeniedException":
        ...            # masalah IAM, bukan masalah kode — mengulang tidak menolong
    elif kode == "ValidationException":
        ...            # bentuk permintaanmu salah
    else:
        raise

boto3 sudah punya retry bawaan dengan exponential backoff untuk error yang bisa diulang. Kamu bisa mengaturnya, dan untuk beban kerja LLM ini layak dinaikkan:

from botocore.config import Config

cfg = Config(
    retries={"max_attempts": 5, "mode": "adaptive"},
    read_timeout=300,        # respons LLM panjang bisa lama; default terlalu pendek
    connect_timeout=10,
)
bedrock = boto3.client("bedrock-runtime", config=cfg)

Latihan: tulis skrip yang mencetak seluruh modelId yang tersedia di akunmu memakai client bedrock, lalu bungkus dengan try/except ClientError yang mencetak pesan berbahasa Indonesia untuk AccessDeniedException. Uji jalur error-nya dengan sengaja memakai region yang tidak kamu punya izinnya.

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