[Terraform] module이란? 사용법 및 작성 팁

나른한 개발자·2023년 3월 29일
2

👉 이전 포스팅: output, data 블록의 활용 (terraform.tfstate 파일 관리법, 리소스 참조)

module 이란?

테라폼에서의 module이란 관련있는 리소스를 한데 모아 하나의 패키지를 만들어 사용할 수 있도록 하는 테라폼의 자원이다.

장점

  • 캡슐화: 서로 연관있는 리소스들을 한데 모아 결합시키고 필요한 인자들만 넘겨주면 되므로 실제 구현에 대해서는 몰라도 된다.
  • 재사용성: 한번 정의해둔 모듈은 여러번 호출될 수 있으므로 리소스를 쉽게 재사용할 수 있다.
  • 일관성: 모듈화를 통해 리소스에 필요한 옵션들을 정의해놓을 수 있으므로 빠지는 옵션 없이 같은 설정 값으로 리소스를 생성할 수 있다.

사용법

1. 리소스 정의

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
}

2. 설정값 정의

위에서 변수로 대체했던 값들을 variables.tf에 빈 블럭으로 정의해준다. Optional로 정의하고 싶다면 default값으로 null을 넣어준다. 여기에 정의해놓은 값들이 모듈 호출시 필요한 값들이 된다.

# modules/eip/variables.tf

variable instance_id {}
variable network_interface_id {}

3. 모듈 호출

이제 앞에서 정의한 모듈을 호출하면된다. 모듈 호출 시에는 모듈의 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 블럭 활용

모듈에서 output을 정의해두면 루트 모듈에서 이를 활용할 수 있다.

modules/eip/outputs.tf

output "id" {
    value = aws_eip.this.id
}
dev/eip/eip.tf

...생략...

	eip_id = module.eip.id
    
...생략...

주의 사항 및 팁

1. 라이브러리 🙅‍♀️ 템플릿 🙆‍♀️

처음에 테라폼에서 module이라는 개념을 접했을 때는 라이브러리 정도의 개념으로 이해해서 하나의 파일에 여러 리소스를 정의하면 그 중 원하는 리소스만 가져다가 쓸 수 있는줄 알았다. 하지만 테라폼에서는 환경 별로 중복되는 리소스를 정의하거나 항상 같이 정의되어야하는 리소스들을 편리하게 생성할 수 있도록 하는 템플릿 개념에 더 가깝다. 따라서 모듈을 호출하면 모듈 내에 있는 모든 리소스들이 생성된다.

2. 모듈의 디렉터리 이름은 파일 이름과 동일하게

위에 작성한 예시를 보면 modules/eip 디렉터리 내에 eip.tf라는 파일명으로 모듈을 정의했다. 이처럼 모듈을 정의할 때에는 "모듈" 이라는 이름에 걸맞게 최대한 하나의 디렉터리에는 한 개의 리소스 파일만 위치하도록 하고 파일명과 디렉터리 명은 통일한다.

이로써 테라폼은 모듈이 호출되었을 때 디렉터리명과 동일한 파일을 찾아 참조할 것이다.

3. 꼭 필요한 옵션 값들만 적되, Optional 값을 적절히 사용하여 재사용성을 높인다.

모듈의 장점은 필요한 최소한의 옵션 값들을 정의하여 비슷한 스펙으로 리소스를 생성할 수 있다는 것에 있다. 하지만 너무 최소한의 옵션들만 명시해주면 모듈의 사용성이 떨어지니, 공식문서를 참고하여 여러 환경과 스펙을 대응할 수 있을 정도의 옵션들을 정의해주면 재사용성이 높아진다.

profile
Start fast to fail fast

0개의 댓글