Terraform - IaC

김재근·2025년 4월 10일

IaC

목록 보기
1/7
post-thumbnail

IaC(Infrastructure as Code)란?

인프라스트럭처 코드화(IaC)는 인프라를 수동으로 구성하는 대신 코드를 통해 정의, 배포, 관리하는 방법론이다.
서버, 네트워크, 로드 밸런서, 스토리지 등의 인프라를 코드로 작성함으로써 다음과 같은 이점을 얻을 수 있다.

  • 일관성: 동일한 코드로 항상 동일한 환경 구성
  • 버전 관리: Git과 같은 도구를 사용한 인프라 변경 이력 추적
  • 자동화: 인프라 배포 및 변경의 자동화
  • 확장성: 코드 재사용으로 인프라 확장 용이
  • 협업: 개발자와 운영팀 간 효율적인 협업 가능

테라폼(Terraform) 소개

테라폼은 HashiCorp에서 개발한 오픈소스 IaC 도구로, 클라우드 및 온프레미스 인프라를 코드로 관리할 수 있게 해준다. 선언적 구성 파일을 통해 인프라 상태를 정의하고, 테라폼이 그 상태를 달성하기 위한 실행 계획을 생성하고 적용한다.

테라폼이 인기 있는 이유

  • 클라우드 중립성: AWS, Azure, GCP, 알리바바 클라우드 등 다양한 클라우드 제공자 지원
  • 선언적 구문: 인프라의 "원하는 상태"를 선언하면 테라폼이 실현
  • 상태 관리: 배포된 인프라의 상태를 추적하고 관리
  • 종속성 관리: 리소스 간 종속성을 자동으로 파악
  • 모듈화: 재사용 가능한 인프라 구성요소 생성 가능

테라폼의 핵심 구성 요소

Provider

프로바이더는 테라폼이 특정 인프라 서비스와 상호작용할 수 있게 해주는 플러그인이다. AWS, Azure, GCP와 같은 클라우드 제공자뿐만 아니라 DNS 제공자나 모니터링 서비스 등 다양한 서비스를 지원한다.

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-2"
}

Resource

리소스는 인프라의 구성요소(EC2 인스턴스, S3 버킷, VPC 등)를 정의한다. 각 리소스는 유형과, 해당 유형에 필요한 설정 값을 가진다.

resource "aws_instance" "web_server" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  tags = {
    Name = "WebServer"
  }
}

State

테라폼은 관리하는 인프라의 현재 상태를 "상태 파일"(보통 terraform.tfstate)에 저장한다. 이 파일은 테라폼이 어떤 리소스를 생성했고, 그 속성은 무엇인지 추적하는 데 사용된다. 상태 파일은 테라폼이 변경 사항을 계획하고 적용할 때 참조된다.

Output

아웃풋은 테라폼 실행 후 특정 값을 반환하도록 설정할 수 있다. 웹 서버의 IP 주소나 데이터베이스 엔드포인트와 같은 정보를 출력하는 데 유용하다.

output "server_ip" {
  value = aws_instance.web_server.public_ip
  description = "The public IP address of the web server"
}

Module

모듈은 재사용 가능한 테라폼 코드 패키지다. 인프라의 특정 부분(네트워크 구성, 데이터베이스 클러스터 등)을 모듈화하여 여러 프로젝트에서 재사용할 수 있다.

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "3.0.0"

  name = "my-vpc"
  cidr = "10.0.0.0/16"
  
  azs             = ["ap-northeast-2a", "ap-northeast-2c"]
  private_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
  public_subnets  = ["10.0.101.0/24", "10.0.102.0/24"]
}

Remote Backend

원격 백엔드는 상태 파일을 로컬이 아닌 원격 위치(S3, Terraform Cloud 등)에 저장한다. 이를 통해 팀이 공유 상태 파일에 접근하고, 상태 잠금 메커니즘을 활용할 수 있다.

terraform {
  backend "s3" {
    bucket = "terraform-state-bucket"
    key    = "project/terraform.tfstate"
    region = "ap-northeast-2"
    dynamodb_table = "terraform-locks"
    encrypt = true
  }
}

테라폼의 동작 방식

테라폼은 다음과 같은 워크플로우로 동작한다

  1. 초기화 (terraform init)
    • 테라폼 프로젝트를 초기화합니다. 이 단계에서 필요한 프로바이더 플러그인을 다운로드하고, 백엔드를 설정하며, 모듈을 설치한다.
  2. 계획 (terraform plan)
    • 현재 상태와 원하는 상태를 비교하여 실행 계획을 생성합니다. 이 단계에서는 어떤 변경이 이루어질지 미리 확인할 수 있다.
  3. 적용 (terraform apply)
    • 실행 계획을 실제 인프라에 적용합니다. 이 단계에서 리소스가 생성, 수정 또는 삭제된다.
  4. 파기 (terraform destroy)
    • 테라폼으로 생성된 모든 인프라를 제거한다.

테라폼의 핵심 특징

선언적 접근 방식

테라폼은 "어떻게"가 아닌 "무엇"을 정의하는 선언적 코드를 사용한다. 즉, 원하는 최종 상태를 정의하면 테라폼이 그것을 실현하기 위한 단계를 결정한다.

상태 추적 및 드리프트 감지

테라폼은 상태 파일을 통해 인프라의 현재 상태를 추적한다. 이를 통해 수동 변경으로 인한 "드리프트"(의도하지 않은 차이)를 감지하고 수정할 수 있다.

종속성 관리

테라폼은 리소스 간 종속성을 자동으로 감지하고, 올바른 순서로 생성 및 파기한다. 예를 들어, VPC가 생성된 후에야 그 안에 서브넷을 만들 수 있다.

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "example" {
  vpc_id     = aws_vpc.main.id  # 자동으로 VPC 생성 후 서브넷 생성
  cidr_block = "10.0.1.0/24"
}

멱등성(Idempotency)

동일한 테라폼 코드를 여러 번 적용해도 결과는 동일하다. 테라폼은 이미 원하는 상태인 리소스는 건드리지 않는다.


테라폼 활용

다중 환경 관리

변수와 환경별 구성 파일을 사용하여 개발, 스테이징, 프로덕션 환경을 관리할 수 있다.

# variables.tf
variable "environment" {
  description = "Deployment environment"
  type        = string
}

# dev.tfvars
environment = "dev"

# prod.tfvars
environment = "prod"

CI/CD 파이프라인 통합

테라폼을 CI/CD 파이프라인에 통합하여 인프라 변경을 자동화할 수 있다.

# 예: GitHub Actions 
jobs:
  terraform:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: hashicorp/setup-terraform@v1
      - run: terraform init
      - run: terraform plan
      - run: terraform apply -auto-approve

모듈 활용을 통한 재사용성

공통 인프라 패턴을 모듈로 만들어 재사용할 수 있다.


테라폼은 현대 인프라 관리의 핵심 도구로, 코드를 통한 인프라 관리의 장점을 극대화한다.
클라우드 중립성, 선언적 구문, 강력한 상태 관리 기능을 통해 인프라 관리를 간소화하고,
더 안정적이고 재현 가능한 배포를 가능하게 한다.

profile
FullStack + DevOps 개발자입니다.

0개의 댓글