티스토리 뷰

IaC 테라폼 설치에서 운영까지

 

AWS, Google Cloud Platform, Azure 등 퍼블릭 클라우드가 서비스로 흘러들면서 효율적인 인프라 관리를 위한 방법이 화두가 되었습니다. 서버 운영, 관리에 조예가 깊은 개발자라면 잘 알겠지만 애드 훅 스크립트를 통한 서버 관리는 대안이 없던 그 시절 매우 효율적인 것처럼 보였습니다. 요즘은 애드 훅 스크립트를 넘어 다양한 도구들이 쏟아지고 있는데 그 중심에 Terraform(테라폼)이 있다고 해도 과언이 아닐 겁니다.

테라폼은 대표적인 코드형 인프라(Infrastructure as Code: 이하 IaC)로 서버 프로비전 도구입니다. 이 책에서는 서버 관리를 위한 다양한 도구를 설명하고 테라폼과 비교합니다. 그리고 테라폼의 기본적인 철학과 사용법, 나아가 고도화 전략을 다룹니다. 책의 지면은 200쪽까지로 다양한 예제를 다루지는 않지만 module, resource, data, variable 등 테라폼에서 사용 가능한 기법을 충실히 잘 다루고 있으며, HCL(hashicorp configuration language)을 통한 예제를 고도화해 나갑니다. 

빠르게 책의 앞부분부터 살펴보면, IaC 도구를 네 가지 범주로 나누고 설명해 나갑니다.

  • 애드 훅 스크립트
    • 부연설명이 필요 없습니다. Bash 등의 스크립트 언어로 서버의 환경을 세팅하는 걸 의미합니다.
  • 구성 관리 도구
    • 셰프(Chef), 퍼핏(Puppet), 앤서블(Ansible), 솔트스택(Saltstack)이 있습니다.
    • 코딩 규칙이 필요하고 멱등성(같은 코드라면 수행 횟수에 상관없이 결괏값은 항상 같다)이 보장됩니다.
    • 분산 환경을 관리할 수 있도록 설계되어 있습니다. 
  • 서버 템플릿 도구
    • 도커(Docker), 패커(Packer), 베이그란트(Vagrant)가 있습니다.
    • 소프트웨어 실행에 필요한 설정과 의존성 있는 프로그램을 포함해서 특정 시점에 운영 체제와 함께 스냅샷하여 템플릿 이미지화하는 것을 나타냅니다. 도커를 생각하면 쉽게 이해됩니다.
  • 서버 프로비전 도구
    • 테라폼(Terraform), 클라우드포메이션(CloudFormation), 오픈스택 히트(Openstack Heat)가 있습니다.
    • 구성 관리 도구와는 경계가 살짝 모호해지고 있지만 주요 특징으로는 절차적 언어인가 선언형 언어인가를 들 수 있습니다. 선언형 언어로 다뤄지는 테라폼의 경우 인프라에 변경사항이 생겼을 때 변경된 부분만 반영된다는 주요 특징이 있습니다. 예를 들어 인스턴스 5대로 운영 중이던 환경에 10대를 추가하려면 count = 5 부분을 count = 15로 변경하면 테라폼 내부에서 내용을 해석하고 10대만 증설합니다. 

이 외에도 테라폼의 특징은 여러 가지가 있는데요, 이 책의 예제를 통해 살펴보게 됩니다. 우선 테라폼의 특징을 살펴보기 전에 IaC가 갖는 다음과 같은 장점을 이해하면 좋습니다. ( 개별 세부 내용은 책을 통해 확인해보세요 )

  • 셀프서비스
  • 속도와 안정성
  • 문서화
  • 버전 관리
  • 확인 및 검사
  • 재사용성
  • 운영 관리의 편안함과 행복 

테라폼은 무려 700개가 넘는 프로바이더를 제공합니다.

테라폼에서 제공하는 대표적인 프로바이더(provider)

 

책에서는 이 중에 AWS를 선택해서 예제로 다룹니다. 인프라를 성숙시키는 예제를 다루고 있다고 보시면 되는데 대략적인 흐름은 다음과 같습니다. 기억에 의존해서 후기를 작성하고 있기 때문에 책의 내용과 약간 다를 수 있는 점은 감안해주세요. 아래는 모두 테라폼 CLI를 통해 진행됩니다.

  • 테라폼에 AWS 연동
  • 단일 서버 배포 (인스턴스 생성)
  • 웹서버 연동
  • 클러스터 구성
  • 로드 밸런서 배포 및 시큐리티 그룹 설정

위 과정을 통해 테라폼의 기본기를 익힐 수 있습니다. 이후부터는 현업에서 고려해야 되는 조금은 더 다양한 상황을 설명합니다. IaC를 다루는 사람이 한 명일 때는 문제가 되지 않지만 일반적인 프로그래밍도 팀 단위로 개발을 할 때 코드 충돌을 피할 수 없는데요, IaC도 마찬가지입니다. 테라폼은 HCL로 관리되기 때문에 VCS(version control system)에 등록할 수 있습니다. 이때 인프라 관리자 A가 배포한 인프라를 VCS에 올리지 않았고, 마침 이때 B가 다른 변경사항을 배포하게 된다면 A가 먼저 배포했던 환경은 롤백되고 말 겁니다. 당연히 VCS를 통해 제대로 관리되고 있었다면 코드 리뷰를 통해서 배포됐겠지만요 (인프라를 코드 리뷰한다는 말이 아직은 어색하지만 책의 마지막 장을 덮고 나면 충분히 이해가 됩니다). 아무튼, 이런 문제를 피하기 위해서 테라폼의 상태 파일(.tfstate)을 리모트를 통해 어떻게 관리하면 좋은지를 설명합니다. 리모트 관리를 위해 S3(클라우드 스토리지)가 필요하고, 락(Lock) 개념을 넣기 위해 dynamoDB까지 사용합니다. 이 부분은 투머치 같기도 하지만 테라폼이 이렇게까지 지원한다" 정도로 생각하면 좋습니다.

예제 수준에서 머무는 책이 아니라 실제 현업에서 고려해야 하는 부분도 다루고 있습니다. 바로 환경에 대한 이야기인데요, 서비스 인프라를 운영해본 사람이라면 당연히 development, staging, production 환경에 대한 이해가 있을 겁니다. 각 환경에 따라 서버의 스펙도 다르게 운영을 하죠. 예를 들어 production 환경은 쏟아지는 트래픽을 받치기 위해 넉넉한 리소스의 인스턴스를 사용해야 합니다. 한편 개발 환경은 그 정도까지는 필요 없죠. 물론 상황에 따라서 개발 환경의 리소스를 잠시 넉넉하게 끌어올리기도 합니다. 아무튼, 우리는 한 개의 코드로 여러 환경이 관리되기를 바랍니다. DRY(don't repeat yourself), 중복 배제는 소프트웨어 개발론인데 테라폼도 코드기 때문에 이 원칙이 적용됩니다. 이를 위해 module을 사용하는 방법을 다룹니다.

여기까지만 해도 웬만한 인프라를 HCL로 작성하는데 큰 어려움은 없을 겁니다. 하지만 2% 부족한 부분이 있죠. 프로그래밍 언어라면 당연히 반복문, 조건문이 필요할 겁니다. 테라폼은 이 두 가지를 제공합니다. IAM 사용자 N개 생성을 위해 리소스 복붙이 아니라 테라폼 리소스에서 제공하는 메타 변수인 count를 활용하는 방법, count를 조건절로 사용하는 예제를 다룹니다. 그리고 모듈을 VCS를 통해 관리해서 각 환경 별로 다른 모듈을 제공하는 시나리오도 보여줍니다. 생각해보면 일반적인 소프트웨어도 개발환경과 운영환경을 다른 브랜치로 동작시키는 게 당연한 거라 IaC 도 그 철학을 따른다고 보면 됩니다.

끝으로 책이 두껍지 않기 때문에 부담이 없습니다. 200쪽 밖에 안되거든요. 배경지식만 있다면 두 시간이면 충분히 정독하실 수 있을겁니다. 실습까지 한다고 가정하면 시간이 조금 더 들겠지만, 테라폼의 개념 익히는 용도로 쓰기에 이 책은 아주 훌륭합니다. IaC, 나아가 테라폼에 관심 있으신 분께 일독을 권합니다.

 


 

# 마무리

책을 읽기 전에 공식문서와 실제 사용을 통해 테라폼의 기본적인 내용은 인지하고 있었습니다. 굳이 이 책을 선택한 이유는 내가 이해하고 사용하는 방식이 올바른지에 대한 검토가 필요해서였어요. 개발도 혼자서만 하면 늘지 않고 남들과 비교하며 다듬어야 사람도, 서비스도 성장할 수 있잖아요? 그래서 코드 리뷰, 페어 프로그래밍 같은 것들이 튀어나왔고요. 이처럼 테라폼을 다루고 있기는 한데 이게 "Hello world" 수준인지, HCL로 작성해 놓은 게 스파게티 상태인지 개인적인 리뷰가 필요했습니다. 그래서 책을 통해 검증해보려고 했지요. 책을 덮고 나서 결과를 생각해보니 "스파게티"였습니다. 사실 옳고 그른 건 없습니다. 다만,

  • 어떻게 작성하고 운영하는 게 편의성(재활용)이 좋은지.
  • 어떻게 하면 IaC 철학에 한 발짝 떨어져 있는 팀원이 배포에서 실수하지 않을지
  • 패스워드 등이 VCS, CI/CD 도구에 무방비로 노출되어 있지는 않은지

이 정도 원칙을 두고 작성하면 어쨌든 스파게티는 풀어낼 수 있을 것 같습니다. 책에 대한 리뷰는 여기서 마치고 시간이 허락한다면 다른 글을 통해 테라폼, 그 자체 사용법에 대해서 심도 있게 다뤄볼 수 있는 기회가 있기를 바랍니다. :-) 

댓글
  • 프로필사진 채문창 좋은 글 감사합니다. 어셈블리부터 시작해서 C, 커널, 터널 모듈, libc, CLI, GNU 등등도 하나하나 깊은 주제인데, 다시 거기에 응용까지.
    이제는 이런 유기적인 응용의 deployment, orchestration 까지.
    모두가 연결 연결 되어 거대한 무언가를 이루어가고 있는 것 같습니다.
    단순 응용, 서비스 뿐만 아니라 각각 깊숙이 하나 하나의 프레임워크, 도구, 라이브러리 등을 제작하는 것과
    마찬가지로 이런 도구를 가능한한 많이 알고 적재 적소에 잘 활용하는 것도
    어찌보면 더 중요하다는 생각이 드네요.
    이런 모든 것을 다 마스터 할 수 는 없지만 잘 활용하고 이용하여
    최소의 시간과 노력으로 최대의 효과를 낸다면 그것이 곧 개인, 회사의 경쟁력이라 생각합니다.
    종종 좋은 지식을 널리 공유해 주셔요.
    2021.02.14 22:56
  • 프로필사진 BlogIcon Jaeyeon Baek 이제는 개발되어 있는 도구를 잘 사용하는 것도 능력인 세상이네요. 감사합니다. :) 2021.02.16 19:56 신고
댓글쓰기 폼