인프런 커뮤니티 질문&답변

형빈님의 프로필 이미지
형빈

작성한 질문수

[2024] 실무에서 사용하는 클라우드 보안 프로그래밍 (AWS, Python, Terraform)

2.8. 반복문(for_each)

for_each 사용 시 key를 가져오는 기준

해결된 질문

작성

·

126

1

안녕하세요

key로 리소스 유무를 판단하니 중복되면 안된다고 생각해 테스트해보려고 중복된 key를 넣어주고 for_each로 가져오니 상위 key를 가져오는거 같지 않아서 별도 기준이 있는지 그냥 랜덤인지 궁금하여 질문드립니다.

 

# count

variable "user_count" {
  type      = list(string)
  default   = ["hb", "terraform", "aws"]
}

resource "aws_iam_user" "user" {
  count = length(var.user_count)
  name = "${var.user_count[count.index]}-${count.index}"
}

배포 시 hb-0, terraform-1, aws-2 생성 (리스트의 인덱스 순서대로 가져옴)

 

# for_each

variable "user_map" {
  type      = map(string)
  default   = {
    "hb"        = "/good/"
    "terraform" = "/nice/"
    "hb"        = "/bad/"
  }
}

resource "aws_iam_user" "users" {
  for_each = var.user_map
  name     = each.key
  path     = each.value
}

배포 시 아래와 같이 생성

"hb" : "/good"이 아닌 "hb" : "/bad"가 생성

 

key가 중복되면 중복되는 key는 제외되어 loop는 실제로 2번만 도는걸까요?

 

 

 

답변 2

1

형빈님의 프로필 이미지
형빈
질문자

(추가 질문)

만약 저런 식으로 iam을 관리할 때, users 변수에 중복된 Key가 있는지 검증하는 방법이 있을까요??

users의 key 개수를 어딘가에 저장하고(locals??) apply 할 때 count를 비교해주면 될 것 같은데.. 구현 방법을 잘 모르겠습니다.

variable "users" {
  type = map(string)
  default = {
    "hb"        = "/good/"
    "terraform" = "/bad/"
    "hb"        = "/hmm/"
  }

  validation {
    condition     = length(keys(var.users)) != (중복제거한 var.users)   # 이런식으로
    error_message = "duplicated in map"
  }
}

 

0

천강민님의 프로필 이미지
천강민
지식공유자

안녕하세요.

보통의 프로그래밍 언어처럼 map에서 키가 중복되는 경우엔 마지막 키를 기준으로 동작하게 됩니다.

이와 반대로, set의 경우엔 링크를 보시면 중복되는 마지막 값을 제거합니다.

맵의 예시를 Python의 딕셔너리 형태의 예시로 보여드리면 아래와 같습니다.

a = {
    "a": "a",
    "a": "b",
}

print(a)

# 결과
python3 test.py  
{'a': 'b'}

추가 질문 주신 부분에 대해서는 현재 사용하고 계신 방법에 대해서는 가능한 조치 방안이 없습니다.

관련해서 논의 중인 링크 참고 부탁드립니다.

꼭 검증이 필요하다면 아래와 같이 만들어주셔야 합니다.

variable "users" {
  type = list(object({
    name = string
    path = string
  }))
  default = [
    { name = "hb", path = "/good/" },
    { name = "terraform", path = "/nice/" },
    { name = "hb", path = "/bad/" }
  ]

  validation {
    condition     = length(var.users) == length(distinct([for user in var.users : user.name]))
    error_message = "중복되는 키가 있습니다."
  }
}

###

Planning failed. Terraform encountered an error while generating this plan.

╷
│ Error: Invalid value for variable
│ 
│   on main.tf line 1:
│    1: variable "users" {
│     ├────────────────
│     │ var.users is list of object with 3 elements
│ 
│ 중복되는 키가 있습니다.
│ 
│ This was checked by the validation rule at main.tf:12,3-13.
형빈님의 프로필 이미지
형빈

작성한 질문수

질문하기