OpenTofu는?
Hashicorp에서 Terraform의 라이센스를 MPL(Mozilla Public License)에서 BUSL(Business Source License) 비오픈 라이센스로 변경하였고, 이에 대한 대응으로 탕생하게 되었습니다.
물론 이것이 Terraform의 인기를 반증한다고 할 수 있으며, Terraform을 포크한 오픈 소스이기 때문에 Terraform의 구성과 워크플로에 호환됩니다.
현재는 버전 차이가 크지 않아 업데이트에 잘 따라가고 있으나, 회사와 같은 기술 로드맵이 있지 않으며 업데이트가 늘어날 수록 기능에 차이가 생길 것으로 예상됩니다.
Oracle 역시 기업용 제품 라인업에서 Terraform을 Opentofu로 대체되었습니다.
Terraform to Opentofu
opentofu를 접하면서 제일 궁금했던건 그래서, 기존에 만들어둔 코드 그대로 opentofu로 바꿔서 배포하면 똑같이 배포가 되는 것일까? 이었습니다.
그래서 이전에 EKS 배포했을 때 사용했던 코드 그대로 opentofu를 통해 배포해보았습니다.
Step 1) opentofu를 설치합니다.
## MAC OS 기준 ##
$ brew install tenv
$ tenv -v
$ tenv tofu -h
$ tenv tofu list-remote
$ tenv tofu install 1.7.3
$ tenv tofu use 1.7.3
tenv는 tfenv와 동일하게 여러 버전의 opentofu를 다운로드 받아 코드 호환성에 따라 버전을 지정해 사용할 수 있습니다.
신기한 점은 tenv에서 tfenv 처럼 terraform도 설치할 수 있다는 것이었습니다.
$ tenv tf list-remote
$ tenv tf install 1.8.5
$ tenv tf use 1.8.5
$ tenv tf list
Step 2) 별도로 코드를 수정하지 않고 배포합니다.
opentofu는 명령어 수행 시 tofu로 수행합니다.
Terraform과 마찬가지로 apply / destroy 시 -auto-approve를 지원합니다.
$ tofu init
$ tofu plan
$ tofu apply
Plan도 잘되는 것 같고, cluster 생성 후 정보 조회 시 데이터가 잘 조회되었습니다.
Step 3) 자원 삭제
opentofu는 terraform과 달리 Destroy 시에도 apply를 포함해 주어야 했으나, 1.8.0-rc1 에서는 Destroy로만으로 자원이 삭제되었습니다.
## opentofu 1.7.3 resource destroy ##
$ tofu apply -destroy -auto-approve
## opentofu 1.8.0-rc1 resource destroy ##
$ tofu destroy -auto-approve
Opentofu의 장점이라 느낀 것
Opentofu에서 가장 특이하지만 장점이라고 생각했던 부분
1) Terraform에서는 Provider가 별도 지원했던 function이 내장 함수로 지원된다는 것
ex) base64gunzip
terraform : provider support (https://registry.terraform.io/providers/Yantrio/tfutils/latest/docs/functions/base64gunzip)
opentofu : built-in function (https://opentofu.org/docs/language/functions/base64gunzip/)
2) Backend, Module Sources, Encryption Configuration 항목에 variable 적용이 가능
ex) backend 구분에 변수 적용
variable "s3_name" {
default = "ssungz-tf-bucket-2408"
}
variable "region" {
default = "ap-northeast-2"
}
terraform {
backend "s3" {
bucket = var.s3_name
key = "terraform.tfstate"
region = var.region
encrypt = true
}
}
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"] # Canonical
}
resource "aws_instance" "this" {
ami = data.aws_ami.ubuntu.id
instance_type = "t3.micro"
tags = {
Name = "final-labs"
}
}
$ tofu init
$ tofu plan && tofu apply -auto-approve
- Terraform에서 변수로 수행할 경우
Terraform 에서 backend 블럭에 변수를 적용할 경우 위와 같이 변수 사용이 허가되지 않는다는 오류가 init 단계에서 발생합니다.
반면 opentofu에서는 init에서 apply 까지 오류 없이 정상적으로 배포되었습니다.
이로 인해 변수의 사용 범위가 좀 더 넓어지고, 코드의 활용성도 높힐 수 있어 보였습니다. (환경 별 배포와 같은 케이스에서)
마무리
Opentofu 챕터를 마지막으로 gasida terraform 스터디가 종료되었습니다.
처음에는 매주 블로그를 작성해야 한다는 것이 부담되었으나,
점점 재미가 붙어 블로그 게시글을 작성하기 위해 테스트하는 것 조차 즐거워졌습니다.
또 terraform에 대해 기초적인 부분만 알고 있었고, 이 스터디에서 Terraform의 모든 것을 공부하지는 않았지만
Terraform에 대해 충분히 공부할 수 있어서 개인적으로 유익한 스터디 기간이었습니다.
최근 기술 스택에 대해 여러 고민이 있었는데 이번 스터디를 통해 어느정도 갈피가 잡히게 되어 행복한 스터디 기간을 지냈습니다.
이제 다른 포스팅을 통해 얇을 수 있지만 공부하고 있는 내용들을 더 많이 공유하도록 하겠습니다.
'Cloud > Terraform' 카테고리의 다른 글
[T101] Terraform 101 Study 7주차 (EKS, Karpenter) (0) | 2024.07.27 |
---|---|
[T101] Terraform 101 Study 5주차 (Atlantis custom workflow) (1) | 2024.07.12 |
[T101] Terraform 101 Study 4주차 (0) | 2024.07.05 |
[T101] Terraform 101 Study 실습(5) - for (1) | 2024.07.03 |
[T101] Terraform 101 Study 실습(4) - data resource (0) | 2024.07.02 |