[Terraform] 반복문 - 2

박원균·2021년 10월 20일
0

Terraform

목록 보기
6/11
post-thumbnail

반복문

for_each 표현식을 사용한 반복문 처리 -2

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 표현식을 이용한 반복문

단일 값을 생성하기 위해 반복이 필요한 경우

[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 업앤 러닝 - 예브게닝 브릭만

profile
함바라기

0개의 댓글