for_eact를 사용해 리소스를 맵으로 처리하면 컬렉션 중간의 항목도 안전하게 제거할 수 있어 count를 사용해 리소스를 배열로 처리하는 것보다 이점이 큽니다.
리소스 내에서 여러 개의 인라인 블록을 만들 수 있다는 것입니다.
예시 )
책 187p 예시 참조
dynamic "<VAR_NAME>"{
for_each = <COLLECTION>
content {
[CONFIG...]
}
}
여기서 VAR_NAME은 각 '반복'의 값을 저장할 변수에 사용할 이름이고 COLLECTION은 반복되는 리스트 또는 맵이며
conten 블록 내에서 <VAR_NAME>.key 및<VAR_NAME>.value를 사용해 COLLECTION에 있는 현재 항목의 키와 값에 각각 액세스 할 수 있습니다.
for_each를 리스트와 함께 사용하는 경우 key는 인덱스가 되고 value는 해당 인덱스 목록에 있는 항목이 된다는 점을 기억합니다. 그리고 for_each를 맵과 함께 사용하는 경우 key와 value는 맵의 키-값 쌍 중 하나가 된다는 점을 유의해야합니다.
resource "aws_autoscaling_group" "wgpark-exam" {
.
.
.
tag {
key = "name"
value = var.cluster_name
propagate_at_launch = true
}
}
dynamic "tag" {
for_each = var.custom_tags
content {
key = tag.key
value = tag.value
propagate_at_launch = true
}
}
단일 값을 생성하기 위해 반복이 필요한 경우
[for <ITEM> in <LIST> : <OUTPUT>]
여기서 LIST는 반복할 리스트고 ITEM은 LIST의 각 항목에 할당할 로컬 변수의 이름이며 OUTPUT은 ITEM을 어떤 식으로든 변환하는 표현식입니다.
# 소문자를 대문자로 변환하는 테라폼 코드
variable "names" {
type = list(string)
default = ["wgpa","jwham","bdLee"]
}
output "upper_names" {
value = [for name in var.names :upper(name)]
}
# output
upper_names = [ "WGPA","JWHAM","BDLEE"]
# 필터링도 가능합니다
output "short_upper_names" {
value = [for name in var.names : upper(name) if length(name) <5 ]
}
# output
short_upper_names = ["WGPA"]
이와 같이 여러가지 기능을 이용할 수 있습니다.
문자열 지시자를 사용하면 문자열 보간과 유사한 구문으로 문자열 내에서 for 반복문,if문 같은 제어문을 사용할 수 있습니다. 다만 달러 부호와 중골화 ${...} 대신 백분율 부호 %{...} 를 사용한다는 차이가 있습니다.
테라폼은 두 가지 유형의 문자열 지시자, for 반복문과 조건문을 지원합니다.
for 문자열 지시자는 다음 구문을 사용합니다.
%{ for <ITEM> in <COLLECTION> } <BODY>%{endfor}
# COLLECTION 은 반복할 리스트 또는 맵
# ITEM 은 COLLECTION의 각 항목에 할당할 로컬 변수의 이름
# BODY는 ITEM을 참조할 수 있는 각각의 반복을 렌더링하는 대상입니다.
variable "names" {
type = list(string)
default = ["wgpark","jwham","bdlee"]
}
output "for_directive" {
value = <<EOF
%{for name in var.names}
${name}
${endfor}
EOF
}
# output
for_directive =
wgpark
jwham
bdlee
# 줄바꿈
스페이스나 줄 바꿈,공백을 없애기 위해 문자열 지시자의 앞이나 뒤에 물결표를 사용하면 됩니다.
%{~ for ... }
%{~ endfor}
Terraform Up & Running 테라폼 Writing Infrastructure as code 업앤 러닝 - 예브게닝 브릭만