작성
·
147
1
안녕하세요. 쭉 강의를 팔로우 하고 있는데 다른 케이스들이나 해외 레딧의 사례들도 같이 참고하다가 한가지 의문이 생겨서 여쭤보고 싶습니다.
모듈화를 통한 디렉토리를 나누거나, 폴더를 따로 두어서 관리하는 경우가 많더라구요
흔히 테라폼 디렉토리 구조 best practice 의 검색 결과 나오는 사진입니다.
제가 체감하기에는 main.tf 에서 모든걸 한번에 넣어 두는 경우는 읽기 너무 복잡해서
모듈과 리소스명.tf 파일을 분리하는 등등의 과정으로 두가지 나눠서 디렉토리를 관리합니다.
실무자 입장에서 또한 많은 경험이 있는 엔지니어 입장에서 어떤식으로 디렉토리를 분류하고, 파일을 나누고, 모듈화를 하는지, 송주영님 만의 기준이 있는지 궁금합니다.
또한 이건 약간 곁다리 질문인데요, 최근에 terragrunt 라는 테라폼을 한번더 고도화 해서 사용하는 사례도 종종 보이고 있습니다. 혹시 도입을 고민하신적 있는지, 사용하셨다면 어떤 느낌이었는지 궁금합니다!
강의 잘 보고 있습니다! 단순히 docs를 풀어서 읽기주시기만 하는 강의가 아니라, 실무자의 고민과 해결, 관점이 강의 사이사이 들어 있어서 정말 큰 도움이 되고 있습니다!!!
답변 2
1
인프런 A.I가 거의 저 처럼 대답을 하네요ㅎㅎ 굉장히 공감하는 내용이 많습니다.
아마 많은 회사들이 제가 쓰는 방식보다 질문 주신 방식을 쓰는 회사들이 훨씬 많을겁니다.
하지만 저는 제가 쓰는 방식이 훨씬 낫다고 생각합니다.
그 이유는,
Terraform에서 제가 항상 강조하는 것은 Readability 입니다.
VPC등 여러가지를 module로 관리하면 변경사항이 더 없고. 코드양을 줄여서 Readability가
좋아질꺼라 생각하지만 아닙니다.
정확히 얘기하면 아주 간단한 구조의 서비스는 module로 관리하는게 나을 수 도 있지만,
한개의 서비스가 VPC 10개 이상을 쓰는 서비스에서는 그냥 단순한 형태로 쓰는게 훨씬 낫습니다.
그 이유는 VPC 등 AWS의 여러 서비스들의 발전속도가 엄청 빠르기 때문입니다.
10개의 VPC가 다 똑같이 생겼을거라 보장이 없습니다. 예를들면 비용을 위해서 어떤 VPC는 Zone을
1-2개만 쓰고, 어떤 VPC는 Zone을 4개 쓸 수 도 있습니다. Zone을 많이 쓰면 Spot instance 같은 것을 더욱더 비율을 높혀 쓸 수 있기 때문입니다.
module 1개로 만들면 결국 모듈 파일에서 분기를 타야됩니다.
물론 테라폼은 if 형태를 지원하지만, 읽기가 불편합니다.
VPC의 차이점이 1개가되고 2개가 되고, 기능이 반복적으로 나올때마다 분기가 계속 늘어납니다.
이건 VPC가 여러 자원들의 집합체라서 복잡도가 늘어날 수 밖에 없습니다.
module 의 파라미터가 계속 늘어나고 true and false 가 계속 늘어날겁니다.
그래서 VPC는 module이 굉장히 비적합 합니다.
하지만 EC2는 단일 구조이고, 구조상 IF를 타는 경우가 거의 없어서 module로 써도 큰 불편함이 없습니다.
제가 단순히 예제코드로 resource로 나누지만 KMS, Codebuild 같이 ec2처럼 단일서비스는 module이 더 나을 수 있습니다.
그런데 여기서 중요하게 생각할 점이 있습니다.
제 코드에서 module이 더 낫지만, 그냥 편하게 폴더로 나눠서 쓰는 경우도 있습니다.
그 이유는 그냥 처음에 그렇게 만들었고, 변경해봐야 크게 나아지지 않기 때문입니다.
그러니까 module을 사용할때는 module로 사용했을때 훨씬 생산성이 높아야 하는데,
module로 사용하나 그냥 copy & paste & update 로 사용하나 큰 속도차이가 없으면,
그냥 쓰던대로 쓰는게 낫습니다. 굳이 전체 코드를 리팩토링 할 필요가 없습니다.
Terraform은 중요하지만, 중요한 일이 아닙니다. 서로 동료간의 변경점을 정확하게 리뷰하고,
정확한 plan 정확한 apply 만 충족하면 됩니다.
Terraform code를 리팩토링할 시간에 비즈니스에 도움이 되는 다른 일이 더 중요합니다.
가용성을 높히거나 비용을 줄이거나 보안을 강화 그리고 모니터링 하는 일들이 훨씬 더 중요합니다.
제가 2016년에 Hashicorp 에서 삼성전자로 이직해서 대화를 나눈 친구의 이야기가 기억납니다.
Hashicorp에서 만든 Best Practice를 쓰지 말라구요. 굳이 그거에 신경쓸 필요 없다고 했습니다.
그리고 지금 제가 만든 방식으로 썼었던 친구는 Hashicorp에서 Director 하고 있습니다.ㅎ
우리가 개발을 하다보니 Terraform은 코드가 짧고, module 처럼 즉 함수형처럼 쓰면 효율적이라 생각할 수 있는데, 실제로 리소스를 변경하고, 서로 리뷰를 받고 이 과정이 더 빠른거에 초점을 맞추어야 합니다.
실제로 측정해보면 별 차이가 없습니다.
그래서 저는 최대한 단순하게 관리하고 변경이 많은건 그대로 관리하고 충분히 copy & paste 로 해결하는 것이 우수하다고 생각합니다. Terraform 코드를 작성하는게 일의 본질이 아니거든요.
어디는 branch로 관리하고, 어디는 module의 version 까지 관리하는데, 생각해보면 그것보다 중요한 일이 훨씬 많습니다ㅎ 오히려 인프라의 변경가능성을 낮추고, 안정성을 높히는 다른 어떤 일을 하는게 더 중요합니다.
그럼 module의 Best practice는 뭘까 생각해보면 선언형으로 쓰는게 아니라 명령형으로 쓸때 그 진가가 발휘됩니다. https://registry.terraform.io/modules/terraform-aws-modules/atlantis/aws/latest
아예 이런식으로 테라폼으로 AWS의 자원관리가 아니라 AWS의 자원들의 집합체로 이루어진, 어떤 도구를 만들때입니다.
이런건 똑같이 몇벌이 생기는게 아니라 지속적으로 하나의 Version을 관리하는게 중요하기 때문입니다.
지금 제 답변과 인프런 AI 답변의 방향이 같습니다. 그리고 Terragrunt 같은 경우 2016년인가 검토하고,
당시 Terraform backend 가 없었을 시절에 도입을 고민했습니다만, 역시나 Terraform 친구들을 굳이 복잡하게 쓸 필요가 없기 때문에, 저는 잘 사용하지 않습니다.
가장 중요한건 나의 Performance, 팀의 Performance 입장으로 고민해보는 것이 좋습니다~
좋은 답변이 되었으면 합니다.
물론 제 경험은 좀 치우친 경향이 있습니다. 저는 간단한 서비스를 해본 경험이 없습니다.
Multi-region, Multi-VPC, 10억 사용자, 100만 TPS, 갑자기 예고 없이 100배 이상 늘어나는 트래픽 등
복잡도가 높은 서비스를 해본 경험만 있기 때문입니다.
그런데 아주 간단한 서비스를 만들더라도 굳이 사용 방법을 크게 바꾸지 않을 것 같습니다.
그리고 제가 이직을 해서 어떤 곳에서 module 방식을 쓰고 있다면, 굳이 그걸 대규모 개편하지는 않을 것 같습니다. 그냥 이대로 쓰는거랑 리팩토링하는거랑 큰 차이가 없다면 그냥 그대로 쓰고, 다시 말씀드리지만
다른 더 중요한 일에 집중을 할 것이기 때문입니다~
1
안녕하세요, 인프런 AI 인턴입니다. techsupport2님, 강의를 열심히 수강해 주셔서 감사드리며, Terraform의 모듈화와 디렉토리 구조에 대한 질문 주셔서 감사합니다.
Terraform 디렉토리 및 파일 구조:
프로젝트의 복잡도와 규모에 따라 Terraform의 디렉토리 및 파일 구조를 구성하는 방법이 중요합니다. 일반적으로는 다음과 같은 방식으로 구조화할 수 있습니다:
모듈별 디렉토리: 큰 프로젝트에서 모듈화는 각 기능별로 디렉토리를 나누어 관리하는 것이 효율적입니다. 예를 들어, modules/vpc
, modules/ec2
와 같이 기능별로 모듈을 분리하여 관리하면 코드의 재사용성과 유지보수성을 높일 수 있습니다.
파일 분할: 각각의 리소스에 대해 <resource_name>.tf
파일로 분리하는 것이 좋습니다. 이 방법은 각 리소스의 설정을 명확히 이해할 수 있게 해주며, 특정 리소스에 변경사항이 있을 때 관련된 파일만 수정하면 되므로 관리가 쉽습니다.
환경별 변수 파일: 운영(prd
), 개발(dev
) 등의 환경에 따른 설정 차이를 tfvars
파일에 관리하여 필요에 따라 다양하게 조합하거나 적용할 수 있도록 합니다.
송주영님의 접근 방식:
송주영님은 강의에서 실무적인 경험을 토대로 Terraform 코드의 모듈화와 디렉토리 관리를 보다 최적화할 수 있는 방안을 소개하고 있었습니다. 주로 “쉬운 이해, 빠른 변경, 실수 최소화”를 염두에 두고, 가독성이 높은 코드를 유지하려는 방향으로 Terraform을 사용하는 것을 권장하고 계십니다.
Terragrunt의 도입:
Terragrunt는 Terraform의 반복 작업을 줄이고 코드를 고도화하는 수단으로 사용됩니다. 설정 관리를 보다 효율적으로 하고 싶다면 고려해볼 만하지만, Terragrunt 역시 새로운 툴의 학습과 유지보수가 필요한 것을 감안해야 합니다. 송주영님께서도 Terragrunt의 사용 경험이 있으시며, 팀의 필요에 따라 적절히 사용 여부를 결정하는 것이 중요하다는 의견을 가지고 계십니다.
위의 설명이 도움이 되셨길 바라며, 향후 강의에서도 많은 인사이트를 얻으시길 바랍니다. 강의 중 더 궁금한 점이 생긴다면 언제든지 질문해 주세요. 추가적으로, 다음 자료들도 참고하시면 좋을 것 같습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.