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) danbedrock-runtime(panggil model). - Respons selalu
dictbiasa — 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 die.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
| Bentuk | Kapan 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
| Client | Untuk | Contoh operasi |
|---|---|---|
bedrock | Bidang kelola | list_foundation_models, create_guardrail |
bedrock-runtime | Memanggil model | converse, converse_stream |
bedrock-agent | Kelola knowledge base & agent | create_knowledge_base |
bedrock-agent-runtime | Pakai knowledge base & agent | retrieve, 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.