Terraform 모듈

LinuxBeginner
지금 연습하기

소개

동네를 설계하는 건축가라고 생각해 봅시다. 집 한 채 한 채를 벽돌 단위로 처음부터 모두 그리지는 않을 것입니다. 대신 "표준 주택"의 청사진을 만든 다음 그 청사진을 50 번 복사할 것입니다.

Terraform 에서 이러한 재사용 가능한 청사진을 모듈이라고 합니다.

모듈은 Terraform 을 작은 예제에서 실제 인프라 코드베이스로 확장할 때 사용하는 핵심 방법입니다. 팀은 모듈을 통해 패턴을 한 번 패키징하고 여러 번 재사용할 수 있습니다.

같은 구성을 계속 반복해서 작성하는 대신, 모듈 안에 한 번 작성하고 재사용합니다. 실제 인프라 코드베이스는 빠르게 커지므로 애플리케이션 코드와 마찬가지로 구조가 필요합니다. 따라서 모듈이 중요합니다.

이 실습에서는 서버 구성 파일을 생성하는 간단한 모듈을 만든 다음, 이 모듈을 사용해 서로 다른 서버 두 대를 만듭니다.

모듈 디렉터리 만들기

먼저 청사진을 저장할 위치가 필요합니다. Terraform 모듈은 내부에 Terraform 파일이 들어 있는 일반 폴더일 뿐입니다.

여기서 중요한 점은 모듈이 파일 형식 측면에서 특별한 새 언어 기능이 아니라는 것입니다. 모듈은 재사용 가능한 인터페이스 뒤에 Terraform 구성을 묶어 둔 것입니다.

일반적으로 정리를 위해 modules라는 폴더를 만듭니다. 그 안에 특정 webserver 모듈을 위한 폴더를 만듭니다.

다음과 같이 구조를 설정합니다.

cd ~/project
mkdir -p modules/webserver

작업 결과를 확인합니다.

ls -R

modules 디렉터리 안에 webserver 디렉터리가 표시되어야 합니다. 이 webserver 폴더가 독립적으로 동작하는 작은 프로젝트 역할을 합니다.

모듈 정의하기

이제 청사진 자체를 작성합니다.

모듈은 루트 프로젝트와 같은 방식으로 동작합니다. 리소스를 정의하는 main.tf와 입력을 받는 variables.tf를 가집니다.

이 실습에서는 local_file이라는 간단한 리소스를 사용합니다. 이 리소스는 디스크에 텍스트 파일을 생성합니다. 복잡한 클라우드 설정이 필요하지 않고 빠르게 실행되므로 모듈을 학습하기에 적합합니다.

먼저 nano로 모듈의 main.tf를 만듭니다.

nano modules/webserver/main.tf

다음 내용을 추가합니다. 이 구성은 특정 텍스트가 들어 있는 파일을 생성하도록 Terraform 에 지시합니다.

resource "local_file" "server_config" {
  content  = "Server Name: ${var.server_name}\nEnvironment: ${var.env}"
  filename = "${path.root}/${var.server_name}-config.txt"
}

nano에서 저장하고 종료합니다 (Ctrl+O, Enter, Ctrl+X).

잠깐, var.server_name은 무엇일까요? 아직 정의하지 않았습니다. 프로그래밍의 함수와 마찬가지로 모듈도 허용하는 입력을 선언해야 합니다.

함수와 같은 이 모델을 이해를 위한 비유로 사용할 수 있습니다. 모듈은 입력과 출력을 외부에 제공하면서 내부 리소스의 세부 정보를 호출하는 쪽에서 숨깁니다.

모듈의 variables.tf를 만듭니다.

nano modules/webserver/variables.tf

다음 입력 정의를 추가합니다.

variable "server_name" {
  description = "The name of the server"
  type        = string
}

variable "env" {
  description = "The environment (e.g., dev, prod)"
  type        = string
  default     = "dev"
}

nano에서 저장하고 종료합니다.

이제 청사진인 모듈이 완성되었습니다. 모듈은 파일을 어떻게 만들지 알고 있으며, 작업에 필요한 정보인 이름과 환경이 무엇인지도 알고 있습니다.

모듈 호출하기

이제 사이트 관리자의 역할을 맡는다고 가정합니다. 서버를 만들고 싶지만 세부 구현은 신경 쓰고 싶지 않습니다. 모듈을 "고용"해서 작업을 맡기기만 하면 됩니다.

루트 main.tf(~/project에 있는 파일) 에 module 블록을 만들어 이 작업을 수행합니다.

루트 main.tf를 만듭니다.

cd ~/project
nano main.tf

다음 내용을 추가하여 모듈을 "호출"합니다.

module "my_first_server" {
  source      = "./modules/webserver"
  server_name = "web-01"
  env         = "production"
}

저장하고 nano를 종료합니다.

각 항목의 의미는 다음과 같습니다.

  • module "my_first_server": 이 특정 인스턴스의 이름입니다.
  • source: 매우 중요합니다. Terraform 이 청사진 폴더 (./modules/webserver) 를 찾을 위치를 지정합니다.
  • server_name 및 env: 모듈에 전달하는 입력입니다.

즉, 모듈 호출을 사용하면 루트 구성이 더 높은 수준에서 의도를 표현할 수 있습니다. 모든 하위 수준 리소스를 다시 입력하는 대신 "이 입력으로 재사용 가능한 패턴을 인스턴스화하라"고 지정하는 것입니다.

중요: 새 모듈을 추가할 때마다 Terraform 에 해당 모듈을 준비하도록 알려야 합니다. init을 실행하여 모듈을 설치합니다.

terraform init

이제 설계를 적용합니다.

terraform apply -auto-approve

결과를 확인합니다. 모듈이 새 파일을 생성했어야 합니다.

cat web-01-config.txt

성공입니다! 모듈이 입력값인 "web-01"과 "production"을 받아 대신 작업을 수행했습니다.

모듈 재사용하기

이제 모듈의 진가를 확인합니다. 두 번째 서버를 만들려고 합니다. 모든 리소스 코드를 복사하는 대신 청사진을 한 번 더 사용하면 됩니다.

다시 nano로 루트 main.tf를 엽니다.

nano main.tf

아래쪽 화살표 키로 파일의 맨 아래로 이동한 다음 다음 블록을 추가합니다.

module "my_second_server" {
  source      = "./modules/webserver"
  server_name = "web-02"
  ## We are not setting 'env' here, so it will use the default value "dev"
}

저장하고 nano를 종료합니다.

구성이 깔끔하지 않나요? "web-02 라는 이름의 서버를 하나 더 원한다"고 지정하기만 하면 됩니다. local_file이 내부적으로 어떻게 동작하는지 알 필요가 없습니다. 인터페이스만 사용하면 됩니다.

변경 사항을 적용합니다.

terraform init
terraform apply -auto-approve

이제 서로 다른 서버 파일이 두 개 있는지 확인합니다.

ls -l *-config.txt

두 번째 파일이 기본 "dev" 환경을 사용했는지도 확인합니다.

cat web-02-config.txt

재사용 가능한 인프라의 기본 원리를 익혔습니다!

요약

축하합니다! 전문적인 Terraform 코드를 작성하는 데 큰 발걸음을 내디뎠습니다.

이 실습에서는 다음 내용을 배웠습니다.

  • 모듈: 코드를 재사용 가능한 폴더, 즉 "청사진"으로 그룹화하는 방법
  • 입력: 변수를 사용하여 모듈을 유연하게 만드는 방법
  • 모듈 호출: module 블록을 사용하여 청사진의 인스턴스를 만드는 방법
  • 재사용: 최소한의 코드로 인프라를 여러 개 쉽게 만드는 방법

이제 복잡하게 쌓인 벽돌 더미 대신 재사용 가능한 구성 요소를 갖추게 되었습니다. 이를 통해 더 빠르고 안전하며 깔끔한 인프라를 구축할 수 있습니다.