클라우드/GCP 자원 테라폼으로 관리해보기

(3-2) GCP IAM Policy 관리 - serviceAccount, group, user를 role에 연결해주는 모듈

Fanic 2024. 6. 9. 01:50
반응형

 

serviceAccount, group, user를 role에 연결해주는 모듈에 대해 기술한다.

 

1. iam_policy.tf

모듈을 입력하는 부분으로 필수 입력으로 member_type(serviceAccount, group, user)을 지정해야한다.

 

iam_policy 모듈의 경우 email 정보를 서비스 계정 생성 모듈의 output 정보를 활용하여 가져오게 하였다.

# 필수 입력 member_type : user, serviceAccount , group

module "iam_policy" {
  source = "./modules/iam_policy_module"

  project_id           = "pjt-an3-dev-vm-2"
  member_type  = "serviceAccount"
  email = module.svcacc_test_account.service_account_email
  roles = {
    editor             = "roles/editor",
    network_admin      = "roles/compute.networkAdmin",
    serviceAccountUser        = "roles/iam.serviceAccountUser",
    artifactregistry_viewer              = module.artifactregistry_viewer.google_project_iam_custom_role_id,
    artifactregistry_reader             ="roles/artifactregistry.reader",
    artifactregistry_admin = "roles/artifactregistry.admin",
    serviceAgent = "roles/run.serviceAgent",
    serviceAccountTokenCreator = "roles/iam.serviceAccountTokenCreator",
    #artifactregistry_viewer              ="projects/pjt-an3-dev-vm-2/roles/artifactregistry_viewer",
    # 추가적인 역할들
  }
}



module "sa_pubsub_bigquery_policy" {
  source = "./modules/iam_policy_module"

  project_id           = "pjt-an3-dev-vm-2"
  member_type  = "serviceAccount"
  email = "pubsub-bigquery@pjt-an3-dev-vm-2.iam.gserviceaccount.com"
  roles = {
    editor             = "roles/editor",
    network_admin      = "roles/compute.networkAdmin",
    serviceAccountUser        = "roles/iam.serviceAccountUser",
    # 추가적인 역할들z
  }
}

module "sa_terraform_connect_policy" {
  source = "./modules/iam_policy_module"

  project_id           = "pjt-an3-dev-vm-2"
  member_type  = "serviceAccount"
  email = "terraform-connect@pjt-an3-shard-vpc-2.iam.gserviceaccount.com"
  roles = {
    artifactregistry_admin = "roles/artifactregistry.admin",
    cloudfunctions_admin  = "roles/cloudfunctions.admin"
    # 추가적인 역할들z
  }
}



module "user_hr9_iam_policy" {
  source = "./modules/iam_policy_module"

  project_id           = "pjt-an3-dev-vm-2"
  member_type  = "user"
  email = "hr9@hrc0618.com"
  roles = {
    editor             = "roles/editor",
    network_admin      = "roles/compute.networkAdmin",
    serviceAccountUser        = "roles/iam.serviceAccountUser",
    # 추가적인 역할들
  }
}


module "user_hr3_iam_policy" {
  source = "./modules/iam_policy_module"

  project_id           = "pjt-an3-dev-vm-2"
  member_type  = "user"
  email = "hr3@hrc0618.com"
  roles = {
    artifactregistry_reader             ="roles/artifactregistry.reader",
    artifactregistry_viewer              = module.artifactregistry_viewer.google_project_iam_custom_role_id,
    # 추가적인 역할들
  }
}

 

GCP 콘솔에서 확인한 추가된 권한

 

iam_policy_module 정보

 

1) main.tf

iam_policy.tf 에서 지정된 memeber_type을 통해 타입을 식별하여 이메일을 추가하게 된다.  

resource "google_project_iam_member" "project_iam_member" {
  for_each = var.roles
  project = var.project_id
  role = each.value
  member =  "${var.member_type}:${var.email}"
    # 추가적인 맴버 종류에 따른 처리
 
}


2) output

현재는 전달 받는 곳이 없어 추가하지 않았다.
3) variables.tf

roles의 경우 map 형태로 보내야하며 member_type의 경우 serviceAccount, group, user를 지정하여 보내도록 설정하였다.

variable "project_id" {
  description = "프로젝트 ID"
  type        = string
}

variable "email" {}



variable "roles" {
  type    = map(string)
  default = {}
}

variable "member_type" {
  description = "맴버 종류 : serviceAccount, group, user"
  type        = string
}
반응형