Physical Address
South Korea
Physical Address
South Korea


몇 년 전, 새로 들어간 프로젝트에서 급하게 테스트 환경을 구축해 달라는 요청을 받았습니다. 평소 하던 대로 AWS 콘솔에 로그인해서 신나게 마우스를 클릭했죠. VPC를 만들고, 서브넷을 쪼개고, EC2 인스턴스를 올린 뒤 보안 그룹까지 꼼꼼하게 설정했습니다. 제 눈에는 완벽해 보였습니다.
하지만 진짜 문제는 그다음 날 터졌습니다. “개발팀용, 검증팀용으로 똑같은 환경 2개만 더 만들어 주세요”라는 메일을 받은 것입니다. 다시 콘솔을 열고 어제 내가 뭘 클릭했는지 기억을 더듬어가며 작업했지만, 귀신같이 보안 그룹 설정 하나가 누락되어 통신 에러가 발생했습니다. 원인을 찾느라 결국 새벽까지 모니터를 붙잡고 있어야 했죠.
이처럼 사람이 손으로 직접 인프라를 만들다 보면 반드시 실수가 나옵니다. 규모가 커져서 관리해야 할 서버가 수십, 수백 대가 되면 클릭 몇 번으로 감당할 수 없는 수준이 되죠. 이런 끔찍한 삽질을 막기 위해 등장한 구원투수가 바로 IaC(Infrastructure as Code), 즉 ‘코드로 관리하는 인프라’입니다.
인프라를 자동화해 주는 도구는 생각보다 많습니다. AWS의 CloudFormation도 있고, 설정 관리에 강한 Ansible도 있죠. 하지만 현업에서 일하는 엔지니어들에게 “요즘 뭐 써요?”라고 물어보면 십중팔구 테라폼(Terraform)이라는 답이 돌아옵니다. 왜 이렇게 인기가 많을까요? 실제로 제가 굴러보며 느낀 장점은 크게 세 가지입니다.
AWS만 쓰다가 갑자기 회사의 방향이 바뀌어 Azure나 GCP, 심지어 오라클 클라우드(OCI)까지 섞어 써야 하는 상황이 올 수 있습니다. 이때 테라폼은 빛을 발합니다. 특정 클라우드 벤더에 종속되지 않기 때문에, 테라폼 문법 하나만 잘 익혀두면 어떤 클라우드 환경이든 부드럽게 넘나들며 인프라를 짤 수 있습니다.
Ansible 같은 도구는 “A를 하고, 그다음에 B를 한 뒤, C를 해라”라는 식으로 순서를 일일이 알려줘야 합니다. 반면 테라폼은 “내가 원하는 최종 상태는 EC2 인스턴스 3대야”라고 결과만 적어두면 끝입니다. 만약 기존에 1대가 켜져 있었다면, 테라폼이 알아서 계산해서 부족한 2대만 추가로 만들어 줍니다. 엔지니어가 머리 싸매고 순서를 계산할 필요가 없어서 실수가 확 줄어듭니다.
기존 서버에 들어가서 설정을 이리저리 수정하다 보면, 나중에 이 서버가 왜 작동하는지 아무도 모르는 ‘마법의 서버’가 되곤 합니다. 테라폼은 기존 것을 고치는 게 아니라, 새로운 설정을 가진 깨끗한 서버를 새로 띄우고 예전 서버를 지우는 방식(Immutable Infrastructure)을 지향합니다. 덕분에 인프라 꼬임 현상에서 해방될 수 있습니다.
테라폼을 내 손으로 직접 다루기 전에, 이 녀석이 어떤 구조로 돌아가는지 핵심 개념 5가지만 아주 쉽게 짚고 넘어가겠습니다.
실무에서 테라폼으로 인프라를 만들고 지울 때는 딱 4가지만 기억하면 됩니다. 이 루틴은 엔지니어의 하루 일과이기도 합니다.
말로만 들으면 감이 안 오니, AWS에 아주 기본적인 VPC 네트워크와 EC2 인스턴스 하나를 올리는 코드가 어떻게 생겼는지 가볍게 구경해 봅시다.
Terraform
# 1. 어떤 클라우드를 쓸지 통역사를 지정합니다.
provider "aws" {
region = "ap-northeast-2" # 서울 리전
}
# 2. 내 가상 네트워크망(VPC)을 만듭니다.
resource "aws_vpc" "main_vpc" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
tags = {
Name = "My-First-VPC"
}
}
# 3. 그 네트워크 안에 웹 서버 하나를 띄웁니다.
resource "aws_instance" "web_server" {
ami = "ami-0c55b159cbfafe1f0" # 우분투 이미지 ID (리전별 확인 필요)
instance_type = "t3.medium"
tags = {
Name = "Hello-Terraform-Server"
}
}
여기서 주의할 점이 하나 있습니다. 아무 인터넷 블로그에 있는 ami-xxxx 코드를 그대로 긁어서 복사하면 100% 에러가 납니다. 클라우드 벤더사나 리전마다, 그리고 시기마다 사용할 수 있는 이미지 ID와 인스턴스 타입이 조금씩 다르기 때문입니다. 코드를 실행하기 전에 내 환경에서 지원하는 스펙인지 확인하는 버릇을 들이는 것이 좋습니다.
처음 테라폼을 배우면 내 컴퓨터 바탕화면에 terraform.tfstate 파일이 생깁니다. 혼자 연습할 땐 상관없지만, 팀원들과 같이 일할 때 이 파일을 각자 로컬에 두고 쓰면 인프라가 완전히 꼬여버립니다. 동료가 서버를 지웠는데 내 장부에는 살아있는 상태가 되는 거죠. 반드시 AWS S3 같은 원격 백엔드에 저장하고, DynamoDB를 연동해 한 사람이 수정 중일 땐 다른 사람이 못 건드리게 락(Locking)을 걸어두세요.
코드 안에 IP 주소나 인스턴스 크기를 무턱대고 적어두지 마세요. 나중에 사양을 변경하거나 개발 환경에서 운영 환경으로 코드를 복사할 때 골치가 아파집니다. 변수 파일(variables.tf)을 따로 만들어서 값들을 빼놓는 습관을 들이면, 나중에 코드 재사용하기가 훨씬 편해집니다.
네트워크, 데이터베이스, 웹 서버 코드를 파일 하나에 전부 몰아넣으면 나중에 코드가 수천 줄로 늘어나 손대기 무서워집니다. 처음에는 작게 시작하더라도 네트워크 모듈, 서버 모듈처럼 기능을 쪼개서 관리하는 ‘모듈화’를 고민해 보세요. 그래야 인프라 규모가 커져도 길을 잃지 않습니다.
예전에는 서버실에서 땀 흘리며 무거운 장비를 랙에 꽂고 케이블을 연결해야만 ‘인프라를 한다’고 했습니다. 하지만 지금은 모니터 앞에 앉아 코드를 정교하게 짜고 아키텍처를 설계하는 능력이 엔지니어의 진짜 경쟁력이 되었습니다.
테라폼은 여러분의 퇴근 시간을 앞당겨줄 가장 강력한 무기입니다. 처음에는 콘솔 클릭이 더 빠르다고 느껴질 수 있습니다. 하지만 한 번 잘 짜여진 코드는 두고두고 여러분의 든든한 자산이 될 것입니다. 오늘 당장 프로젝트의 작은 리소스 하나부터 코드로 직접 만들어 보는 건 어떨까요?
[성능 Monitoring 체계 구축: OS와 DB 레벨에서 반드시 확인해야 할 핵심 지표]