DevOps

[OpenTofu] OpenTofu 1.9.0-alpha1 릴리즈: 주요 기능 및 다중 리전 인프라 배포의 유연성

Jflip 2024. 11. 12. 10:27
728x90

오픈 소스 인프라 관리 툴 OpenTofu의 1.9.0-alpha1 프리릴리즈가 공개되었습니다. 이 버전은 여러 커뮤니티 기여를 반영한 다양한 개선 사항과 기능을 제공합니다. 특히 다중 리전 및 특정 리소스 관리의 유연성을 높여주는 새로운 기능들이 추가되었는데, 본 포스팅에서는 주요 기능과 주의사항을 상세히 살펴보도록 하겠습니다.
 
Terraform과 마찬가지로 OpenTofu는 for_each를 통해 다중 리전 인프라 배포 시 코드 효율성을 크게 높이며, -exclude 옵션을 통해 특정 리소스를 제외한 계획 수립을 지원합니다.
 

OpenTofu 1.9.0-alpha1의 주요 기능

1. for_each 프로바이더 구성 블록

OpenTofu는 프로바이더 블록에서도 for_each 구문을 활용해 여러 인스턴스를 생성할 수 있는 기능을 제공합니다. 이는 다중 리전에 대한 프로바이더를 효율적으로 정의하는 데 도움이 됩니다.

provider "aws" {
  alias    = "by_region"
  for_each = var.aws_regions
  region   = each.key
}

위 예제는 여러 AWS 리전에 대해 프로바이더를 한 번에 구성할 수 있게 해 줍니다.
이를 통해 다중 리전에서 동일한 인프라 구성을 반복 생성할 수 있으며, 추가적인 코드 중복을 줄일 수 있습니다.

2. -exclude 옵션으로 특정 리소스 제외

OpenTofu 1.9.0-alpha1에서는 -exclude 플래그를 사용해 특정 리소스나 객체를 배포 계획에서 제외할 수 있습니다. -target 플래그가 특정 리소스를 포함하는 방식이라면, -exclude는 제외할 리소스를 지정하는 방식입니다. 이 기능을 사용하면 의도치 않은 변경을 방지하고, 계획과 실행의 효율성을 높일 수 있습니다.

tofu plan -exclude=kubernetes_manifest.crds

위 명령어는 kubernetes_manifest.crds 리소스를 배포 계획에서 제외합니다. 이는 특정 리소스를 제외한 상태에서의 계획 수립이 필요할 때 유용하게 사용될 수 있습니다.

다중 리전 배포와 for_each의 장점

Terraform과 OpenTofu에서는 for_each를 통해 동일한 리소스를 반복 생성할 수 있어 다중 리전 인프라 배포 시 코드의 중복을 줄이고, 유연한 구성을 할 수 있습니다. 예를 들어, 아래와 같이 for_each 구문을 사용하면 여러 리전에 대해 동일한 설정의 인프라를 쉽게 배포할 수 있습니다.

variable "aws_regions" {
  type    = list(string)
  default = ["us-east-1", "us-west-1"]
}

resource "aws_instance" "example" {
  for_each = toset(var.aws_regions)
  provider = aws.by_region[each.key]
}

이 코드를 통해 개별 리전 설정 없이 단일 코드 블록에서 다수의 리전 설정이 가능합니다. 이를 통해 인프라 코드의 간결성과 확장성이 크게 향상됩니다.

for_each가 프로바이더에서 기본적으로 지원되지 않는 이유

Terraform과 OpenTofu에서(이번 프리 릴리즈 이전)는 리소스나 모듈에서 for_each 구문을 사용할 수 있지만, 프로바이더에서는 기본적으로 for_each가 적용되지 않습니다.
이는 프로바이더의 설계 원칙 및 역할에 기인한 한계로, 다음과 같은 이유가 있습니다.
프로바이더는 동적 리소스 생성을 위해 설계되지 않음: 프로바이더는 리소스를 정의하는 데 필요한 인증 정보와 설정을 제공하며, 특정 리소스에 고정된 설정을 제공하도록 설계되었습니다.
프로바이더의 상태 관리 복잡성: 여러 프로바이더 인스턴스를 생성하면 상태 파일의 복잡성이 증가하고, 이로 인해 예기치 않은 동작이나 상태 충돌이 발생할 수 있습니다.
프로바이더는 리소스 의존성의 루트를 형성: 다중 프로바이더 인스턴스가 동적으로 생성되면 의존성 관리가 어려워지고, 리소스 간 충돌이 발생할 가능성이 높아집니다.

해결 방안: 다중 프로바이더 인스턴스를 미리 정의하고 모듈에 전달

다중 리전 구성을 위해 프로바이더에 for_each를 직접 사용할 수는 없지만, 이를 대신해 미리 정의된 프로바이더 인스턴스를 활용할 수 있습니다. 예를 들어, alias와 로컬 변수를 사용하여 다중 리전 프로바이더 인스턴스를 관리하고, 이를 모듈로 전달하는 방법입니다.

provider "google" {
  alias  = "goog-us-east1"
  region = "us-east1"
}



provider "google" {
  alias  = "goog-us-west1"
  region = "us-west1"
}



locals {
  regions = toset(["us-east1", "us-west1"])
  providers = {
    us-east1 = google.goog-us-east1
    us-west1 = google.goog-us-west1
  }
}



module "vpc" {
  for_each = local.regions
  providers = {
    google = local.providers[each.key]
  }
}

이 방법은 다중 리전 구성을 위한 효율적인 프로바이더 관리 방안으로, OpenTofu와 Terraform 모두에서 유사하게 적용할 수 있습니다.
 

OpenTofu 1.9.0-alpha1 프리릴리즈 주의사항 및 제약사항

⚠️ 중요: 이 버전은 프리릴리즈(알파) 버전으로, 프로덕션 환경에서 사용하지 않는 것을 강력히 권장합니다.

1. 이전 버전과의 호환성 정보

  • 새로운 기능인 프로바이더 설정 블록의 for_each와 -exclude 옵션이 추가됨
  • Linux, Windows, MacOS, FreeBSD, OpenBSD, Solaris 등 다양한 플랫폼 지원
  • 각 플랫폼별 386, amd64, arm, arm64 아키텍처 지원

2. -exclude 옵션 사용 시 주의사항

  • -target과 반대로 작동하여, 제외할 객체와 그에 의존하는 모든 객체가 제외됨
  • 의존성 체인으로 인해 예상보다 많은 리소스가 제외될 수 있으므로 주의 필요
  • 제외된 리소스의 상태 관리에 특별한 주의가 필요함

3. 새로운 기능들의 성능 영향과 제약사항

  • 프로바이더 for_each 기능은 코드 중복을 줄이지만, 상태 파일 크기 증가 가능성 있음
  • 알파 버전이므로 안정성이 완전히 보장되지 않음
  • 프로바이더 설정의 복잡성이 증가할 수 있음
  • 커뮤니티의 적극적인 테스트와 피드백이 필요한 단계

마무리: Terraform과 OpenTofu의 다중 리전 프로바이더 구성의 최적화

OpenTofu와 Terraform은 고가용성 및 확장성을 위한 다중 리전 인프라 배포에 유용한 도구입니다. OpenTofu 1.9.0-alpha1 버전은 for_each와 -exclude 옵션 같은 새로운 기능을 통해 다중 리전 구성을 효율적으로 지원하고 있습니다. 비록 for_each를 프로바이더에서 직접 사용할 수는 없지만, alias와 로컬 변수를 활용해 다중 프로바이더 인스턴스를 설정하고 모듈에 전달하는 방식으로 유사한 효과를 얻을 수 있습니다.
이처럼 OpenTofu와 Terraform의 최신 기능을 활용하여 다중 리전 인프라를 최적화된 방식으로 관리할 수 있습니다.

728x90
반응형