★★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 값 개수 만큼 리소스 생성

Map , set
main.tf
배포 후 생성된 파일 확인

 

 

  • 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 구문을 사용 가능

main.tf

 

terraform state list

 

  • key 값은 count의 index와는 달리 고유하므로 중간에 값을 삭제한 후 다시 적용해도 삭제한 값에 대해서만 리소스 삭제

main.tf 수정
terraform state list

 

for_each 데이터 유형

main.tf
terraform plan

: for_each argument로 사용할 수 있는 것은 map, set type만 가능하기 때문에 error 발생

 

코드 수정 후 terraform plan 시 정상

 

▶ 데이터 유형 실습

 

  • 기본 유형
    - 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" )

mainn.tf
terraform console

  • Test 2 [ terraform console ]
    # list, set, tuple - 'value'
    terraform console


  • Test 3 [ terraform console ]
    # map, object - 'key : value'


  • Test 4 [ terraform console ]
    # tuple > list > set


  • Test 5 [ terraform console ]
    # object > map

 

 

  • main.tf 수정

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에서도 사용 가능

main.tf

: for_each를 사용한 후에는 하나의 리소스 또는 count를 사용한 것과 같은 리소스 배열이 되는 것이 아니라 리소스 맵 list into a set이 된다.