IaC(Infrastructure as Code)

AWS + Terraform (Loop)

cwchoiit 2024. 3. 7. 11:29
728x90
반응형
SMALL
728x90
SMALL

이번엔 루프를 이용해보자. 다음 main.tf 파일을 보자.

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_iam_group" "developer" {
  name = "developer"
}

resource "aws_iam_group" "employee" {
  name = "employee"
}

output "groups" {
  value = [
    aws_iam_group.developer,
    aws_iam_group.employee
  ]
}

variable "users" {
    type = list(any)
}

resource "aws_iam_user" "this" {
  for_each = {
    for user in var.users : user.name => user
  }

  name = each.key

  tags = {
    level = each.value.level
    role = each.value.role
  }
}

resource "aws_iam_user_group_membership" "this" {
  for_each = {
    for user in var.users : user.name => user
  }

  user = each.key

  groups = each.value.is_developer ? [
    aws_iam_group.developer.name, aws_iam_group.employee.name
    ] : [
        aws_iam_group.employee.name
    ]
}

locals {
  developers = [
    for user in var.users : user if user.is_developer
  ]
}

resource "aws_iam_user_policy_attachment" "developer" {
  for_each = {
    for user in local.developers : user.name => user
  }

  user = each.key
  policy_arn = "arn:aws:iam::aws:policy/AdministratorAccess"

  depends_on = [ aws_iam_user.this ] # 이 리소스가 생성되어야만 가능하게 설정
}

output "developers" {
  value = local.developers
}

output "high_level_users" {
  value = [
    for user in var.users : user if user.level > 5
  ]
}

 

그리고 변수를 정의한 파일인 terraform.tfvars 파일은 다음과 같다.

users = [
 {
    name = "john"
    level = 7
    role = "재무"
    is_developer = false
 },
 {
    name = "alice"
    level = 1
    role = "인턴 개발자"
    is_developer = true
 },
 {
    name = "tony"
    level = 4
    role = "데브옵스"
    is_developer = true
 },
 {
    name = "cindy"
    level = 9
    role = "경영"
    is_developer = false
 },
 {
    name = "hoon"
    level = 3
    role = "마케팅"
    is_developer = false
 }   
]

 

이런식으로 for 문을 사용할 수 있다.

resource "aws_iam_user" "this" {
  for_each = {
    for user in var.users : user.name => user
  }

  name = each.key

  tags = {
    level = each.value.level
    role = each.value.role
  }
}

 

코드를 보면 이러한 구문이 있다.

for user in var.users : user.name => user

 

선언한 users 라는 변수에 담긴 각각의 유저 하나씩 루프를 돌리는데 이걸 담는 형태가 Map 형식이기 때문에 Key/Value를 다음과 같이 선언하는 것.

user.name => user

 

Map이 아닌 배열로 담는 경우 다음과 같이 사용한다.

locals {
  developers = [
    for user in var.users : user if user.is_developer
  ]
}

 

다만, 이 배열에 담을 땐 조건이 따른다. 그래서 if가 있다. 조건 없이 모두 넣으려고 한다면 이렇게 사용하면 된다.

locals {
  developers = [
    for user in var.users : user
  ]
}

 

그리고 위 main.tf 파일에서 한 가지 새로운 개념인 depends_on 이 있다.

resource "aws_iam_user_policy_attachment" "developer" {
  for_each = {
    for user in local.developers : user.name => user
  }

  user = each.key
  policy_arn = "arn:aws:iam::aws:policy/AdministratorAccess"

  depends_on = [ aws_iam_user.this ] # 이 리소스가 생성되어야만 가능하게 설정
}

 

이 depends_on이 있는 리소스는 depends_on에 걸려있는 리소스가 생성되어야만 만들어지는 리소스임을 의미한다.

728x90
반응형
LIST

'IaC(Infrastructure as Code)' 카테고리의 다른 글

Terraform Commands (taint / untaint)  (0) 2024.03.08
Terraform State  (0) 2024.03.07
AWS + Terraform (Conditions)  (0) 2024.03.07
AWS + Terraform (For-Each)  (0) 2024.03.06
AWS + Terraform (Module)  (0) 2024.03.06