Room9

Terraform - Modules 본문

Terraform/NCP

Terraform - Modules

Room9_ 2022. 1. 7. 12:09

Overview

HCL을 이용하여 네이버 클라우드 상에 리소스를 생성하였습니다. main.tf파일에 모든 리소스가 있다 보니 파일의 길이가 너무 길어지고 주석을 꼭 살펴야 해당 리소스의 용도와 생성 이유에 대해서 확인을 할 수 있었습니다. 테라폼은 코드의 재활용성을 높이기 위하여, 모듈화를 통하여 여러 서비스에서 코드를 재사용할 수 있게 지원합니다.

module 은 크게 두 가지로 나눌 수 있습니다.

  • Root module - Terraform command를 수행하는 directory에 있는 파일들로 구성된 module을 Root module
  • Child module - 다른 module (Root module 포함)에서 호출하여 사용되는 module을 Child module이라고 한다.
    Child module 은 여러 번 호출되어 사용될 수 있고 module에 따라 다른 configuration 값을 전달하여 사용할 수도 있습니다.

Details

  • Module 구조
  • Module arguments

Module 구조

 ✘ Room9 🎉   ~/workspace/basic   master  tree
.
├── main.tf
├── modules
│   └── network
│       ├── main.tf
│       ├── outputs.tf
│       └── variables.tf
├── ubuntu_server_image_list.json
└── variables.tf

기존의 Network 부분을 해당 구조로 분리해주었습니다.


Module Arguments

기본적으로 모듈을 선언하고 해당 모듈의 위치를 지정하여 사용할 수 있습니다. 모듈의 위치는 로컬뿐만 아니라 terraform registry 등 다양하게 존재합니다. 특히 글로벌 벤더사 같은 경우에는 공식적으로 지원하는 모듈들도 있으니 간단하게 사용하여 자신의 리소스에서 사용할 수 있는 장점이 있습니다.

module "network" {
  source = "./modules/network"
}

이런 식으로 로컬 위치의 디렉터리를 모듈로 메인에서 불러 사용이 가능합니다.

모듈에서는 ouputs.tf파일에 출력할 변수를 지정해 줘야 합니다.

Network 모듈의 outputs.tf파일을 확인해보겠습니다.

output "vpc_id" {
    value = ncloud_vpc.vpc.id
}
output "pub_sub" {
    value = ncloud_subnet.pub-sub.id
}

vpc_id 인수는 ncloud_vpc.vpc.id의 값을 가지고 있는 것을 확인이 가능합니다.

그러면 이제 다시 해당 모듈을 끌어 쓰는 main.tf의 파일에서 모듈의 ouput 인수를 어떻게 사용하는지 확인하겠습니다.

## ACG ##
resource "ncloud_access_control_group" "acg" {
  name   = "pub-acg"
  vpc_no = module.network.vpc_id
}

[모듈]. [모듈명]. [outputs인수]로 불러서 사용이 가능합니다.


마치며

이와 같이 테라폼은 모듈을 지원하며, 모듈의 범위, 재사용성을 고려하여 작성한다면 매번 코드를 작성하는 반복 업무에서 벗어날 수 있을 것으로 생각됩니다. 오늘은 간단하게 모듈을 나누고 해당 모듈을 선언하여 사용하는 방법까지 확인하였습니다. 본문에서 언급하였듯, 모듈은 로컬뿐만 아니라 여러 가지 방식으로 사용 가능합니다. 모듈 사용을 익숙하게 한다면, 매번 코드를 수정하거나, 작성하는 일 없이 리소스를 생성하고 관리할 수 있을 것 같습니다. 앞으로는 해당 코드를 조금 더 수정하여 사용 가능한 모듈화까지 진행해볼 예정입니다.

References

https://www.terraform.io/language/modules/develop

 

Creating Modules | Terraform by HashiCorp

Modules are containers for multiple resources that are used together in a configuration. Learn when to create modules and about module structure.

www.terraform.io

 

Comments