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

오픈 소스 인프라 관리 툴 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의 최신 기능을 활용하여 다중 리전 인프라를 최적화된 방식으로 관리할 수 있습니다.