Boto3 — Credentials
boto3 tidak pernah meminta kredensial. Ia mencarinya sendiri, dengan urutan tetap. Menghafal urutan ini menghemat berjam-jam debugging.
Intisari
- Urutannya tetap: parameter kode → variabel environment → profil di
~/.aws/→ role dari lingkungan. - Yang ditemukan pertama menang. Environment variable yang tertinggal bisa menutupi profilmu.
- Di Lambda/ECS/EC2, kredensial datang dari role — tanpa file dan tanpa konfigurasi.
- Karena itu
boto3.client("s3")polos adalah kode yang benar untuk production. - Kalau bingung siapa yang sedang dipakai:
sts.get_caller_identity().
Rantai pencarian kredensial
Saat kamu membuat client, boto3 menelusuri daftar ini dari atas ke bawah dan berhenti di temuan pertama:
| # | Sumber | Biasanya dipakai saat |
|---|---|---|
| 1 | Parameter langsung ke client() / Session() | Setelah assume_role manual |
| 2 | AWS_ACCESS_KEY_ID dkk. dari environment | CI/CD, container |
| 3 | Profil di ~/.aws/credentials | Pola lama |
| 4 | Profil di ~/.aws/config (termasuk SSO) | Laptopmu |
| 5 | Role container (ECS/Fargate) | Otomatis di ECS |
| 6 | Instance metadata (EC2), role eksekusi (Lambda) | Production |
Ini penyebab bug "kok pakai akun yang salah". Environment variable ada di urutan 2, jauh di atas
profil SSO-mu di urutan 4. Satu AWS_ACCESS_KEY_ID yang tertinggal dari eksperimen kemarin akan
menang atas --profile yang kamu kira sedang aktif. Cek dulu:
env | grep AWS_.
Kenapa kode production justru paling polos
import boto3
# Kode yang benar untuk Lambda, ECS, dan EC2 — sekaligus jalan di laptopmu.
bedrock = boto3.client("bedrock-runtime")
Tidak ada profil, tidak ada key, tidak ada pembacaan environment variable buatan sendiri. Di laptop, boto3
menemukan profil SSO-mu (urutan 4). Di Lambda, ia menemukan kredensial dari role eksekusi (urutan 6).
Kode yang sama, tanpa cabang if production.
Sebaliknya, ini pola yang harus kamu hindari:
# JANGAN — key di kode, atau dibaca dari env buatan sendiri
bedrock = boto3.client(
"bedrock-runtime",
aws_access_key_id="AKIA...", # ikut ter-commit cepat atau lambat
aws_secret_access_key=os.environ["SECRET"],
)
Region juga punya rantainya sendiri
Region dicari terpisah dari kredensial, dengan urutan: parameter region_name → AWS_REGION / AWS_DEFAULT_REGION → region di profil aktif.
botocore.exceptions.NoRegionError: You must specify a region.
Untuk Bedrock, sebutkan region secara eksplisit di kode atau konfigurasi deployment. Region default yang "kebetulan benar" di laptopmu tidak akan ikut ke Lambda, dan ketersediaan model berbeda antar region.
Diagnostik tiga baris
import boto3
sesi = boto3.Session()
print("region :", sesi.region_name)
print("identitas:", sesi.client("sts").get_caller_identity()["Arn"])
Kalau ARN yang tercetak bukan yang kamu harapkan, masalahnya ada di rantai kredensial — bukan di IAM policy. Membedakan dua hal ini di awal menghemat sangat banyak waktu.
Latihan: jalankan skrip diagnostik di atas. Lalu set AWS_ACCESS_KEY_ID dan
AWS_SECRET_ACCESS_KEY ke nilai ngawur di shell-mu, jalankan ulang, dan amati bahwa profil SSO-mu
kalah. Bersihkan dengan unset. Pengalaman lima menit ini akan menghemat berjam-jam nanti.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.