해결된 질문
작성
·
128
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.