👉 이전 포스팅: output, data 블록의 활용 (terraform.tfstate 파일 관리법, 리소스 참조)
테라폼에서의 module이란 관련있는 리소스를 한데 모아 하나의 패키지를 만들어 사용할 수 있도록 하는 테라폼의 자원이다.
aws_eip
를 예시로 살펴보자. eip를 생성하고 해당 리소스를 ec2 인스턴스에 연결해주는 모듈을 정의하려고 한다. 우선 아래처럼 리소스 정의부를 작성하고 필요한 옵션 값들은 모두 변수로 작성해준다.
# module/eip/eip.tf
resource "aws_eip" "this" {
vpc = true
instance = var.instance_id
network_interface = var.network_interface_id
}
resource "aws_eip_association" "this" {
allocation_id = aws_eip.this.allocation_id
instance_id = var.instance_id
network_interface_id = var.network_interface_id
}
위에서 변수로 대체했던 값들을 variables.tf
에 빈 블럭으로 정의해준다. Optional로 정의하고 싶다면 default값으로 null을 넣어준다. 여기에 정의해놓은 값들이 모듈 호출시 필요한 값들이 된다.
# modules/eip/variables.tf
variable instance_id {}
variable network_interface_id {}
이제 앞에서 정의한 모듈을 호출하면된다. 모듈 호출 시에는 모듈의 variable.tf
에 정의해놓은 값들을 넘겨준다. source
는 모듈의 위치를 나타내며 모듈을 호출하고 있는 파일의 위치를 기준으로 작성해준다.
# dev/eip/eip.tf
module eip {
source = "../../modules/eip"
instance_id = "instance_id"
network_interface_id = "network_interface_id"
}
이렇게 모듈을 호출하고 나서는 terraform init
을 실행시켜 모듈을 다운로드받아야 테라폼이 최신 상태의 모듈을 참조할 수 있다.
이렇게 모듈을 사용하면 리소스 두개를 따로 정의하지 않고도 필요 옵션값만 전달하여 손쉽게 리소스를 생성할 수 있다. 정의한 모듈은 다른 인자값을 사용하여 여러번 호출될 수 있다.
모듈에서 output을 정의해두면 루트 모듈에서 이를 활용할 수 있다.
modules/eip/outputs.tf
output "id" {
value = aws_eip.this.id
}
dev/eip/eip.tf
...생략...
eip_id = module.eip.id
...생략...
처음에 테라폼에서 module이라는 개념을 접했을 때는 라이브러리 정도의 개념으로 이해해서 하나의 파일에 여러 리소스를 정의하면 그 중 원하는 리소스만 가져다가 쓸 수 있는줄 알았다. 하지만 테라폼에서는 환경 별로 중복되는 리소스를 정의하거나 항상 같이 정의되어야하는 리소스들을 편리하게 생성할 수 있도록 하는 템플릿 개념에 더 가깝다. 따라서 모듈을 호출하면 모듈 내에 있는 모든 리소스들이 생성된다.
위에 작성한 예시를 보면 modules/eip
디렉터리 내에 eip.tf
라는 파일명으로 모듈을 정의했다. 이처럼 모듈을 정의할 때에는 "모듈" 이라는 이름에 걸맞게 최대한 하나의 디렉터리에는 한 개의 리소스 파일만 위치하도록 하고 파일명과 디렉터리 명은 통일한다.
이로써 테라폼은 모듈이 호출되었을 때 디렉터리명과 동일한 파일을 찾아 참조할 것이다.
모듈의 장점은 필요한 최소한의 옵션 값들을 정의하여 비슷한 스펙으로 리소스를 생성할 수 있다는 것에 있다. 하지만 너무 최소한의 옵션들만 명시해주면 모듈의 사용성이 떨어지니, 공식문서를 참고하여 여러 환경과 스펙을 대응할 수 있을 정도의 옵션들을 정의해주면 재사용성이 높아진다.