테라폼으로 인프라의 규모가 커질경우 하나의 파일에 모든것을 정의할 경우 의도치않게 다른 부분에 영향을 끼칠 수 있고 환경별 같은 리소스의 코드가 중복되어 쌓일수가 있다.
이러한 단점을 해결하기 위해 테라폼은 모듈이란 요소를 제공해준다.
모듈은 관련있는 요소끼리 모아 하나의 패키지를 만든다.
예를 들어 VPC 모듈의 경우 서브넷, netmask 등의 리소스를 하나의 패키징을 한다.
캡슐화
서로 관련있는 요소들 끼리마 캡슐화를 하여 의도치 않은 문제 발생을 예방 할 수 있다.
재사용성
모듈을 사용하여 리소스를 정의하면 다른 환경에서도 해당 리소스를 쉽게 재사용 할 수 있다.
일관성
매번 새로 작성하게 되면 사람에 따라 리소스의 옵션이 빠지는 부분이 생길수도 있고 매번 같을 수 없기에 모듈을 재사용시 일관성을 가지게 된다.
module "<NAME>" {
source = "<SOURCE>"
[CONFIG ...]
}
module "module_test" {
source = "./module
}
module "webserver_cluster" {
source = "github.com/hashicorp/example"
}
module "consul" {
source = "hashicorp/consul/aws"
version = "0.1.0"
}
or
module "consul" {
source = "app.terraform.io/example-corp/k8s-cluster/azurerm"
version = "1.1.0"
}
- 각 사용하는 provider에 맞춰서 제공하는 서비스에 맞는 모듈을 찾아서 사용하는것이 중복되는 코드와
다양한 서비스를 이용하는데 효율적인 개발 방법이라고 생각한다.- 다양한 모듈들이 존재 하기에 본인 및 회사에 맞는 모듈을 찾아서 사용하거나
모듈을 생성해서 운영에 사용하는 것이 중요하다
provider "aws" {
region = "ap-northeast-2"
}
module "vpc" {
source = "tedilabs/network/aws//modules/vpc"
version = "0.24.0"
name = "louis-vpc"
cidr_block = "10.0.0.0/16"
internet_gateway_enabled = true
dns_hostnames_enabled = true
dns_support_enabled = true
tags = {}
}
module "subnet_group__public" {
source = "tedilabs/network/aws//modules/subnet-group"
version = "0.24.0"
name = "${module.vpc.name}-public"
vpc_id = module.vpc.id
map_public_ip_on_launch = true
subnets = {
"${module.vpc.name}-public-001/az1" = {
cidr_block = "10.0.0.0/24"
availability_zone_id = "apne2-az1"
}
"${module.vpc.name}-public-002/az2" = {
cidr_block = "10.0.1.0/24"
availability_zone_id = "apne2-az2"
}
}
tags = {}
}
module "subnet_group__private" {
source = "tedilabs/network/aws//modules/subnet-group"
version = "0.24.0"
name = "${module.vpc.name}-private"
vpc_id = module.vpc.id
map_public_ip_on_launch = false
subnets = {
"${module.vpc.name}-private-001/az1" = {
cidr_block = "10.0.10.0/24"
availability_zone_id = "apne2-az1"
}
"${module.vpc.name}-private-002/az2" = {
cidr_block = "10.0.11.0/24"
availability_zone_id = "apne2-az2"
}
}
tags = {}
}
module "route_table__public" {
source = "tedilabs/network/aws//modules/route-table"
version = "0.24.0"
name = "${module.vpc.name}-public"
vpc_id = module.vpc.id
subnets = module.subnet_group__public.ids
ipv4_routes = [
{
cidr_block = "0.0.0.0/0"
gateway_id = module.vpc.internet_gateway_id
},
]
tags = {}
}
module "route_table__private" {
source = "tedilabs/network/aws//modules/route-table"
version = "0.24.0"
name = "${module.vpc.name}-private"
vpc_id = module.vpc.id
subnets = module.subnet_group__private.ids
ipv4_routes = []
tags = {}
}
tfi & tfp & tfa를 통해서 코드를 생성 진행 한다.
VPC 및 리소스 생성을 콘솔에서 확인 한다
- VPC
- SUBNET(pubclit / private)
- 라우트 테이블
Registry module을 활용해서 VPC 리소스 생성하는 예제를 진행해 보았다. 무수히 많은 모듈과 repo가 존재한다.
직접 개발 하여서 사용하는것도 좋지만 기존의 모듈들을 활용해서 개발하는 것 역시 운영의 효율성 면에선 좋은 방법이라 생각 한다.
외부 모듈을 사용해서 사용하는 방법의 예제를 통해서 다른 분들이 좀 더 쉽게 테라폼 모듈을 사용 할 수 있는 기회가 되었으면 좋겠다.
그림 출처 : O.REILLY Terraform Up & Running 테라폼