모듈과 .tf 파일 분할에 대해서 의견이 궁금합니다.
인프런 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 방식을 쓰고 있다면, 굳이 그걸 대규모 개편하지는 않을 것 같습니다. 그냥 이대로 쓰는거랑 리팩토링하는거랑 큰 차이가 없다면 그냥 그대로 쓰고, 다시 말씀드리지만다른 더 중요한 일에 집중을 할 것이기 때문입니다~