IAM Role
Role adalah identitas tanpa kredensial permanen yang bisa diambil sementara oleh siapa pun yang diizinkan. Hampir semua hal di AWS berjalan di atas mekanisme ini.
Intisari
- Role punya dua policy: trust policy (siapa boleh memakai) dan permissions policy (boleh apa).
- Mengambil role menghasilkan kredensial sementara lewat AWS STS — otomatis kedaluwarsa.
- Lambda, ECS, dan EC2 mendapat izin lewat role, bukan lewat access key yang ditempel.
- Kalau
AssumeRolegagal, 90% kasusnya salah di trust policy, bukan di izinnya. - Role adalah cara benar untuk akses lintas akun dan untuk CI/CD (via OIDC, tanpa rahasia sama sekali).
Role itu apa
Kalau IAM user adalah "siapa kamu", role adalah "peran yang sedang kamu pegang". Role tidak punya password dan tidak punya access key. Ia cuma seperangkat izin yang bisa dipinjam — dan saat dipinjam, AWS STS menerbitkan kredensial sementara yang mati sendiri setelah beberapa jam.
Setiap role selalu punya dua dokumen, dan membedakannya adalah kunci semua debugging IAM:
| Dokumen | Menjawab | Punya Principal? |
|---|---|---|
| Trust policy | Siapa yang boleh mengambil role ini? | Ya |
| Permissions policy | Setelah diambil, boleh melakukan apa? | Tidak |
Contoh: role untuk fungsi Lambda
Trust policy — hanya layanan Lambda yang boleh memakai role ini:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": { "Service": "lambda.amazonaws.com" },
"Action": "sts:AssumeRole"
}]
}
Permissions policy — apa yang boleh dilakukan fungsi itu:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "bedrock:InvokeModelWithResponseStream",
"Resource": "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-*"
},
{
"Effect": "Allow",
"Action": ["logs:CreateLogStream", "logs:PutLogEvents"],
"Resource": "arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/*"
}
]
}
Hasilnya: kode Lambda-mu memanggil Bedrock tanpa satu baris pun kredensial. boto3 mengambil kredensial sementara dari environment yang disiapkan runtime Lambda. Ini yang membuat "tidak ada secret di kode" bukan sekadar slogan.
Siapa saja yang bisa jadi Principal
| Bentuk | Contoh isi | Dipakai untuk |
|---|---|---|
Service | lambda.amazonaws.com | Layanan AWS menjalankan kodemu |
AWS | arn:aws:iam::111122223333:root | Akses lintas akun |
Federated | token.actions.githubusercontent.com | CI/CD via OIDC — tanpa rahasia tersimpan |
Mengambil role dari kode
import boto3
sts = boto3.client("sts")
resp = sts.assume_role(
RoleArn="arn:aws:iam::123456789012:role/BacaKnowledgeBase",
RoleSessionName="ingest-harian", # muncul di CloudTrail — beri nama yang berarti
)
kredensial = resp["Credentials"]
bedrock = boto3.client(
"bedrock-runtime",
aws_access_key_id=kredensial["AccessKeyId"],
aws_secret_access_key=kredensial["SecretAccessKey"],
aws_session_token=kredensial["SessionToken"], # wajib — ini penanda kredensial sementara
)
Dalam praktik kamu jarang menulis ini. Untuk Lambda dan ECS, role sudah terpasang otomatis.
Untuk laptopmu, aws configure sso yang mengurusnya. Kode di atas dipakai saat satu proses
memang perlu berpindah peran — misalnya menyeberang akun.
Kenapa AssumeRole gagal
| Gejala | Penyebab yang paling sering |
|---|---|
User … is not authorized to perform: sts:AssumeRole | Trust policy role belum mencantumkan principal-mu |
Berhasil assume, tapi API-nya AccessDenied | Trust benar, permissions policy-nya yang kurang |
| Jalan di laptop, gagal di Lambda | Kamu memakai izin pribadimu, bukan izin role Lambda |
| Lintas akun tetap ditolak | Lintas akun butuh izin di kedua sisi: trust di sana, sts:AssumeRole di sini |
Latihan: buat satu IAM role bernama BelajarBedrockRole dengan trust policy untuk
lambda.amazonaws.com dan izin bedrock:InvokeModel saja. Belum perlu ada Lambda-nya —
role ini dipakai lagi di Fase 1. Lalu jawab tanpa membuka dokumentasi: kenapa role ini tidak bisa kamu pakai
langsung dari laptopmu?
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.