본문 바로가기

DevOps/IaC

[테라폼] TerraForm 이란?

IaC란?

코드로 필요한 인프라를 만들고, 수정하고, 삭제하는 것 즉 인프라를 코드로 관리하는 것
필요한 인프라를 코드로 정의하고 관리한다면 수동으로 명령어를 실행하여 설정을 변경하던 환경보다 훨씬 더 정확하고 효율저그올 인프라를 관리할 수 있다.

테라폼(TerraForm) 이란?

가장 대표적인 코드형 인프라 도구 중 하나이다. 여러 클라우드 공급자에 적용할 수 있으며 클라우드 공급자가 제공하는 기능들을 빠르게 반영한다. 따라서 안정적인 인프라를 구축하고 관리할 수 있는 최적의 도구이다.

예전에는 시스템 관리자가 인프라를 수동으로 구축하고 관리했다. 하지만 모든 서버, 데이터 베이스, 로드 밸런서, 네트워크 등을 수작업으로 관리하기에는 서버 다운이나 휴먼 폴트, 긴 배포 시간 등의 단점이 많았다, 하지만 데브옵스(DevOps)로의 변화 덕에 더 효율적인 작업을 할 수 있게 되었다.

테라폼은 해시코프(HashiCorp)사에서 만든 오픈 소스 도구이다. 테라폼은 간단한 선언적 언어를 사용하여 인프라를 코드로 정의한다. 코드형 인프라(Infrastructure as a code 또는 IaC) 라고 한다. 그리고 다양한 퍼블릭 클라우드와 프라이빗 클라우그와 가상화 플랫폼에서 해당 인프라를 배포 및 관리한다. 예를 들어 웹 페이지를 수동으로 클릭하거나 수십 개의 명령을 실행하는 대신 다음과 같은 코드만으로 AWS에서 서버를 구성한다.

# AWS 서버 구성

provider "aws" {  
region = "us-east-2"  
}

resource "aws\_instance" "example"{  
ami = "ami-0c55jkjfdkmkfmsk"  
instance\_type = "t2.micro"  
}

# 배포 실행

$ terraform init  
$ terraform apply  

이런 간편한 덕분에 테라폼은 데브옵스에서 중요한 역할을 맡게 되었다. 인프라 관리의 지루하고 취약하며 수동적인 부분을 자동화된 테스트, 지속적 통합, 지속적 전달 같은 데브옵스 작업 표준과 도커(Docker), 셰프(Chef) 등의 도구를 통해 견고하고 자동화 된 환경으로 바꿀 수 있다.

 

 

(1) 데브옵스의 등장

얼마전까지만 해도 소프트웨어 회사를 창업하려면 수많은 하드웨어까지 직접 관리를 해야했다. 랙을 구성한 후 랙에 서버를 설치하고, 네트워크를 구성하고, 전원장비를 설치하는 등의 작업을 진행해야 했다. 그래서 역할별로 팀이 나누어져있었다, 이렇게 하드웨어를 관리하는 팀은 운영팀(Ops), 소프트웨어를 개발하는 팀은 개발팀(Dev)이었다.

 

일반적인 개발팀은 애플리케이션을 만들어서 운영팀으로 넘겨준다. 그리고 운영침은 애플리케이션을 어떻게 배포하고 운영할것인지 결정한다. 이 작업은 대부분 수동으로 이루어졌다. 서버를 랙에 설치하거나 네트워크 케이블을 설정하는 등 하드웨어를 물리적을 설치하는 일은 특히나 수작업으로 할 수 밖에 없었다. 이처럼 수동으로 하는 작업은 조직이 커지면서 서버가 늘어남에 따라 작업이 느려지고 운영팀의 실수로 모든 서버가 똑같이 설정되지 않고 일부 설정이 미묘하게 다른 '구성 드리프트(configuration drift)'가 발생할 수 있어 결과적으로 버그의 수가 증가한다.

 

그러나 오늘날은 데이터센터를 직접 운영하는 대신에 AWS, Azure, GCP 같은 클라우드 서비스를 사용하기 시작했다. 수많은 운영팀들은 하드웨어에 돈과 노력을 투자하는 대신에 도커(Docker), 셰프(Chef), 테라폼(TerraForm), 퍼펫(Puppet) 같은 도구를 사용하여 소프트웨어 작업에 더 많은 시간을 들이고 있다. 시스템 관리자가 서버를 설치하고 네트워크 케이블 설치를 하는 대신에 코드를 작성하는 것이다. 결과적으로 이제는 개발팀과 운영팀 모두 소프트웨어 작업에 대부분의 시간을 소비하며 두 팀의 구분이 모호해지고 있다. 데브옵스가 태동하기 시작한것이다. 데브옵스는 소프트웨어를 효율적으로 전달하는 프로세스이다. 이제는 프로젝트를 병합하느라 고생하는 대신, 지속적으로 코드를 통합하고 항상 배포가능한 상태로 유지한다. 한달에 한번 코드를 배포하는 대신 하루에 수십번도 배포할 수 있고, 심징어 코드 변경 내용을 커밋할 때마다 배포할 수 있다. 또한 탄력적이고 치유적인 시스템을 구축하고 모니터링 및 알람 기능을 사용하여 자동으로 해결할 수 없는 문제에 대비할 수 있다.

 

(2) 코드형 인프라란?

 

코드형 인프라란 코드를 작성 및 실행하여 인프라를 생성, 배포, 수정, 정리 하는것을 말한다. 이는 서버를 물리적으로 설치하는 등의 하드웨어 측면을 포함하여 운영의 모든 측면을 소프트웨어적으로 생각하는 중대한 사고 전환을 보여준다. 실제로 데브옵스의 핵심은 서버, 데이터베이스, 네트워크, 로그파일, 애플리케이션 구성, 문서, 자동화된 테스트, 배포 프로세스 등을 코드로 관리할 수 있다는 것이다.

코드형 인프라 도구에선 다섯 가지 범주가 있다.

 

(2)-1  애드혹 스크립트

자동화하는 가장 간단한 방법은 애드혹 스크립트(ad hoc script)를 사용하는 것이다 수행할 작업을 단계별로 나누고 배시, 루비, 파이썬 등 선호하는 언어를 사용하여 각 단계를 코드로 정의하고 작성된 스크릡트를 서버에서 수동으로 실행하는 것이다.

# apt-get 캐시를 업데이트
sudo apt-get update

# PHP와 아파치 설치
sudo apt-get install -y php apache2

# 깃 리포지터리에서 코드를 다운로드
sudo git clone https://github.com/brikis98/php=app.git /var/www/html/app

# 아파치 웹 서버 시작
sudo service apache2 start

하지만 이는 또한 코드를 직접 작성하여 수동으로 직업해야 한다는 의미이다. 범용 프로그래민 언어를 사용하면 사용자가 매번 수동으로 맙춤 코드를 작성해야한다. 그러나 코드형 인프라를 위해 특수 제작된 조구를 사용하면 이런 복잡한 작업을 간결한 API로 수행할 수 있다. 또한 코드형 인프라용으로 설계된 도구를 사용하면 대체로 코드에 정해진 구조가 적용된다. 반면에 범용 프로그래밍 언어를 사용할 때는 각 개발자가 자신만릐 고유한 스타일로 작업한다. 아파치 웹서버를 설치하는 8줄짜리 코드에서는 이것이 별 문제가 되지 않지만 애드훅 스크립트로 수 십개의 서버, 데이터베이스 로드 밸런서, 네트워크 구성 등을 관리하는 경우라면 이야기가 달라진다. 애드혹 스크립트는 소규모 일회성 작업에는 적합하지만 모든 인프라를 코드로 관리하려면 작업 목적에 맞게 설계된  코드형 인프라 도구를 사용해야한다.

 

 

(2)-2 구성 관리 도구

셰프, 퍼핏, 앤서블, 솔트스택 등은 모두 구성 관리 도구로써 대상 서버에 소프트웨어를 설치하고 관리하도록 설계되어 있다. 예컨대 web-server.yml 이라는 앤서블 파일은 앞에서 보았건 애드훅 스크립트와 마찬가지로 아파치 웹서버를 구성한다.

- name: Update the apt-get cache
  apt:
   update_cache: yes
   
- name: Install PHP
  apt:
   name: php
   
- name: Install Apache
  apt:
   name: apache2
   
- name: Copy the code from the repository
  git: repo=https://github.com/brikis98/php=app.git /var/www/html/app
  
- name: Start Apache
  service: name=apache2 state=started enabled=yes

이 코드는 배시 스크립트와 비슷해 보인다 그러나 앤서블과 같은 도구를 사용하면 애드혹 스크립트를 사용할 때와 다른 여러 가지 장점이 있다.

 

코딩규칙

앤서블은 문서화, 파일 레이아웃, 명확하게 이름 붙여진 매개변수, 시크릿 관리 등을 포함하는 일관되고 예측 간으한 구조를 제공한다. 개발자마다 다양한 방식으로 애드혹 스크립트를 작성할 수 있지만 이러한 구성 관리 도구에는 코딩 규칙(coding convention)이 포함되어 있어 코드를 쉽게 탐색할 수 있게 해준다.

 

멱등성

한 번 작동하는 애드혹 스크립트를 작성하는것은 그리 어렵지 않다. 여러번 반복해서 실행하더라도 올바르게 작동하는 스크립트를 작성하는것이 어렵다. 스크립트에서 폴더를 생성할 때마다 전에 만든 폴더가 있는지 체크해야한다. 그리고 구성 파일에 새로운 내용을 추가할 때마다 해당 부분이 기존하는지 확인해야한다. 마찬가지로 애플리케이션을 실행할 때마다 이미 실행되고 있지 않은지 체크해야한다.

 

실행 횟수에 관계없이 올바르게 동작하는 코드를 '멱등성을 가진 코드'라고 한다. 앞에서 본 배시 셸 스크립트를 멱등성을 가진 코드로 작성하려면 많은 조건문이 포함된 복잡한 구조의 코드를 작성해야한다.  반면에 앤서블이 제공하는 대부분의 기능은 기본적으로 멱등성을 가진다. 예를 들어 앤서블 롤은 설정파일을 사용하여 아파치가 설치되지 않았을 경우에만 설치하고 아파치 웹서버가 동작하지 않는 경우에만 동작하게 한다.

 

분산형 구조

# host 파일
[webservers]
11.11.11.11
11.11.11.12
11.11.11.13
11.11.11.14
11.11.11.15

# 앤서블 플레이북 정의
- host: webservers
  roles:
  - webserver

# 플레이북 실행
$ ansible-playbook playbook.yaml

애드혹 스크립트는 단일 로컬 머신에서만 실행되도록 설계되었다. 반면 앤서블과 같은 구성 관리 도구는 원격의 수많은 서버를 관리하기 위해 특별히 설계되었다. 예를 들어 5대의 서버에 web-server.yaml 롤을 적용하기 위해서는 먼저 5대 서버의 IP 주서가 포함된 'host' 라는 이름의 파일을 생성해야한다. 앤서블 플레이북을 정의하고 플레이북을 실행한다. 앤서블에 5개의 서버를 병렬로 구성하도록 지시한다. 아니면 플레이북에 serial 이라는 매개 변수를 설정하여 롤링배포를 수행함으로서 서버를 일괄 업데이트 할 수도 있다. 

 

 

 

(2)-3 서버 템플릿 도구

구성 관리 도구의 대안으로 최근에 도커(Docker), 패커(Packer), 베이그런트(Vagrant) 와 같은 서버 템플릿 도구도 인기가 높아지고 있다. 여러 서버를 시작하고 각각의 동일한 코드를 실행하여 서버를 구성하는 기존 방식과는 다르게, 서버 템플릿 도구는 운영 체제, 소프트웨어, 파일 및 기타 필요한 내용을 포함하고 있는 스냅샷으로 이미지를 생성한다. 

 

 

(2)-4 오케스트레이션 도구

서버 템플릿 도구는 VM이나 컨테이너를 생성하기에 더없이 좋은 도구이다. 하지만 이를 어떻게 관리하는가도 중요한 문제이다. 실제 사용 환경에서는  다음과 같은 것들이 필요하다.

 

- VM과 컨테이너를 하드웨어에 효율적으로 배포하기

- 롤링 배포, 블루-그린(blue-green)배포, 카나리배포 전략을 사용하여 기존의 VM이나 컨테이너를 효율적으로 업데이트 하거나 롤백하기

- VM과 컨테이너의 상태를 모니터링하고 비정상적인 부분을 자동으로 대체하기(자동복구)

- 발생하는 트래픽에 따라 VM과 컨테이너의 수를 늘리거나 줄이기(자동 확장)

- VM과 컨테이너릐 트래픽을 분산하기(로드 밸런싱)

- 서로 다른 네트워크에 있더라도 VM과 컨테이너가 서로 식별하고 통신할 수 있게 하기(서비스 검색)

 

이 작업들을 처리하기 위해 쿠버네티스, 마라톤.메소스, 아마존 엘라스틱 컨테이너 서비스, 도커 스웜, 그리고 노마드 같은 오케스트레이션 도구가 필요하다. 예를들어 쿠버네티스를 사용하면 도커 컨테이너를 어떻게 관리할지를 코드로 정의한다.

 

 

(2)-5 프로비전 도구

구성 관리, 서버 템플릿 및 오케스트레이션 도구가 각 서버에서 실행되는 코드를 정의한다면 테라폼, 클라우드 포메이션, 오픈스택 히트와 같은 프로비전 도구는 서버 자체를 생성한다. 사실상 프로비전 도구를 사용하면 서버를 생성하는것이 아니라 데이터베이스, 캐시, 로드밸런서, 큐, 모니터링, 서브넷 구성, 방화벽 설정, 라우팅 규칙 설정, SSL 인증서 등 인프라에 관한 거의 모든 부분을 프로비저닝 할 수 있다.

 

 

 

 

 

 

 

https://dodo-devops.tistory.com/56

 

[테라폼] TerraForm 이란? 2

https://dodo-devops.tistory.com/55 [테라폼] TerraForm 이란? IaC란? 코드로 필요한 인프라를 만들고, 수정하고, 삭제하는 것 즉 인프라를 코드로 관리하는 것 필요한 인프라를 코드로 정의하고 관리한다면

dodo-devops.tistory.com

 

 

 

참고 : https://www.terraform.io/docs/index.html
출처 : 테라폼 업앤러닝 / 예브게니 브릭만 지음 / 김문주 옮김 (루비페이퍼)

'DevOps > IaC' 카테고리의 다른 글

[테라폼] TerraForm 이란? 2  (0) 2022.11.13
IaC 개요  (0) 2022.06.16