이 내용은 CloudNet@ 에서 진행하는 테라폼 기초 입문 스터디에 대한 연재글입니다.
스터디에서 사용하는 교재는 Terraform Up & Running 2nd Edition 입니다.
테라폼의 모듈이 등장하게 된 배경에 대해 살펴보고, 주의사항은 어떤 것이 있는지 알아봅시다.
modules
같은 디렉토리에 빼고, 파일경로를 참조하여 사용하는 것이 바로 그 방안입니다.테라폼의 모듈은 아래와 같이 분류됩니다.
Root module
Child module
Terraform 모듈(일반적으로 구성의 루트 모듈)은 다른 모듈을 호출 하여 해당 리소스를 구성에 포함할 수 있습니다. 다른 모듈에 의해 호출된 모듈을 종종 자식 모듈이라고 합니다.
자식 모듈은 동일한 구성 내에서 여러 번 호출할 수 있으며 여러 구성에서 동일한 자식 모듈을 사용할 수 있습니다.
Published module
그렇다면 테라폼 모듈을 가져오는 소스는 어떤 것이 있을까요?
모듈을 사용하기 위한 구문은 아래와 같습니다:
module "<NAME>" {
source = "<SOURCE>"
[CONFIG ...]
}
modules/services/webserver-cluster
와 같은 모듈 코드를 찾을 수 있는 경로입니다.모듈을 적용하거나 source 파라미터를 수정하는 경우 반드시 terrraform init
명령 실행이 필요합니다.
다시말해 init
명령어 하나로 손쉽게 프로바이더와 모듈을 다운로드하고 백엔드를 구성할 수 있습니다.
모듈을 사용할 때, 아래의 주의사항에 대해 참고해주세요.
파일 경로(File paths)
루트 모듈에서 file 함수 사용은 가능하지만, 별도의 폴더에 정의된 모듈에서 file 함수를 사용하기 위해서 경로 참조 path reference 표현식이 필요합니다.
path.module
: 표현식이 정의된 모듈의 파일 시스템 경로를 반환
path.root
: 루트 모듈의 파일 시스템 경로를 반환
path.cwd
: 현재 작업 중인 디렉터리의 파일 시스템 경로를 반환
사용자 데이터 스크립트의 경우 모듈 자체에 상대 경로가 필요하므로 modules/services/webserver-cluster/main.tf
의 templatefile
데이터소스에서 path.module
사용
인라인 블록(Inline blocks)
일부 테라폼 리소스는 인라인 블록 또는 별도의 리소스(권장)로 정의 할 수 있습니다.
다만 인라인 블록으로 규칙을 정의한 경우에는 코드가 작동하지 않습니다!. 아래와 같은 유사한 리소스를 사용하면 그런 문제가 발생할 수 있습니다:
aws_security_group
과 aws_security_group_rule
aws_route_table
과 aws_route
aws_network_acl
과 aws_network_acl_rule
등등…
(스터디 중 논의) 이런 값들은 일일이 코드로 작성하는 편이 좀 더 변화에 유연하다고 하는 지적이 있었습니다.
모듈에 대한 버전관리를 통해, 특정 환경(스테이징, 프로덕션 등)별로 보다 세부적인 관리를 진행하는 방안에 대해 소개합니다.
제 4장에서는 아래의 내용을 반드시 기억하셨으면 좋겠습니다.
이것으로 제 4장을 마칩니다. 긴 글 읽어주셔서 감사합니다.