Terraform 기초 실습 스터디를 진행하고 있으며, 커리큘럼 4주차에 해당하는 내용입니다.
* [테라폼으로 시작하는 IaC] 도서 참조
이전 포스팅에서 테라폼의 State 에 대해 살펴보았다.
이번 포스팅에서는 책 내용의 CHAPTER 6. 모듈 에 대해 알아보도록 하겠다.
모듈은 테라폼으로 인프라 관리 시, 복잡한 리소스 간의 연관 관계와 종속성 파악을 위한 테라폼 구성 집합이라고 이해할 수 있다.
모듈은 루트 모듈과 자식 모듈로 구분된다.
- 루트 모듈: 테라폼을 실행하고 프로비저닝하는 최상위 모듈
- 자식 모듈: 루트 모듈의 구성에서 호출되는 외부 구성 집합
(모듈을 자바의 클래스 개념과 유사하다고 생각할 수 있겠다.)
모듈 작성 기본 원칙
모듈은 대부분의 프로그래밍 언어에서 쓰이는 라이브러리나 패키지와 역할이 비슷하다.
모듈의 작성 방식은 사용자마다 다르겠지만, 다음과 같은 기본 원칙을 제안한다.
- 모듈 디렉터리 형식은 terraform-<프로바이더 이름>-<모듈 이름> 형식을 제안한다. 이 형식은 Terraform Cloud/Enterprise 에서도 사용되는 방식이다.
- 테라폼 구성은 궁극적으로 모듈화가 가능한 구조로 작성할 것을 제안한다.
- 각각의 모듈을 독립적으로 관리하기를 제안한다.
- 공개된 테라폼 레지스트리의 모듈을 참고하기를 제안한다.
- 작성된 모듈은 공개 또는 비공개로 게시해 팀 또는 커뮤니티와 공유하기를 제안한다.
루트 모듈의 하위에 자식 모듈을 구성하는 경우 종속성이 발생하므로, 루트 모듈 상위에 모듈 디렉토리를 지정하는 것을 추가로 제안한다.
모듈화해보기
모듈에서 필요한 값은 variable 로 선언해 설정하고, 모듈에서 생성된 값 중 외부 모듈에서 참조하고 싶은 값은 output 으로 설정한다.
마치 자바 개발 시 getter, setter 로 캡슐화된 클래스를 활용하는 것과 비슷하다.
자식 모듈 작성 실습
자식 모듈 호출 실습
실습과 관련해서는 해당 스터디의 최종 목적인 테라폼 EKS 구축 과제 중, 모듈화하는 과정에서 추가해보도록 하겠다.
모듈 사용 방식
모듈 사용 시 프로바이더 정의, 반복문 처리를 알아보자.
모듈 사용 방식 1. 모듈과 프로바이더
모듈에서 사용되는 모든 리소스는 관련 프로바이더의 정의가 필요하다.
여기서 사용자는 프로바이더 정의를 모듈 안에 두어야 할지, 밖에 두어야할 지에 대한 고민을 할 수 있다.
유형 1. 자식 모듈에서 프로바이더 정의
모듈에서 사용하는 프로바이더 버전과 구성 상세를 자식 모듈에 고정하는 방법이다.
굉장히 독립적인 구조이므로, 자식 모듈간 또는 자식과 루트 모듈간 버전 조건 합의가 되지 않았다면 오류가 발생하기 쉽고 반복문을 사용할 수 없다는 단점이 있어 잘 사용하지 않는다.
유형 2. 루트 모듈에서 프로바이더 정의
자식 모듈은 루트 모듈의 프로바디어 구성에 종속되는 방식이다.
디렉토리 구조는 분리되어 있어도 테라폼 실행 단계에서 동일 계층으로 해석되므로 프로바이더 버전과 구성은 루트 모듈의 설정이 적용된다.
실습 과제 시, 해당 유형으로 진행할 예정이며 상세한 사항은 인프라 구성 시 확인해보겠다.
모듈 사용 방식 2. 모듈의 반복문
모듈 또한 리소스에서 반복문을 사용하듯 구성할 수 있다.
모듈의 반복문 테스트도 추후에 여러 방안을 적용하여 확인해보자.
모듈 소스 관리
Module 블록에 정의된 소스 구성으로 모듈의 코드 위치를 정의한다.
terraform init 을 수행할 때 지정된 모듈을 다운로드 해 사용할 수 있다. 모듈 소스의 유형은 다음과 같다.
- 로컬 디렉토리 경로
- 테라폼 레지스트리
- 깃허브
- S3
- GCS 등...
테라폼 공식 문서 안내와 같이 패키지 하위 디렉터리 경로를 참조하는 것도 하나의 방안이다.
모듈 소스 관리 1. 로컬 디렉토리 경로
로컬 경로를 지정할 때는 테라폼 레지스트리와 구분하기 위해 하위 디렉토리는 ./ 로, 상위 디렉토리는 ../ 로 시작한다.
대상 모듈은 이미 같은 로컬 파일 시스템에 존재하므로 다운로드 없이 바로 사용한다.
앞서 언급한대로 해당 모듈이 재사용성이 고려된다면 상위디렉토리에 별도 관리하는 것을 권장하고, 항상 루트 모듈과 함께 동작해야 하는 경우 하위 디렉토리에 모듈을 정의한다.
모듈 소스 관리 2. 테라폼 레지스트리
테라폼 레지스트리는 테라폼의 프로토콜을 사용해 모듈을 사용하는 방식이다.
공개된 테라폼 모듈을 사용하거나 Terraform Cloud/Enterprise 에서 제공되는 비공개 테라폼 모듈을 사용할 수도 있다.
공개된 모듈은 링크 를 클릭하면 확인할 수 있고, 각 모듈을 선택하면 테라폼 구성 시 정의 방법에 대해 안내를 확인할 수 있다.
추가로 깃허브에 저장된 파일을 테라폼 모듈의 소스로 선언 및 관리할 수도 있다.
모듈에 대한 포스팅은 내용 추가이 필요하고, 추가 포스팅이 필요할 정도로 상세해질 수 있는 가장 중요한 내용이다.
스터디를 통해 프로젝트를 진행하면서 시행착오와 더불어, 현재 업무를 수행하며 운영중인 테라폼 리소스를 뜯어보며 많은 내용을 추가 업데이트 해보도록 하겠다.