테라폼(Terraform)이란?
인프라를 코드로 관리하는 도구이다. 클라우드 인프라를 코드로 정의하고 자동으로 생성/변경/삭제할 수 있게 해준다.
왜필요할까?
기존에는 인프라를 직접 클릭하거나 명령어로 하나하나 설정했다. 이는 반복적이고 실수가 발생하기 쉽다. 테라폼은 이를 코드로 자동화 해준다. 코드로 관리하기 때문에 버전관리(git), 리뷰, 재사용, 일관성 유지가 가능하다.
내가 근무했던 직장에서는 MSA의 구조가 아니기 때문에 한개의 프로젝트에서 많아봐야 5개의 서버 구성이 필요했다. 때문에 이렇게 적은 수의 경우는 오버헤드만 늘어날 뿐 큰 이득을 보지 못할 수 있다. 하지만 MSA처럼 다수의 서버로 구성해야하는 경우 테라폼을 사용하면 서버를 붕어빵 찍어내듯 만들 수 있고 관리가 용이하니 많은 기업에서 사용할 것 같다.
주요 개념
| 개념 | 설명 |
|---|---|
| Provider | AWS, GCP, Azure, Kubernetes 등 인프라를 제공하는 플랫폼과 연결해주는 플러그인 |
| Resource | 인프라의 구성 요소 (예: EC2 인스턴스, S3 버킷 등) |
| Module | 반복적으로 사용할 수 있는 재사용 가능한 코드 단위 |
| State | 현재 인프라의 상태를 기록한 파일. Terraform은 이 파일을 기준으로 변경 사항을 추적한다. |
| Plan | 어떤 리소스가 변경되는지 미리 보여주는 단계. |
| Apply | 실제로 인프라에 변경을 적용하는 단계. |
사용 흐름
- 코드 작성 (.tf 파일)
- terraform init – 필요한 플러그인 다운로드 (Provider 설치)
- terraform plan – 어떤 리소스가 어떻게 변경되는지 미리 확인
- terraform apply – 실제 인프라 적용
- terraform destroy – 인프라 제거 (선택적)
예시
테라폼은 AWS와 같은 클라우드 환경이 아니더라도 docker와 k8s에 적용할 수 있다. AWS는 비용이 청구될 수 있으니 k8s를 통해 실행해보자.
사전 환경
HashiCorp GPG 키 및 저장소 추가
Terraform은 Ubuntu 공식 저장소에 포함되어 있지 않기 때문에 Terraform 제작사(HashiCorp)의 자체 저장소를 APT에 등록해야 한다.
그리고 이 저장소가 진짜 HashiCorp에서 온 것인지 검증하기 위해 GPG 키를 등록하는 것이다.
sudo apt-get update && sudo apt-get install -y gnupg software-properties-common curl
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \
https://apt.releases.hashicorp.com $(lsb_release -cs) main" \
| sudo tee /etc/apt/sources.list.d/hashicorp.list
Terraform 설치
sudo apt update
sudo apt install terraform
설치 확인
terraform -v
파일 생성
terraform {
required_providers {
kubernetes = {
source = "hashicorp/kubernetes"
version = "~> 2.27.0"
}
}
}
provider "kubernetes" {
# minikube start 를 하면 생성됨.
config_path = "~/.kube/config"
}
# 1. Namespace 생성
resource "kubernetes_namespace" "demo" {
metadata {
name = "terraform-demo"
}
}
# 2. Nginx Pod 생성
resource "kubernetes_pod" "nginx" {
metadata {
name = "nginx"
namespace = kubernetes_namespace.demo.metadata[0].name
labels = {
app = "nginx"
}
}
spec {
container {
name = "nginx"
image = "nginx:latest"
port {
container_port = 80
}
}
}
}
# 3. ClusterIP Service 생성
resource "kubernetes_service" "nginx" {
metadata {
name = "nginx-service"
namespace = kubernetes_namespace.demo.metadata[0].name
}
spec {
selector = {
app = "nginx"
}
port {
port = 80
target_port = 80
}
type = "NodePort"
}
}
위는 간단하게 nginx를 k8s를 통해 실행시키는 코드이다.
실행
terraform init
terraform init
해당 명령어 실행시 현재 디렉토리에 있는 모든 .tf 파일을 실행시킨다. 이때 .terraform/ 디렉토리가 생성되며, 파일에 설정한 플러그인 또한 설치된다.
terraform plan
terraform plan
해당 명령어는 실제 적용 전에 무엇이 변경될지 미리 보여준다.
어떤 리소스가 생성/변경/삭제될지 출력해주며, 실제로 아무 것도 적용되진 않는다.
terraform apply
terraform apply
실제로 .tf 파일의 정의대로 인프라를 구성한다. "Do you want to perform these actions?"라는 메시지가 나왔을때 yes라고 입력하면 실행된다. 실행 후에는 terraform.tfstat파일이 생성되는데, 이는 현재 인프라 상태를 추적한다. 임의 수정은 하지 않는것을 권장.

terraform destroy
terraform destroy
.tf 파일로 만든 인프라를 모두 삭제한다. .tfstat파일 기준으로 만든 리소스를 삭제한다. 도커라면 이미지까지 삭제해준다. 다만 사용하고 있는 이미지라면 삭제하지 못한다.
'Web' 카테고리의 다른 글
| Rag를 사용해서 자신의 전문 비서를 만들어 보자 - Lang Chain (2) | 2025.07.08 |
|---|---|
| Rag를 사용해서 자신의 전문 비서를 만들어 보자 (5) | 2025.07.08 |
| ElasticSearch 인덱스 갱신을 위한 Debezium 사용해보기 (1) | 2025.06.22 |
| ElasticSearch를 이용한 검색 기능 만들어보기 - 1 (1) | 2025.06.20 |
| ElasticSearch를 이용한 검색 기능 만들어보기 - 0 (0) | 2025.06.18 |