Terraform - AWS 도입기

728x90

Terraform이란?

인프라를 코드로 정의하고 자동으로 생성·변경·관리하기 위한 Infrastructure as Code(IaC) 도구

  • 무엇을 하는가? : 서버 , DB , 네트워크 , VPC , 로드밸런서 같은 인프라를 선언형 코드로 관리
  • 어떻게 동작하는가? : 현재상태와 원하는상태를 비교하여 차이만 사용한다.
  • 어디서 쓰나? : Provider를 이용해 각종 빅테크 서비스들을 쓴다.
  • 왜 쓰냐? : 재현성, 자동화 , 현업 ,변경 이력관리

도입하는 이유

최근 사용자 100만명이 넘는 서비스의 인프라 설계 및 구축작업을 하였다.

핫피크 트래픽량이 1500만건이넘어가는 (CF 트래픽 포함) 서비스였기 때문에 신경쓸 부분이 많았다.

AWS 콘솔을 이용해서 하나씩 설계한대로 작업을 하고 관리하며 운영을 하고 있는데,

인프라 확충 작업 중 실수로 관리자 운영 서버가 날라간 적이 있다.

 

이미지 덤프도 안떠놨고(너무 예전버전이라 쓸 수가 없었다), 삭제처리를 위한 방지 기능을 켜두었음에도 AWS 콘솔에서 명령어를 남발해

(정말 급하게 확충 중이였어서 확인할 시간이 없었다..)

지우지말아야할 서버가 날라가버린것이다.

 

다행히 금방 복구 작업을 했지만 (서버 개발 부터 인프라 세팅 까지 다 했기때문에.. 할 수 있었다)

이후에 이번에는 관리자 서버였으니 다행이였지, VPC 같은 밑바탕이 되는 서비스가 날라갔으면

정말 큰 이슈가 되서 문제가 커지고, 서비스 제공이 안되었을 거기때문에

이런문제를 방지하고, 문제가 생겨도 빠르게 복구할 수 있는 방안들을 여러개 도입하고,

 

그중 하나인 Terraform을 알게되어 도입 해보며 정리한 자료이다.

장점

일단, 인프라 구축에 대해 어느정도 감이 생겨있다면, 어떤식으로 구상해야하는지 아키텍처를 잡을 수 있게되는데

이걸 코드로 관리할 수 있기 때문에 혹시 모를 상황에 대비할 수도 있고, 늘리거나 줄이거나하는걸 콘솔에서 하나씩보면서 할 필요없이 조정해서 관리하면 되기때문에 매우 유리하다.

 

또한, AWS 뿐만 아니라 GCP , Azure같은 클라우드 , 쿠버네티스 ,도커, helm 같은 플랫폼/인프라 파트도 커버가되고, 필요하다면 다른 서비스들 - github , cloudflare , slack 같은 SASS들도 한번에 연동관리가 코드로

가능해지기 때문에 매우 편리하며, 문제가 있으면 즉각적으로 코드를 통해 재배포할 수 있다는 장점이 있다.

장점을 느낀 이유

실무를 하다보면 인프라쪽은 갑작스러운 문제가 발생하면 일단 최초로 조치가 들어가게 되는 경우가 많다

예를들어 트래픽이 몰려서 특정 기능이 문제가 생겼다?

 

거기서 코드보고 분석해서 개선하고 있다가는 서비스 터지고, 난리날것이다

그래서 일단은 버틸 수 있게 수직적확장, 수평적확장을 해주며 일단 버티게 하고 추후에 다양한 수집로그와

해당 상황에 발생한 슬로우쿼리, 감사로그들 , 통계치를 바탕으로 문제를 분석해서 처리하는 것이 맞다고 생각한다

 

그렇기 때문에 급작스러운 상황에서 콘솔에서 하나씩 누르고 있다보면, 사람인지라 실수 하는 경우도 있을 수 있고

구축하며 사용은 했지만 핵심적인 부분이 아니여서 약간 잊고있던 부분들이면, 그거 찾느라 시간이 걸린다.

 

그래서 이런거를 미리 코드화 시켜놓고 그부분만 고쳐서 바로 재배포 시킬 수 있다는 장점을 가지게 되는것이다

핵심 개념

  • 선언형 IaC
    • 이 상태로 만들어라 하고 선언하는 것이다.
    • 이미있으면 → 유지 , 없으면 → 생성 , 다르면 →수정 , 있는데 없어진거면 → 삭제
resource "aws_instance" "web" {
  ami           = "ami-0abc1234"
  instance_type = "t3.micro"
}
  • Provider
    • Terraform이 외부서비스와 통신하는 플러그인
    • 플러그인이란 기존프로그램에 새로운 기능을 더해주는 부가 장치
    • Provider는 Terraform의 중추인데 이걸로 진짜 구현이 된다고 보면 된다.
provider "aws" {
  region = "ap-northeast-2"
}
  • Resource
    • 실제로 생성되는 인프라 단위를 말한다.
    • C2, RDS, VPC, IAM, GCS, BigQuery, Cloud Run 등 전부 Resource
resource "aws_s3_bucket" "bucket" {
  bucket = "my-app-bucket"
}
  • State (terraform.tfstate)
    • 테라폼의 두뇌인데, 현재 상태를 기록해서 변경차이점 (diff)를 계산하는거다
  • Plan → Apply
    • init : 초기화 (provider 다운로드)
    • Plan : 변경 사항 미리보기
    • apply : 실제 반영
terraform init   # 초기화 (provider 다운로드)
terraform plan   # 변경 사항 미리보기
terraform apply  # 실제 반영

내가 쓴거 몇개더

  • 일단 변수관리가 용의한데 .env 파일처럼 외부 파일을 이용해 주입시킬 수 있는 “variables.tf” 가 있다.이거에 정식명칭은 tfvars라고 부른다
  • 이거 쓰면 장점이 내가 필요한 상황에 맞춰서 변경하고 사용하는 작업을 즉각적으로 할 수 있다
  • main.tfoutputs.tf
    • main : 이 인프라에서 무엇을 만들 것인가 를 선언하는 진입점(Entry Point)
    • 나는 모듈로 각각 단위별로 모두 분리한 다음에 각각 관리를 하고, 이걸 한번에 부르는 진입점을 만들어서쓰는게 유리하다고 생각해서 이렇게 만들어서 사용했는데 쉽게말해서 모듈은 레고고 main은 레고 조립설명서다.
    • outputs : 결과 설명서인데어디다가 만들어야 할지를 알기 때문에 이런 값들을 미리 정의해둔 결과서 라고 보면된다.
    • 예를들어 VPC 를만들고 안에 퍼블릭, 프라이빗 서브넷을 만들고, NAT를 연결한다음에 Tansit Gateway를 열어서 프라이빗 서브넷에 만드는 서버와 외부에 있는 서버간 통신이 가능하게 구축한다고 하면, 만들때마다 고유한 아이디 값과 같은 값들을 넘겨줘야 어디에 만들어졌고,

잡설

물론 이렇게 인프라 구축에 대한 부분을 지원하는 기능은 많다

그리고 IaC를 안쓰고 운영하고 있다면, 이걸 도입하기 위한 러닝커브도 분명히 존재한다.

 

다만, 대 AI 시대에 인프라 아키텍처를 잡아서 AI를 직접 코드로 소통할 수 있다는 점이

내생각에는 테라폼같은 도구들의 최고 강점이라고 생각한다.

이거는 내가 예시용으로 만든 AWS를 구축하기 위한 테라폼이다.

 

물론 다양한 기능을 더넣거나 필요에 따라 빼서 쓰면되는데, 인프라 엔지니어같은 사람들은 알아서 만들겠지만

나처럼 서버, 백엔드 개발을 하는데 따로 인프라하는 사람이 없어서 쓰는 사람들은 이걸 가져다가 AI에 분석시켜서

본인이 설계한 구조에 맞춰달라고하면 거의 동작가능한 수준까지 작동이 될거다.

 

https://github.com/SejinYang-SquadX/Terraform-structure-aws

728x90

'AWS' 카테고리의 다른 글

VPC - AmazonVPC에 대하여  (0) 2025.09.07
AWS - Ubuntu - 접속하기  (1) 2024.12.08
AWS - EC2 - Ubuntu 서버 설치하기 - Setting  (0) 2024.12.08