1주차 - Terraform의 기초

이 내용은 CloudNet@ 에서 진행하는 테라폼 기초 입문 스터디에 대한 연재글입니다.

스터디에서 사용하는 교재는 Terraform Up & Running 2nd Edition 입니다.

들어가며...

인프라를 코드를 통해 관리(Infrastructure as Code, 이하 IaC)하는 개념은 널리 퍼져있습니다. 이는 수동으로 운영하는 수고를 벗어나, 코드화하여 관리할 수 있는 이점을 지니기도 합니다.

그렇지만 올바르게 알아야 이를 적재적소에 사용할 수 있으며, 백엔드 개발에 대한 지식을 익혀둔 현 시점에 학습하면 협업 및 서브프로젝트 진행에 도움이 될 것이라고 판단하였습니다.

따라서 제가 공부한 내용을 남겨, 이해하고 배운 내용을 공유하려 합니다.

부디 이 내용이 도움이 되기를 바랍니다.

이 글의 대상은?

목차

Prerequisites

아래에서 1주차 스터디 내용을 공유합니다.

교재의 1, 2장을 다룹니다.

DevOps의 대두, IaC의 등장, 그리고 Terraform

과거에는 랙이나 캐비넷에 서버를 설치하고, 배선작업을 하고 쿨링 시스템을 설정하여 서버를 개발하던 시절이 있었습니다(물론 현재에도 여전히 유효하며, 필요에 따라서는 사용해야 합니다!). 이러한 시대에는 개발팀(Dev)과 운영팀(Ops)이 분리되어 하드웨어, 소프트웨어 파트를 각각 맡았으며 회사가 커짐에 따라 불필요한 수고가 많아졌습니다. 클라우드 컴퓨팅의 시대가 도래하여 필요에 따라 하드웨어 제품을 "대여" 할 수 있게 되고, Chef, Puppet, Terraform 등과 같은 소프트웨어의 등장하여 이러한 수고를 "모든" 회사가 하지 않아도 되는 시대가 왔습니다. 이러한 시대의 흐름을 타고 개발과 운영이 한데 어우러진, 이른 바 "DevOps 운동"이 시작되었습니다. 소프트웨어 개발 전반에 필요한 프로세스와 방법론, 그리고 세부 기술에 대한 논의가 진행되는건 당연한 수순이라고 할 수 있겠네요.

따라서, DevOps는 아래와 같다고 할 수 있겠습니다:

소프트웨어를 효율적으로 전달하는 프로세스

IaC(Infrastructure as Code)는 이러한 DevOps를 할 수 있게 한 원동력입니다. 문자 그대로, 인프라환경을 코드로 작성할 수 있게 된 것이지요. 앞서 말씀드린 Chef, Puppet, Terraform 등과 같은 도구가 그 대상 중 하나입니다. 저희는 앞으로 그 중 하나인 Terraform(이하 테라폼)을 배우게 될 것입니다.

Terraform 이란?

HashiCorp 에서 만든 IaC 도구입니다. 사람이 읽기 쉬운(human-readable) 설정파일을 통해 버저닝과 재사용, 그리고 팀원간의 공유를 할 수 있게 합니다.

코드화가 된다면, 코드를 작성할 때의 덕목을 모두 사용할 수 있음을 의미합니다. 따라서, 좋은 코드를 작성하기 위한 요소를 알고, Ops 파트의 특성을 공유한다면 보다 기민한 제품개발(뭐가 되었든!)을 할 수 있겠지요.

IaC 도구의 장점

인프라를 코드 형식으로 작성하는 경우, 아래의 장점을 가져갈 수 있습니다.

테라폼에 대하여

아래에서 본격적으로 테라폼이 어떤 식으로 사용되는지에 대해 살펴보겠습니다.

테라폼의 기본 개념

테라폼에서 주요하게 사용되는 기본개념은 아래와 같습니다:

테라폼 코드에 대하여

테라폼 코드의 실제 작성요소에 대해 간략히 정리하고자 합니다.

테라폼 코드는 HCL(Hashicorp Configuration Language) 로 작성합니다.

OS 마다 바이너리 파일이 존재하는데, Go코드는 하나의 바이너리 파일로 컴파일되며 terraform <args> 형식의 명령어로 실행합니다. 테라폼 바이너리가 provider를 대신해 API를 호출하여 리소스를 생성합니다. 테라폼은 인프라 정보가 담겨 있는 테라폼 구성 파일을 생성하여 API를 호출하지요.

확장자는 *.tf 입니다.

테라폼 구동방법

테라폼의 구동 후 프로비저닝[1] 은 크게 3단계로 나뉩니다.

예시를 통한 resource 정의 방법 표현

실제로 생성할 인프라 자원에 대해 정의하는 방법은 아래와 같습니다.

resource "<PROVIDER>_<TYPE>" "<NAME>" {
  [CONFIG ...]
}

그렇다면, 예시코드를 보며 이해해보죠.

https://github.com/s3ich4n/terraform-study-101/blob/4e0b9159a443853311734cf0a839a11772290bbf/chapter01/example01/main.tf#L1-L12

예시를 통한 참조(reference) 방법 표현

참조(reference)는 코드의 다른 부분에서 사전에 정의한 리소스의 특정 값에 액세스 할 수 있게 해주는 표현식을 의미합니다. 정의 방법은 아래와 같습니다.

<PROVIDER>_<TYPE>.<NAME>.<ATTRIBUTE>

예시1)

변수(variables) 표현

변수(variables)는 자주 사용되는 값에 대해 변수값으로 별도의 .tf 파일에 기록하는 것을 의미합니다.

두가지 예시코드를 살펴보며 학습하겠습니다.

Lessons learned

제 1장에서는 테라폼의 기본 내용을 살펴보았습니다. 아래 내용을 반드시 기억하셨으면 좋겠습니다.

  1. 다양한 IaC 도구들의 등장과 클라우드 컴퓨팅의 등장으로, 개발과 운영은 새로운 패러다임을 맞이했습니다.
  2. 테라폼의 기본적인 개념에 대해 익히고, 특정 프로바이더의 리소스를 사용할 수 있습니다.
  3. 2에서 언급한 리소스의 값을 마치 변수처럼 "참조"할 수 있으며, 공통적으로 사용되는 상수값은 "변수"로 둘 수 있습니다.

이것으로 제 1장을 마칩니다. 긴 글 읽어주셔서 감사합니다.


[1]: "작성된 코드에 대한 환경을 배포한다" 로 이해하면 쉽습니다. 적절한 권한을 가진 유저가 인프라 구성 명령을 내려서 실제 인프라 구성을 수행하는 것이지요.