반응형
이번 포스트에서는 테라폼의 가장 중요한 설계방법인 모듈화를 알아보자
📌 서론
내가 처음 테라폼 코드를 작성할 때는 module의 존재는 알았지만 도대체 이게 어떻게 사용되는 건지 모르겠어서 module을 사용하지 않고 하나의 tf 파일에 모든 리소스에 대한 코드를 전부 다 적었었다.
이렇게 하나의 tf 파일에 모든 리소스가 모이다 보니 리소스 수정을 하고싶을때 코드를 읽고 찾는 것이 너무 힘들었다. 그래서 조금이라도 가독성을 좋게 만들기 위해 여러 검색을 하던 도중 외국계 기술 블로거의 글을 보던 도중 테라폼 코드를 읽기 좋게 작성하려면 모듈화를 사용하라고 적혀있었고 이에 바로 모듈화를 적용시켜 보았다.
1. 테라폼의 모듈화란 무엇인가?
1-1. 테라폼의 모듈화란?
- 테라폼 모듈화(Modularization)는 복잡한 인프라 구조를 보다 쉽게 관리하고, 재사용할 수 있도록 만드는 테라폼의 핵심 기능이다. 이는 테라폼 구성 파일(.tf 파일)들을 모아 하나의 디렉토리에 위치시키는 것으로, 특정 인프라 구성 요소를 정의하고, 필요에 따라 다른 프로젝트에서 재사용할 수 있게 한다.
1-2. 테라폼 모듈의 구성
- 각 테라폼 모듈은 자체적으로 완전한 기능을 가진, 독립적인 테라폼 코드 블록으로 구성되어 있다. 이 모듈들은 네트워크, 서버 클러스터, 데이터베이스 등과 같은 인프라 구성 요소를 명확하게 정의하고, 이를 다양한 프로젝트에서 재사용할 수 있도록 해준다. 모듈을 사용함으로써, 개발자들은 코드의 중복을 줄이고, 프로젝트의 구조를 더 체계적으로 관리할 수 있게 된다. 또한, 모듈화는 코드의 가독성을 향상시키고, 인프라 구성의 복잡성을 줄여준다.
1-3. 핵심
- 테라폼 모듈화의 핵심은 각각의 모듈이 독립적으로 기능하면서도, 전체 인프라 구성의 일부로서 함께 작동한다는 것이다. 이를 통해, 테라폼 사용자들은 인프라 구성의 일부분만을 변경하거나 업데이트할 수 있게 되며, 이는 전체 인프라에 미치는 영향을 최소화하면서 효율적인 관리를 가능하게 한다.
2. 모듈화의 중요성 및 이점
2-1. 모듈화의 중요성 및 이점은 다음과 같다.
1. 필수적인 접근 방식 |
|
2. 관리의 용이성 |
|
3. 오류 감소 |
|
4. 코드 재사용성 |
|
5. 구성 조직화와 캡슐화 |
|
6. 일관성과 최선의 관행 |
|
테라폼 모듈의 기본 구조를 알아보자
3. 테라폼 모듈의 기본 구조
3-1. 테라폼 모듈의 기본 구조는 일반적으로 다음과 같은 파일들로 구성된다.
main.tf |
|
variables.tf |
|
outputs.tf |
|
README.md |
|
Terraform Module
├── main.tf
├── variables.tf
├── outputs.tf
└── README.md
테라폼의 표쥰 모듈은 어떤 구조로 이루어져 있을까?
4. 테라폼 표준 모듈의 구조
4-1. 테라폼의 표준 모듈 구조
- 테라폼에서 제공하는 표준 모듈 구조는 모듈의 기본 구조를 확장하여, 보다 체계적이고 재사용하기 쉬운 형태를 제공한다. 이 구조는 다음과 같은 요소들을 포함한다.
1. 루트 모듈 |
|
2. README 파일 |
|
3. LICENSE 파일 |
|
4. 중첩된 모듈들 |
|
Terraform Module (루트 모듈)
└── main.tf
└── modules/
├── ec2_instance (서브 모듈1)
│ ├── main.tf
│ ├── variables.tf
│ └── outputs.tf
└── load_balancer (서브 모듈2)
├── main.tf
├── variables.tf
└── outputs.tf
- 여기서 루트 모듈은 프로젝트의 핵심적인 진입점으로 작용하며, 주로 서브모듈들을 호출하는
main.tf
파일을 포함한다. 이 구조를 통해 프로젝트의 전반적인 구조를 간결하고 체계적으로 관리할 수 있다.
모듈을 사용하여 테라폼 코드를 작성해 보자
5. 테라폼 모듈화 예시
5-1. 예시상황 설정
- AWS 인프라를 관리하기 위한 테라폼 구성을 만들고 있다고 상상해 보자. 이 인프라에는 VPC, 서브넷, 보안 그룹, EC2 인스턴스 등이 포함되어 있다. 처음에는 모든 구성을 하나의
.tf
파일에 넣을 수 있지만, 이 구성이 커지면서 관리하기 어려워지기 시작한다. 이때 모듈화가 도움이 된다.
5-2. VPC 모듈
VPC와 관련된 모든 리소스(예: VPC, 서브넷, 라우팅 테이블)를 포함하는 모듈을 만들 수 있다.
"vpc.tf"
: VPC와 서브넷을 생성하는 코드가 포함됨.
resource "aws_vpc" "example" {
cidr_block = var.vpc_cidr_block
// ... 기타 VPC 설정
}
resource "aws_subnet" "example" {
vpc_id = aws_vpc.example.id
cidr_block = var.subnet_cidr_block
// ... 기타 서브넷 설정
}
"variables.tf"
: VPC 크기, 서브넷 설정 등에 사용되는 변수들을 정의.
variable "vpc_cidr_block" {
description = "The CIDR block for the VPC."
type = string
}
variable "subnet_cidr_block" {
description = "The CIDR block for the subnet."
type = string
}
"outputs.tf"
: 생성된 VPC와 서브넷의 ID와 같은 출력값들을 정의.
output "vpc_id" {
value = aws_vpc.example.id
}
output "subnet_id" {
value = aws_subnet.example.id
}
5-3. 보안 그룹 모듈
EC2 인스턴스에 적용할 보안 그룹을 정의하는 모듈을 만들 수 있다. 이 모듈에는 다음과 같은 파일이 포함될 수 있다.
"security_group.tf"
: 보안 그룹과 관련 규칙을 정의.
resource "aws_security_group" "example" {
vpc_id = var.vpc_id
// ... 보안 그룹 규칙 정의
}
"variables.tf"
: 보안 그룹 규칙에 대한 변수들을 정의.
variable "vpc_id" {
description = "The VPC ID where the security group will be created."
type = string
}
"outputs.tf"
: 생성된 보안 그룹의 ID를 출력.
output "security_group_id" {
value = aws_security_group.example.id
}
5-4. EC2 인스턴스 모듈
EC2 인스턴스를 생성하기 위한 모듈. 이 모듈은 다음과 같이 구성될 수 있다.
"ec2.tf"
: EC2 인스턴스를 생성하는 코드.
resource "aws_instance" "example" {
ami = var.ami_id
instance_type = var.instance_type
security_groups = [var.security_group_id]
// ... 기타 EC2 인스턴스 설정
}
"variables.tf"
: 인스턴스 타입, AMI ID 등을 정의.
variable "ami_id" {
description = "The AMI ID to use for the instance."
type = string
}
variable "instance_type" {
description = "The type of instance to start."
type = string
}
variable "security_group_id" {
description = "The ID of the security group to associate with the EC2 instance."
type = string
}
"outputs.tf"
: 생성된 EC2 인스턴스의 ID와 public IP를 출력.
output "instance_id" {
value = aws_instance.example.id
}
output "instance_public_ip" {
value = aws_instance.example.public_ip
}
이제 작성한 모듈을 사용하기 위해 main.tf 파일을 만들고 코드를 작성해 보자
6. 작성한 테라폼 모듈 사용하기
6-1. 모듈을 사용하는 방법
- 메인 테라폼 구성에서 이제 이 모듈들을 활용할 수 있다. `main.tf` 파일에서 각 모듈을 호출하여 사용한다. 호출 시, 각 모듈의 `variables.tf`에 정의된 변수들에 값을 할당하게 된다.
- 모듈 내부의 리소스에서 생성된 정보를 필요로 할 때는 해당 모듈의 `outputs.tf`에 정의된 출력값을 `module.<모듈 이름>.<출력 변수 이름>` 형태로 참조하여 다른 모듈에서 활용할 수 있다.
# VPC 모듈 호출
module "vpc" {
source = "./modules/vpc"
vpc_cidr_block = "10.0.0.0/16"
subnet_cidr_block = "10.0.1.0/24"
}
# 보안 그룹 모듈 호출
module "security_group" {
source = "./modules/security_group"
vpc_id = module.vpc.vpc_id
}
# EC2 인스턴스 모듈 호출
module "ec2_instance" {
source = "./modules/ec2_instance"
ami_id = "ami-12345678" # 예시 AMI ID
instance_type = "t2.micro"
security_group_id = module.security_group.security_group_id
}
6-2. 코드 구성 설명
- 이 main.tf 파일은 다음과 같은 기능을 수행한다.
1. VPC 모듈 호출 |
|
2. 보안 그룹 모듈 호출 |
|
3. EC2 인스턴스 모듈 호출 |
|
- 각 모듈은 독립적으로 관리되므로, 코드의 재사용성이 높아지고 관리가 용이해진다. 이러한 모듈 방식은 테라폼 코드를 더욱 체계적으로 구성하는 데 도움이 된다.
모듈화까지 알아봤으니 다음 포스트에서는 내가 실전에서 작성한 테라폼 코드를 알아보자
이 포스트는 Team chillwave에서 사이드 프로젝트 중 적용했던 부분을 다시 공부하며 기록한 것입니다.
시간이 괜찮다면 팀원 '평양냉면7 '님의 블로그도 한번 봐주세요 :)
반응형
'AWS > 테라폼(Terraform)' 카테고리의 다른 글
실전! 테라폼 적용기3편 - Auto Scaling Group과 용량 공급자(Capacity provider) 작성 (1) | 2023.12.18 |
---|---|
실전! 테라폼 정복기 2편 - vpc, subnet 설정과 인프라 구축 (0) | 2023.12.16 |
테라폼(Terraform) 사용 가이드 7: AutoScailingGroup과 LoadBalancer을 생성하고 연결하기 (0) | 2023.12.07 |
테라폼(Terraform) 사용 가이드 6: 테라폼으로 IAM 정책 생성/관리하기 (1) | 2023.12.05 |
테라폼(Terraform) 사용 가이드 5: variable/output(입출력 변수) 사용하기 (1) | 2023.12.05 |