[2판] 01. 왜 테라폼인가
이 문서는 책 "테라폼 업앤러닝"을 읽고 작성되었습니다. 최대한 요약해서 책 내용을 최소로 하는데 목표를 두고 있어서, 더 친절하고 정확한 내용을 원하신다면 책을 구매하시는 것을 추천드립니다. => 책 링크
용어 정리
"Devops"란
Devops
는 소프트웨어를 효율적으로 전달하는 프로세스이다. 다음과 같은 핵심 가치 4가지가 존재한다.
- Culture
- Automation
- Measurement
- Sharing
이 책은 2번, 특히 인프라스트럭처 배포 자동화에 초점을 맞춘다.
"IaC"란
IaC
는 "Infrastructure As Code"의 약자로써, 코드로 인프라를 관리하는 것을 의미한다. 서버, DB, 네트워크, 로그, 애플리케이션 구성, 문서, 자동화된 테스트, 배포 프로세스 등 거의 모든 작업을 코드로 관리할 수 있다.
다음과 같은 도구들이 존재한다.
- 스크립트
- 설정 관리 도구
- 서버 템플릿 도구
- 오케스트레이션 도구
- 프로비전 도구
"IaC"의 종류
간단하게 IaC
의 종류에 대해서 알아보자.
스크립트
먼저 스크립트는 Bash
, Python
, Ruby
, Golang
등 여러 프로그래밍 언어로 작성될 수 있으며, 인프라를 관리를 자동화하는데 최소한의 도구이다. 예를 들어 서버에 php
로 작성된 코드 기반의 웹 앱을 설치하고 apache2
서버를 구동하는 작업을 자동화한다고 해보자. 다음과 같이 Bash
스크립트로 작성할 수 있다.
#!/bin/bash
# 패키지 업데이트
sudo apt-get update
# apache2 웹서버, php 설치
sudo apt-get install -y php apache2
# php 프로젝트 클론 /var/www/html/app 에 코드를 품.
sudo git clone github.com/foo/php-app /var/www/html/app
# 웹 서버 구동
sudo systemctl start apache2
구성 관리 도구
대표적인 구성 관리 도구는 Chef
, Puppet
, Ansible
등이 있다. 이들은 실행 중인 서버의 구성을 변경하는 작업을 자동화할 때 자주 사용된다. 위의 예를 Anisble
로 진행해보자. 다음과 같이 playbook
을 작성해서 실행하면 된다.
- name: Update the apt-get cache
apt:
update_cache: yes
- name: Install PHP
apt:
name: php
- name: Install Apache
apt:
name: apache2
- name: Git clone Repository
git: repo=https://github.com/foo/php-app dest=/var/www/html/app
- name: Start Apache
systemd:
name: apache2
state: started
구성 관리 도구는 다음과 같은 특징이 있다.
- 코드 규칙
- 멱등성
- 분산형 구조
서버 템플릿 도구
대표적인 서버 템플릿 도구로 Docker
와 Packer
가 있다. 이들은 머신 이미지를 생성할 때 주로 사용된다. 즉 apache
서버 실행 등의 작업은 템플릿 도구로 생성된 이미지를 기반으로 서버를 실행할 때가 되서야 가능하다. 그 이전까지 작업은 이 도구로 자동화할 수 있다. Packer
로 위의 예를 자동화해보자.
packer {
required_plugins {
amazon = {
version = ">= 0.0.2"
source = "github.com/hashicorp/amazon"
}
}
}
source "amazon-ebs" "ubuntu" {
ami_name = "learn-packer-linux-aws"
instance_type = "t2.micro"
region = "us-west-2"
source_ami_filter {
filters = {
name = "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*"
root-device-type = "ebs"
virtualization-type = "hvm"
}
most_recent = true
owners = ["099720109477"]
}
ssh_username = "ubuntu"
}
build {
name = "learn-packer"
sources = [
"source.amazon-ebs.ubuntu"
]
provisioner "shell" {
inline = [
"sudo apt-get update",
"sudo apt-get install -y php apache2",
"sudo git clone github.com/foo/php-app /var/www/html/app",
]
}
}
이렇게 이미지를 만든 후에 이를 기반으로 서버를 구동한 뒤 user_data
등에서 sudo systemctl restart apache2
명령어를 작성해주면 된다. 서버 템플릿 도구는 Immutable Infrastructure
구성 시 핵심 역할을 하고 있으니 같이 알아두는 것이 좋다.
오케스트레이션 도구
오케스트레이션 도구는 일반적으로 수 많은 컨테이너를 관리하는데 필요한 도구이다. 보통 Docker
같은 컨테이너 런타임(Container Runtime) 위에 Kubernetes
같은 오케스트레이션 도구를 구축해서 컨테이너들을 관리한다. 다음과 같은 기능을 가졌다.
- 블루-그린 배포 같은 배포 전략(롤링 업데이트)
- 컨테이너 오토스케일링
- 트래픽 로드 밸런싱
- 셀프 리커버리
- 서비스 디스커버리
Packer
, Docker
등의 템플릿 도구로 컨테이너 이미지를 구성한 후 Kubernetes
설정 파일을 통해서 여러 대의 컨테이너를 배포를 할 수 있다.
프로비전 도구
프로비전 도구는 서버뿐 아니라 데이터베이스, 네트워크 등 인프라스트럭처의 형상을 구성 및 관리할 수 있다. 대표적인 도구로 Terraform
, AWS Cloudformation
등이 있다. Terraform
으로도 위의 예를 구성할 수 있다.
resource "aws_instance" "example" {
ami = "ami-005e54dee72cc1d00"
instance_type = "t2.micro"
availability_zone = "us-east-1a"
user_data = <<EOF
#!/bin/bash
sudo apt-get update
sudo apt-get install -y php apache2
sudo git clone github.com/foo/php-app /var/www/html/app
sudo systemctl start apache2
EOF
}
일반적으로 Terraform
은 다음과 같은 조합으로 구성하여 인프라스트럭처를 관리한다.
- Terraform + Packer + Ansible
- Terraform + Packer + K8S
첫 번째 방식은 기존 클라우드 인프라를 관리하는 구성이다. Packer
로 서버 이미지를 만든 후, Terraform
으로 인프라스트럭처를 구성한다. 그 후 실행되는 서버 설정은 Anisble
을 이용해 관리하는 것이다.
두 번째 방식은 최신 컨테이너 형, 클라우드 인프라를 관리하는 구성이다. Packer
로 Docker Image
를 만든 후에, Terraform
으로 인프라스트럭처를 구성한다. 이 때 Kubernetes
클러스터를 구성한다. Packer
에 의해 생성된 Docker Image
들은 Kubernetes
가 참조하여 여러 컨테이너를 오케스트레이션한다.
"IaC"의 장점
IaC
는 다음과 같은 장점을 얻는다.
- 배포 프로세스 자동화
- 속도와 안정성
- 문서화
- 버전 관리
- 유효성 검증
- 재사용성
원래 관리자의 영역이었던 배포 프로세스가 자동화가 되면서 그 개발자들로만으로도 배포 프로세스를 실행시킴으로써 애플리케이션 배포가 가능하게 되었다. 또한, 컴퓨터가 작업함으로 사람이 수작업으로 할 때보다 매우 정확하고 빠르게 프로세스를 수행할 수 있다. 3-6번은 "소스 코드"의 장점이다. 이를 통해서 "행복함"을 얻을 수 있다고 한다.