최근 업로드 된 HashiTalks: Japan 중에 평소 궁금했던 주제가 몇 개 있어서 간단히 번역/정리했다.
아무래도 가장 많이 써 본 HashiCorp 제품이 Terraform이다보니, 주로 Terraform에 대한 영상부터 정리를 시작했지만, 시간이 되면 다른 제품에 대한 내용도 정리해볼 생각이다.
오늘은 가장 먼저, Terraform의 올바른 디렉토리 구성이란 무엇인가에 대해 고찰해 본 경험을 소개해준 영상을 듣고 정리해보았다.
비교적 적은 리소스를 배포할 경우에는 한 개의 디렉토리에 필요한 파일을 넣어두고 사용할 수 있겠지만, 리소스가 많거나 개발/스테이지/운영 등 배포할 환경이 다양한 경우, 디렉토리를 분리하고자 하는 요구사항이 있을 수 있다.
그런 경우에 구체적으로 어떤 식으로 디렉토리를 구분할 지에 대해서는 다양한 의견이 있겠지만, 이번에는 2개의 패턴을 골라서 비교를 해보았다.
첫번째는 최상위 디렉토리를 환경별로 구분하는 패턴이다.
각 환경에서 사용할 IaC 코드를 환경별 디렉토리에 저장하는 패턴이다.
여러 환경에서 설정 값만 변경하여 같은 리소스를 정의하고 싶을 때는, 로컬 모듈로 정의하여 사용할 수도 있다.
이렇게 사용하면 같은 소스를 디렉토리별로 모두 저장하는 것이 아니라 모듈을 호출하여 사용할 수 있다.
두번째는 최상위 디렉토리를 리소스별로 구분하는 패턴이다.
배포하고 싶은 리소스 종류에 따라 디렉토리를 구분하는 패턴이다.
각각의 리소스 디렉토리 내에 환경별로 사용할 IaC 코드를 저장한다.
위 이미지 상에 표현은 되어있지 않으나, 이 패턴에서도 로컬 모듈을 사용하여 중복되는 코드를 줄이는 것은 가능하다.
이제 두 패턴을 아래의 세가지 관점에서 비교해보려고 한다.
스테이지 환경을 구축하는 상황을 가정하고 비교해보았다.
패턴 1의 경우, envs/stg 내에서 terraform apply
를 한 번만 실행하면 stg에 배포하고 싶은 리소스를 모두 배포할 수 있다.
패턴 2의 경우, 각 리소스 별 디렉토리 하위의 stg 디렉토리 내에서 terraform apply
를 실행해야 하므로, 리소스 종류가 많아질수록 apply 실행 횟수가 많아진다.
다만, 스크립트를 작성하거나, Atlantis 등의 툴을 사용하여 실행 횟수를 줄이는 방법도 있다.
tfstate란, Terraform이 실제 환경에 배포되어 있는 리소스를 파악하고 관리하기 위해 사용되는 파일을 뜻한다.
terraform apply
명령어가 실행되면 tfstate와 관련하여 크게 두 가지의 작업이 수행된다.
하나는 tfstate의 내용을 읽어서 코드와 실제 환경 간의 차이점을 파악하는 것이다.
다른 하나는 배포가 완료되고 난 후, 실제 환경에 어떤 변경이 있었는지를 tfstate에 기록하고, tfstate 파일의 내용을 실제 환경과 동일한 상태로 유지하는 것이다.
tfstate 파일이 관리하는 리소스가 많으면 많을수록, 즉 파일의 크기가 크면 클수록 plan/apply 명령이 수행되는 속도가 느려지게 된다.
이번에는 DB 리소스만을 변경하는 상황을 가정하고 비교해보았다.
패턴 1의 경우, 환경별 디렉토리 내에 모든 리소스에 대한 정의가 기록되어 있으므로, tfstate 파일의 크기가 리소스 양에 따라 커지게 된다.
반면, 패턴 2의 경우, 리소스별로 디렉토리가 다르게 구성되어 있기 때문에 패턴 1에 비하여 tfstate 파일의 크기가 작다.
여러 명이서 같은 환경에 리소스를 배포하고자 할 때, 동시에 얼마나 많은 사람이 같은 환경에 대해 작업이 가능한지를 비교하고자 한다.
이 내용은 앞서 말한 tfstate 파일과도 관련이 있는데, 패턴 1의 경우에는 모든 리소스가 하나의 tfstate 파일을 통해 관리되는 반면, 패턴 2의 경우에는 리소스별로 별도 tfstate 파일이 존재한다.
따라서 패턴 2는 plan/apply가 리소스별로 이루어지게 된다.
즉, 패턴 1에서는 같은 환경에 대해 하나의 tfstate 파일을 쓰기 때문에, 동시 작업이 불가능하다. 하지만 패턴 2에서는 같은 환경이더라도 리소스 종류가 다르면 동시에 작업이 가능하다.
세 가지 관점에서 비교해 본 결과, 패턴 2가 패턴 1보다 효율적으로 사용될 수 있는 것으로 보인다.
각자의 환경에 따라 어떤 구성이 맞는지는 다르겠지만, tfstate 파일을 작게 분할하는 것이 많은 리소스를 관리하는 환경에서는 더욱 적합할 수 있음을 알 수 있다.
필요에 따라 두 가지 패턴을 적재적소에 사용하는 것이 좋을 것으로 보인다.
Terraform에 대해 발표했을 때, Terraform Enterprise 운영자 역할을 했을 때, 가장 많이 들었던 질문 중 하나가 "Terraform 디렉토리는 어떻게 구성하는 게 정답인가요?"였다.
이에 대해서 IaC 경험이 많은 분들께 물어보면, 그 때 그 때 다르다는 답을 해주셨고, 결국 나도 정답을 찾지 못해서 질문주신 분께 죄송하단 생각이 들기도 했다.
그래서 이 영상의 제목만 보고, 이건 반드시 봐야겠다는 생각을 했다. 이 영상을 보고도 아직 정답은 찾지 못한 것 같긴하다. 아마 몇년간 Terraform 쓸 일이 없긴 하겠지만.. 그래도 언젠가, 누군가, 내게 Terraform 디렉토리 구성 어떻게 해야하나요?하고 질문하면 생각한 척이라도 한 번 해볼 수 있을 것 같다.