[기본 구성 요소] Modules

2024. 11. 26. 14:44Terraform/[인프런] 아키텍처와 함께하는 Terraform

1. Modeuls 

- 인프라 코드를 구성하고 재사용하기 위한 단위이다.
- 코드의 반복을 줄이고 관리와 유지보수를 쉽게 하기 위해 사용된다.
- 모듈은 하나 이상의 Terraform 구성 파일로 구성된 디렉토리이다.
- Terraform 구성 파일은 기본적으로 루트 모듈이며, 이를 기반으로 하위 모듈을 호출하여 구성 요소를 재사용할 수 있다.

 

 

2. Modules 주요 특징

- 코드 재사용성 : 반복적으로 사용되는 리소스를 하나의 모듈로 정의하여 재사용한다.
- 모듈 호출 : 루트 모듈에서 하위 모듈을 호출해 구성 요소를 조립하듯 사용한다.
- 매개변수화 : 변수와 출력 값을 활용해 모듈의 유연성과 확장성 높인다.

 

 

3. Modules 예제

- VPC를 생성하는 하위 모듈 만들기 예제
* 하위 모듈 디렉토리 구조
modules/
└── vpc/
    ├── main.tf
    ├── variables.tf
    └── outputs.tf
* 하위 모듈 구성 파일(modules/vpc/main.tf)
resource "aws_vpc" "main" {
  cidr_block = var.cidr_block

  tags = {
    Name = var.name
  }
}

resource "aws_subnet" "subnet" {
  vpc_id            = aws_vpc.main.id
  cidr_block        = var.subnet_cidr_block
  availability_zone = var.availability_zone

  tags = {
    Name = "${var.name}-subnet"
  }
}
* 하위 모듈 구성 파일(modules/vpc/variables.tf)
variable "cidr_block" {
  description = "CIDR block for the VPC"
  type        = string
}

variable "subnet_cidr_block" {
  description = "CIDR block for the subnet"
  type        = string
}

variable "availability_zone" {
  description = "Availability zone for the subnet"
  type        = string
}

variable "name" {
  description = "Name tag for the VPC and subnet"
  type        = string
}
* 하위 모듈 구성 파일(modules/vpc/outputs.tf)
output "vpc_id" {
  value = aws_vpc.main.id
}

output "subnet_id" {
  value = aws_subnet.subnet.id
}
- 루트 모듈에서 하위 모듈 호출 예제
* 루트 모듈 디렉토리 구조
.
├── main.tf
├── variables.tf
└── terraform.tfvars
* 루트 모듈 구성 파일(main.tf)
provider "aws" {
  region = "ap-northeast-2"
}

module "vpc" {
  source              = "./modules/vpc" # 로컬 디렉토리에서 모듈 호출
  cidr_block          = "10.0.0.0/16"
  subnet_cidr_block   = "10.0.1.0/24"
  availability_zone   = "ap-northeast-2a"
  name                = "MyVPC"
}

output "vpc_id" {
  value = module.vpc.vpc_id
}

output "subnet_id" {
  value = module.vpc.subnet_id
}
* 루트 모듈 구성 파일(terraform.tfvars)
cidr_block        = "10.0.0.0/16"
subnet_cidr_block = "10.0.1.0/24"
availability_zone = "ap-northeast-2a"
name              = "MyVPC"