DevOps

[DevOps] IaC 정리

teddy bear 2026. 7. 2. 11:41
반응형

🏗️ Infrastructure as Code: Terraform, Ansible, Pulumi 비교

"서버를 클릭으로 만들지 말고, 코드로 선언하라."

Infrastructure as Code(IaC)는 서버, 네트워크, 데이터베이스 같은 인프라를 코드로 정의하고 관리하는 방식입니다. 콘솔에서 클릭하며 리소스를 만들던 시절과 달리, IaC는 버전 관리, 재현성, 리뷰 프로세스를 인프라에도 적용할 수 있게 해줍니다.


📌 목차

  1. IaC가 필요한 이유
  2. Terraform
  3. Ansible
  4. Pulumi
  5. 세 도구의 근본적 차이
  6. 무엇을 선택할까

1️⃣ IaC가 필요한 이유

콘솔 클릭으로 인프라를 구성하면 다음과 같은 문제가 생깁니다.

  • 누가 언제 무엇을 바꿨는지 추적 불가
  • 같은 환경을 다시 만들려면 수작업 재현
  • 실수로 리소스를 삭제해도 되돌릴 방법이 없음

IaC는 이 모든 걸 코드로 관리해 Git으로 추적하고, PR 리뷰를 거치고, plan으로 변경 사항을 미리 확인할 수 있게 합니다.


2️⃣ Terraform

HashiCorp가 만든 선언적(Declarative) IaC 도구로, 클라우드 프로바이더에 관계없이 동일한 문법(HCL)을 사용합니다.

resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t3.micro"

  tags = {
    Name = "web-server"
  }
}

동작 흐름

terraform init   ──▶  프로바이더 플러그인 설치
terraform plan   ──▶  변경 사항 미리보기
terraform apply  ──▶  실제 인프라에 반영
terraform destroy──▶  리소스 삭제

핵심 특징

  • State 파일로 현재 인프라 상태를 추적 (terraform.tfstate)
  • AWS, GCP, Azure는 물론 수백 개의 프로바이더 지원
  • plan 단계에서 "무엇이 바뀌는지"를 미리 확인할 수 있어 안전함

⚠️ 주의: State 파일은 민감 정보를 포함할 수 있어 S3 + DynamoDB Lock 같은 원격 백엔드로 관리하는 것이 실무 표준입니다.


3️⃣ Ansible

Agentless 구성 관리 도구입니다. SSH만으로 원격 서버에 접속해 설정을 적용하기 때문에 별도 에이전트 설치가 필요 없습니다.

- hosts: webservers
  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present

    - name: Start nginx
      service:
        name: nginx
        state: started

Terraform과의 역할 차이

TerraformAnsible

주 목적 인프라 프로비저닝 (서버 생성/삭제) 서버 내부 설정 (패키지 설치, 파일 배치)
상태 관리 State 파일로 추적 기본적으로 상태 비저장(멱등성으로 보완)
비유 건물을 짓는다 건물 내부에 가구를 배치한다

실무에서는 종종 Terraform으로 서버를 만들고, Ansible로 그 안을 설정하는 조합을 사용합니다.


4️⃣ Pulumi

Terraform과 목적은 같지만, HCL 대신 Python, TypeScript, Go 같은 범용 프로그래밍 언어로 인프라를 정의합니다.

import * as aws from "@pulumi/aws";

const server = new aws.ec2.Instance("web", {
    ami: "ami-0c55b159cbfafe1f0",
    instanceType: "t3.micro",
});

export const publicIp = server.publicIp;

장점

  • 반복문, 조건문, 함수 등 프로그래밍 언어의 기능을 그대로 활용
  • 기존 개발자라면 새로운 문법(HCL)을 배울 필요 없음
  • 타입 체크, IDE 자동완성의 이점

단점

  • Terraform보다 생태계와 커뮤니티 자료가 상대적으로 적음
  • "너무 많은 자유도"가 오히려 일관성을 해칠 수 있음

5️⃣ 세 도구의 근본적 차이

Terraform  : 선언적 문법(HCL) + State 관리      → "무엇을" 만들지 선언
Pulumi     : 선언적 목적 + 범용 언어 문법        → 코드로 "무엇을" 선언
Ansible    : 절차적 실행 + Agentless SSH        → "어떻게" 설정할지 순서대로 지시

6️⃣ 무엇을 선택할까

상황추천

클라우드 리소스(VPC, EC2, RDS 등) 관리 Terraform
이미 만들어진 서버 내부 설정/배포 자동화 Ansible
프로그래밍 언어로 인프라를 다루고 싶음 Pulumi
둘 다 필요한 실무 환경 Terraform(프로비저닝) + Ansible(설정) 조합

💡 학습 순서 추천: Terraform으로 IaC의 개념(선언적 관리, plan/apply)을 먼저 익히고, 이후 Ansible로 애플리케이션 배포 자동화까지 확장하는 것을 권장합니다.


🔚 마무리

IaC는 단순히 "스크립트를 코드로 옮기는 것"이 아니라, 인프라 변경에 리뷰, 추적, 재현성이라는 소프트웨어 엔지니어링의 기본 원칙을 적용하는 것입니다. 작은 프로젝트라도 Terraform 하나만 익혀두면 실무에서 바로 활용할 수 있습니다.