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

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, opsional Condition.
  • Default-nya semua ditolak. Izin harus diberikan secara eksplisit.
  • Satu Deny eksplisit mengalahkan berapa pun Allow yang ada. Tidak ada pengecualian.
  • Identity-based menempel pada identitas; resource-based menempel pada resource (mis. bucket policy).
  • Condition adalah 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-*"
    }
  ]
}
FieldArtinya
VersionVersi bahasa policy. Selalu "2012-10-17" — ini bukan tanggal dokumenmu.
SidLabel bebas untuk manusia. Opsional, tapi menolong saat debugging.
EffectAllow atau Deny.
ActionOperasi API, formatnya layanan:NamaOperasi. Wildcard boleh.
ResourceARN target. Sebagian action tidak punya resource spesifik — di situ "*" memang benar.
ConditionSyarat 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:

  1. Default deny. Belum ada izin apa pun.
  2. Ada Deny eksplisit? Kalau ya — berhenti, ditolak. Titik.
  3. Ada Allow yang cocok? Kalau ya — diizinkan.
  4. 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-basedResource-based
Menempel padaUser, group, roleResource (bucket S3, antrean SQS, KMS key)
Menjawab"Identitas ini boleh apa?""Siapa saja yang boleh menyentuh benda ini?"
Punya PrincipalTidakYa — wajib
Lintas akunButuh pasangan di sisi sanaBisa 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

KesalahanKenapa menyakitkan
"Action": "*" supaya cepat jalanTidak pernah dirapikan lagi, lalu ikut ke production
Menyamakan izin membaca dan menuliss3:GetObject dan s3:PutObject beda risiko jauh
Lupa ARN S3 ada dua bentukOperasi bucket butuh arn:…:bucket, operasi objek butuh arn:…:bucket/*
Menambal AccessDenied dengan Allow baruKalau 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.