목적

Branch를 통해 개발(dev) 환경과 운영(prod) 환경을 분리하여 소프트웨어 개발과 배포 과정에서 발생할 수 있는 문제를 최소화한다.

Branch란?

말 그대로 Git 브랜치를 사용하여 각 환경에 맞는 Terraform 코드 버전을 관리하는 것이다. 앞서 설명한 바와 같이 Terraform workspace를 통해 환경별로 다른 리소스 생성 및 백엔드 사용이 가능하지만, backend 블럭에 변수를 사용할 수 없기 때문에, 하나의 환경이 하나의 bucket에 1:1 대응해야 한다. 또한 환경별로 다른 버전을 배포하는 것은 Terraform workspace로 지원하지 않기 때문에 다른 방법을 찾아야 하는데 그 중 하나가 바로 branch를 이용한 환경 관리이다.

환경별 다른 리소스 생성(1)

Terraform workspace을 이용하면 ${terraform.workspace} 환경 변수를 사용할 수 있다. Branch를 이용하여 환경을 분리하는 방법은 그냥 prod/dev 용 브랜치를 각각 생성하는 것이다.

  1. prod나 dev이름으로 브랜치를 생성한다.
$ git checkout -b dev
Switched to a new branch 'dev'
  1. dev 환경에서 배포할 리소스를 작성한다.
resource "aws_instance" "example" {
  ami           = "ami-0fb653ca2d3203ac1"
  instance_type = "t2.micro"
  tags = {
    Name = "example-server-dev"
  }
}
  1. 브랜치 간 이동
$ git checkout prod
Switched to branch 'prod'
  1. prod 환경에서 배포할 리소스를 작성한다.
resource "aws_instance" "example" {
  ami           = "ami-0fb653ca2d3203ac1"
  instance_type = "t2.large"
  tags = {
    Name = "example-server-prod"
  }
}
  1. 해당 브랜치에서 리소스를 배포한다.
terraform apply

단점: 이렇게 환경별로 모든 브랜치를 만들면 중복되는 코드가 계속 생겨날 것이고 유지보수를 더 어렵게 만든다.

환경별 다른 리소스 생성(2)

그렇기 때문에 코드는 동일하게 유지하되 변경되는 부분만 terraform.tfvars파일을 통해 변수화시켜서 관리해야 한다. terraform.tfvars파일은 시크릿 value들을 관리하기 위하여 git 레포에 커밋하지 않는 변수관리용 파일이기 때문에 checkout해도 값은 변하지 않는다.

resource "aws_instance" "example" {
  ami           = "ami-0fb653ca2d3203ac1"
  instance_type = var.instance_type
  tags = {
    Name = var.instance_name
  }
}