Terraform Module 사용법과 예제

Louis·2022년 12월 8일
0

Terraform

목록 보기
4/6

Terraform Module이란.?

테라폼으로 인프라의 규모가 커질경우 하나의 파일에 모든것을 정의할 경우 의도치않게 다른 부분에 영향을 끼칠 수 있고 환경별 같은 리소스의 코드가 중복되어 쌓일수가 있다.
이러한 단점을 해결하기 위해 테라폼은 모듈이란 요소를 제공해준다.
모듈은 관련있는 요소끼리 모아 하나의 패키지를 만든다.
예를 들어 VPC 모듈의 경우 서브넷, netmask 등의 리소스를 하나의 패키징을 한다.

Terraform Module의 장점

  • 캡슐화

    서로 관련있는 요소들 끼리마 캡슐화를 하여 의도치 않은 문제 발생을 예방 할 수 있다.

  • 재사용성

    모듈을 사용하여 리소스를 정의하면 다른 환경에서도 해당 리소스를 쉽게 재사용 할 수 있다.

  • 일관성

    매번 새로 작성하게 되면 사람에 따라 리소스의 옵션이 빠지는 부분이 생길수도 있고 매번 같을 수 없기에 모듈을 재사용시 일관성을 가지게 된다.

Terraform Module 기본 사용법

기본 구문

  • NAME : 테라폼 코드 전체에서 참조하기 위해 사용하는 식별자
  • SOURCE : 모듈 코드를 찾을 수 있는 경로
  • CONFIG : 모듈과 관련된 특정한 하나 이상의 인수로 구성
module "<NAME>" {
	source = "<SOURCE>"
    
    [CONFIG ...]
}

Terraform Module 사용 문법

Locals

  • 테라폼 모듈이 위치한 경로를 상대 경로로 지정해서 이용 할 수 있다.
module "module_test" {
	source = "./module							
}

Github

module "webserver_cluster" {
	source = "github.com/hashicorp/example"
}

Registry

  • Terraform 해쉬코프에서 제공해주는 모듈들의 저장공간
  • 다양한 리소스의 모듈들이 관리되고 있다
  • 필요한 리소스 모듈들을 https://registry.terraform.io 에서 검색해서 사용가능 하다
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"
}

Terraform Module 사용 예제

  • 각 사용하는 provider에 맞춰서 제공하는 서비스에 맞는 모듈을 찾아서 사용하는것이 중복되는 코드와
    다양한 서비스를 이용하는데 효율적인 개발 방법이라고 생각한다.
  • 다양한 모듈들이 존재 하기에 본인 및 회사에 맞는 모듈을 찾아서 사용하거나
    모듈을 생성해서 운영에 사용하는 것이 중요하다

Registry module 활용

  • Registry 등록 된 모듈을 활용해서 vpc 배포하는 방법을 예제로 작성해 보도록 하겠다.
  • 테라폼 히어로인 당근마켓의 박용진이 운영하시는 terraform 모듈 repo에서 vpc 모듈을 사용하는 것을 진행해 보겠다.
    • 다른 유명한 사이트도 있고 aws 출신의 개발자가 제공하는 repo도 있지만 한글로 제공된다는 점과 지속적으로 관리가 되고 있으며
      당근 마켓에서 활용한다는 점을 생각해서 선택 하였다.
    • repo : https://github.com/tedilabs
  • source와 version 지정을 통해서 사용하고자 하는 모듈을 활용 한다.

code 1

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 = {}
}
  • vpc 모듈을 사용하고 name과 cidr_block 지정, 기타 옵션을 설정한다.

code 2

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 = {}
}
  • subnet-group에 대한 모듈을 지정해서 사용하였다.
  • subnet_group_public/private : 퍼블릭/프라이빗 subnet에 대한 그룹을 만들어서 관리하게 모듈이 생성되어 있다.
  • subnet(퍼블릭/프라이빗)이 각각 배포 될 availabilty_zone_id를 각각 지정해서 하나의 블록에서 관리하고 사용 하였다.
  • 그외 옵션은 repo 에 표시 된 option 파라미터 가이드를 활용하면서 설정 하였다.

code 3

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 = {}
}
  • 라우트 테이블을 활용하기 위해서 /modules/route-table 를 지정하여서 사용하였다.
  • public 서브넷과 private 서브넷에서 사용할 라우트 테이블에 대핸 설정이다.
  • 인터넷 통신을 위한 설정과 private 라우트는 NAT 비용이 발생 하기에 설정 없이 생성 진행 하였다.

tfi & tfp & tfa

  • tfi & tfp & tfa를 통해서 코드를 생성 진행 한다.

  • VPC 및 리소스 생성을 콘솔에서 확인 한다
    - VPC

    - SUBNET(pubclit / private)

    - 라우트 테이블

결론

Registry module을 활용해서 VPC 리소스 생성하는 예제를 진행해 보았다. 무수히 많은 모듈과 repo가 존재한다.
직접 개발 하여서 사용하는것도 좋지만 기존의 모듈들을 활용해서 개발하는 것 역시 운영의 효율성 면에선 좋은 방법이라 생각 한다.
외부 모듈을 사용해서 사용하는 방법의 예제를 통해서 다른 분들이 좀 더 쉽게 테라폼 모듈을 사용 할 수 있는 기회가 되었으면 좋겠다.

참고

그림 출처 : O.REILLY Terraform Up & Running 테라폼

profile
인프라 운영하는 개발자

0개의 댓글