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

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:

#SumberBiasanya dipakai saat
1Parameter langsung ke client() / Session()Setelah assume_role manual
2AWS_ACCESS_KEY_ID dkk. dari environmentCI/CD, container
3Profil di ~/.aws/credentialsPola lama
4Profil di ~/.aws/config (termasuk SSO)Laptopmu
5Role container (ECS/Fargate)Otomatis di ECS
6Instance 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.