IaC(Infrastructure as Code)

AWS + Terraform (Module)

cwchoiit 2024. 3. 6. 15:45
728x90
반응형
SMALL
728x90
SMALL

 

목표

이번에는 모듈을 사용해서 인프라를 구축해보자. VPC, Subnet, Route Tables 등등을 모듈로 정의하고 가져다가 사용해서 인프라를 구축한다. 

 

Module

모듈은 쉽게 말해서, 어떤 특정 컴포넌트(예: VPC)를 만들기 위해 필요한 정보들을 미리 구현해놓은 누군가(또는 나의)의 것을 가져다가 사용한다고 생각하면 된다. 개발할 때 패키지나 모듈을 다운받아서 가져다가 쓰는 원리랑 동일하다.

 

그래서 테라폼 레지스트리에서 올려놓은 여러 모듈 중 하나를 가져다가 사용해서 인프라를 구성해보자.

 

테라폼 레지스트리에 등록된 모듈 중 이 모듈을 사용할 것이다.

 

Terraform Registry

 

registry.terraform.io

 

여기 보면 AWS 네트워크 관련된 모듈들이 있다.

 

Terraform Registry

 

registry.terraform.io

 

 

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을 명시해줘야 한다. 이 내용은 다음 링크에서 자세히 확인이 가능하다.

 

Module Sources | Terraform | HashiCorp Developer

The source argument tells Terraform where to find child modules's configurations in locations like GitHub, the Terraform Registry, Bitbucket, Git, Mercurial, S3, and GCS.

developer.hashicorp.com

 

그리고 이제 다음 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를 직접 작성해서 만들 수도 있겠지만, 같은 구성 같은 환경이라면 하나의 모듈을 만들어서 그것을 여러번 사용하는게 좀 더 효율적이지 않을까.

728x90
반응형
LIST

'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