inflearn logo
강의

Course

Instructor

Cloud Security Programming for Practical Use (AWS, Python, Terraform)

2.8. Loop (for_each)

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

Resolved

251

gudqls15393845

13 asked

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번만 도는걸까요?

 

 

 

python aws Terraform devsecops

Answer 2

1

gudqls15393845

(추가 질문)

만약 저런 식으로 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

rex

안녕하세요.

보통의 프로그래밍 언어처럼 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.

작업형 1 유형 부분

0

9

1

수강평 이벤트

0

15

2

패키지 구분에 대해 궁금한게 있습니다

0

7

1

.terraform, .terraform.lock.hcl 파일이 생성되지 않는 현상

0

75

2

섹션 4 프로젝트 코드

1

83

1

mysql 접속 에러

0

106

1

default tags , 리소스에 tags 중복 문의

1

209

1

테라폼으로 람다 형상 관리 방법

1

306

1

강의 순서 문의

1

217

1

람다 캐싱 질문

1

204

1

webhook 단점

1

240

1

ModuleNotFoundError: No module named 'pprint' 에러

1

250

1

모듈 vs 리소스

1

215

1

s3 bucket 생성 에러

1

316

1

terraform import 관련 질문

1

209

1

generate expression 사용 예시

1

194

1

boto3 라이브러리 사용 시 에러

1

248

1

boto3 사용자 생성 질문입니다.

1

408

2

pip로 패키지를 설치했음에도 import 오류가 납니다. 어떻게 해야 할까요?

0

660

1

3.2. 왜 리소스 기반 정책은 Deny로 해야되나요? 부분이 잘 이해되지 않습니다.

1

371

2

제상황을 좀 더 자세히 적겠습니다.

0

585

1

영상을 아무리 찾아봐도

0

399

1

질문입니다

0

355

1

질문입니다

0

1003

1