★★cloudNet@ 팀의 가시다 님이 진행하는 Terraform 101 Study 4기 내용과 한빛미디어 테라폼으로 시작하는 IaC 책을 참고하여 정리하였습니다. |
반복문
▶ for_each : 반복문, 선언된 key 값 개수만큼 리소스를 생성
- for_each는 반복(for)을 할 때 타입 값에 대해 하나하나 each object로 접근
- each object는 key, value 2개의 속성을 가지고 있음
- each, key - The map key (or set member) corresponding to this instance.
- each, value - The map value corresponging to this instance. (If a set was provided, this is the same as each.key) - 하지만 for_each는 모든 타입에 대해 each object로 접근 할 수 없고 map, set타입만 허용
- map, set 타입이 아닌 expression은 map 또는 set으로 타입변환(toset 등)을 해야한다
- set : 유일한 값의 요소들로 이루어진 list
: [1,2,3] - map : Key-Value 형식의 데이터
: { k:v, k2:v2}
: key값은 string이여야함
- 리소스 또는 모듈 블록에서 for_each에 입력된 데이터 형태가 map 또는 set이면, 선언된 key 값 개수 만큼 리소스 생성
- for_each가 설정된 블록에서는 each 속성을 사용해 구성을 수정할 수 있다
- each.key : 이 인스턴스에 해당하는 map 타입의 key 값
- each.value : 이 인스턴스에 해당하는 map의 value 값 - 생성되는 리소스의 경우 <리소스 타입>,<이름>[<key>], 모듈의 경우 module.<모듈 이름>[<key>]로 해당 리소스의 값을 참조
- main.tf 파일 수정
: local_file.abc 는 변수의 map 형태의 값을 참조
: local_file.def의 경우 local_file.abc 결과가 map으로 반환되므로 다시 for_each 구문을 사용 가능
- key 값은 count의 index와는 달리 고유하므로 중간에 값을 삭제한 후 다시 적용해도 삭제한 값에 대해서만 리소스 삭제
for_each 데이터 유형
: for_each argument로 사용할 수 있는 것은 map, set type만 가능하기 때문에 error 발생
▶ 데이터 유형 실습
- 기본 유형
- string : 글자 유형
- number : 숫자 유형
- bool : true 또는 false
- any : 명시적으로 모든 유형이 허용됨을 표시 - 집합 유형
- list [<유형>] : 인덱스 기반 집합
- map(<유형>) : 값 = 속성 기반 집합이며 키값 기준 정렬
- set(<유형>) : 값 기반 집합이며 정렬 키 값 기준 정렬
- object({<인수 이름>=<유형>,...})
- tuple ([<유형>,...]) - list와 set은 선언하는 형태가 비슷하지만 참조 방식이 인덱스와 키로 각각 차이가 있고, map와 set의 경우 선언된 값이 정렬되는 특징을 가진다.
- Test 1 [ terraform console ]
1번) type 지정을 안하였을 경우 어떻게 인식 하는지 -> 쌍따옴표 안에 들어갈 경우 기본적으로 string으로 인
2번) default 값에 "" 가 없을 경우 -> error 발생 ( in variable "string_c" )
- Test 2 [ terraform console ]
# list, set, tuple - 'value'
- Test 3 [ terraform console ]
# map, object - 'key : value'
- Test 4 [ terraform console ]
# tuple > list > set
- Test 5 [ terraform console ]
# object > map
- main.tf 수정
- 확인 : count는 index로 몇번에 어떤 내용이 있는지를 알 수 없다.
중간 리소스 삭제나 추가 시 문제 발생
: index key 로 인해 배포된 속성을 구분하지 못하므로 문제 발생
: for_each의 경우 키 값이 들어가 있어 삭제하고 싶은 리소스 삭제하여 문제가 발생하지 않음
▶ for_each vs count와 비교
- for_each 표현식을 사용하면 리스트 lists, 집합 sets, 맵 maps 를 사용하여 전체 리소스의 여러 복사본 또는 리소스 내 인라인 블록의 여러 복사본, 모듈의 복사본을 생성 할 수 있음
- for_each를 사용하여 리소스의 여러 복사본을 만드는 구문
resource "<PROVIDER>_<TYPE>" "<NAME>" {
for_each = <COLLECTION>
[CONFIG ...]
}
- COLLECTION은 루프를 처리할 집합 sets 또는 맵 maps
- 리소스에 for_each를 사용할 때에는 리스트는 지원하지 않는다
- CONFIG는 해당 리소스와 관련된 하나 이상의 인수로 구성되는데 CONFIG 내에서 each.key 또는 each.value를 사용하여 COLLECTION에서 현재 항목의 키와 값에 접근할 수 있다.
- for_each를 사용하여 3명의 IAM 사용자 생성
- var.user_names 리스트를 집합(set)으로 변환하기 위해 toset 사용. for_each는 리소스에 사용될때는 set과 map만 지원
- for_each가 이 집합을 반복하면 each.value에서 각 사용자 이름을 사용 가능
- 일반적으로는 each.key는 키/값 쌍 맵에서만 사용가능하지만, 사용자 이름은 each.key에서도 사용 가능
: for_each를 사용한 후에는 하나의 리소스 또는 count를 사용한 것과 같은 리소스 배열이 되는 것이 아니라 리소스 맵 list into a set이 된다.
'스터디 > Terraform' 카테고리의 다른 글
[Terraform T101 4기 스터디] - Provider & State (0) | 2024.07.01 |
---|---|
[Terraform T101 4기 스터디] - 기본 사용 (3)_2 (0) | 2024.06.24 |
[Terraform T101 4기 스터디] - 기본 사용 (2)_3 (0) | 2024.06.20 |
[Terraform T101 4기 스터디] - 기본 사용 (2)_2 (0) | 2024.06.20 |
[Terraform T101 4기 스터디] - 기본 사용 (2)_1 (0) | 2024.06.16 |