본문 바로가기
IT 트렌드/가볍게 배우는 신기술 이야기

Terraform를 활용한 IaC 인프라 관리: 개념, 설치 방법, 명령어, 사용 사례 총정리

by KBerry 2025. 9. 5.

목차

    클라우드 인프라 구축 경력 5년 이상의 중급~고급 사용자를 위해, Infrastructure as Code(IaC) 도구인 Terraform의 핵심 개념부터 설치, 주요 명령어, 실제 활용 사례까지 한 곳에 정리했습니다. Terraform은 멀티 클라우드 환경에서 인프라를 코드로 관리할 수 있게 해주는 대표적인 IaC 도구로, AWS나 GCP 같은 다양한 클라우드 서비스를 선언형 코드로 자동화할 수 있습니다. 이 글에서는 "Terraform", "IaC", "Terraform 설치 방법", "Terraform 사용 사례" 등의 주요 키워드를 중심으로 Terraform을 깊이 있게 살펴보겠습니다.

     

    Terraform 로직
    Terraform 로직

    1. Terraform의 기본 개념 및 특징

    Terraform은 HashiCorp사가 개발한 오픈 소스 IaC 도구로, 클라우드 인프라 리소스를 코드로 정의하고 프로비저닝(생성/관리)할 수 있게 해 줍니다. 개발자는 사람이 읽기 쉬운 구성 파일(HCL, HashiCorp Configuration Language)을 통해 원하는 인프라의 최종 상태를 선언하면, Terraform이 다양한 클라우드 제공자의 API를 호출하여 그 상태대로 리소스를 생성하거나 업데이트합니다. 즉, 복잡한 스크립트 작성 없이 선언형(Declarative) 방식으로 인프라를 관리할 수 있는 것이 Terraform의 큰 장점입니다.

    주요 특징: Terraform은 클라우드 불가지론(Cloud-agnostic) 성격을 가져, AWS, Azure, GCP, VMware 등 멀티 클라우드 및 온프레미스 환경을 모두 한꺼번에 다룰 수 있습니다. 하나의 Terraform 코드베이스로 여러 프로바이더의 인프라를 정의할 수 있어 멀티클라우드 인프라 관리에 유용합니다. 또한 변경 사항을 적용하기 전에 미리 계획을 보여주는 Plan 단계와, 실제 적용하는 Apply 단계를 분리하여 운영 상 안전성을 높였습니다. Terraform은 상태 관리 파일(tfstate)을 통해 현재 인프라 상태를 추적하여, 코드의 원하는 상태와 실제 인프라 상태를 비교함으로써 필요한 변경만을 수행합니다. 이 상태 파일은 로컬이나 원격 스토리지(AWS S3, Terraform Cloud 등)에 저장할 수 있으며, 이를 통해 동일한 인프라 구성을 팀원이 협업하여 관리할 수도 있습니다.

    Terraform은 수백 개 이상의 프로바이더(Provider)를 통해 확장됩니다. 프로바이더는 AWS, GCP 같은 클라우드 서비스는 물론 GitHub, Kubernetes, Datadog 등의 써드파티 서비스까지 다양하게 제공되므로, Terraform 하나로 인프라 일관성 있게 관리가 가능합니다. 이러한 풍부한 생태계와 코드 기반 관리로 Terraform은 인프라 변경의 버전 관리, 재현성, 형상 관리에 뛰어난 효율을 제공합니다.

    Tip: Terraform의 아키텍처는 크게 Terraform Core 엔진과 여러 Provider 플러그인으로 이루어져 있습니다. Terraform Core가 .tf 코드와 상태 파일을 읽어 리소스 생애주기(plan/apply/destroy)를 관리하고, 각 Provider가 AWS나 GCP 같은 서비스와 통신하며 실제 리소스를 생성/변경합니다.

    수동 관리 방식의 한계와 IaC의 필요성

    현대 클라우드 환경의 동적이고 복잡한 특성은 인프라 관리에 새로운 도전 과제를 제시하고 있습니다. 가상 머신, 컨테이너, 네트워크, 데이터베이스 등 수많은 리소스가 유기적으로 연결된 시스템을 수동으로 프로비저닝 하고 구성하는 방식은 더 이상 지속 가능하지 않습니다. 이러한 수동 작업은 본질적으로 휴먼 에러를 유발하기 쉽고, 이로 인해 인프라의 비일관성이 초래될 수 있습니다. 연구에 따르면, 인프라의 실제 상태와 코드에 정의된 상태가 불일치하는 '드리프트(drift)' 현상은 수동적인 콘솔 작업이나 통제 범위를 벗어난 변경으로 인해 주로 발생합니다. 이러한 드리프트는 예기치 않은 서비스 중단(downtime)이나 데이터 유출과 같은 보안 취약점 노출로 이어질 수 있으며, 임시로 생성된 리소스가 방치되어 불필요한 비용을 발생시킬 수 있습니다.  또한, 수동 관리는 변경 사항을 추적하고 재현성을 확보하는 데 심각한 제약을 가합니다. 어떤 변경이 언제, 누구에 의해 이루어졌는지 파악하기 어렵고, 특정 환경에서 작동하는 구성을 다른 환경에 정확히 복제하는 것이 거의 불가능합니다. 이는 팀 간의 협업을 저해하고, 특히 데브옵스(DevOps) 워크플로우의 핵심인 연속성과 확장성을 근본적으로 제약합니다. 따라서 인프라 관리를 소프트웨어 개발의 모범 사례에 접목하여 자동화, 일관성, 그리고 재현성을 확보하는 '인프라스트럭처의 코드화(IaC)' 방법론이 필수적인 패러다임으로 자리 잡았습니다.  

    Terraform이 IaC 시장에서 차지하는 독보적인 위치

    Terraform은 IaC 시장에서 가장 널리 채택된 도구 중 하나로, 복잡한 인프라 관리를 위한 강력한 솔루션을 제공합니다. 이 도구는 사람이 읽기 쉬운 선언형 언어인 HCL(HashiCorp Configuration Language)을 사용하여 사용자가 원하는 인프라의 최종 상태를 정의할 수 있게 합니다. 이러한 접근 방식은 복잡한 스크립트 작성이나 단계별 명령어 나열 없이도 인프라를 효율적으로 프로비저닝하고 관리할 수 있게 해 줍니다. Terraform은 인프라를 애플리케이션 코드와 동일하게 취급하여, 구성 파일을 버전 관리 시스템에 저장하고, 코드 리뷰, 테스트 등 소프트웨어 개발의 이점을 인프라 관리에 적용할 수 있도록 합니다. 이를 통해 기업은 인프라의 일관성을 확보하고, 휴먼 에러를 줄이며, 팀 간의 협업을 효율적으로 개선할 수 있습니다.  인프라스트럭처의 코드화는 단순히 효율성을 증대시키는 기술적 수단을 넘어, 조직의 비즈니스 민첩성과 안정성을 확보하는 핵심 전략으로 진화했습니다. 인프라 관리가 코드로 이루어짐으로써, 변경 사항을 명확하게 추적하고, 환경을 일관되게 복제하며, 자동화된 배포를 가능하게 하는 이점은 기업이 더 빠른 개발 주기를 달성하고 시장 출시 시간을 단축하는 데 직접적으로 기여합니다. 즉, IaC는 이제 엔지니어링 효율성을 넘어, 비즈니스 경쟁력을 결정하는 핵심 요소로 자리 잡았다고 볼 수 있습니다. Terraform은 이러한 기술적 및 전략적 요구사항을 모두 충족하며, 현대 클라우드 인프라 운영의 기반을 다지는 필수 도구로 평가됩니다.  

     

    제2장. Terraform의 핵심 원리: 선언형 접근 방식과 그 실질적 가치

    선언형 vs. 명령형 접근 방식: "무엇"을 정의하는 선언형의 이점

    소프트웨어 아키텍처에서 인프라를 다루는 방식은 크게 선언형(Declarative)과 명령형(Imperative)으로 나눌 수 있습니다. 이 두 접근법의 핵심적인 차이는 '무엇(What)'과 '어떻게(How)'에 대한 관점에 있습니다. 명령형 접근 방식은 시스템이 원하는 상태에 도달하기 위한 단계별 명령어를 명시하는 데 집중합니다. 예를 들어, A를 먼저 실행하고, 그 다음 B를 적용하며, 최종적으로 C를 실행하라와 같이 특정 순서와 절차를 명확히 지시합니다. 반면에, 선언형 접근 방식은 원하는 인프라의 최종 상태만 정의하고, 그 상태에 도달하기 위한 방법을 도구(Tool)에 맡깁니다. 이는 마치 택시 앱에서 "톰의 집"이라는 최종 목적지만 지정하면 시스템이 최적의 경로를 알아서 파악하는 것과 유사합니다.  

    Terraform은 이 선언형 방식을 채택하여 HCL 구성 파일을 통해 사용자가 원하는 인프라의 최종 상태를 선언하면, Terraform이 클라우드 제공자의 API를 호출하여 그 상태에 도달하는 데 필요한 모든 작업을 자동으로 수행합니다. 이 방식은 작업에 대한 깊은 이해 없이도 특정 목표를 달성할 수 있게 해 주며, 엔지니어가 각 클라우드 서비스의 복잡한 API 호출 순서나 내부 메커니즘을 모두 알 필요 없이, 목표 상태에만 집중할 수 있게 합니다.  

     

    Terraform의 선언형 모델이 제공하는 일관성, 재현성, 그리고 안정성

    Terraform의 선언형 모델은 인프라 관리에 있어 몇 가지 중요한 가치를 제공합니다.

    첫째, 일관성 및 재현성입니다. 동일한 Terraform 코드는 항상 동일한 인프라 상태를 보장합니다. 이는 수동 구성으로 인해 발생하는 환경 간의 미묘한 차이("Configuration Drift")를 원천적으로 방지합니다.

    둘째,  자동 변경 관리입니다. Terraform은 tfstate라는 상태 파일을 통해 인프라의 현재 상태를 추적하고, 구성 파일에 정의된 원하는 상태와 실제 인프라 상태를 비교함으로써 필요한 변경만을 자동으로 감지하고 수행합니다. 이 기능은 인프라가 코드의 의도와 항상 동기화되도록 보장합니다.  선언형 접근 방식은 단순한 편리함을 넘어, 인프라 관리의 인지적 복잡성을 혁신적으로 낮추는 역할을 합니다. 인프라가 복잡해질수록, 엔지니어가 수많은 리소스의 상호 의존 관계와 배포 순서를 모두 기억하고 관리하는 것은 비효율적이고 오류 발생 가능성이 높습니다. 그러나 선언형 모델에서는 인프라의 최종 모습만 정의하면 되므로, 엔지니어는 더 높은 수준의 아키텍처 설계와 비즈니스 로직에 집중할 수 있습니다. 이는 인프라 관리의 진입 장벽을 낮추고, 다양한 기술적 배경을 가진 팀원 간의 협업을 촉진하는 데 기여합니다. 결과적으로, Terraform의 선언형 모델은 기술적 복잡성을 효과적으로 관리하고, 운영 안정성을 확보하며, 팀 생산성을 향상하는 핵심적인 원리가 됩니다.

    제3장. Terraform의 생애주기: Plan-Apply-Destroy 워크플로우의 이해

    Terraform은 init, plan, apply, destroy로 구성된 명확하고 안전한 워크플로우를 제공합니다. 이 단계별 프로세스는 단순한 기술적 절차를 넘어, '책임 있는 인프라 관리'를 위한 조직적 프로세스의 근간을 형성합니다.

    terraform init: 환경 초기화 및 프로바이더 준비

    모든 Terraform 프로젝트는 terraform init 명령어로 시작됩니다. 이 명령어는 작업 디렉터리를 초기화하고, Terraform 구성 파일에 명시된 모든 프로바이더 플러그인을 다운로드하여 환경을 준비합니다. 이 단계는 Terraform이 클라우드 제공자와 통신하고 리소스를 관리하는 데 필요한 핵심 구성 요소를 갖추도록 보장합니다.  

    terraform plan: 변경 사항의 시뮬레이션 및 안전성 확보

    plan 단계는 Terraform 워크플로우의 가장 중요한 안전 장치입니다. 이 명령어는 구성 파일(원하는 상태)과 상태 파일(실제 상태)을 비교하여, apply 명령어를 실행할 경우 어떤 리소스가 생성, 변경, 또는 삭제될지 미리 보여주는 '드라이 런(dry run)' 역할을 합니다. 이 실행 계획은 인프라에 대한 실제 변경이 적용되기 전에 잠재적인 실수를 사전에 발견하고, 예기치 않은 변경 사항이 없는지 동료의 코드 리뷰를 통해 철저히 검토할 수 있는 기회를 제공합니다. plan 단계의 투명한 출력물은 인프라 변경에 대한 의사결정 과정을 시각화하고, 팀원 간의 협업과 승인 프로세스를 기술적으로 지원하여 '휴먼 에러'를 최소화하는 핵심적인 역할을 수행합니다.  

     

    terraform apply: 최종 상태로의 인프라 프로비저닝

    terraform apply는 plan 단계에서 생성된 실행 계획을 기반으로, 실제 클라우드 제공자의 API를 호출하여 인프라를 최종 상태로 변경합니다. 이 명령어는 기본적으로 사용자에게 변경 사항을 승인할지 묻는 메시지를 표시하며, 사용자가   

    yes라고 명시적으로 입력해야만 작업이 진행됩니다. 이러한 명시적인 승인 절차는 의도치 않은 변경을 막는 또 다른 안전 장치입니다. apply가 완료되면, Terraform은 tfstate 파일을 업데이트하여 인프라의 최신 상태를 반영합니다.  

     

    terraform destroy: 관리 리소스의 안전한 제거

    terraform destroy 명령어는 Terraform이 관리하는 모든 리소스를 안전하게 삭제하는 데 사용됩니다. 이 명령어는   

    plan 및 apply 워크플로우를 역으로 적용하여 인프라를 정리하며, 테스트 환경이나 개발 환경을 폐기할 때 유용합니다.

    Terraform의 워크플로우는 기술적 절차를 넘어, 인프라 변경에 대한 의사결정 과정을 시각화하고, 팀원 간의 협업과 승인 프로세스를 기술적으로 지원하는 역할을 수행합니다. 이 워크플로우는 인프라 변경의 책임이 한 개인에게만 국한되지 않고, 투명한 코드 리뷰와 자동화된 검증을 통해 팀 전체로 확장되는 '사회 기술적' 시스템을 구축하는 데 핵심적인 역할을 합니다.

    제4장. 인프라의 ‘진실의 근원(Source of Truth)’: 상태 관리(State Management)의 중요성

    tfstate 파일의 역할과 구성 요소

    Terraform의 모든 작업은 '상태(state)'에 대한 명확한 이해를 바탕으로 이루어집니다. tfstate 파일은 Terraform이 관리하는 리소스의 실제 상태에 대한 메타데이터를 저장하는 '진실의 근원(Source of Truth)' 역할을 수행합니다. 이 파일은 Terraform 구성 파일에서 선언된 리소스와 클라우드 환경에 실제로 존재하는 원격 객체를 바인딩하며, 리소스 ID, 속성, 종속성 정보를 포함하고 있습니다. tfstate 파일이 없으면 Terraform은 인프라 변경 계획을 정확하게 수립하거나 적용할 수 없습니다. 그러나 이 파일은 민감한 데이터(예: 비밀번호)를 평문으로 저장할 수 있어, 엄격한 보안 관리가 필수적입니다.  

    로컬 상태 관리의 한계와 원격 상태 관리의 이점

    기본적으로 Terraform은 terraform.tfstate 파일을 로컬 작업 디렉터리에 저장합니다. 이는 개인 프로젝트나 소규모 팀에게는 편리할 수 있으나, 팀 규모가 커지고 협업이 필요한 환경에서는 심각한 문제를 야기합니다. 로컬 상태 파일은 병합 충돌을 일으키기 쉽고, 우발적인 삭제나 손상 위험이 높으며, 팀원들이 최신 인프라 상태에 대한 공유된 시야를 확보하기 어렵게 만듭니다.  이러한 문제를 해결하기 위한 표준적인 접근법은 원격 상태 관리를 도입하는 것입니다. 이는 상태 파일을 AWS S3, Azure Blob Storage, Google Cloud Storage와 같은 중앙 집중식 객체 스토리지에 저장하는 것을 의미합니다. 이 방법은 모든 팀원이 동일한, 최신 상태에 기반하여 작업할 수 있도록 보장하며, 로컬 머신 장애로 인한 데이터 손실 위험을 방지하는 내구성을 제공합니다.  

     

    2. Terraform 설치 방법 (OS별 안내)

    Terraform는 단일 실행 파일(terraform)로 배포되며, Windows, macOS, Linux 등 다양한 OS에서 손쉽게 설치할 수 있습니다. 아래에 각 운영체제별 Terraform 설치 방법을 정리했습니다:

    • macOS: Homebrew 패키지 매니저를 이용하면 간단합니다. 터미널에서 다음 명령어를 실행하세요:
    brew tap hashicorp/tap
    brew install hashicorp/tap/terraform

     

     

          설치 후 terraform -v 명령으로 버전을 확인해 Terraform CLI가 정상 설치되었는지 점검합니다.

    • Windows: Chocolatey를 사용하는 방법과 수동 설치 방법이 있습니다. Chocolatey가 설치되어 있다면 관리자 Powershell에서 다음을 실행하세요:
    choco install terraform

     

     

    • 혹은 HashiCorp 공식 웹사이트의 다운로드 페이지에서 Windows용 ZIP 패키지를 받아 terraform.exe를 원하는 경로에 두고, 해당 경로를 PATH 환경변수에 추가해 주는 방식으로 수동 설치할 수도 있습니다.
    • Linux: 배포판별 패키지 매니저를 이용하거나 직접 바이너리를 설치할 수 있습니다. Debian/Ubuntu 계열의 경우 HashiCorp 공식 리포지토리를 추가한 뒤 apt로 설치 가능합니다. 예를 들어:
    # (공식 GPG키 및 리포지토리 추가 후)
    sudo apt-get update && sudo apt-get install terraform

     

     

    • CentOS/RHEL 계열은 yum/dnf를 통한 설치, 그 외 배포판은 terraform.zip 직접 다운로드 후 바이너리를 /usr/local/bin 등에 두는 방법 등이 있습니다.

    설치가 완료되었으면 terraform version 명령으로 버전을 출력해 보세요. Terraform은 별도의 데몬이나 서버 구성 없이 CLI 실행 파일 하나만으로 동작하므로 설치가 간단합니다. 또한 필요에 따라 tfenv 같은 Terraform 버전 관리 도구를 사용하면 여러 버전을 손쉽게 전환할 수 있습니다.

     

    Terraform 공식 다운로드 페이지 

    - https://developer.hashicorp.com/terraform/install

     

    Note: Terraform CLI는 오픈 소스로 무료 제공되며, 기업용 기능이 필요한 경우 별도로 Terraform Enterprise나 Terraform Cloud 서비스를 사용할 수 있습니다. 하지만 일반적인 IaC 작업은 CLI만으로도 충분합니다.

    3. Terraform 주요 명령어와 구성(structure) 설명

    Terraform을 효과적으로 사용하려면 CLI 명령어 활용과 구성요소 구조를 이해하는 것이 중요합니다. 이 절에서는 자주 사용하는 Terraform 명령어들과 Terraform 코드 구조를 정리합니다.

    주요 Terraform 명령어 (CLI)

    • terraform init: 현재 작업 디렉토리를 Terraform 작업 공간으로 초기화하는 명령입니다. 설정 파일에 정의된 프로바이더 플러그인을 자동으로 다운로드하고(예: AWS를 사용하면 AWS 프로바이더 다운로드), Terraform 상태 파일 관리를 위한 기본 폴더(.terraform/) 등을 설정합니다. 새로운 Terraform 프로젝트를 시작하거나 기존 코드를 클론 한 후에는 가장 먼저 terraform init을 실행해야 합니다.
    • terraform plan: 실제 리소스 변경을 적용하기 전에 예상 변경 내역(plan)을 미리 보여주는 명령입니다. 현재 상태(state)와 코드를 비교하여 추가될 리소스, 변경될 속성, 삭제될 리소스를 상세히 출력합니다. 이를 통해 사용자는 적용 전 계획을 검토하고 실수로 인프라를 망가뜨리는 일을 방지할 수 있습니다. plan 출력 결과를 파일로 저장(-out=planfile)하여 이후 apply에 활용할 수도 있습니다.
    • terraform apply: 구성 파일에 따라 실제 인프라에 변경 사항을 적용(provision)하는 명령입니다. 기본적으로 apply 실행 시 한 번 더 plan 결과를 보여준 뒤 "yes" 입력을 요구하여, 사용자가 계획된 변경을 승인하면 그제야 리소스를 생성/변경합니다. 이 과정을 통해 변경 사항을 인프라에 반영하고, 내부적으로 terraform 상태 파일도 최신 상태로 업데이트합니다. (-auto-approve 옵션을 주면 승인 단계 없이 바로 적용합니다.)
    • terraform destroy: 코드에 정의된 모든 리소스를 삭제(teardown)하는 명령입니다. 개발/테스트 환경 등을 제거할 때 유용하며, apply와 마찬가지로 실행 시 실제 삭제될 리소스 목록을 확인하고 진행합니다. 의도치 않은 삭제를 막기 위해 destroy도 승인 확인을 거치므로, 안전하게 인프라 정리를 할 수 있습니다.

    이 밖에도 terraform fmt(코드 포맷 정리), terraform validate(구문 유효성 검증), terraform import(기존 리소스를 terraform 상태로 가져오기) 등의 명령어가 있습니다. 하지만 일반적인 워크플로우에서는 init → plan → apply → (변경 시 반복) → destroy 순으로 명령어들이 사용됩니다. 이러한 일련의 과정으로 Terraform은 인프라의 생명주기를 코드로 관리하게 됩니다.

    Terraform 구성 요소와 폴더 구조

    Terraform으로 인프라 코드를 작성할 때는 보통 하나의 디렉터리 내에 여러 .tf 파일들을 작성하게 됩니다. Terraform은 동일 디렉터리의 모든 .tf 파일을 자동으로 모아 하나의 설정으로 취급하므로, 파일을 논리적으로 분리하여 구성할 수 있습니다. 예를 들어, 일반적으로 다음과 같이 파일을 구성합니다:

    terraform 폴더구조
    terraform 폴더구조

    • 메인 설정 파일: main.tf 등으로 불리며, 핵심 리소스 정의와 프로바이더 설정 등을 포함합니다.
    • 변수 정의 파일: variables.tf에 입력 변수들을 정의합니다 (변수 이름, 기본값 등).
    • 출력 정의 파일: outputs.tf에 output 값을 정의합니다 (예: 생성된 리소스의 IP나 ARN 등을 출력).
    • 테라폼 설정 파일: terraform.tfvars (선택사항)로 변수 값을 지정하거나 backend 설정을 할 수 있습니다.
    • 상태/락 파일: terraform.tfstate(상태 파일)와 .terraform.lock.hcl(프로바이더 버전 잠금) 등이 자동으로 관리됩니다.

    각 .tf 파일 내에서는 블록(block) 단위로 설정을 기술합니다. 주요 블록 유형은 다음과 같습니다:

    • 프로바이더(provider) 블록: 어떤 클라우드/서비스를 다룰지 명시하고 자격증명(credentials)이나 기본 설정을 합니다. 예를 들어 AWS를 사용한다면 provider "aws" { region = "ap-northeast-2" }처럼 AWS 프로바이더와 리전을 지정합니다. Terraform은 terraform init 시 해당 프로바이더 플러그인을 설치하고, 이후 리소스 생성 시 이 설정을 사용합니다.
    • 리소스(resource) 블록: 생성할 실제 인프라 리소스를 정의합니다. resource "<프로바이더>_<리소스타입>" "<이름>" { ... } 형태로 작성하며, 예를 들어 AWS EC2 인스턴스를 생성하려면 resource "aws_instance" "web_server" { ... }처럼 기술합니다. 블록 내부에는 해당 리소스의 속성들(예: 인스턴스 타입, 이미지 ID 등)을 지정합니다. Terraform은 리소스 블록들을 읽어 실제 클라우드에 자원을 생성하거나 업데이트합니다.
    • 변수(variable) 블록: Terraform 설정에서 사용되는 입력값을 매개변수화할 때 사용합니다. 예를 들어 여러 환경에서 공통 코드를 재사용하기 위해 variable "instance_count" { type = number; default = 2 }처럼 변수와 기본값을 정의해두고, 실제 값은 terraform.tfvars나 CLI -var 옵션으로 주입합니다. 변수를 쓰면 코드의 재사용성환경별 유연성이 높아집니다.
    • 출력(output) 블록: Terraform 실행 결과 값들을 출력하여 다른 곳에 활용하거나 사용자에게 보여주기 위해 사용합니다. 예를 들어 생성된 EC2의 IP를 출력하려면 output "ec2_ip" { value = aws_instance.web_server.public_ip }처럼 정의해 둘 수 있습니다. terraform apply 완료 후 이 output 값이 콘솔에 표시되며, terraform output 명령으로도 나중에 조회 가능합니다.
    • 모듈(module): 여러 리소스 블록을 하나의 구성으로 묶어 재사용 가능한 템플릿으로 만든 것입니다. 예를 들어 VPC 생성에 관련된 리소스들을 하나의 모듈로 빼 두고 여러 프로젝트에서 공통으로 사용할 수 있습니다. 모듈은 별도의 디렉터리에 Terraform 코드를 작성한 뒤, module "모듈이름" { source = "경로 또는 모듈등록소" ... } 형태로 불러와 사용합니다. 중급 이상 환경에서는 모듈화를 통해 코드 관리 효율을 높입니다.
    • 그 외에 데이터 소스(data) 블록이나 프로비저너(provisioner) 등 고급 개념도 있지만, 데이터 소스는 기존에 있는 외부 리소스 정보를 읽어올 때, 프로비저너는 리소스 생성 후 추가 스크립트를 실행할 때 사용합니다. 필요할 때 선택적으로 활용하면 됩니다.

    Terraform 예시 프로젝트 폴더 구조 이미지 보기

    위 이미지에서는 Terraform 코드가 폴더별 모듈로 구성된 예시를 보여줍니다. modules/ 디렉터리 아래에 VPC, EC2, RDS 등 컴포넌트별 모듈이 있고, 최상위 main.tf에서 이 모듈들을 호출하여 인프라를 구성하는 구조입니다. 이렇게 코드를 모듈화 하면 코드의 재사용성과 가독성이 높아져, 여러 환경(dev/stage/prod 등)이나 팀 간 협업 시 유용합니다.

    State 파일 관리: Terraform은 terraform.tfstate라는 상태 파일에 현재 인프라의 실제 정보를 JSON 형태로 저장합니다. 이 파일을 통해 Terraform은 드리프트 감지(코드와 실제 인프라 불일치 탐지) 및 변경 사항 계산을 수행하므로 매우 중요합니다. 팀 환경에서는 이 상태 파일을 원격 저장소(S3, GCS, Terraform Cloud 등)에 보관하고 lock을 걸어 동시 변경을 조율합니다. 상태 파일은 민감한 정보도 담길 수 있어 백업 및 보안에 특히 신경 써야 합니다.

    4. Terraform 실무 사용 사례 예시 (AWS, GCP 등)

    Terraform은 다양한 환경에서 인프라를 코드로 관리하는 데 활용되고 있습니다. AWS와 GCP를 포함한 주요 클라우드에서 Terraform을 사용하는 대표적인 실무 사례를 몇 가지 살펴보겠습니다.

    • AWS 인프라 구성 사례: Terraform은 AWS 리소스를 손쉽게 프로비저닝 하는 데 널리 쓰입니다. 예를 들어 웹 서비스 환경을 Terraform으로 코드화한다고 가정해 보겠습니다. VPC 네트워크부터 서브넷(공개/비공개), 라우팅 테이블, 인터넷 게이트웨이/ NAT 게이트웨이 설정을 코드로 정의합니다. 그리고 애플리케이션 서버용 EC2 인스턴스 2대를 오토스케일링 그룹으로 생성하고, 데이터베이스용 RDS 인스턴스를 비공개 서브넷에 생성하며, 정적 자산 호스팅을 위한 S3 버킷을 설정하는 등 2-Tier/3-Tier 아키텍처 전체를 Terraform 코드 하나로 구현할 수 있습니다. Terraform AWS 프로바이더를 통해 AWS의 거의 모든 서비스 자원을 관리할 수 있고, 필요시 IAM 사용자/롤, CloudWatch 알람, S3 백엔드 설정 등까지 모두 코드로 선언해 둡니다. 수십~수백 개의 리소스로 이루어진 복잡한 AWS 인프라도 Terraform 코드로 관리하면 변경 내역을 Git으로 추적하고, 일관된 설정을 여러 환경에 쉽게 배포할 수 있습니다.
    • GCP 인프라 구성 사례: Google Cloud Platform에서도 Terraform 활용이 활발합니다. 예를 들어 GCP에서 고가용성 웹 애플리케이션을 구축한다고 하면, VPC 네트워크와 서브넷을 정의하고, 여러 지역에 GCE VM 인스턴스를 배포하며, 관리형 DB로 Cloud SQL 인스턴스를 생성하고, 정적 콘텐츠는 Cloud Storage에 저장하는 식의 구성이 가능합니다. 이러한 GCP 리소스들도 Terraform GCP 프로바이더를 통해 코드로 정의하여 배포할 수 있습니다. Terraform은 GCP 프로젝트 생성, IAM 설정, Kubernetes(GKE) 클러스터 생성, BigQuery 세팅 등 GCP의 모든 주요 자원을 프로비저닝 할 수 있어 인프라 구축 자동화에 큰 도움이 됩니다. 예를 들어 Terraform 코드 한 세트로 AWS EC2와 유사한 GCP VM 인스턴스를 생성하고, 각 플랫폼별 차이만 변수로 처리하여 멀티클라우드에 걸친 일관된 인프라 환경을 만드는 것도 가능합니다.
    • 멀티클라우드 및 기타 활용: Terraform의 최대 강점은 멀티클라우드 및 하이브리드 클라우드 시나리오입니다. 한 조직에서 AWS와 GCP를 동시에 사용하면서 Terraform을 도입하면, 하나의 IaC 툴로 두 환경을 모두 관리할 수 있습니다. 예를 들어 Terraform 모듈로 공통 인프라 패턴을 만들어 AWS용, GCP용에 각각 적용하되, 개발자는 Terraform 문법만 익히면 되므로 학습 비용이 줄어듭니다. 또한 Terraform은 On-Prem 환경에서도 VMware vSphere 리소스 관리, OpenStack 자원 관리 등에 활용되며, Kubernetes 클러스터 상의 리소스까지 관리할 수 있는 Provider도 제공됩니다. 이처럼 Terraform은 인프라 플랫폼 전반을 아우르는 통합 자동화 도구로서 실무에서 광범위하게 쓰입니다.

    AWS 예시 아키텍처 다이어그램 이미지 보기

    (상단 다이어그램은 AWS VPC 내에 다중 AZ에 걸친 웹-DB 2 티어 아키텍처 예시를 보여줍니다. Terraform으로 이러한 구성을 코드 한 벌로 자동 생성할 수 있습니다.)

    뿐만 아니라, Terraform은 CI/CD 파이프라인과 연계하여 GitOps 방식으로도 많이 활용됩니다. 예를 들어 코드가 변경되면 자동으로 terraform plan을 실행해 변경 내역을 검토하고, 승인되면 terraform apply로 프로덕션에 배포하는 식입니다. 이를 통해 인프라 변경 프로세스에 코드 리뷰자동화를 도입하여 안정성과 협업 효율을 높이고 있습니다.

    5. Terraform FAQ (자주 묻는 질문)

    Q1. Terraform은 무엇이고 왜 필요한가요?
    A. Terraform은 인프라를 코드로 관리(IaC) 하기 위한 도구로, 수동으로 콘솔에서 클릭하며 인프라를 만드는 대신 코드로 선언하고 자동으로 프로비저닝할 수 있게 해줍니다. 이를 통해 인프라 설정을 버전 관리하고 반복적으로 재사용할 수 있으며, 사람에 의한 오류를 줄이고 대규모 환경을 효율적으로 관리할 수 있습니다. 멀티클라우드 환경을 단일 도구로 관리할 수 있다는 점도 Terraform의 큰 가치입니다.

     

    Q2. Terraform은 무료인가요?
    A. 네, Terraform CLI는 오픈 소스로 무료입니다. HashiCorp에서 제공하는 공식 바이너리를 설치하여 누구나 사용할 수 있습니다. 다만 HashiCorp에서 제공하는 상용 서비스인 Terraform Cloud/Enterprise는 협업 기능이나 정책 강화 기능 등 부가 가치를 제공하며 유료 플랜이 있습니다. 하지만 순수 인프라 코드 관리 자체는 Terraform CLI만으로도 충분하며, 오픈 소스 에디션으로 제약 없이 사용 가능합니다.

     

    Q3. Terraform으로 여러 클라우드(Multi-Cloud)를 동시에 관리할 수 있나요?
    A. 가능합니다. Terraform은 AWS, Azure, GCP를 비롯한 다양한 클라우드 프로바이더에 대한 플러그인을 제공하므로, 한 Terraform 구성에서 다수의 프로바이더를 선언하고 동시에 자원을 관리할 수 있습니다. 예를 들어 동일한 Terraform 코드에서 AWS EC2 인스턴스와 GCP VM 인스턴스를 각각 생성하도록 정의하고, provider "aws"와 provider "google" 블록을 함께 설정할 수 있습니다. Terraform은 각 프로바이더별로 병렬로 작업을 수행하여 멀티클라우드 인프라를 한 번에 구축해줍니다. 이처럼 Terraform은 멀티클라우드 관리에 유연하며, 클라우드 간 일관된 IaC 워크플로우를 구현할 수 있습니다.

     

    Q4. Terraform의 상태 파일(tfstate)은 무엇이고 왜 중요한가요?
    A. 상태 파일(tfstate)은 Terraform이 관리하는 인프라의 현재 상태를 저장하는 내부 데이터입니다. 여기에 리소스의 ID, 구성 값 등이 기록되어 있어 Terraform이 코드상의 원하는 상태와 대조하여 변경사항을 계산합니다. 만약 상태 파일이 없다면 Terraform은 리소스 존재 여부를 알 수 없기 때문에, 항상 모든 자원을 새로 만들려고 시도할 것입니다. 따라서 상태 파일은 Terraform의 싱글 소스 오브 트루스(Single Source of Truth)로서 매우 중요합니다. 협업 환경에서는 이 파일을 원격에 저장하여 (예: S3 + DynamoDB 락, Terraform Cloud 등) 여러 사람이 동시에 Terraform을 실행해도 충돌 없도록 관리합니다. 상태 파일이 유실되거나 손상되면 Terraform 관리 하에 있는 인프라 추적에 문제가 생기므로, 백업과 보안에 각별히 신경 써야 합니다.

     

    Q5. Terraform과 CloudFormation 등의 다른 IaC 도구와의 차이점은 무엇인가요?
    A. Terraform vs CloudFormation: AWS CloudFormation은 AWS 전용 IaC 서비스이고, Terraform은 멀티클라우드를 지원한다는 큰 차이가 있습니다. Terraform은 다양한 클라우드를 하나의 문법으로 다룰 수 있는 반면 CloudFormation은 AWS 리소스만 템플릿(YAML/JSON)으로 관리합니다. 또한 Terraform은 개발사와 커뮤니티가 함께 프로바이더를 만들어 생태계가 매우 넓은 반면, CloudFormation은 AWS 내 자원 위주로 지원됩니다.
    Terraform vs Ansible: Ansible은 설정 관리(Configuration Management) 도구로 주로 서버에 소프트웨어를 설치하거나 설정을 조정하는 데 쓰이고, Terraform은 인프라 프로비저닝(가상머신, 네트워크 등 자원 생성)에 특화되어 있습니다. Ansible은 절차적(tasks)이고 에이전트리스 SSH 기반인 반면 Terraform은 선언형이고 클라우드 API를 활용합니다. 둘은 상호 보완적으로, Terraform으로 인프라를 만들고 Ansible로 서버 세팅을 하는 식으로 함께 사용하기도 합니다. Terraform vs Pulumi: Pulumi는 비교적 신생 IaC 도구로, 익숙한 프로그래밍 언어(Py, TS, Go 등)로 인프라를 코드화한다는 점이 Terraform(HCL 사용)과 다릅니다. Pulumi는 개발자 친화적인 언어 사용이 장점이지만, Terraform은 전통적 선언형 IaC 접근과 거대한 모듈/프로바이더 생태계의 안정성이 강점입니다. 이 외에도 CDK for Terraform, Terragrunt 등의 도구가 있으나, Terraform은 광범위한 프로바이더 지원과 오랜 기간 검증된 안정성으로 IaC 표준에 가깝게 자리잡고 있습니다.


    이상으로 Terraform의 개념부터 설치, 활용법까지 살펴보았습니다. Terraform을 통한 IaC는 초기 학습 곡선은 조금 있을 수 있지만, 한 번 도입하면 인프라 관리에 탁월한 효율성과 안정성을 가져다줍니다. 기존에 수작업으로 운영되던 클라우드 자원들을 코드로 관리하며, 변경 이력을 투명하게 남기고, 동일한 구성을 손쉽게 여러 환경에 복제 배포할 수 있는 Terraform의 위력을 경험해보시기 바랍니다. 여러분의 인프라를 Terraform으로 안전하고 자동화된 방식으로 관리하여, 클라우드 운영의 생산성을 한 단계 높여보세요!