본문으로 바로가기

[DevOps]테라폼(Terraform)이란?

category IT/Terraform 2021. 5. 20. 17:18
반응형

안녕하세요 오늘은 테라폼에대해 설명해보도록 하겠습니다.

  • 테라폼은 프로그램 코드를 통해 인프라 서버를 구축/운영 할 수 있게 해주는 오픈 소스 소프트웨어 입니다.
  • 코드형 인프라를 뜻하는 "IAC(Infra as a code) 도구(Tool)" 입니다.

IT에 종사 하면서 도구(Tool)의 사용법을 익히기는것도 중요하지만, 그 뒷 배경 또한 중요합니다. 아는 만큼 보이는 법이니까요

코드형 인프라(IAC, Infra as a code)개념은 왜 생겨나게되었을까요?

1. 가상화 기술의 발전

그 시작은 가상화 기술의 발전으로부터 시작됩니다. VM ware, Hyper-V와 같은 기술을 통해서 여러대의 서버를 더 많이 더 쉽게 만들 수 있게 되었습니다. 기하급수적으로 늘어나는 서버들에대한 프로비저닝과 운영에 대한 이슈가 발생하였습니다. 인력을 무한정으로 늘릴 수 없었기 때문에아 서버 구축과 운영에 대한 자동화가 필요했습니다. 이러한 배경에서 프로그래밍 코드로 인프라를 구축/운영할 수 있는 IAC(Infra as a code)가 생겨나게되었습니다.

2.CloudNative로 변화

Cloudnative 생태계에서 가장 기본이 되는것은 클라우드서비스의 출현입니다. 기존에 서버와 네트워크 등 인프라 자원을 직접 박스형태로 구매했던 방식에서 인터넷만 가능하면 서버를 구축할 수 있는 시대로 바뀌고 있습니다. 따라서 빠르게 다양한시도를 할 수 있게 되었고, 다양한 오픈소스가 활성화되어 Cloudnative생태계가 자리잡을 수 있게 되었습니다. 클라우드 인프라를 제공하는 Vender를 CSP(Cloud Service Provider)라고 하는데, 가장 대표적인 서비스로는 AWS, Azure, GCP가 있고 현재는 AWS가 점유율 1위를 차지 하고 있습니다. 이런 CSP에서 제공하는 퍼블릭클라우드 서비스가 생겨나면서 아래와 같은 이슈가 발생하였습니다.

  • Vender Lock-in 을 피하고 싶음
    -> 여러가지이유로 고객들은 Vender Lock-in을 두려워합니다. 그럴일은 희박하겠지만 Vender가 망하면 내 서비스도 망하니까.. 또는 CEO가 바뀌었는데 갑자기 AWS말고 Azure로 바꾸라고 지시한다던가.. 등등..
  • 멀티 클라우드로 다양한 Vender의 서비스를 사용하고 싶음
    -> 회사내부에는 부서도 다양하고 부서의 성향도 다양합니다. 따라서 어떤 부서는 AWS, 어떤 부서는 Azure, GCP 를 사용하고 싶어합니다. 이럴 경우 통합 인프라 관리는 어떻게 해야하는지..가 고민이 되기시작합니다.

따라서 IAC가 생겨나게되었고, 테라폼과 같은 강력한 IAC도구가 생겨나게 되었습니다.

IAC종류

코드형 인프라를 가능하게하는 도구(Tool)들은 Terraform뿐만 아니라 다음과 같이 여러가지가 있습니다.

  • Chef
  • Puppet
  • Ansible
  • AWS Cloudformation

terraform

그러면 테라폼은 어디서 어떻게 만들어졌을까요?

Q: 어디서 만들었나?
A: HashiCorp에서 만든 툴입니다.

Q: HashiCorp가 뭔가요?
A: HashiCorp는 미국 캘리포니아 샌프란시스코에 있는 소프트웨어 회사입니다.

Q: 누가 세운 회사인가요?
A: 2012년 미셸 하시모토, 아몬 데드거 가 창업한 회사입니다. 

Q: 창업 배경은 어떻게 되나요?
A: 미셸 하시모토는(일본 사람 아님) 창업 이전부터 가상 머신으로 부터 개발 환경 셋업을 도와주는 Vagrant를 루비(Ruby)언어로 개발하였다고 합니다.

그러면 테라폼은 어떻게 사용하는건가요??

를 설명드리기전에 테라폼이 어떻게 동작하는지 간단하게 설명드리겠습니다.

terraform work flow

테라폼은 명렁어를 통해 컴퓨터에게 일을 할 수 있게 해주는 커맨드 라인 인터페이스 즉, CLI(Command-line interface)를 제공합니다.
또한, HCL이라고 부르는 Hashcorp Language를 사용하여 프로그래밍 합니다.

이 말은 CLI사용법과, HCL언어 사용법을 배워야 한다는 말이 되겠죠?
기존에 박스형태로 인프라를 관리하시던 분들은 Cloudnative를 무서워합니다. 왜냐면 왠만하면 코딩이 들어가기 때문입니다.
(이제는 개발자 뿐만아니라 인프라 담당자들도 코드와 친해져야합니다. 모든 인프라 담당자들 화이팅!)

테라폼 사용을 정리하면 다음과 같은 절차를 거치게됩니다. (공식 문서에는 Write,Plan,Apply 3가지로 안내하는데, install이 빠진거같아 추가하였습니다.)

1. terrafrom CLI 설치(Install)

  • terraform명령어가 너무 기니까 alias 로 "tf"로 설정하기도 합니다.

2. terraform 코드 작성(Write)

  • HCL언어로 어떤 자원(서버,네트워크 등)을 어떻게 만들겠다를 정의한 ".tf" 확장자의 소스코드를 작성합니다.

3 terraform 코드 계획(Plan)

  • 테라폼 기능중 가장 마음에 드는 것중 하나입니다. 뭐냐면 내가 작성한 코드가 실제로 어떤 리소스를 생성할 것인지 생성하기전에 먼저 눈으로 확인할 수 있습니다.
  • 이게 되지 않으면 필요 없는 자원을 만들거나, 사용중인 자원을 삭제할 수도 있기 때문에 아주 강력한 기능이라고 생각합니다.

4. terraform 코드 적용(Apply)

  • 계획에서 확인한 리소스를 적용하는 단계 입니다.

그러면 이제 테라폼 코드는 어떻게 작성해야 하나요??

테라폼 코드를 작성하기 전에 테라폼 프로젝트의 파일 구조를 잘 잡아야합니다.
그렇지 않고 일단 해봐야지 하고 시작하면 나중에 처음부터 다시 코딩해야하는 경우가 발생 할 수 있습니다.

IAC를 한다는건 소스코드의 파일 하나하나를 관리해야한다는 것입니다. 즉, 파일을 구조적으로 어떻게 잘 잡을 것인가가 중요한 포인트 입니다.
기존 고급 개발자분들과 다르게 기존 인프라 운영에서 시작한 담당자들은 이게 참 취약합니다. (프로젝트 단위로 소스코드를 많이 다뤄보지 않았기 때문이죠)

디렉터리 구조에 대해 정확히 표준화된 답이 없지만 테라폼에서 가이드 하고 있는 구조는 아래와 같습니다.

terraform 디렉터리 구조

  • minimal 예제
    ├── README.md
    ├── main.tf
    ├── variables.tf
    ├── outputs.tf
  • complete 예제
    ├── README.md
    ├── main.tf
    ├── variables.tf
    ├── outputs.tf
    ├── ...
    ├── modules/
    │ ├── nestedA/
    │ │ ├── README.md
    │ │ ├── variables.tf
    │ │ ├── main.tf
    │ │ ├── outputs.tf
    │ ├── nestedB/
    │ ├── .../
    ├── examples/
    │ ├── exampleA/
    │ │ ├── main.tf
    │ ├── exampleB/
    │ ├── .../
  • 여기에 추가로 커스텀하게 아래의 파일들을 붙히기도 합니다.
    ├── provider.tf
    ├── backend.tf
  • main.tf : 테라폼 CLI를 사용하여 apply 명령어를 사용하면 가장 먼저 main소스 코드를 동작시킵니다. 말 그대로 main
  • modules : 자바로 보면 하나의 클래스를 만드는 것과 비슷한 개념입니다. main에서 input 값을 지정하고 해당 모듈을 사용할 수 있습니다.
  • backend.tf : 테라폼은 형상관리를 위해 .tfstate 파일을 생성합니다. 이 파일을 backup하고 형상관리하기위한 설정을 정의합니다.
  • provider.tf : 리소스를 어디서 제공하는지, 버전은 어떤것인지 등을 설정합니다.
  • outputs.tf : 해당 파일에 설정을 통해서 소스코드에 대한 실행 결과를 출력할 수 있습니다.
  • variables.tf : 소스코드에 사용할 변수들을 정의 합니다.

자, 이제 여기 까지 이해가 되셨다면 terraform을 사용할 준비는 끝났습니다.
다음 시간에 terraform 코드를 사용해서 AWS 의 인프라를 구축해보도록 하겠습니다.

감사합니다.

반응형