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

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

목차

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

for_each의 실제 사용 사례

1. 리소스 체이닝

리소스 체이닝은 한 리소스의 구성이 다른 리소스의 출력에 따라 달라지는 리소스 간 종속성을 만드는 것을 포함합니다. 이는 특정 리소스를 순차적으로 프로비저닝해야 하는 인프라 설정에서 일반적입니다.

리소스 체이닝을 더 잘 이해하기 위해 VPC를 설정하고 VPC 내에 서브넷을 배포하는 일반적인 시나리오를 살펴보겠습니다.

variable.tf

# variable.tf
variable "networks" {
  description = "Map of networks configurations"
  type = map(string({
    cidr           = string
  }))
  default = {}
}

terraform.tfvars

# terraform.tfvars
networks  {
    "network1" = {
      cidr = "10.0.1.0/24"
    },
    "network2" = {
      cidr = "10.0.2.0/24"
    }
  }

main.tf

resource "aws_vpc" "main" {
  for_each = var.networks
  cidr_block = each.value.cidr
  tags = {
    Name = "VPC-${each.key}"
  }
}

resource "aws_subnet" "subnets" {
  for_each          = var.networks
  vpc_id            = aws_vpc.main[each.key].id
  cidr_block        = each.value.cidr
  availability_zone = "us-west-2a"
  tags = {
    Name = "Subnet-${each.key}"
  }
}

이 예제에서 각 VPC는 network map을 기반으로 생성되고, 그런 다음 각 VPC 내에 서브넷을 생성합니다.
aws_subnet 리소스는 aws_vpc블럭의 ID를 참조하여 같은 방식으로 for_each루프를 돌며 서브넷을 생성합니다.

2. 태깅 리소스를 동적으로 할당하기

동적 태그를 사용하면 구성의 설정이나 기타 동적 입력을 기반으로 리소스에 메타데이터를 할당하여 리소스 관리, billing 및 자동화를 개선할 수 있습니다.

다음을 for_each문을 사용하여 s3 버킷을 동적으로 태그 지정하는 예를 들어 보겠습니다.

variable.tf

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

terraform.tfvars

# terraform.tfvars
buckets  {
    "bucket1" = {
      name = "app-logs",
      tags = {
        "Environment" = "Production",
        "Application" = "Logging",
      }
    },
    "bucket2" = {
      name = "app-data",
      tags = {
        "Environment" = "Staging",
        "Application" = "DataStore",
      }
    }
  }

main.tf

resource "aws_s3_bucket" "app_bucket" {
  for_each = var.buckets
  bucket = each.value.name
  tags = each.value.tags
}

이 예제에서는 bucket map에서 정의된 태그를 기반으로 각 S3 버킷에 동적으로 태그를 적용합니다.

3. 여러 region에 리소스 배포

여러 region에 리소스를 배포하면 재해 복구를 향상하고 지연 시간을 줄일 수 있습니다.
for_each문은 이러한 배포를 효율적으로 관리하는 데 사용할 수 있습니다.

아래의 예와 같이 for_each문을 사용하여 여러 region에 s3 버킷을 배포할 수 있습니다.

provider.tf

provider "aws" {
  alias  = "useast1"
  region = "us-east-1"
}

provider "aws" {
  alias  = "apnortheast1"
  region = "ap-northeast-1"
}

variable.tf

variable "regions" {
  description = "Regions to deploy S3 buckets"
  type = map(string({
    "us-east-1"      = string
    "ap-northeast-1" = string
  }))
  default = {}
}

terraform.tfvars

regions = {
  "us-east-1" = "env0-app-us-east-1",
  "ap-northeast-1" = "env0-app-ap-northeast-1"
}

main.tf

# 멀티 리전 s3버킷 생성
resource "aws_s3_bucket" "multi_region_buckets" {
  for_each = var.regions
  bucket   = each.value
  provider = each.key == "us-east-1" ? aws.useast1 : aws.apnortheast1
}

이 예제에서 S3 버킷은 us-east-1그리고 ap-northeast-1 두 region 모두에서 생성됩니다. provider 속성은 region이 정의되어진 map 콜렉트를 for_each로 루프를 돌며 providerkey값을 기준으로 올바른 제공자를 동적으로 선택하여 리소스를 생성합니다.