본문으로 바로가기
반응형

Intro

테라폼으로 IAM Role을 생성하여 EC2에 할당 할때는 AWS Console에서 작업하는 것과는 다르게 Instance Profile 생성 단계가 필요합니다. 이 Instance Profile이 무엇이고 어떻게 할당 하는지 예제를 통해 알아보도록 하겠습니다.

AWS Console 에서 IAM Role생성

AWS콘솔에서 IAM Role을 생성하면 아래 그림과 같이 자동으로 instance profile이 생성됩니다. 오늘의 주인공이 바로 instance profile 입니다.

그림1.

Instance Profile 이란?

AWS에서는 instance profile을 아래와 같이 정의 하는데요. 간단히 설명하면 “IAM Role을 EC2인스턴스에 할당하기 위해 필요한 자원” 이다 라고 보면 됩니다.

An instance profile is a container for an IAM role that you can use to pass role information to an EC2 instance when the instance starts.

Terraform에서 IAM Role생성

테라폼에서는 아래와 같이 aws_iam_role 을 생성하면, aws console에서 확인 했을때 그림과 같이 instnace profile은 자동으로 생성되지 않습니다.

그림2.

resource "aws_iam_role" "test_role" {
  name = "test_role"

  # Terraform's "jsonencode" function converts a
  # Terraform expression result to valid JSON syntax.
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Sid    = ""
        Principal = {
          Service = "ec2.amazonaws.com"
        }
      },
    ]
  })

  tags = {
    tag-key = "tag-value"
  }
}

따라서, 아래와 같이 반드시 instance profile을 같이 생성 해주어야 합니다.

resource "aws_iam_instance_profile" "test_profile" {
  name = "test_profile"
  role = aws_iam_role.test_role.name
}

Terraform으로 EC2에 IAM Role할당 하는 예시

iam_instance_profile 파라미터를 사용하여 위에서 생성한 instance profile을 할당합니다.

module "hpg_ec2_dev_home_webwas_a"{
  source                 = "./modules/ec2"
  name                   = "test-ec2"

  instance_count         = 1

  iam_instance_profile   = aws_iam_instance_profile.test_profile.name

  ami                    = data.aws_ami.base_ami.id
  instance_type          = var.ec2_instnace_type

  key_name               = data.terraform_remote_state.keypair.outputs.keypair_ec2
  monitoring             = true
  vpc_security_group_ids = [
                            data.terraform_remote_state.sg.outputs.sg_id
                           ]
  subnet_id              = data.terraform_remote_state.vpc.outputs.private_subnet_id

  associate_public_ip_address = false

  enable_volume_tags = true

  user_data = filebase64("userdata/userdata.sh")

  tags = merge(local.common_tags,
      {
          Owner         = "kimdragon"
          Resource      = "ec2"
      }
  )
}
반응형