Terraform 개념 및 설정

LinuxBeginner
지금 연습하기

소개

Infrastructure as Code(IaC) 의 세계에 오신 것을 환영합니다.

바쁜 레스토랑의 수석 셰프라고 상상해 보세요. 전통적으로는 모든 요리를 단계별로 직접 만들 수 있습니다. IT 세계에서 이는 서버를 하나씩 수동으로 구성하는 것과 같습니다. 시간이 오래 걸리고 실수하기 쉽습니다.

IaC 를 사용하면 반복적인 명령을 실행하거나 클라우드 콘솔을 클릭해 인프라를 수동으로 구성하는 대신, 버전 관리하고 검토하며 재사용할 수 있는 파일에 인프라를 정의할 수 있습니다.

Terraform 은 가장 널리 사용되는 IaC 도구 중 하나입니다. Terraform 은 선언적 도구입니다. 원하는 최종 상태를 정의하면 Terraform 이 해당 상태에 도달하는 방법을 계산합니다.

이 선언적 모델은 Terraform 을 대표하는 핵심 개념 중 하나입니다. 인프라가 어떤 상태로 존재해야 하는지를 정의할 뿐, 인프라를 생성하는 데 필요한 각 저수준 단계의 명령형 스크립트 전체를 작성하지는 않습니다.

이 실습에서는 "주방"을 준비하고 로봇에게 첫 번째 기술을 가르칩니다. AWS, Google Cloud, Docker 와 같은 다양한 재료에 접근할 때 로봇에게 필요한 특정 조리 도구와 같은 **프로바이더 (Providers)**를 배웁니다.

이 실습을 마치면 Terraform 을 설치하고, 첫 번째 "레시피" 파일을 만들며, 인프라 구축을 시작할 수 있도록 환경을 준비하게 됩니다.

Terraform 설치

terraform 프로그램을 설치해야 합니다. 이는 로봇의 두뇌를 다운로드하는 것과 같습니다. 프로그램이 어디에서 제공되고 어디에 저장되는지 명확히 확인할 수 있도록 직접 설치합니다.

먼저 현재 작업 위치를 확인합니다. 프로젝트 폴더 안에 있어야 합니다.

pwd

다음으로 인터넷에서 Terraform 패키지를 다운로드합니다. 이 실습의 모든 과정이 정상적으로 작동하도록 wget 명령으로 특정 버전 (1.14.3) 을 가져옵니다.

wget https://releases.hashicorp.com/terraform/1.14.3/terraform_1.14.3_linux_amd64.zip

다운로드한 파일은 도구가 들어 있는 여행 가방과 같은 압축된 "zip" 아카이브입니다. unzip 명령으로 압축을 풀어야 합니다.

unzip terraform_1.14.3_linux_amd64.zip

이제 terraform 프로그램이 생겼지만, 현재는 이 특정 폴더 안에만 있습니다. ls나 cd 같은 일반 명령처럼 시스템 어디에서나 실행할 수 있도록 설정해야 합니다.

이를 위해 프로그램을 /usr/local/bin이라는 특수한 시스템 폴더로 이동합니다. 이 디렉터리는 명령을 입력할 때 시스템이 항상 확인하는 공용 도구 상자와 같습니다.

sudo mv terraform /usr/local/bin/

마지막으로 버전을 확인하여 설치가 완료되었는지 검증합니다.

terraform -version

Terraform v1.14.3을 나타내는 출력이 표시되어야 합니다.

작업 공간을 깔끔하게 유지하려면 다운로드한 zip 파일을 삭제합니다.

rm terraform_1.14.3_linux_amd64.zip

청사진 만들기

Terraform 은 무엇을 구축해야 하는지 알기 위해 청사진이 필요합니다. 이러한 청사진은 .tf 확장자로 끝나는 텍스트 파일에 작성합니다.

이 단계에서는 기본 구성 파일을 만듭니다. 일반적으로 관례에 따라 기본 파일의 이름은 main.tf로 지정합니다. 레시피 책의 첫 페이지라고 생각하면 됩니다.

~/project 디렉터리에 main.tf라는 새 파일을 만듭니다. 먼저 touch 명령으로 빈 파일을 만들 수 있습니다.

touch main.tf

파일이 생성되었는지 확인합니다.

ls -l main.tf

현재 파일은 비어 있습니다. 다음 단계에서 파일에 내용을 추가합니다. 이 파일은 인프라를 정의하는 청사진으로 사용됩니다.

프로바이더 구성

이제 main.tf 파일이 있으므로 파일에 지시사항을 추가해야 합니다.

Terraform 은 범용 도구입니다. 기본적으로 Docker, AWS 또는 Azure 와 통신하는 방법을 알지는 못합니다. Terraform 과 관리하려는 플랫폼 사이에서 통역사 역할을 하는 **프로바이더 (Provider)**를 추가해야 합니다. 이 실습에서는 Docker 컨테이너를 관리하므로 Docker 프로바이더가 필요합니다.

핵심 엔진과 프로바이더 플러그인을 분리했기 때문에 동일한 Terraform 작업 흐름 패턴으로 여러 인프라 시스템을 관리할 수 있습니다.

텍스트 편집기 nano를 사용하여 main.tf를 엽니다.

nano main.tf

다음 코드를 파일에 복사하여 붙여 넣습니다. 첫 번째 부분인 terraform 블록은 Terraform 에 다운로드할 통역사 플러그인을 정확히 알려 줍니다. 두 번째 부분인 provider 블록은 해당 플러그인을 활성화합니다.

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 3.0.1"
    }
  }
}

provider "docker" {}

코드를 붙여 넣은 후 변경 사항을 저장하고 편집기를 종료합니다. Ctrl + O를 눌러 파일을 저장하고, Enter를 눌러 파일 이름을 확인한 다음 Ctrl + X를 눌러 종료합니다.

이 구성은 Terraform 에 다음과 같이 알립니다. "Docker 프로바이더를 사용하며, 구체적으로 버전 3.0.1 또는 호환되는 버전을 사용하겠습니다."

프로젝트 초기화

도구를 설치하고 청사진도 작성했지만, Terraform 은 아직 완전히 준비되지 않았습니다. main.tf에서 "Docker" 통역사 (플러그인) 가 필요하다는 것을 확인했지만, 아직 다운로드하지 않았습니다.

init 명령을 실행해야 합니다. 이를 "작업장 준비"라고 생각하면 됩니다. Terraform 은 청사진을 읽고, 필요한 도구가 무엇인지 확인한 다음 해당 도구를 숨김 디렉터리에 자동으로 다운로드합니다.

따라서 terraform init은 인프라를 변경하는 단계가 아니라 프로젝트를 부트스트랩하는 단계입니다. 이후 명령이 구성을 올바르게 이해할 수 있도록 작업 디렉터리를 준비합니다.

초기화 명령을 실행합니다.

terraform init

다음과 비슷한 출력이 표시되어야 합니다.

Initializing the backend...

Initializing provider plugins...
- Finding kreuzwerker/docker versions matching "~> 3.0.1"...
- Installing kreuzwerker/docker v3.0.2...
- Installed kreuzwerker/docker v3.0.2 (self-signed, key ID 24E54F214539BC63)

Terraform has been successfully initialized!

이 명령은 프로젝트 폴더에 .terraform이라는 숨김 디렉터리를 생성합니다. Terraform 은 이 디렉터리에 다운로드한 프로바이더 플러그인을 저장합니다.

숨김 파일을 포함한 모든 파일을 나열하여 이 디렉터리가 존재하는지 확인할 수 있습니다.

ls -a

.terraform과 .terraform.lock.hcl이 표시되어야 합니다. 잠금 파일은 이후 실행에서도 정확히 동일한 프로바이더 버전을 사용하도록 하여 일관성을 보장합니다.

요약

축하합니다! Terraform 환경을 성공적으로 설정했습니다.

이 실습에서는 다음 내용을 배웠습니다.

  • 설치: Terraform 바이너리를 시스템 경로 (/usr/local/bin) 에 배치하는 방법
  • 구성: 인프라 청사진 역할을 하는 main.tf 파일을 만드는 방법
  • 프로바이더: Terraform 이 Docker 와 같은 다양한 플랫폼과 통신할 수 있도록 하는 고유한 "통역사"
  • 초기화: 작업을 시작하기 전에 필요한 플러그인을 다운로드하는 terraform init 사용 방법

이제 다음 실습에서 실제 리소스를 정의하고 인프라를 구축할 준비가 되었습니다.