01. 왜 테라폼인가
이 문서는 책 "테라폼 설치에서 운영까지"을 읽고 작성되었습니다. 최대한 요약해서 책 내용을 최소로 하는데 목표를 두고 있어서, 더 친절하고 정확한 내용을 원하신다면 책을 구매하시는 것을 추천드립니다. => 책 링크
Devops란 무엇인가
Devops
의 목적은 소프트웨어를 전달하기 위한 절차와 방법을 훨씬 더 효율적으로 만드는 것이다. 잘 적용된 Devops
는 서비스 개발/운영/배포에 걸리는 소요 시간과 비용을 매우 크게 절감할 수 있다. Devops
의 핵심 가치는 크게 4가지가 있다.
- 문화
- 자동화
- 측정
- 공유
이 책에서는 자동화
에 대한 기술에 초점을 맞춘다.
IaC란 무엇인가
IaC(Infrastructure as Code)
란 코드 형태로 인프라를 작성, 정의, 배포, 업데이트하는 것을 의미한다. 인프라를 관리하는 모든 것을 코드 형태로 관리하는 것이다. IaC
의 종류는 크게 다음의 4가지가 있다.
- 애드 훅 스크립트
- 구성 관리 도구
- 서버 템플릿 도구
- 서버 프로비전 도구
애드 훅 스크립트는 Python
, Ruby
, Bash
등의 스크립트 언어로, 인프라를 관리하는 것이다. 모든 IaC
의 기본이라고 보면 된다. 매우 큰 장점은 도입하기가 쉽다는 것이다. 반면에 개발자/운영자 역량에 따라 코드 품질, 구조가 매우 상이하다는 단점이 있다.
구성 관리 도구에는 Ansible
, Puppet
, Chef
등의 기술들이 있다. 서버에 소프트웨어를 설치/관리하는 목적으로 사용한다. 최근에는 마스터만 있어도 운영 가능한 Ansible
이 가장 핫하다. 이들이 애드 훅 스크립트보다 좋은 점은 다음과 같다.
- 명확하고 동일한 코딩 규칙
- 멱등성
- 분산형 구조
간단하게 말하면 애드 훅 스크립트는 소규모, 단발성에 좋고 구성 관리 도구는 대규모 분산 환경에 알맞은 기술이라고 보면 된다.
서버 템플릿 도구에는 Docker
, Packer
, Vargrant
등의 기술이 있다. 쉽게 설명하면, 설치 구성품이 저장된 서버의 스냅샷을 이미지로 만들어서 서버 생성 시에 이 이미지를 이용하는 것이다. 서버의 이미지는 크게 가상 머신과 컨테이너로 구분할 수 있다. 서버 템플릿 도구는 Immutable Infrastrucutre
를 만드는데 필수 불가결한 기술이며, 함수형 프로그래밍처럼 가변적인 변수를 제거하여 항상 값을 불변으로 유지하는 것이 큰 특징이다.
서버 템플릿 도구만으로는 구성 관리 도구를 모두 대체할 수 없다. 서버 프로비전 도구와 함께여야 비로소 대체가 가능하다. 서버 프로비전 도구는 서버 자체를 구성하기 위한 도구로써 Terraform
, CloudFormation
등의 기술이 있다. 인스턴스는 물론, 데이터베이스, 네트워크, 서브넷 등 여러 인프라 요소들을 구성할 수 있다.
이것은 지극히 나의 생각인데 자신의 회사가 AWS
종속적인 회사라면, AWS
에서 제공하는 서버 템플릿 도구인 Image Builder
, 서버 프로비전 도구인 CloudFormation
을 통해서 Immutable Infrastrucutre
를 구성하는 것이 좋다. 반면 여러 인프라 기술이 혼합된 경우, 하이브리드 형태라면 서버 템플릿 도구는 Packer
, 서버 프로비전 도구는 Terraform
조합으로 인프라스트럭처를 구성하는 것이 좋다.
이젠 IaC
의 장점을 알아보자. 책에 나온 장점은 다음과 같다.
- 셀프 서비스
- 속도와 안정성
- 문서화
- 버전 관리
- 확인 및 검사
- 재사용성
IaC
로 배포 작업을 자동화하게 되면 개발자가 원하는 시점에 배포할 수 있으며, 컴퓨팅 리소스가 배포하기 때문에 수작업보다 빠르고 안전하게 배포가 가능하다. 또한 코드이기 떄문에 그 자체로 문서화가 된다고 볼 수 있으며, 변경 사항과 커밋 이력이 남기 때문에 버전 관리도 할 수 있다. 코드 리뷰를 통해서 변경되는 인프라스트럭처를 확인할 수 있고 모듈 형태로 재사용할 수가 있다. 개인적으로 IaC
는 그냥 코드가 갖는 장점을 모두 가져간다라고 보면 될 것 같다.
Terraform의 장점
다른 IaC
도구 특히, Ansible
과 같은 설정 관리 도구에 비해서 Terraform
이 갖는 장점은 다음과 같다.
- 선언형 언어이다.
- 마스터/에이전트가 아니다.
요즘은 정말 많은 곳에서 MSA
를 도입하고 있다. MSA
에 적절한 인프라스트럭처는 바로 Immutable Infrastructure
이다. 이에 적절한 언어는 바로 선언형 언어이다. Ansible
과 같은 구성 관리 도구는 보통 절차형 언어라고 보면 된다. 처음 인프라스트럭처를 구성할 때는 구성 관리 도구와 서버 프로비전 도구는 동일한 결과를 나타낸다. 하지만 그 다음부터가 복잡하다. 이 예를 한 번 살펴보자. 만약 인프라스트럭처의 10대의 서버가 필요하다고 해보자.
Ansible
의 경우는 다음 코드로 그 구성을 할 수 있다.
- ec2:
count: 10
image: ami-40d28157
instance_type: t2.micro
Terraform
은 다음과 같이 구성할 수 있다.
resource "aws_instance" "example" {
count = 10
ami = "ami-40d28157"
instance_type = "t2.micro"
}
근데 5대를 추가해야 한다고 해보자 Ansible
은 다음과 같이 코드를 업데이트 해야 한다.
- ec2:
count: 5 # 이미 10대가 있으니까 나머지 5대
image: ami-40d28157
instance_type: t2.micro
Terraform
은 다음과 같이 코드를 업데이트한다.
resource "aws_instance" "example" {
count = 15
ami = "ami-40d28157"
instance_type = "t2.micro"
}
여기서 중요한 점은 Terraform
은 구성될 인프라스트럭처의 "최종 결과"를 선언한다는 것이다. Ansible
의 경우에는 변경 이력을 모두 알고 있어야 원하는 인프라스트럭처 구성을 할 수 있다. 만약 자신은 10대라고 생각하고 5대를 추가했는데 이미 누군가 2대를 추가하면 어떨 것 같은가? 이러한 변경 이력을 모르면 결국 리소스 낭비가 이루어진다는 것이다. 이런 점에서 Terraform
은 매우 큰 장점을 가지고 있다.
또한 마스터/에이전트 구조가 아니다. 따라서 서버를 나눌 필요도 없으며 모든 서버에 설치할 필요도 없다. 일반적으로는 (Terraform
을 설치해서 인프라스트럭처를 관리하는 용도의 서버를 1대 두는 듯 하다.) 구성 관리 도구는 Ansible
을 제외한 나머지 기술들은 모두 마스터 서버와 각 서버들에 에이전트를 설치해야 한다. 이는 운영하는데 복잡도를 높이는 한 요인이 된다. Terraform
은 운영 면에서도 구성 관리 도구에 비해 쉽다는 장점을 갖게 된다.
뭐 매우 큰 커뮤니티라는 장점이 있긴 한데 IaC
기술 중에서는 비교적 가장 최신의 기술이기 때문에(아직 1.x도 안됐다..) 덜 성숙했다는 단점이 더 커서 이는 생략한다.