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

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

목차

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

for_each를 사용하는 장점

1. 동적 리소스 관리

for_each문은 컬렉션(map 또는 set)을 기반으로 리소스를 동적으로 생성, 관리 및 destroy를 가능하게 합니다. 이 동적 접근 방식을 통해 인프라는 Terraform 코드의 구성을 수동으로 업데이트하지 않고도 terraform.tfvars에 정의된 입력변수 데이터의 변경만으로도 자동으로 구성을 변경할 수 있습니다.

예를 들어, 아래 예와 같이 프로젝트 이름 목록을 기반으로 동적 개수의 S3 버킷을 프로비저닝하기 위한 인프라 프로비저닝을 위한 IaC를 작성할 수 있습니다.

variable.tf

# variable.tf
variable "project_names" {
  description = "Map of Project Names"
  type = set(string)
  default = []
}

terraform.tfvars

# terraform.tfvars
project_names = ["DisasterRecovery", "VPCNetworkSetup"]

main.tf

resource "aws_s3_bucket" "project_bucket" {
  for_each = var.project_names
  bucket   = each.value
}

2. 조건부 리소스 생성

Terraform의 조건식과 결합하면, for_each문에 의해 반복되는 데이터 내의 특정 기준에 따라 리소스를 조건부로 생성하는 데 사용할 수 있습니다. 이를 통해 어떤 리소스를 생성, 업데이트 또는 파괴할지에 대한 보다 세부적인 제어가 가능합니다.

예를 들어, 다음과 같이 create속성이 참 경우에만 S3 버킷을 생성하도록 IaC를 조정할 수도 있습니다.

variable.tf

# variable.tf
variable "bucket_configs" {
  description = "Map of buckets configurations"
  type = map(object({
    name   = string
    create = bool
  }))
  default = {}
}

terraform.tfvars

# terraform.tfvars
buckets  {
    "bucket1" = {
        name = "env01", 
      create = true 
    },
    "bucket2" = {
        name = "env02", 
      create = false 
    }
  }

main.tf

resource "aws_s3_bucket" "conditional_bucket" {
  for_each = { for k, v in var.bucket_configs : k => v if v.create }
  bucket   = each.value.name
}

3. 향상된 코드 재사용성

리소스의 각 인스턴스에 대해 리소스 블록을 복제해서 작성하는 대신, 각각에 대해 컬렉션(예: map이나 set)의 각 항목에 적용할 수 있는 단일 resource(또는 modules) 블록을 정의할 수 있습니다.

이러한 접근 방식은 공통적인 구성 요소를 단일 매개변수화된 블록으로 추상화하고, 각 리소스 인스턴스에 대한 구체적인 세부 정보는 반복되는 컬렉션에서 동적으로 파생됩니다.

예를 들어, 다음을 통합할 수 있습니다. 각각에 대해 module을 사용하여 코드를 DRY하게 유지하세요:

variable.tf

variable "environments" {
  description = "Map of environment configurations"
  type = map(string({
    "dev"      = string
    "prod" = string
  }))
  default = {}
}

terraform.tfvars

environments = {
    "dev"  = "ami-02d3fd86e6a2f5122",
    "prod" = "ami-0ce2cb35386fc22e9",
}

main.tf

module "dry_module_ec2" {
  for_each      = var.environments
  source        = "terraform-aws-modules/ec2-instance/aws"
  ami           = each.value
  instance_type = "t2.micro"
}

자주 묻는 질문

Q. Terraform에서 for_each와 count를 같은 리소스에 사용할 수 있나요?

아니요,
for_eachcount는 동일한 리소스 또는 모듈 블록 내에서 함께 사용할 수 없습니다. 사용할 때 필요에 따라 하나를 선택해야 합니다.

count문은 지정된 수의 동일한 리소스를 생성하는 데 사용되는 반면 for_eachmap이나 set의 항목을 반복하여 서로 다른 구성으로 여러 리소스를 생성할 때 사용됩니다.

Q. Terraform에서 count.index의 용도는 무엇인가요?

Terraform에서는 count문이 사용되는 블록에서 생성된 리소스의 0부터 시작하는 인덱스로 시작하는 내장 변수가 있는데 이 인덱스를 호출하는 것이 count.index 입니다.

이는 count문에 의해 여러 개의 인스턴스 리소스를 만들때 각 개별의 인스턴스의 숫자 식별자를 사용하여 카운트하거나 구별해야 할 때 주로 사용됩니다.

Q. for_each를 모듈과 함께 사용할 수 있나요?

예, for_each문은 Terraform 모듈과 함께 사용할 수 있으며, map이나 set의 항목을 기반으로 모듈의 여러 인스턴스를 만들 수 있습니다. module에서 for_each문을 사용할 때 반복하려는 값은 컬렉션(map 또는 set) 정의된 항목의 속성을 참조하여 리소스를 생성할 수 있습니다.

Q. count를 사용하여 리소스를 조건부로 생성할 수 있나요?

예, count문은 Terraform에서 리소스를 조건부로 생성하는 데 사용할 수 있습니다. count문을 활용하여 조건에 따라 리소스를 생성할지 여부를 지정할 수 있습니다. 예를 들어, 조건문을 사용하여 해당 조건이 true이면 리소스의 단일 인스턴스를 생성하고 false이면 리소스를 생성하지 않습니다.

Q. count에서 for_each로 마이그레이션하는 것이 가능합니까?

네, count문에서 for_each문으로 마이그레이션이 가능합니다. 하지만, 이 프로세스에는 신중한 계획과 실행이 필요합니다.