Terraform Cloud 도입

Hoonkii·2023년 8월 7일
0

서론

사내 인프라 환경을 기존 모놀리식 + ECS 환경에서 MSA + AWS EKS 로 전환하면서 Terraform 도입도 같이 진행하게 되었다. Terraform 도입 이후 효율적인 tfstate 관리 방법과, CI/CD 상 terraform 변경 사항에 대한 검증 및 가시화 파이프라인에 대한 요구사항이 생겼다. Terraform Cloud는 우리의 요구 사항을 만족하는 서비스이기 때문에 도입하게 되었다.

Terraform Cloud란?

Terraform cloud는 terraform의 가상 실행환경을 제공하고, tfstate 관리 및 Github과 같은 VCS와의 연동을 제공하여 Gitops를 가능하게 해주는 클라우드 서비스이다.

Github Action처럼 Terraform plan & apply 명령어를 클라우드 환경에서 실행해주며, Github 레포지토리와 연동시켜 놓으면 자동으로 CI/CD가 비슷하게 적용되어 편리하게 Gitops를 구축할 수 있다.

Github 과의 연동

우리는 tfstate 파일의 버전 관리 및 Locking, Github 과 연동 하여 인프라 변동 사항에 대한 PR을 생성했을 때 변경 사항을 CI 파이프라인 상에서 볼 수 있기를 원했으며, 머지가 되었을 때도 바로 Apply가 실행되는 것이 아니라, 한번 더 Check 하고 Apply 할 수 있는 절차를 원했다.

Terraform cloud 는 Github 연동을 하면 위의 요구 사항의 모든 기능을 제공한다.

다음과 같은 절차를 통해 Github 과 연동을 진행할 수 있다.

Terraform Cloud 에 회원 가입 이후 Workspace를 만든다. 이 때 1번 Version control workflow 를 선택한다.

이후 Github을 VCS 로 선택한다.

그 다음 3번 step에서 연동을 원하는 Repository를 선택한다.

적절히 Workspace 이름을 설정한 후 Advanced options를 펼쳐보자.

Advanced option에서는 Github 내 Working directory 및 언제 Terraform Cloud 에서 Terraform을 실행시킬 지 등에 관한 옵션들이 존재한다.

Terraform Working Directory 는 Repository 내 테라폼 Configuration 이 존재하는 디렉토리가 따로 있다면 명시하면 된다.
우리의 경우 폴더 구조가 다음과 같이 되어있기 때문에 /terraform을 working directory로 설정해야 했다.

/helm-manifest
/terraform
  main.tf
  providers.tf
  variables.tf
  ...

Apply Method 는 지정한 브랜치에 PR이 머지되거나 커밋이 푸시되었을 때 직접 terraform Cloud 내에서 직접 apply를 눌러야 인프라 변경 사항을 apply할 것인지, 혹은 그냥 main 브랜치에서 변경 사항이 머지될 때 plan이 성공하면 알아서 apply 실행시킬지 여부에 대한 옵션이다.

각자 상황에 맞게 옵션을 설정한 후 Workspace를 생성하면 그 시점부터 github repository와 연동된다.

특정 helm chart를 설치하는 terraform 설정을 추가한 후 PR을 생성하면, 커밋 옆에 CI 처럼 Terraform Cloud 에서 terraform plan 명령어를 실행시켜 준다.

Details 를 클릭하면 Terraform Cloud 에서 자세한 실행 내역을 볼 수 있다.

Terraform plan을 실행시켰을 때 terraform에 어떤 변화가 있는지 웹 UI로 보여준다. 이 기능을 통해서 PR의 리뷰어가 로컬에서 Terraform plan을 실행시키지 않고 웹에서 변경사항을 검증할 수 있어 매우 유용하다.

  • State 관리

terraform cloud 를 통해 terraform apply를 실행하면 state가 변경되며 해당 state는 모두 terraform cloud 에 저장된다. 어떤 실행에 따라 변경되었는지 모든 내역들을 다 추적할 수 있다.

결론

github + terraform 을 같이 쓰면서 팀원과 협업하고 있다면 용이한 state 관리 및 자동 ci/cd 를 지원하는 terraform cloud를 도입을 추천한다. 리소스 500개 팀원 5명 이하까지는 무료이다.

추가 설정

Terraform Cloud 연동 이후 terraform block에서 별다른 설정을 하지 않으면, 로컬에서 terraform plan & apply 명령어를 입력할 때 로컬에서의 state 파일이 업데이트 될 수 있다. 즉 Terraform 원격에 올라간 state 파일과 차이가 날 수 있다. 이를 방지하려면 테라폼 코드에 아래와 같이 연결된 terraform cloud 정보를 넣어주면 plan & apply 명령어를 로컬에서 실행시켜도 terraform cloud 에서 원격으로 실행된다.

terraform {
  required_version = ">= 0.12"

  cloud {
    organization = "organization_name"
    workspaces {
      name = "workspace_name"
    }
  }
}

Appendix - 동일 레포지토리 내 dev, prod 환경 별 Terraform Workspace 구성

하나의 레포지토리에서 모든 환경의 Terraform 구성을 관리할 수 있다.
가령 다음과 같이 디렉토리로 나눠질 수 있다. (Working 브랜치는 master로 고정)

/terraform
   /dev
      main.tf
   /prod
      main.tf

이 경우 Terraform Cloud에서 Workspace를 환경 별로 두 개로 구성한 다음, 각 Workspace에서 Github VCS 를 동일한 레포지토리로 연결한 다음 Terraform Working Directory 를 /terraform/dev , /terraform/prod 로 각각 설정할 수 있다.

그리고 각 Workspace 내 Version Control 에 들어가서 VCS Triggers 옵션에 특정 path가 변해야지 Run을 Trigger 하도록 설정하면 각 Workspace에서 추적하고자 하는 환경의 변경사항에만 CI/CD (Plan & Apply) 가 동작하도록 설정할 수 있다.

profile
개발 공부 내용 정리

2개의 댓글

comment-user-thumbnail
2023년 8월 7일

정보 감사합니다.

1개의 답글