개요
IaC (Infrastructure as Code)는 서버, 네트워크, 데이터베이스 등 인프라를 코드로 정의하고 관리하는 방식입니다. 수동 설정 대신 선언적/명령적 코드로 인프라를 자동 프로비저닝합니다.
핵심 개념
| 개념 | 설명 |
|---|
| 선언적(Declarative) | “원하는 상태”를 정의 → 도구가 현재 상태와 비교하여 적용 (Terraform, Pulumi) |
| 명령적(Imperative) | “실행할 단계”를 순서대로 정의 (Ansible, 스크립트) |
| 멱등성(Idempotent) | 같은 코드를 여러 번 실행해도 결과 동일 |
| 상태 관리(State) | 현재 인프라 상태를 파일로 추적 (Terraform state) |
| 드리프트 감지 | 코드와 실제 인프라 차이 자동 감지 |
주요 도구
| 항목 | 내용 |
|---|
| 개발 | HashiCorp |
| 언어 | HCL (HashiCorp Configuration Language) |
| 유형 | 선언적, 프로비저닝 |
| 지원 | AWS, GCP, Azure, K8s 등 3,000+ 프로바이더 |
| 라이선스 | BSL 1.1 (2023~ 오픈소스→소스공개) |
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t3.micro"
tags = { Name = "web-server" }
}
장점: 사실상 IaC 표준, 거대한 생태계, 멀티클라우드
단점: HCL 학습 필요, 상태 파일 관리, BSL 라이선스 변경 논란
OpenTofu
| 항목 | 내용 |
|---|
| 핵심 | Terraform의 오픈소스 포크 (Linux Foundation) |
| 호환 | Terraform 1.5 호환, HCL 동일 |
- Terraform BSL 라이선스 변경에 대한 커뮤니티 응답
- Terraform 코드 그대로 사용 가능 (
terraform → tofu 명령어 변경)
Pulumi
| 항목 | 내용 |
|---|
| 핵심 | 프로그래밍 언어로 IaC (HCL 대신 Python/TypeScript/Go/C#) |
| 유형 | 선언적, 프로비저닝 |
| 지원 | AWS, GCP, Azure, K8s 등 |
import pulumi_aws as aws
server = aws.ec2.Instance("web",
instance_type="t3.micro",
ami="ami-0c55b159cbfafe1f0",
tags={"Name": "web-server"}
)
장점: 기존 언어 사용 (조건문, 루프, 함수), IDE 자동완성, 테스트 가능
단점: Terraform 대비 작은 생태계, 상태 관리 (Pulumi Cloud 또는 S3)
Ansible
| 항목 | 내용 |
|---|
| 개발 | Red Hat |
| 언어 | YAML (Playbook) |
| 유형 | 명령적, 구성 관리 (Configuration Management) |
| 에이전트 | 에이전트리스 (SSH) |
- hosts: webservers
tasks:
- name: Install nginx
apt: name=nginx state=present
- name: Start nginx
service: name=nginx state=started
장점: 에이전트 불필요 (SSH만), 학습 쉬움, 서버 구성 관리 강점
단점: 대규모에서 느림, 선언적이지 않음, 드리프트 감지 약함
기타
| 도구 | 특징 |
|---|
| AWS CloudFormation | AWS 전용 IaC (JSON/YAML), AWS CDK (프로그래밍 언어) |
| AWS CDK | TypeScript/Python으로 CloudFormation 생성 |
| Crossplane | K8s CRD로 클라우드 리소스 관리 (GitOps 호환) |
| Chef | Ruby 기반 구성 관리 (에이전트 방식) |
| Puppet | 선언적 구성 관리 (에이전트 방식) |
| SaltStack | Python 기반, 이벤트 드리븐 |
| Vagrant | 로컬 VM 프로비저닝 (개발 환경) |
도구 분류
[프로비저닝] [구성 관리]
인프라 생성/삭제 서버 내부 설정
Terraform / OpenTofu Ansible
Pulumi Chef
CloudFormation / CDK Puppet
Crossplane SaltStack
- 프로비저닝: “서버를 만든다” (EC2 인스턴스, VPC, RDS 생성)
- 구성 관리: “서버를 설정한다” (nginx 설치, 설정 파일 배포)
- 실무: Terraform (프로비저닝) + Ansible (구성 관리) 조합이 일반적
비교
| 도구 | 유형 | 언어 | 멀티클라우드 | 상태 관리 | 난이도 |
|---|
| Terraform | 프로비저닝 | HCL | 최강 | 있음 | 중간 |
| OpenTofu | 프로비저닝 | HCL | 최강 | 있음 | 중간 |
| Pulumi | 프로비저닝 | Python/TS/Go | 강함 | 있음 | 중간 |
| Ansible | 구성 관리 | YAML | O | 없음 | 낮음 |
| CloudFormation | 프로비저닝 | JSON/YAML | AWS 전용 | AWS 관리 | 중간 |
| Crossplane | 프로비저닝 | K8s YAML | O | K8s | 높음 |
선택 가이드
| 상황 | 추천 |
|---|
| 멀티클라우드 | Terraform or OpenTofu |
| 개발자가 HCL 싫어함 | Pulumi (Python/TS) |
| AWS 전용 | CloudFormation or AWS CDK |
| 서버 내부 설정 | Ansible |
| K8s GitOps | Crossplane + ArgoCD |
| 오픈소스 중요 | OpenTofu |
관련 항목