본문 바로가기
INFRA/Automation

[Terraform] Terraform module

by BTC_쭈콩 2023. 5. 21.

베하 !!! 

안녕하세요 BTC 콩순이들입니다 !! 

오늘은 Terraform module에 대해 이야기 해 볼까 합니다 : ) 

Terraform module이 무엇인지!

어떤 장 단점이 있는지 ,

어떤 경우에 사용하는지,

알아보겠습니다! 

그럼 시작할게요 !!! 

 


이전 포스팅을 보셨다면 아시겠지만 다시 한 번 설명드리자면 

 

테라폼은 클라우드 인프라를 손쉽게 구축하고 안전하게 변경 가능하며,

효율적으로 인프라의 형상을 관리할 수 있는 오픈소스 도구 입니다. 

 

즉 인프라를 코드로 정의하여 생산성과 투명성을 높일 수 있고,
정의한 코드를 쉽게 공유할 수 있어 협업에 효율적으로 사용할 수 있습니다. 

 

그렇다면 테라폼 모듈이란 무엇일까요? 

 

 

Terraform Module 은 하나의 파일에 모든 코드가 정의 되지 않도록 '관련 요소를 모아 패키지'로 만든 것을 뜻합니다. 

테라폼으로 만든 인프라의 규모가 커지면 한 파일에 모든 코드를 정의할 경우 의도치 않게 다른 리소스에 영향을 끼칠 수도 있고, 코드를 환경별로 나눌 때 코드 중복이 발생할 수 있기 때문입니다!! 

 

Module의 장점 

  • 캡슐화 : 서로 관련이 있는 리소스를 묶어 캡슐화 하면 다른 리소스에 영향을 주지 않습니다.
  • 재사용성 : 모듈을 사용해서 리소스를 정의할 경우 , dev, stg, prd 처럼 다른 환경에서도 모듈을 사용 할 수 있습니다. 
  • 일관성 : 매번 코드를 새로 작성해서 프로비저닝 할 경우 중요한 옵션이 누락되거나 , 추가 될 수 있기 때문에 미리 정의된 모듈을 재 사용한다면 일관성을 유지할 수 있습니다. 

혼자 하는 일이 아닌 모두의 협업이 필요할 수록 module화 는 더 필요해질 것 같죠? 

 

그럼 본격적으로 테라폼 모듈을 어떻게 사용하는지 조금 더 자세히 알아볼까요??

오늘은 vpc module을 기반으로 설명드리겠습니다 ! 

 

root module 과 child module 

module은 root module과 child module로 나누어 생각해야 하는데요 , 

저도 처음엔 도대체 이게 무슨 말인가 했지만 ! 잘 설명해 보겠습니다 ~~~! 

 

  • root module

root module은 terraform command 가 실행 되고 있는 디렉토리입니다.

모듈을 하나의 디렉토리라고 생각하면 쉬워요!

모듈화를 하기 위해서는 root module은 필수적입니다! 다른 모듈을 사용하기 위해서는 

terraform command를 실행할 root module이 꼭 필요하거든요 :)

보통 root 모듈 안에 child module을 정의하고 있고, main.tf 파일에서 모든 모듈의 연결을 정의합니다.

 

  •  child module

child module은 실제 resource 를 정의하여 만들어 놓은 module입니다. 

이 child  module을 나누는 과정에서 그 기준이 상황마다 달라지는데요 ! 

 

1. 기능  : 특정 기능이나 작업을 수행하는 논리적 단위로 나눌 수 있습니다.
예를 들어 vpc 모듈, ec2 모듈 과 같이 같은 작업이 실행되는 서비스 별로 나눌 수 있습니다. 

2. 재사용성 : 여러 프로젝트나 환경에서 자주 사용되는 서비스나 인프라는 모듈로 만들어 두면 언제든 재사용이 가능하니 
간편하기도 하고, 팀 내 코드 중복을 최소화하고 일관성을 유지 시키기에도 좋겠죠! 

3. 관리 가능성 : 모듈은 특정 팀이나 담당자가 모듈을 관리하고 유지 보수 할 수 있기 때문에 변경사항을 추적하고 모듈간 의존성을 관리 할 수 있도록 관리를 기준으로 나눌 수 있습니다. 

 

이렇게 모듈을 나누는 기준은 누가 만드는지, 어떤 색의 팀이 만드는지, 어느 환경에서 만드는지에 따라 천차만별이지만 

보통 구성 요소 간의 관련성과 의존성에 따라 결정 되곤 한다고 합니다 ㅎㅎㅎ!!

 

그럼 모듈을 만드는 과정에 대해 빼꼼 살펴보도록 합시다! 

 

먼저 실제 resource를 정의할  child module을 만들어 봅시다. 

모듈 구조는 다음과 같아요 !! 

 

vpc 모듈 안에는 

리소스가 정의 될 main.tf

변수가 정의 될 variable.tf

출력 변수가 정의 될 ouput.tf로 이루어져있습니다. 

 

물론 main.tf에 변수와 출력변수를 모두 입력할 수도 있지만 코드의 가독성과 일관성을 위해 

나누어 주었습니다 !! 

 

  • main.tf

  • variable.tf

  • output.tf

 

저는 이렇게 코드를 정의 했습니다! variable의 default 값은 루트 모듈에서 호출할 때 

변수 값을 정의 하지 않아도 default에 정의 된 값이 들어가도록 할 수 있습니다! 

사실 저는 제 이름을 썼어요 : ) 여러분도 ! 여러분이 넣고 싶은 이름이나 tag를 넣어주시면 좋을 것 같습니다 !! 

 

이렇게 child module의 정의가 끝나면 

이제 진짜로 모듈을 통한 프로비저닝을 해야겠죠 ! 

바로 루트 모듈로 가보겠습니다 !!! 

 

module 을 사용하는 코드 예시는 다음과 같습니다.

module의 이름은 팀 내 네이밍 규칙대로 해주면 제일 좋겠죠 ! 

module "btc_vpc" {
     source = "./child_module/vpc"   - 이곳에 호출하고자 하는 모듈의 경로를 써줍니다. 상대경로 ! 
}

 

root_module 의 main.tf입니다. 

  • main.tf

 

이렇게 구성해주면 테라폼으로 vpc 의 모듈화가 완성됩니다 !!!

오늘 terraform 모듈화 가 무엇인지 어떻게 구조화 할 수 있는지 알아보았습니다 : )

모듈 구조에 대한 이해에 조금이나마 도움이 됐으면 좋겠습니다 ~~~~  !!

다음엔 더 생생한 실습과 함께 돌아올게요~~~

베빠 ~~~! 

'INFRA > Automation' 카테고리의 다른 글

[Terraform] Meta-Argument 2 . for_each문  (0) 2023.06.30
[Terraform] 모듈과 모듈화  (0) 2023.06.22
[Terraform] Meta-Argument 1 . Count문  (0) 2023.06.13
Terraform Remote State (S3편)  (0) 2023.05.26
[Terraform] Terraform 환경구성  (0) 2023.05.12

댓글