Terraform. 이름은 몹시 멋지다. 골디락스 존에 있는 행성이나 가까이 있는 화성처럼 지구화 가능할 것 같은 곳을 지구처럼 만드는 걸 테라포밍이라고 하는데 그걸 따온 것은 아닐까 하는 생각을 했다. 어쨌든 회사에 들어오니 테라폼을 사용하고 있었을 뿐.
코드로서의 인프라스트럭처를 지향한다
테라폼은 하시코프라는 곳에서 만든 인프라스트럭처 관리 도구이다. 오픈소스다. 테라폼이 뭐하는걸까 물어볼 사람이 없어서 사이트에 들어가보니 테라폼은 인프라를 만들고 바꾸고 버전관리를 안전하고 효율적으로 하기 위한 툴 이라고 쓰여 있었다.
그러니까 인프라 구축하는데 도와주는거구나. 근데 이게 왜 필요할까?
코드로서의 인프라스트럭처를 지향한다. 웹 콘솔이나 GUI를 사용해 관리하지 않고 필요한 리소스들을 코드로 작성해 관리한다.
이제 서버를 내가 만들고 관리할 수 있는 것이 가능하게 되었다. AWS나 AZURE 등 클라우드 서비스들이 많아졌다. devops들이 생겨가면서 코드로서 인프라스트럭처를 관리하는 IAC(Infrastructure As Code)도 덩달아 주목받기 시작했다. GUI를 통해 수동으로 서버를 운영하고 관리할 수 있긴 하다. 하지만 애플리케이션처럼 코드로 인프라를 생성, 관리, 변경, 운영이 가능하다면 그게 더 편하고 안전하지 않을까?
맞아 안전한거 같아
처음에 terraform이 뭔지 잘 모르고 회사 서버를 만지작거리다가 한번 날린적이 있었는데(진짜 등에 땀 줄줄 났음) 다행히 terraform으로 서버 세팅이 잘 이루어져있어서 금방 복구 할 수 있었다. terraform이 없었으면 이전 작업자가 서버를 어떻게 세팅해놨는지도 모르고(문서화가 되어있지 않음) 이미 서버를 지구를 떠났으니 나는 등땀을 엄청 흘리다가 이실직고하고 지옥에서 착한일 하는 것 같은 죄책감속에서 동료의 따가운 눈총을 받으며 복구할 때 까지 수 없는 밤을 지새워야했을지 모른다.
테라폼은 어떻게 동작하지?
테라폼은 서버 프로비저닝을 지원한다. 프로비저닝이란 사용자의 요구에 맞게 시스템 자원을 할당, 배치, 배포해 두었다가 필요시 시스템을 즉시 사용할 수 있는 상태로 미리 준비해 두는 것을 말한다. 서버 자원 프로비저닝, OS 프로비저닝, 소프트웨어 프로비저닝, 스토리지 프로비저닝, 계정 프로비저닝 등이 있다.
우리 아빠는 기회가 왔을 때 잡을 수 있도록 미리미리 준비해두라고 했지. 테라폼은 우리 아빠가 하는 말과 잘 부합하는 툴이다. 미리 프로비저닝해두면 언제든 내가 원할 때 짠 하고 네트워크를 세팅하거나 서버를 만들 수 있다. 이거 참 신기함.
예를 들면 나는 요리를 할 때 도구는 칼 2자루, 도마 2개, 아래로 깊은 팬 하나, 넓고 평평한 팬 하나가 필요하고, 향신료는 소금, 후추는 백후추와 흑후추, 오레가노, 타임, 바질은 생바질과 바질페스토, 요리에 쓸 달지않고 싼 화이트와인 하나, 내가 마실 산미구엘 한캔이 항상 필요하다고 가정하자. 매번 요리할 때마다 저걸 챙겨야하고, 내가 아니라 다른 사람이 나를 위해 준비해주는 경우엔 하나 둘 빠뜨릴 수 도 있다. 근데 알프레도라는 집사를 고용해서 그 사람한테 한번 저 세팅을 알려줬더니 언제든 누군가 필요하다고 말만하면 짠 하고 세팅을 해주는거야. 야 진짜 완전 짱이지 않냐 이거? 대박이다 정말!
테라폼과 함께라면 AWS에서 ec2 인스턴스를 만들고 security groups와 elb 설정을 하는 일 등을 코드로 관리할 수 있다.
아래 테라폼 코드를 실행하면 서울리전에 cores기반으로 ec2 인스턴스를 t2.micro로 2개 생성할 수 있다. 선언식으로 되어 있어 전체적인 그림을 살펴보기에 편리하다.
provider "aws" {
region = "ap-northeast-2"
}
data "aws_ami" "coreos" {
most_recent = true
filter {
name = "name"
values = ["*CoreOS*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
}
resource "aws_instance" "coreos" {
count = 2
ami = "${data.aws_ami.coreos.id}"
instance_type = "t2.micro"
vpc_security_group_ids = ["${aws_security_group.ec2_front_end.id}"]
tags {
Name = "example"
}
}
왜 코드로 관리해?
인간은 언제나 실수를 하지. 나도 항상 실수투성이 만신창이 인생이라 난 나를 믿지 않… 사람은 실수를 할 수 있다. 직접 수동으로 작업하다보면 분명 어딘가에서 실수가 발생할 수 있다. 하지만 코드로 관리되고 실행되면 이런 사람이 하는 실수를 방지할 수 있다.
위에서 말했지만 서버 운영이 자동화가 가능해지기 때문에 aws 콘솔들어가서 이거 누르고 저거 쓰고 할 필요 없이 그냥 terraform 코드만 실행시키면 된다.
코드이기 때문에 git을 이용해 쉽게 관리도 가능하다
그리고 새로들어온 개발자도 terraform 코드를 보면 인프라의 전체적인 구성을 이해할 수 있다. 그렇다. 테라폼없이 수동으로 작업한다면 인프라를 구현한 작업자가 안알랴줌하면 아무도 모른다.
마냥 좋은가
그렇지는 않은 것 같다. 처음 수동으로 구축하는 것 보다 테라폼을 통해 만들려면 쉽고 간단한 작업도 시간이 오래 걸린다. 그냥 aws 콘솔가서 ec2 인스턴스 생성 누르면 되는데 이건 뭐 설정하는게 많냐라는 생각이 들 수 있다. 하지만 한번 테라폼으로 코드화가 되면 유지보수가 쉽고 관리도 간편해지기 때문에 테라폼을 사용하는 것을 권장한다.
그러면 어떻게 사용하는가
테라폼 문서를 보며 차근차근 배워보자. https://www.terraform.io/docs/index.html
화이팅.