모듈 구성
모듈 구성 (Modules overview / Configuration)
Terraform 모듈이 무엇이고, 모듈을 호출(call)하고 구성하는 방법을 설명해 드릴게요. 재사용 가능한 인프라 코드 작성의 핵심 개념이에요.
출처: 문서
본문
모듈(module)은 함께 사용되는 여러 리소스를 담는 컨테이너예요. Terraform 구성은 루트 모듈에서 실행되며, 루트 모듈은 다른 모듈을 호출(module 블록)해 재사용 가능한 구성 조각을 만들 수 있어요.
모듈 호출 (Calling a module)
다른 모듈의 리소스를 포함하려면 module 블록을 작성해요. module 블록은 어떤 모듈을 사용할지, 어떤 입력 변수를 줄지, 어떤 출력을 받을지를 다음과 같이 선언해요:
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "5.0.0"
name = "my-vpc"
cidr = "10.0.0.0/16"
}
module 블록의 source 인자는 사용할 모듈의 위치(설명)로, 반드시 필요해요. version 인자는 레지스트리에서 가져온 모듈의 버전을 지정해요. 그 외에 모듈이 정의한 입력 변수에 대응하는 인자를 전달할 수 있어요.
모듈 출력 (Module outputs)
module 블록 안의 값은 모듈이 정의한 출력을 참조해서 사용해요:
subnet_id = module.vpc.public_subnets[0]
module.<MODULE NAME>.<OUTPUT NAME> 형식으로 출력을 참조해요.
모듈 입력 변수 (Module input variables)
호출하는 모듈은 자신의 입력 변수를 정의하며, 호출자가 module 블록의 인자로 값을 전달해요. 변수에 type과 description을 정의하고 필요시 default를 제공하는 것이 좋아요. 값이 전달되지 않으면 default를 사용해요.
메타-인자 (Meta-arguments)
count, for_each, depends_on, providers 같은 메타-인자를 module 블록에서도 사용할 수 있어요. 이를 통해 모듈을 여러 번 인스턴스화하거나 의존성·프로바이더를 제어할 수 있어요.
소스 (Source)
source는 다음 중 하나가 될 수 있어요:
- 로컬 경로:
./modules/network또는../shared/modules/network - Terraform 레지스트리:
hashicorp/consul/aws - GitHub:
github.com/hashicorp/example - 버킷:
s3::https://s3-eu-west-1.amazonaws.com/examplecorp-terraform-modules/vpc.zip
자세한 내용은 모듈 소스를 참고해요.
모듈은 재사용을 위해 설계해요
모듈을 만들 때는 해당 모듈이 인프라의 한 부분을 깔끔하게 캡슐화하고, 입력 변수와 출력이 명확하며, 문서가 제공되도록 해요. 재사용 가능한 모듈은 Terraform Registry에 게시할 수 있어요.