IAM — Policy dan izin
Setiap panggilan API AWS dievaluasi terhadap sekumpulan policy JSON. Paham cara evaluasinya membuat pesan AccessDenied berhenti terasa acak.
Intisari
- Policy adalah dokumen JSON berisi statement:
Effect,Action,Resource, opsionalCondition. - Default-nya semua ditolak. Izin harus diberikan secara eksplisit.
- Satu
Denyeksplisit mengalahkan berapa punAllowyang ada. Tidak ada pengecualian. - Identity-based menempel pada identitas; resource-based menempel pada resource (mis. bucket policy).
Conditionadalah tempat izin yang sebenarnya menarik: batasi per region, per tag, per sumber VPC.
Bentuk sebuah policy
Semua izin di AWS akhirnya berbentuk JSON seperti ini. Ini contoh izin minimal untuk memanggil satu model Bedrock — dan tidak lebih:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PanggilSatuModelSaja",
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-*"
}
]
}
| Field | Artinya |
|---|---|
Version | Versi bahasa policy. Selalu "2012-10-17" — ini bukan tanggal dokumenmu. |
Sid | Label bebas untuk manusia. Opsional, tapi menolong saat debugging. |
Effect | Allow atau Deny. |
Action | Operasi API, formatnya layanan:NamaOperasi. Wildcard boleh. |
Resource | ARN target. Sebagian action tidak punya resource spesifik — di situ "*" memang benar. |
Condition | Syarat tambahan. Di sinilah policy berubah dari kasar jadi presisi. |
Membaca ARN
ARN adalah alamat global sebuah resource. Polanya konsisten, dan begitu terbaca sekali, seterusnya gampang:
arn:aws:bedrock:us-east-1:123456789012:knowledge-base/KB123ABC
│ │ │ │ └─ nama/ID resource
│ │ │ └─ nomor akun (kosong untuk resource milik AWS)
│ │ └─ region (kosong untuk layanan global seperti IAM dan S3 bucket)
│ └─ layanan
└─ partisi (aws, aws-cn, aws-us-gov)
Cara AWS memutuskan
Untuk setiap permintaan API, urutannya selalu sama:
- Default deny. Belum ada izin apa pun.
- Ada
Denyeksplisit? Kalau ya — berhenti, ditolak. Titik. - Ada
Allowyang cocok? Kalau ya — diizinkan. - Kalau tidak ada keduanya — ditolak (implicit deny).
Konsekuensi praktisnya: menambah Allow tidak akan pernah memperbaiki masalah yang
disebabkan Deny. Kalau kamu sudah menempelkan AdministratorAccess tapi masih kena
AccessDenied, berhentilah menambah izin — cari Deny-nya. Biasanya ia datang dari
Service Control Policy di level organisasi, atau dari permissions boundary.
Identity-based vs resource-based
| Identity-based | Resource-based | |
|---|---|---|
| Menempel pada | User, group, role | Resource (bucket S3, antrean SQS, KMS key) |
| Menjawab | "Identitas ini boleh apa?" | "Siapa saja yang boleh menyentuh benda ini?" |
Punya Principal | Tidak | Ya — wajib |
| Lintas akun | Butuh pasangan di sisi sana | Bisa memberi akses langsung |
Condition: bagian yang membuat policy layak dipakai
Tanpa Condition, izin cenderung terlalu lebar. Dengan Condition, kamu bisa menulis
"boleh, tapi hanya dari VPC ini, hanya di region ini, hanya untuk resource bertag tim ini":
{
"Effect": "Allow",
"Action": "bedrock:InvokeModel",
"Resource": "*",
"Condition": {
"StringEquals": { "aws:RequestedRegion": "us-east-1" },
"Bool": { "aws:SecureTransport": "true" }
}
}
Kunci kondisi yang paling sering dipakai: aws:RequestedRegion, aws:SourceVpce,
aws:PrincipalTag/…, dan aws:ResourceTag/…. Di Fase 6 pola ini dipakai serius untuk
mengunci akses Bedrock hanya lewat VPC endpoint.
Kesalahan yang paling sering
| Kesalahan | Kenapa menyakitkan |
|---|---|
"Action": "*" supaya cepat jalan | Tidak pernah dirapikan lagi, lalu ikut ke production |
| Menyamakan izin membaca dan menulis | s3:GetObject dan s3:PutObject beda risiko jauh |
| Lupa ARN S3 ada dua bentuk | Operasi bucket butuh arn:…:bucket, operasi objek butuh arn:…:bucket/* |
Menambal AccessDenied dengan Allow baru | Kalau penyebabnya Deny, ini tidak akan pernah berhasil |
Latihan: tulis satu policy JSON yang mengizinkan bedrock:InvokeModel hanya di
us-east-1 dan hanya untuk model Anthropic, lalu jalankan lewat IAM Policy Simulator di konsol
untuk dua kasus: model Anthropic di us-east-1 (harus Allow) dan model yang sama di
ap-southeast-1 (harus Deny).
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.