테라폼에서 루프문 사용하기2

2024. 8. 23. 18:43IT/d . e . v . O . p . s

목차

1. 테라폼에서 루프문 사용하기1
2. 테라폼에서 루프문 사용하기2
3. 테라폼에서 루프문 사용하기3
4. 테라폼에서 루프문 사용하기4

for_each는 어떻게 작동하나요?

더 잘 이해하기 위해 for_each문의 실제 사용 사례를 살펴보겠습니다.

EC2 인스턴스의 식별자인 각 키의 문자열 값과 인스턴스 유형 및 AMI ID를 포함하는 또 다른 맵인 인스턴스 구성 맵이 있다고 가정해 보겠습니다.

variable.tf

# variable.tf
variable "instances" {
  description = "Map of instance configurations"
  type = map(object({
    ami           = string
    instance_type = string
  }))
  default = {}
}

terraform.tfvars

# terraform.tfvars
instances {
    amzlinux = {
      ami           = "ami-02d3fd86e6a2f5122"
      instance_type = "t2.micro"
    },
    ubuntu = {
      ami           = "ami-0ce2cb35386fc22e9"
      instance_type = "t2.small"
    }
  }

main.tf

#main.tf
resource "aws_instance" "servers" {
  for_each      = var.instances
  ami           = each.value.ami
  instance_type = each.value.instance_type
  tags = {
    Name = "env0-Server-${each.key}"
  }
}

위의 코드를 세부적으로 살펴보겠습니다.

  • variable.tf 파일에 map으로 각 인스턴스에 대한 항목과 변수형식을 정의합니다.
  • terraform.tfvars파일에서는 각각의 리소스에 대해 key-value의 형식으로 변수들을 정의합니다. 여기에서는 "amzlinux"와 "ubuntu"는 이러한 구성의 식별자로 가지며, 각각 AMI ID와 인스턴스 유형을 지정합니다.
  • "aws_instance"타입의 "servers"블럭에서 for_eachvar.instances로 정의된 map의 각 요소들을 루프를 돌며 변수에 지정된 AMI 및 인스턴스 타입으로 EC2 인스턴스를 생성합니다.
  • tags블록에서는 each.key키(예: "amzlinux", "ubuntu")를 참조하여 각 인스턴스에 고유한 이름을 지정합니다.
  • each.value.ami 그리고 each.value.instance_type을 통해 각 인스턴스 구성에 대해 설정을 합니다.

Terraform 워크플로(init -> plan -> apply)실행이 성공적으로 완료가 되면 AWS 콘솔상에서 for_each문으로 프로비저닝 다음 두 인스턴스를 확인할 수 있습니다.

for_each에 대한 컬렉션

Maps

maps는 키-값 쌍의 컬렉션입니다. for_each를 사용하여 maps의 각 항목의 루프를 돌며 각각의 항목에 maps의 key와 value를 할당할 수 있습니다.
maps은 고유 식별자(key)와 특정 속성이나 구성을 연결해야 할 때 제일 적합합니다.

variable.tf

# variable.tf
variable "instance_tags" {
  description = "Map of instance configurations"
  type = map(string({
    Role           = string
    Environment = string
  }))
  default = {}
}

terraform.tfvars

# terraform.tfvars
instance_tags {
    "Role" = "Web-server"
    "Environment" = "Production"
}

main.tf

# main.tf
resource "aws_instance" "server_tags" {
  for_each = var.instance_tags
  # Other Configuration...
  tags = {
    "${each.key}" = "${each.value}"
  }
}

Sets

set은 유니크한 값을 가지는 컬렉션입니다. for_each를 사용하여 set의 루프를 돌며 각각의 항목에 배열의 값을 할당한다.
고유성을 보장해야 하고 key-value의 형태가 필요하지 않을 때 집합이 유용합니다.

variable.tf

# variable.tf
variable "availability_zones" {
  description = "Map of AZ configurations"
  type = set(string)
  default = []
}

terraform.tfvars

# terraform.tfvars
availability_zones = ["us-west-2a", "us-west-2b"]

main.tf

#Example config
resource "aws_subnet" "list_subnets" {
  for_each = var.availability_zones
  availability_zone = each.key
  # Other Configuration...
}

Lists

기본적으로 lists는 각 항목에 대한 고유한 키를 제공하지 않으므로 for_each 루프문으로 루핑을 돌릴 수가 없다.
하지만 방법이 없는 것은 아닙니다. 다음을 사용할 수 있습니다. tomap()또는toset() 펑션을 이용해서 listsset이나 map으로 변환을 하여 사용하면 됩니다.

variable.tf

# variable.tf
variable "availability_zones" {
  description = "Map of AZ configurations"
  type = list(string)
  default = []
}

terraform.tfvars

# terraform.tfvars
availability_zones = ["us-west-2a", "us-west-2b"]

main.tf

#Example config
variable "availability_zones" {
  type = list(string)
  default = ["us-east-1a", "us-east-1b"]
}
resource "aws_subnet" "example" {
  for_each = toset(var.availability_zones)    #or tomap(var.availability_zones)
  availability_zone = each.key
  # Other configurations...
}