목표
이번에는 모듈을 사용해서 인프라를 구축해보자. VPC, Subnet, Route Tables 등등을 모듈로 정의하고 가져다가 사용해서 인프라를 구축한다.
Module
모듈은 쉽게 말해서, 어떤 특정 컴포넌트(예: VPC)를 만들기 위해 필요한 정보들을 미리 구현해놓은 누군가(또는 나의)의 것을 가져다가 사용한다고 생각하면 된다. 개발할 때 패키지나 모듈을 다운받아서 가져다가 쓰는 원리랑 동일하다.
그래서 테라폼 레지스트리에서 올려놓은 여러 모듈 중 하나를 가져다가 사용해서 인프라를 구성해보자.
테라폼 레지스트리에 등록된 모듈 중 이 모듈을 사용할 것이다.
여기 보면 AWS 네트워크 관련된 모듈들이 있다.
main.tf
다음과 같이 main.tf 파일을 만든다. 하나하나 뜯어보자.
provider "aws" {
region = "ap-northeast-2"
}
module "vpc" {
source = "tedilabs/network/aws//modules/vpc"
version = "0.24.0"
name = "tf-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}-public-002/az2" = {
cidr_block = "10.0.11.0/24"
availability_zone_id = "apne2-az2"
}
}
tags = {}
}
VPC 모듈
module "vpc" {
source = "tedilabs/network/aws//modules/vpc"
version = "0.24.0"
name = "tf-vpc"
cidr_block = "10.0.0.0/16"
internet_gateway_enabled = true
dns_hostnames_enabled = true
dns_support_enabled = true
tags = {}
}
우선 모듈을 작성할 때 source와 version을 작성해줘야 하는데, source는 이 모듈이 Local, Terraform Registry, Github 등 어디서 가져오냐에 따라 작성 방식이 살짝 다르다. 나의 경우 Terraform Registry에서 가져왔기 때문에 저렇게 source, version을 명시해줘야 한다. 이 내용은 다음 링크에서 자세히 확인이 가능하다.
그리고 이제 다음 name, cidr_block, internet_gateway_enabled 등등은 이 모듈을 제공하는 제공자가 작성하라고 명시한 값이다. 이는 당연히 해당 모듈에 대한 문서에 나와있어야 하고 그것을 가져다가 사용할 뿐이다.
Subnet Group 모듈
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}-public-002/az2" = {
cidr_block = "10.0.11.0/24"
availability_zone_id = "apne2-az2"
}
}
tags = {}
}
이렇게 main.tf 파일을 만들고 이 파일을 init - apply 해보자.
이러한 결과가 나온다. 잘 만들어졌는지 AWS Console에서 확인해보자.
결론
작성한 대로, VPC와 Subnet들이 생성됐음을 확인할 수 있다. 이렇게 모듈을 사용해서 Resources를 하나하나 만들어내는게 아니라 원하
는 모듈 하나를 가져와서 그 모듈이 제공하는 리소스를 가져다가 사용할 수도 있다. 모듈이 주는 장점은 재사용성을 높인다는 것이다. 만약 VPC를 만들어 내려고 할 때마다 VPC Resource를 직접 작성해서 만들 수도 있겠지만, 같은 구성 같은 환경이라면 하나의 모듈을 만들어서 그것을 여러번 사용하는게 좀 더 효율적이지 않을까.
'IaC(Infrastructure as Code)' 카테고리의 다른 글
AWS + Terraform (Conditions) (0) | 2024.03.07 |
---|---|
AWS + Terraform (For-Each) (0) | 2024.03.06 |
AWS + Terraform (2) | 2024.03.05 |
Terraform 소개 및 간단하게 다루어보기 (0) | 2024.03.05 |
패커(Packer), Ansible 설치 및 설정 (0) | 2024.03.05 |