새소식

IaC/Terraform

5주차(2)_Terraform 반복문 for_each

  • -
CloudNet@ 팀의 가시다님께서 Leading 하시는 Terraform T101 Study 내용 요약

 

해당 Terraform Study 는 Terraform Up and Running 책을 기반으로 진행 중입니다.

 

 

테라폼에는 반복되는 여러 리소스를 한 번에 배포할 수 있도록 count, for, for_each 등의 반복문을 제공하고 있다.
이번 포스팅에서는 테라폼 반복문 중 for_each 에 대해서 알아보자!

 

count 반복은 아래 포스팅을 참고하자 !!
 

5주차(1)_Terraform 반복문_count

CloudNet@ 팀의 가시다님께서 Leading 하시는 Terraform T101 Study 내용 요약 해당 Terraform Study 는 Terraform Up and Running 책을 기반으로 진행 중입니다. 테라폼에는 반복되는 여러 리소스를 한 번에 배포할 수

kimalarm.tistory.com



1. for_each


for_each 표현식은 리스트(List), 집합(Set), 맵(Map) 을 사용하여 전체 리소스 혹은 인라인 블록을 반복할 수 있다.
  • for_each 표현식은 리소스를 배열(Array)이 아닌 맵(Map)으로 저장하기 때문에, 특정 리소스만을 삭제할 수 있다.

 

1.1. for_each 사용법

기본 구문은 아래와 같다.
  • COLLECTIOM : 반복 처리할 집합(Set), 맵(Map)
  • CONFIG : 해당 리소스와 관련된 인수로 구성. each.key 혹은 each.value 를 통해 COLLECTION 의 key - value 에 접근

resource "<PROVIDER>_<TYPE>" "<NAME>" {
  for_each = <COLLECTION>

  [CONFIG ...]
}

 

실제로 테스트하기 위해 다음과 같이 ec2.tf , variables.tf 를 생성한다.

  • ec2_type 변수의 항목 개수만큼 반복을 하며, instance_type 인수 속에는 ec2_type 항목 value 에 해당하는 값이 입력됨

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_instance" "example" {
  for_each  = var.ec2_type

  ami           = "ami-0c76973fbe0ee100c"
  instance_type = each.value
}

variable "ec2_type" {
  description = "Create EC2 with these types"
  type        = map(string)
  default     = {
    micro   = "t2.micro"
    medium  = "t2.medium"
    large   = "t2.large"
  }
}

 

1.2. for_each 내 List 사용

for_each 내에서 list 리소스를 사용하기 위해 toset 함수가 필요

for_each 는 기본적으로 List 를 지원하지 않아 toset 함수를 사용해야한다.

이전 포스팅에서 사용했던 iam.tf 파일을 for_each 구문을 활용해서 생성해보자

// iam.tf 내용

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_iam_user" "myiam" {
  for_each = toset(var.user_names)
  name     = each.value
}
// variables.tf 내용

variable "user_names" {
  description = "Create IAM users with these names"
  type        = list(string)
  default     = ["terraform", "aws", "local"]
}

output "all_users" {
  value = aws_iam_user.myiam
}

 

count 로 생성한 리소스와는 다르게 plan 출력 시, 배열(숫자)이 아닌 설정한 변수값이 출력되는 것을 확인할 수 있다.

그렇다면 output 출력 내용을 살펴보자 !!

 

 

Output이 배열이 아닌 맵 형식으로 출력되는 것을 확인 할 수 있다.

이렇게 되면 특정 리소스만 골라서 삭제하는 것도 가능해진다.

 

variables.tf 에서 "aws" 리소스를 삭제한 후에 plan 과 apply 의 변화는 어떻게 될까??

count 와는 다르게 제거한 "aws" 만 골라서 삭제된다 !!

 

 

1.3. for_each 인라인 블록 사용

for_each 구문은 count 와 다르게 인라인 블록에서도 사용 가능 !!
  • for_cach 인라인 블록 사용 구문

dynamic "<VAR_NAME>" {
  for_each = <COLLECTION>

  content {
    [CONFIG...]
  }
}

다음과 같이 RDS Parameter Group 생성에 for_each 를 사용할 수 있다.

// paramtergroup.tf

provider "aws" {
  region = "ap-northeast-2"
}

resource "aws_db_parameter_group" "db_mysql_pg" {
  name   = "pg-test-mysql"
  family = "mysql8.0"

  dynamic "parameter" {
    for_each = local.parameter_group
    content {
      name  = parameter.key
      value = parameter.value
    }
  }
}
// locals.tf

locals {
  parameter_group = {
    character_set_client : "utf8mb4"
    character_set_connection : "utf8mb4"
    character_set_database : "utf8mb4"
    character_set_filesystem : "utf8mb4"
    character_set_results : "utf8mb4"
    character_set_server : "utf8mb4"
    collation_connection : "utf8mb4_bin"
    collation_server : "utf8mb4_bin"
    time_zone : "Asia/Seoul"
  }
}

 


 

이번 포스팅에서는 for_each 반복문에 대해서 알아보았다.
다음 포스팅에서는 테라폼 for 반복문에 대해서 알아보자 !!

'IaC > Terraform' 카테고리의 다른 글

5주차(4)_Terraform 조건문  (0) 2022.12.02
5주차(3)_Terraform 반복문_for  (0) 2022.11.28
5주차(1)_Terraform 반복문_count  (0) 2022.11.22
4주차(2)_Terraform Module Output, Add-On  (0) 2022.11.21
4주차(1)_Terraform Module  (0) 2022.11.17
Contents

포스팅 주소를 복사했습니다