Terraform 모듈 구현

LinuxBeginner
지금 연습하기

소개

Terraform 모듈은 Infrastructure as Code (IaC) 의 핵심 개념으로, 재사용 가능하고 구성 가능하며 체계적인 컴포넌트를 생성할 수 있게 해줍니다. 동일한 코드 블록을 여러 곳에 작성하는 대신, 이를 모듈로 캡슐화하여 필요할 때마다 호출할 수 있습니다. 이러한 방식은 프로젝트 전반에 걸쳐 코드 유지보수성과 일관성을 크게 향상시킵니다.

본 랩에서는 Terraform 모듈 구현의 기본 사항을 학습합니다. 표준 모듈 디렉터리 구조를 생성하는 것부터 시작할 것입니다. 그런 다음, 로컬 파일을 생성하는 간단한 모듈을 정의합니다. 변수를 사용하여 이 모듈을 구성 가능하게 만들고, 출력을 통해 결과를 노출할 것입니다. 마지막으로, 루트 Terraform 구성에서 이 모듈을 호출하여 리소스를 배포합니다.

본 랩이 끝날 때쯤이면 자신만의 Terraform 모듈을 구축하고 사용하는 방법에 대해 실질적인 이해를 갖게 될 것입니다.

프로젝트 루트에 modules 디렉터리 생성

이 단계에서는 로컬 Terraform 모듈을 위한 표준 디렉터리 구조를 생성합니다. 프로젝트 루트의 modules 디렉터리 내에 모든 로컬 모듈을 배치하는 것이 일반적인 관례입니다. 그러면 modules 내부의 각 하위 디렉터리가 단일의 독립적인 모듈을 나타냅니다.

먼저, 모듈을 위한 디렉터리와 localfile_creator라는 이름을 지정할 모듈을 위한 특정 하위 디렉터리를 생성하겠습니다. 모든 작업은 ~/project 디렉터리에서 수행됩니다.

중첩된 디렉터리 구조를 생성하려면 다음 명령을 실행하십시오.

mkdir -p modules/localfile_creator

-p 플래그는 mkdir이 부모 디렉터리 modules가 아직 존재하지 않는 경우에도 이를 생성하도록 보장합니다.

이제 tree 명령을 사용하여 디렉터리가 올바르게 생성되었는지 확인할 수 있습니다. tree가 설치되어 있지 않다면 ls -R을 사용할 수 있습니다.

tree

새 디렉터리 구조를 확인하는 다음 출력이 표시되어야 합니다.

.
└── modules
    └── localfile_creator

2 directories, 0 files

이 구조는 재사용 가능한 모듈 코드를 이를 사용할 루트 구성과 명확하게 분리합니다.

local_file 리소스를 위한 모듈 내 main.tf 생성

이 단계에서는 새 모듈의 기본 구성 파일을 생성합니다. 각 모듈은 독립적인 Terraform 프로젝트이므로 자체 .tf 파일 세트를 가집니다. main.tf 파일은 일반적으로 모듈의 핵심 리소스가 정의되는 곳입니다.

여기서는 hashicorp/local 프로바이더의 일부인 local_file 리소스를 정의할 것입니다. 이 리소스는 클라우드 제공자 자격 증명 없이 로컬 파일 시스템의 파일을 간단히 관리하므로 학습 목적으로 매우 유용합니다.

먼저, nano 편집기를 사용하여 모듈 디렉터리 내에 main.tf 파일을 생성합니다.

nano modules/localfile_creator/main.tf

이제 파일에 다음 HCL (HashiCorp Configuration Language) 코드를 추가합니다. 이 코드는 example이라는 이름을 가진 local_file 유형의 리소스를 정의합니다.

resource "local_file" "example" {
  content  = "This is a file created by a Terraform module."
  filename = "${path.module}/module_output.txt"
}

이 코드를 분석해 보겠습니다.

  • resource "local_file" "example": 이는 local_file 유형의 리소스를 선언하고 로컬 이름 example을 부여합니다.
  • content: 이 인수는 파일에 기록될 내용을 설정합니다.
  • filename: 이 인수는 생성될 파일의 경로와 이름을 지정합니다. 여기서는 내장 변수인 path.module을 사용하는데, 이는 표현식이 배치된 모듈의 파일 시스템 경로를 항상 참조합니다. 이로 인해 파일 경로는 모듈 자체에 상대적이 됩니다.

nano에서 파일을 저장하고 Ctrl+X를 누른 다음 Y, 그리고 Enter를 눌러 종료합니다.

모듈 변수 및 출력 정의

이 단계에서는 모듈을 구성 가능하게 만들고 정보를 반환할 수 있도록 할 것입니다. 파일 이름이나 콘텐츠와 같은 값을 하드코딩하는 것은 모듈의 재사용성을 제한합니다. 입력 변수 (input variables) 를 사용하여 사용자 정의 값을 전달하고 출력 값 (output values) 을 사용하여 모듈이 생성하는 리소스에 대한 정보를 노출할 것입니다.

관례적으로 변수는 variables.tf 파일에, 출력은 outputs.tf 파일에 정의됩니다.

먼저, 모듈을 위한 variables.tf 파일을 생성합니다.

nano modules/localfile_creator/variables.tf

다음 코드를 추가하여 두 개의 입력 변수인 file_contentfile_name을 정의합니다.

variable "file_content" {
  description = "The content of the file."
  type        = string
  default     = "Default content."
}

variable "file_name" {
  description = "The name of the file to create."
  type        = string
}

다음으로, 모듈이 반환할 정보를 선언하기 위해 outputs.tf 파일을 생성합니다.

nano modules/localfile_creator/outputs.tf

생성된 파일의 전체 경로를 출력하기 위해 다음 코드를 추가합니다.

output "filename" {
  description = "The full path to the created file."
  value       = local_file.example.filename
}

마지막으로, 하드코딩된 값을 대신 사용하도록 모듈의 main.tf를 업데이트해야 합니다. 파일을 다시 엽니다.

nano modules/localfile_creator/main.tf

파일을 다음과 같이 수정합니다. 하드코딩된 문자열을 var.file_contentvar.file_name으로 대체하고 있습니다.

resource "local_file" "example" {
  content  = var.file_content
  filename = "${path.module}/${var.file_name}"
}

편집기를 저장하고 종료합니다. 이제 모듈이 유연해졌으며 다른 입력으로 사용될 준비가 되었습니다.

루트 main.tf 파일에서 모듈 호출

이 단계에서는 방금 구축한 모듈을 호출하는 루트 구성 파일 (root configuration file) 을 생성합니다. 루트 main.tf는 Terraform 실행의 진입점 (entry point) 입니다. 이곳에서 하나 이상의 모듈을 호출하여 인프라를 구성합니다.

이제 프로젝트 디렉터리 (~/project) 의 루트에서 작업합니다. 여기에 main.tf 파일을 생성합니다.

nano main.tf

다음 코드를 이 파일에 추가합니다. 이 구성은 localfile_creator 모듈을 사용할 것입니다.

terraform {
  required_providers {
    local = {
      source  = "hashicorp/local"
      version = "2.4.0"
    }
  }
}

module "file_creator_instance" {
  source = "./modules/localfile_creator"

  file_content = "Hello from the root module!"
  file_name    = "my_test_file.txt"
}

output "created_file_path" {
  description = "Path of the file created by the module."
  value       = module.file_creator_instance.filename
}

이 루트 구성을 분석해 보겠습니다.

  • terraform { ... }: 이 블록은 프로바이더 요구 사항을 정의합니다. 모듈이 local 프로바이더를 사용하므로, 이를 호출하는 루트 모듈도 이를 선언해야 합니다.
  • module "file_creator_instance" { ... }: 이것이 모듈 블록입니다. file_creator_instance는 이 특정 모듈 인스턴스에 대한 로컬 이름입니다.
  • source = "./modules/localfile_creator": 이는 Terraform 에게 모듈의 소스 코드를 어디서 찾아야 하는지 알려줍니다. 이 경우 로컬 경로입니다.
  • file_content = "..."file_name = "...": 여기서는 모듈의 variables.tf에 정의된 입력 변수에 값을 전달하고 있습니다.
  • output "created_file_path" { ... }: 이 루트 수준의 출력 블록은 모듈로부터 값을 검색합니다. 구문은 module.<MODULE_INSTANCE_NAME>.<OUTPUT_NAME>입니다.

파일을 저장하고 nano를 종료합니다. 이제 프로젝트는 모듈을 사용하도록 완전히 구성되었습니다.

모듈을 통해 배포하기 위해 terraform apply 실행

마지막 단계에서는 표준 Terraform 명령어를 사용하여 구성을 초기화 (initialize), 계획 (plan) 하고 적용 (apply) 할 것입니다. 이 과정은 모듈 내의 코드를 실행하고 로컬 파일을 생성합니다.

먼저, Terraform 작업 디렉터리를 초기화합니다. 이 명령어는 필요한 프로바이더 플러그인 (이 경우 hashicorp/local) 을 다운로드합니다.

terraform init

Terraform 이 성공적으로 초기화되었다는 성공 메시지가 표시되어야 합니다.

Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/local versions matching "2.4.0"...
- Installing hashicorp/local v2.4.0...
- Installed hashicorp/local v2.4.0 (signed by HashiCorp)

Terraform has been successfully initialized!
...

다음으로, terraform plan을 실행하여 Terraform 이 어떤 변경 사항을 적용할지 확인합니다. 이는 아무것도 변경하지 않고 실행 계획만 보여주는 드라이 런 (dry run) 입니다.

terraform plan

출력 결과는 하나의 리소스 (local_file, 모듈 내부에 있음) 가 생성될 것임을 보여줍니다.

...
Plan: 1 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + created_file_path = (known after apply)
...

이제 파일을 생성하기 위해 구성을 적용합니다. 대화형 확인 프롬프트를 건너뛰기 위해 -auto-approve 플래그를 사용하겠습니다.

terraform apply -auto-approve

Terraform 이 계획을 실행하고 파일을 생성합니다. 출력 결과는 생성 확인과 정의한 출력 값을 표시할 것입니다.

...
module.file_creator_instance.local_file.example: Creating...
module.file_creator_instance.local_file.example: Creation complete after 0s [id=f73598097552a798110a31388c54c1194b539a53]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

created_file_path = "./modules/localfile_creator/my_test_file.txt"

마지막으로, 파일이 올바른 내용으로 생성되었는지 확인합니다. 모듈 디렉터리의 파일 목록을 확인한 다음 새 파일의 내용을 표시합니다.

ls -l modules/localfile_creator/
cat modules/localfile_creator/my_test_file.txt

cat 명령어의 출력 결과는 다음과 같아야 합니다.

Hello from the root module!

축하합니다. Terraform 모듈을 성공적으로 생성하고 사용했습니다!

요약

본 랩 (lab) 에서는 Terraform 모듈을 생성하고 사용하는 기본 사항을 성공적으로 학습했습니다. 적절한 디렉터리 구조 설정부터 재사용 가능한 모듈을 통해 리소스를 배포하는 전체 프로세스를 살펴보았습니다.

다음 사항들을 학습했습니다.

  • 로컬 모듈을 위한 표준 디렉터리 구조 생성.
  • 모듈의 main.tf 파일 내에 리소스 정의.
  • variables.tf를 사용하여 모듈을 구성 가능하고 재사용 가능하게 만들기.
  • outputs.tf를 사용하여 모듈의 데이터를 호출하는 구성 (calling configuration) 에 노출.
  • 루트 main.tf 파일에서 로컬 모듈을 호출하고, 입력 변수를 전달하며, 출력 값에 접근.
  • 구성을 적용하여 모듈이 작동하는지 확인.

모듈을 숙달함으로써 더 깔끔하고, 더 체계적이며, 더 확장 가능한 Infrastructure as Code(IaC) 를 작성할 수 있습니다. 이 랩을 완료하신 것을 축하드립니다!