Penjelasan & analogi mudah memahami konsep IAM Roles dan Policy di AWS
Di Terraform saya membuat modul terpisah untuk pembuatan IAM Roles untuk S3, agar s3 dapat diakses oleh EC2 dan berikut adalah script untuk iam.tf nya
# IAM Role for EC2
resource "aws_iam_role" "ec2_cloudwatch_role" {
name = "EC2CloudWatchRole"
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [{
Effect = "Allow",
Principal = {
Service = "ec2.amazonaws.com"
},
Action = "sts:AssumeRole"
}]
})
}
# Data: AWS managed policy for CloudWatch agent
data "aws_iam_policy" "cloudwatch_agent" {
arn = "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy"
}
# Attach CloudWatchAgent policy to the role
resource "aws_iam_role_policy_attachment" "attach_cloudwatch_policy" {
role = aws_iam_role.ec2_cloudwatch_role.name
policy_arn = data.aws_iam_policy.cloudwatch_agent.arn
}
resource "aws_iam_role_policy" "ec2_s3_access_policy" {
name = "EC2S3AccessPolicy"
role = aws_iam_role.ec2_cloudwatch_role.id
policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Action = "s3:ListBucket",
Resource = aws_s3_bucket.app_bucket.arn
},
{
Effect = "Allow",
Action = [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
Resource = "${aws_s3_bucket.app_bucket.arn}/*"
}
]
})
}
resource "aws_iam_instance_profile" "ec2_instance_profile" {
name = "EC2InstanceProfile"
role = aws_iam_role.ec2_cloudwatch_role.name
}
Berikut adalah penjelasan lengkap dari contohΒ iam.tf
yang sebelumnya saya buat β bagian ini bertugas untuk mengatur IAM Role dan Policy agar EC2 bisa:
-
Menjalankan CloudWatch Agent (log & monitoring)
-
Mengakses bucket S3 yang dibuat dengan Terraform
π Penjelasan Blok demi Blok iam.tf
1. IAM Role untuk EC2
resource "aws_iam_role" "ec2_cloudwatch_role" {
name = "EC2CloudWatchRole"
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [{
Effect = "Allow",
Principal = {
Service = "ec2.amazonaws.com"
},
Action = "sts:AssumeRole"
}]
})
}
Fungsi: Membuat IAM Role bernama
EC2CloudWatchRole
yang bisa diasumsikan oleh layanan EC2 (ec2.amazonaws.com
) β wajib untuk digunakan sebagaiiam_instance_profile
di EC2.
2. Mengambil Policy AWS untuk CloudWatch Agent
data "aws_iam_policy" "cloudwatch_agent" {
arn = "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy"
}
Fungsi: Mengambil policy AWS bawaan (
CloudWatchAgentServerPolicy
) yang memberikan izin untuk menjalankan CloudWatch Agent dari EC2.
3. Attach Policy CloudWatch ke Role
resource "aws_iam_role_policy_attachment" "attach_cloudwatch_policy" {
role = aws_iam_role.ec2_cloudwatch_role.name
policy_arn = data.aws_iam_policy.cloudwatch_agent.arn
}
Fungsi: Menempelkan (attach) policy
CloudWatchAgentServerPolicy
ke roleEC2CloudWatchRole
.
4. Policy Tambahan untuk Akses S3
resource "aws_iam_role_policy" "ec2_s3_access_policy" {
name = "EC2S3AccessPolicy"
role = aws_iam_role.ec2_cloudwatch_role.id
policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Action = "s3:ListBucket",
Resource = aws_s3_bucket.app_bucket.arn
},
{
Effect = "Allow",
Action = [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
Resource = "${aws_s3_bucket.app_bucket.arn}/*"
}
]
})
}
Fungsi:
-
Memberikan izin kepada EC2 untuk:
-
s3:ListBucket
: Melihat isi bucket -
s3:GetObject
,PutObject
,DeleteObject
: Operasi pada objek di dalam bucket
-
-
Menggunakan
aws_s3_bucket.app_bucket.arn
agar otomatis sesuai dengan nama bucket hasilrandom_id
5. Membuat Instance Profile (dibutuhkan EC2)
resource "aws_iam_instance_profile" "ec2_instance_profile" {
name = "EC2InstanceProfile"
role = aws_iam_role.ec2_cloudwatch_role.name
}
Fungsi: Membuat Instance Profile, yaitu wadah untuk mengaitkan IAM Role ke EC2. Ini yang dipakai di
aws_instance.web.iam_instance_profile
.
π Cara Menghubungkan IAM Role ke EC2
Di file ec2.tf
(atau main.tf
), kamu sudah punya:
iam_instance_profile = aws_iam_instance_profile.ec2_instance_profile.name
Jadi instance kamu otomatis akan menjalankan EC2 dengan IAM Role yang punya akses ke:
-
CloudWatch Agent
-
Bucket S3 kamu
Agar lebih mudah memahami konsep IAM Role, Policy, dan Instance Profile dalam konteks Terraform dan AWS kita gunakanΒ analogi dunia nyata
π Analogi: Perusahaan + Karyawan + Gedung + Akses
Bayangkan kamu punya sebuah perusahaan (AWS) yang terdiri dari:
-
π Gedung S3: Tempat penyimpanan data seperti dokumen, foto, dll
-
π Ruang CloudWatch: Tempat memantau CCTV dan suhu ruangan
-
π¨βπ» Karyawan EC2: Mesin yang bekerja, misalnya mengakses file, mengupload data, atau kirim laporan ke monitoring
Sekarang, mari kita cocokkan bagian-bagiannya:
π§© Bagian-bagian IAM dan Terraform = Analogi
Konsep Terraform / AWS | Analogi Dunia Nyata |
---|---|
aws_instance (EC2) |
Karyawan |
aws_iam_role |
ID Card (Kartu Akses) β menyatakan siapa kamu dan peranmu |
aws_iam_role_policy |
Hak Akses tertulis di kartu (bisa akses ruang A, B, atau C) |
aws_iam_policy_attachment |
Menempelkan akses standar (misal: akses ke ruang monitoring bagi semua teknisi) |
aws_iam_instance_profile |
Tempat menaruh kartu ID agar bisa dibaca oleh sistem saat karyawan masuk gedung |
assume_role_policy |
Aturan siapa yang boleh memakai kartu ini (hanya karyawan EC2, bukan orang luar) |
aws_s3_bucket |
Gedung penyimpanan (S3 Bucket) |
cloudwatch_agent_policy |
Akses untuk karyawan yang bertugas memonitor CCTV dan suhu (CloudWatch) |
π¦ Contoh Kasus: EC2 Butuh Akses ke S3 dan CloudWatch
Tanpa Role:
-
EC2 seperti karyawan tanpa kartu akses β dia tidak bisa masuk ke ruang penyimpanan (S3) atau monitoring (CloudWatch)
Dengan Role + Policy:
-
Kamu buat kartu akses khusus (IAM Role), lalu
-
Tempelkan hak akses (policy: bisa buka pintu S3 dan CloudWatch),
-
Berikan kartu itu ke karyawan (EC2) lewat
instance_profile
π Apa yang dilakukan Terraform?
Saat kamu menjalankan terraform apply
, kamu seperti:
-
Mendaftarkan gedung dan ruang (S3, CloudWatch)
-
Membuat ID Card dan tempelkan hak akses (IAM Role + Policy)
-
Memberikan kartu itu ke karyawan (EC2 via Instance Profile)
-
Semua berjalan otomatis dan terhubung
Kalau kamu membagi ke file iam.tf
, s3.tf
, dan ec2.tf
, itu seperti:
-
Menaruh dokumen gedung, dokumen karyawan, dan dokumen izin akses ke map terpisah β tapi semuanya tetap satu proyek perusahaan.
β Kesimpulan
IAM Role itu seperti kartu akses yang perlu izin tertulis (policy), dan harus diberikan ke EC2 (via instance profile) agar EC2 bisa masuk ke gedung (akses S3) atau ruang monitoring (CloudWatch).
Kalau kamu sudah paham analogi ini, kamu akan lebih mudah memahami seluruh flow IAM di AWS.
Kalau kamu mau, saya bisa bantu gambar diagram alurnya juga. Mau?
No Comments