테라폼이란?
클라우드 인프라스트럭처 자동화 도구

테라폼(Terraform)이란?

하시코프 테라폼(Hashicorp Terraform) 로고

테라폼Terraform하시코프Hashicorp에서 오픈소스로 개발중인 클라우드 인프라스트럭처 자동화를 지향하는 코드로서의 인프라스트럭처Infrastructure as Code, IaC 도구입니다. IaC는 코드로 인프라스트럭처를 관리한다는 개념으로 테라폼에서는 하시코프 설정 언어HCL, Hashicorp Configuration Language을 사용해 클라우드 리소스를 선언합니다. 아마존 웹 서비스Amazon Web Service가 자체적으로 만든 AWS 클라우드 포메이션AWS CloudFormation의 경우 AWS만 지원하는 것과 달리 테라폼의 경우 아마존 웹 서비스Amazon Web Service, 구글 클라우드 플랫폼Google Cloud Platform, 마이크로소프트 애저Microsoft Azure와 같은 주요 클라우드 서비스를 비롯한 다양한 클라우드 서비스들을 프로바이더 방식으로 제공하고 있습니다. 이를 통해 테라폼만으로 멀티 클라우드의 리소스들을 선언하고 코드로 관리하는 것도 가능합니다.

테라폼은 고Go 프로그래밍 언어로 개발 되고 있습니다. 테라폼 사용자는 HCL 언어로 클라우드 리소스를 정의하고 이 내용을 테라폼 CLI 애플리케이션(terraform)으로 자신의 클라우드 계정에 실제로 반영할 수 있습니다. API를 호출해 명령을 실행하는 절차적인 방법과 달리 HCL은 선언적으로 리소스를 정의하기 때문에 리소스를 정의하고 여러번 테라폼을 실행한다고 여러 개의 리소스가 만들어지지는 않습니다. 테라폼을 사용하면 이 과정을 계획(plan)과 적용(apply) 단계로 나누어 진행할 수 있습니다. plan 서브 명령어를 사용하면 클라우드에 적용될 변화 사항을 보여주며 apply 서브 명령어는 이를 자신의 클라우드 계정에 실제로 적용해줍니다. 예를 들어 테라폼에서는 AWS EC2 인스턴스를 다음과 같이 정의합니다.*

* 아래 코드에 대한 자세한 해설은 테라폼(Terraform) 기초 튜토리얼 글을 참고해주세요.

resource "aws_instance" "web" {
  ami = "ami-0a93a08544874b3b7" # amzn2-ami-hvm-2.0.20200207.1-x86_64-gp2
  instance_type = "t2.micro"
  key_name = aws_key_pair.web_admin.key_name
  vpc_security_group_ids = [
    aws_security_group.ssh.id,
    data.aws_security_group.default.id
  ]
}

이 파일을 저장하고 plan을 실행하면 HCL의 내용과 같이 같이 인스턴스를 생성할 예정이라는 계획을 보여줍니다.

$ terraform plan
  + resource "aws_instance" "web" {
      + ami                          = "ami-0a93a08544874b3b7"
      + arn                          = (known after apply)
      + associate_public_ip_address  = (known after apply)
      + availability_zone            = (known after apply)

Plan: 1 to add, 0 to change, 0 to destroy.

이 내용을 실제로 적용하고 싶으면 apply 명령어로 적용합니다. 적용하고 나면 테라폼으로 관리하고 있는 리소스를 구분하고, 클라우드의 최신 상태와 파일의 내용을 비교하기 위해 tfstate라는 JSON 파일에 상태를 별도로 관리합니다. 협업을 위해서는 이 파일을 원격에서 관리해야합니다.

또한 HCL 정의 파일들은 프로그래밍 소스코드와 마찬가지로 단순한 텍스트 파일로 작성되기 때문에, 소프트웨어를 개발할 때 깃Git이나 깃허브GitHub를 활용하는 것과 마찬가지 방법으로 파일을 관리하고 협업하고 코드를 리뷰하고 CI를 사용하는 것도 가능합니다.

릴리스

테라폼은 2014년 처음 릴리스되었습니다 2020년 8월 현재 최신 버전은 0.13 버전입니다. 테라폼은 0.11에서 0.12로 업데이트 되었을 때 문법적으로 큰 변화가 있었습니다. 리소스 참조 문법 변경, 변수 타입 지원, 퍼스트 클래스 표현식, for, for_each 구문 도입, Splat 연산자, 템플릿 문법, null 값 등의 개선이 있었으며 자세한 내용은 다음 문서를 참고해주세요.

44BITS 로고

테라폼(Terraform) 0.12 베타 1 출시 및 개선된 HCL 문법 살펴보기

🗞 새소식, 2019-03-06 - 테라폼(Terraform)은 코드로서의 인프라스트럭처를 실현하는 도구입니다. 2019년 2월, 테라폼 0.12 베타 1 버전이 출시되었습니다. 테라폼 0.12에는 다양한 문법 개선사항들이 반영됩니다. 이 글에서는 새로운 버전을 설치하는 방법과 문법 변경 사항들에 대해서 소개합니다.

2020년 8월 릴리스된 0.13에서는 모듈 관련 개선을 비롯해 커스텀 변수 검증 기능, 테라폼 클라우드 지원 개선 등의 변화가 있었습니다.

테라폼은 0.7부터 0.13까지 업그레이드 가이드를 제공하고 있으니 업그레이드가 필요하신 분들은 참고하시기 바랍니다.

테라폼 클라우드와 테라폼 엔터프라이즈

하시코프Hashicorp에서는 테라폼을 기반으로 하는 테라폼 클라우드Terraform Cloud 서비스를 제공하고 있습니다. 테라폼에서는 로컬의 상태와 클라우드 계정의 실제 상태를 비교하기 위해 tfstate라는 파일을 사용합니다. 같은 HCL 코드 베이스로 인프라스트럭처 작업을 하기 위해서는 테라폼을 한 곳에서만 실행하거나, 이 tfstate 파일을 원격에서 공유해야합니다. 테라폼은 이 파일을 직접 설정한 클라우드 오브젝트 스토리지나 데이터베이스에서 저장하고 공유하는 기능을 지원하고 있습니다. 테라폼 클라우드에서도 tfstate 파일을 공유하는 기능을 제공하고 있습니다. 또한 일종의 CI처럼 테라폼 코드의 내용을 적용하는 작업을 테라폼 클라우드에서 수행할 수 있습니다.*

* 테라폼 클라우드의 리모트 실행 기능을 활성화하는 경우 로컬 머신에서 CLI로 적용(apply)를 실행하더라도 테라폼 클라우드에서 명령어가 실행됩니다.

테라폼 클라우드에서는 5명의 팀원까지 동시에 하나의 적용을 할 수 있는 무료 플랜Free plan을 제공하고 있습니다. 5명 이상이 사용할 경우 인당 월 $5의 이용 요금이 발생하며, 팀 관리 기능과 동시에 2개까지 적용을 실행할 수 있는 팀 플랜은 월 인당 $20입니다. 이보다 더 높은 등급인 비지니스 플랜과 셀프 호스티드 버전도 제공하고 있습니다. 요금에 대한 정확한 최신 정보는 테라폼 공식 페이지를 참고해주세요.

테라폼 클라우드 셋업에 대해서는 공식 문서를 참고해주세요.

테라폼 레지스트리(Terraform Registry) / 테라폼 프로바이더(Terraform Provider)

테라폼에서는 다양한 클라우드 서비스나 애플리케이션의 리소스를 코드로 관리할 수 있습니다. 테라폼 본체와 별개로 서비스나 애플리케이션의 리소스를 사용할 수 있게 해주는 건 프로바이더로 분리되어서 개발되고 있습니다. 예를 들어 아마존 웹 서비스 테라폼 프로바이더의 경우 다음 깃허브GitHub 저장소에서 개발되고 있습니다.

테라폼은 주로 아마존 웹 서비스Amazon Web Service, 마이크로소프트 애저Microsoft Azure, 구글 클라우드 플랫폼Google Cloud Platform과 같은 메이저 클라우드 서비스들을 사용할 때 많이 사용됩니다만 이 외에도 알리바바 클라우드Alibaba Cloud, 오라클 클라우드Oracle Cloud, VM웨어 클라우드VMWare Cloud 등도 지원하고 있습니다. 이 외에 디지털 오션Digital Ocean, 린노드Linode, 벌처Vultr와 같은 VPS 서비스들도 지원하고 있으며, 데이터독Datadog, 뉴 렐릭New Relic, 그라파나Grafana와 같은 모니터링 서비스와 MySQL, PostgreSQL 등과 같은 데이터베이스 서버를 조작할 수 있는 프로바이더 등도 공식적으로 제공하고 있습니다. 이외에도 다양한 프로바이더들이 있으며 전체 목록은 공식 문서의 프로바이더 페이지에서 확인할 수 있습니다.*

* 기존에는 테라폼 공식 페이지에서 프로바이더 문서를 제공하고 있었으나, 2020년 8월 현재 테라폼 레지스트리로 프로바이더 문서도 옮겨가고 있는 것으로 보이며 프로바이더 문서들이 분산되어있습니다.

또한 테라폼 플러그인 SDK를 사용해 직접 테라폼 프로바이더를 개발하는 것도 가능하며, 다양한 커뮤니티 프로바이더들이 개발되고 공개되어있습니다.

테라폼 프로바이더 개발에 관해서는 다음 페이지를 참고해주세요.

테라폼 시작하기

테라폼을 시작하려면 먼저 테라폼 CLI를 설치해야합니다. 맥OS에서는 홈브류Homebrew를 사용해서 쉽게 설치할 수 있습니다.

$ brew install terraform

윈도우에서 패키지 매니저 초코chocolatey를 사용해서 테라폼을 설치할 수 있습니다.

$ choco install terraform

패키지 매니저 사용이 어려운 경우나 다른 환경의 경우 테라폼 공식 릴리스 페이지에서 바이너리로 빌드된 파일을 직접 다운로드 받아 사용할 수도 있습니다.

테라폼은 HCL을 설정 파일로 사용하기 때문에 기본적인 문법에 대해서 학습이 필요합니다.

다음 글에서는 테라폼으로 AWS 리소스를 만드는 방법을 소개합니다.

'테라폼(Terraform) 기초 튜토리얼: AWS로 시작하는 Infrastructure as Code' 대표 이미지

테라폼(Terraform) 기초 튜토리얼: AWS로 시작하는 Infrastructure as Code

🗒 기사, 2020-03-14 - 테라폼(Terraform)은 인프라스트럭처를 선언적인 코드로 작성하고 관리할 수 있게 해주는 도구입니다. 이 글에서는 테라폼에 대해 소개하고, 이를 사용해 AWS 리소스를 정의하고 프로비저닝하는 방법을 소개합니다.

tfenv

하나의 언어로 다양한 프로젝트들을 프로그래밍 하다보면 버전 파편화가 발생하고 프로그래밍 언어의 버전 관리를 위한 도구들을 사용하게 됩니다. 테라폼 코드 역시 리소스가 많아지고 작성 시점에 따라 프로젝트 별로 버전이 파편화될 수 있습니다. 이때 tfenv를 사용하면 여러 버전의 테라폼을 좀 더 쉽게 설치하고, 전환할 수 있습니다. 자세한 내용은 다음 글을 참고해주세요.

44BITS 로고

tfenv로 테라폼(Terraform) 버전 관리하기

🗒 기사, 2019-09-30 - 테라폼을 여러 프로젝트에서 사용하면 다수의 버전이 필요한 경우가 생깁니다. 이럴 때 tfenv를 사용하면 손쉽게 테라폼 버전을 변경해서 사용할 수 있습니다. 이글에서는 tfenv를 사용해 테라폼의 버전을 관리하는 방법을 소개합니다.