Skip to main content

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:

  1. Menjalankan CloudWatch Agent (log & monitoring)

  2. 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 sebagai iam_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 role EC2CloudWatchRole.


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 hasil random_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:

  1. Mendaftarkan gedung dan ruang (S3, CloudWatch)

  2. Membuat ID Card dan tempelkan hak akses (IAM Role + Policy)

  3. Memberikan kartu itu ke karyawan (EC2 via Instance Profile)

  4. 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?