Infrastructure as Code (인프라스트럭처 애즈 코드)
⚠️ 이 문서는 인프라 자원을 코드로서 선언하고 관리하는 IaC(Infrastructure as Code)의 철학적 배경, 핵심 원칙, 구현 접근법(선언형 vs 명령형), 그리고 Terraform, Ansible 등 주요 도구와의 관계에 대한 체계적 분석입니다.
핵심 인사이트 (3줄 요약)
- 본질: IaC는 서버, 네트워크, 스토리지 등 인프라 자원을 수동 클릭(Console)이나 셸 스크립트가 아닌, 선언적(Declarative) 코드(YAML, HCL, JSON 등)로 정의하고, 버전 관리(Git)하며, 자동화된 파이프라인을 통해 프로비저닝하는 실천법입니다.
- 가치: 수동 인프라 관리는 "어떤 서버에 어떤 설정이 적용되었는지 아무도 모른다"는 구성 편류(Configuration Drift)를 야기하며, IaC는 이러한 편류를防止하고 인프라의auditing과Reproducibility를 가능케 합니다.
- 확장: IaC는 단순한 VM 프로비저닝을 넘어, 쿠버네티스 클러스터, 네트워크 정책, 시크릿, 그리고モダン에는 policy as code(OPA)와 결합하여 보안 정책까지 코드로 enforcement하는 방향으로 진화하고 있습니다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
1. IaC 없는 인프라 관리의問題
┌──────────────────────────────────────────────────────────────────────────────┐
│ [ IaC가解決하는 4대 문제 ] │
│ │
│ 문제 1: Configuration Drift (구성 편류) │
│ ────────────────────────────────────────────── │
│ 개발자 A: 프로덕션 서버 SSH 접속 → nginx.conf 수정 → 적용 │
│ 개발자 B: 다른 개발자 접근 → 또 다른 수정 │
│ 결과: 서버마다 서로 다른 설정 → "이 서버는 어떤 설정이 적용되어 있지?" │
│ │
│ 문제 2: 재현 불가능한 인프라 │
│ ────────────────────────────────────────────── │
│ "3개월 전에 만든 환경과 동일한 환경을 만들어주세요" → 불가능 │
│ (설정 변경 히스토리가 없음, 수동 작업이기 때문에) │
│ │
│ 문제 3: 감사(Audit) 불투명 │
│ ────────────────────────────────────────────── │
│ 보안 감사: "작년 6월的这个 서버의 설정이 어떻게 되でしたか?" │
│ → 답: "아마도... 아는 사람이 없어요..." │
│ │
│ 문제 4: 인간적 실수 (Human Error) │
│ ────────────────────────────────────────────── │
│ 深夜凌晨 3시 서버 provisioning → 실수로 프로덕션에 잘못 적용 │
│ → 서비스 장애 4시간, 대응 인력 10명 소요 │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
2. IaC 발전 과정
┌──────────────────────────────────────────────────────────────────────────────┐
│ [ IaC 발전 과정 ] │
│ │
│ 1990년대 2000년대 초반 2010년대 2020년대 │
│ ──────── ─────────── ──────── ──────── │
│ │
│ 수동 provisioning 펀치 카드/스크립트 IaC 도구 등장 IaC 표준화 │
│ (인력 직접 접속) (반 자동화) Terraform, Ansible Terraform │
│ │ │ │ CDK8s │
│ 모든 것이 수동 일관성 없음 선언형 코드 Policy as │
│ 히스토리 없음 반복 불가능 버전 관리 가능 Code 확장 │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
3. IaC와 모범 개발 사례의 비교
┌──────────────────────────────────────────────────────────────────────────────┐
│ [ Infrastructure as Code의 본질: 소프트웨어 개발의 원칙 적용 ] │
│ │
│ 전통적 인프라 관리 IaC 적용 후 │
│ ──────────────────── ──────────────────── │
│ 수동 클릭으로 서버 생성 → Terraform/HCL 코드로 정의 │
│ 대화형 셸로 설정 적용 → Ansible Playbook로 자동화 │
│ 문서化的 절차 → 코드 자체가 문서 │
│ 배포 담당자 별도 교육 → Git 통해所有人都可 查看/理解 │
│ 실수 시 수동 롤백 → git revert로 코드 롤백 │
│ │
│ 핵심 원칙: "모든 것은 코드이며, 코드는 Git으로 관리된다" │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
- 📢 섹션 요약 비유: IaC는 "建筑 설계도"와 같습니다. 과거 건축업자는 현장에서 목수/기능工에게 직접 지시하며 ("여기 기둥을 세워라") building을 constructed했습니다. 하지만 설계도( IaC )를 그리면, 누구가 언제 같은 건물을 지어도 동일한 구조가 보장되고,万一問題가 발생하면 설계도를 检查해不合理한 부분을 파악할 수 있습니다. 또한 "3개월 전에 지은 같은 건물을其他地方에도一模一样으로 지어라"라는 요구에 설계도만 있으면即座에 가능해집니다. 수동 현장 관리에서는 불가능했던 "동일한 환경의再現"이 설계도(IaC)만으로 가능해집니다.
Ⅱ. 핵심 아키텍처 및 원리 (Architecture & Mechanism)
1. 선언형 vs 명령형 접근법 비교
┌──────────────────────────────────────────────────────────────────────────────┐
│ [ 선언형 (Declarative) vs 명령형 (Imperative) ] │
│ │
│ [선언형 (Declarative) - Terraform, Pulumi, CloudFormation] │
│ ──────────────────────────────────────────────────── │
│ │
│ "결과는 이렇습니다: 3대의 Ubuntu 서버, 각 4 core CPU, 8GB RAM" │
│ → 코드는 원하는最終結果のみを定義 │
│ → 도구가 현재 상태와 목표 상태 사이의 차이를 계산하고 적용 │
│ │
│ 코드 예시 (Terraform): │
│ resource "aws_instance" "web" { │
│ count = 3 │
│ ami = "ami-12345" │
│ instance_type = "t3.medium" │
│ tags = { Name = "web-server" } │
│ } │
│ │
│ ──────────────────────────────────────────────────── │
│ │
│ [명령형 (Imperative) - Ansible, Chef, 셸 스크립트] │
│ ──────────────────────────────────────────────────── │
│ │
│ "이렇게 하세요: 1) ami-12345으로 인스턴스 생성, 2) ubuntu 유저 추가, │
│ 3) nginx 설치, 4) nginx.conf 복사, 5) systemd 활성화" │
│ → 단계별 명령어 나열 │
│ → 현재 상태는 중요하지 않고, 명시된 命令 순서만 执行 │
│ │
│ 코드 예시 (Ansible): │
│ - name: Create EC2 instances │
│ ec2: │
│ count: 3 │
│ image: ami-12345 │
│ instance_type: t3.medium │
│ - name: Install nginx │
│ apt: │
│ name: nginx │
│ state: present │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
2. IaC 도구 분류 매트릭스
┌──────────────────────────────────────────────────────────────────────────────┐
│ [ IaC 도구 분류 ] │
│ │
│ 프로비저닝 (Resource 생성) 구성 관리 (설정 적용) │
│ ─────────────────────── ────────────────────── │
│ │
│ 선언형 Terraform (HCL) Pulumi (编程语言) │
│ CloudFormation (JSON/YAML) CDK for Terraform (TypeScript) │
│ │
│ 명령형 - Ansible Playbook (YAML) │
│ - Chef Cookbook (Ruby) │
│ - Puppet Manifest (Ruby DSL) │
│ │
│ 특수 목적 Vagrant (개발 환경) - │
│ Packer (이미지 베이킹) - │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
3. Terraform 프로바이더 플러그인 아키텍처
┌──────────────────────────────────────────────────────────────────────────────┐
│ [ Terraform 아키텍처 ] │
│ │
│ ┌─────────────────────┐ │
│ │ Terraform CLI │ │
│ │ (Plan, Apply) │ │
│ └──────────┬──────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ Terraform Core │ │
│ │ (State Manager) │ │
│ └──────────┬──────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ Provider Plugin │ │
│ │ (AWS, GCP, Azure, │ │
│ │ Kubernetes...) │ │
│ └──────────┬──────────┘ │
│ │ │
│ ┌───────────────────────┼───────────────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ AWS │ │ GCP │ │ Azure │ │
│ │API │ │ API │ │ API │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
Ⅲ. 비교 및 기술적 트레이드오프 (Comparison & Trade-offs)
Terraform vs Ansible vs Pulumi 비교
| 구분 | Terraform | Ansible | Pulumi |
|---|---|---|---|
| 유형 | 프로비저닝專門 (선언형) | 구성 관리專門 (명령형) | 일반 프로그래밍 언어 |
| 언어 | HCL (HashiCorp Config) | YAML (Playbook) | TypeScript, Python, Go, C# |
| 상태 관리 | State 파일 필수 (백엔드 저장) | State 없음 (실행 시 마다 현재 상태 파악) | State 파일 또는 백엔드 |
| 학습 곡선 | 중간 | 낮음 (YAML 친숙) | 높음 (프로그래밍 언어 숙련도 필요) |
| 디버깅 | Plan 결과물로 예측 | 직접 실행하며 디버깅 | 일반적인 IDE 디버깅 |
| 취약점 | State 파일 관리 부담, 내부矛盾 가능 | Idempotency 보장,但不直观 | 코드 품질 보장 어려움 |
| 강점 | 멀티 클라우드, 프로바이더 생태계 | 설정 관리, 기존 서버 적용 | 프로그래밍 언어의 표현력 |
| 적합 업무 | 초기 인프라 프로비저닝 | 기존 서버 설정 변경/관리 | 복잡한 로직이 포함된 IaC |
Terraform State 관리 전략
┌──────────────────────────────────────────────────────────────────────────────┐
│ [ Terraform State 관리 5대 원칙 ] │
│ │
│ 1. State 파일은 격리된 환경에서 관리 │
│ → 환경별 (dev, staging, prod) 별도 State │
│ → backend (S3 + DynamoDB, GCS, Azure Blob) 사용 │
│ │
│ 2. State 파일은 버전 관리하지 않음 (Git에 올리지 말 것) │
│ → 민감 정보(암호 등)가 포함될 수 있음 │
│ → 원격 백엔드만 사용 │
│ │
│ 3. State 잠금 (Locking) 필수 │
│ → 동시 apply 방지 (DynamoDB, Consul 등으로 잠금) │
│ │
│ 4. State 분리 (State Splitting) │
│ → 대규모 인프라 → 환경별로 분리하여 관리 │
│ → 예: network.tfstate, database.tfstate, apps.tfstate │
│ │
│ 5. State 드리프트 감지 (Drift Detection) │
│ → terraform plan로 실제 상태와 코드 상태 차이 파악 │
│ → driftr报告显示 → 인프라 불일치 경고 │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
- 📢 섹션 요약 비유: Terraform State는 "항목 대한ereal_estate 등록정보"와 같습니다.法務局에 등록된 정보( State )와 실제 땅의 상황(실제 인프라)이 일치해야 합니다.万一 누군가 현장에서 무단으로 땅을 使用하면( Configuration Drift ), 등급 정보( State )와 실제 현황이 불일치하여 문제가 발생합니다. Terraform은 이러한 불일치를 탐지( terraform plan )하고, 등급 정보( State )를更新하여 실제 현황과 일치시키는 역할을 합니다. 중요한 것은 등급 정보( State )를 안전한 곳(원격 백엔드)에 보관하고, 동시에 여러 사람이 수정하지 못하도록 잠금( Locking ) 기능을 사용해야 합니다.
Ⅳ. 실무 판단 기준 (Decision Making)
IaC 도구 선택 가이드
| 상황 | 권장 IaC 도구 | 이유 |
|---|---|---|
| 멀티 클라우드 프로비저닝 | Terraform | 1,000+ 프로바이더로跨 클라우드 지원 |
| 기존 서버 설정 관리 | Ansible | 에이전트 불필요, SSH만으로 동작 |
| 복잡한 인프라 로직 | Pulumi | 일반 프로그래밍 언어의 모든 기능 활용 |
| 개발 환경 격리 | Vagrant | 로컬 VM 환경 빠르게 생성/폐기 |
| 머신 이미지 베이킹 | Packer | 同一个 설정으로 여러 포맷 이미지 생성 |
| 쿠버네티스 리소스 관리 | Terraform Provider for K8s 또는 kubectl | K8s 리소스 코드화 |
| AWS에만 특화 | AWS CDK, CloudFormation | AWS 서비스와 긴밀한 통합 |
IaC 파이프라인 설계 원칙
┌──────────────────────────────────────────────────────────────────────────────┐
│ [ IaC 파이프라인 6대 설계 원칙 ] │
│ │
│ 1. 모든 IaC 코드는 Git으로 관리 │
│ → 코드 리뷰 (Pull Request) 필수 │
│ │
│ 2. plan 결과는 apply 전 반드시 검토 │
│ → 자동화된 파이프라인에서 plan 출력 human 검토 스텝 포함 │
│ │
│ 3. 환경별 격리 (Environment Isolation) │
│ → dev, staging, prod 환경은物理적으로 분리 │
│ → 각 환경은 고유한 State 백엔드 사용 │
│ │
│ 4. 최소 권한 원칙 (Principle of Least Privilege) │
│ → IaC 툴에 부여하는 클라우드 자격증명은 최소 권한만 │
│ │
│ 5. 시크릿 관리 분리 │
│ → Terraform 코드에 平文 비밀번호禁止 │
│ → Vault, AWS Secrets Manager 등에서 동적 주입 │
│ │
│ 6. IaC도 소프트웨어 개발 주기를 따름 │
│ → 테스트 (terraform validate, tfsec) → 린트 → plan → apply │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
- 📢 섹션 요약 비유: IaC 파이프라인 설계는 "기업 자금 승인 체계"와 같습니다. 모든 지출( 인프라 변경)은 提出( PR ) → 검토( Code Review ) → 승인( Approved ) → 집행( Apply )의 단계를 거칩니다.万一 이 절차를 생략하고 현장에서 直接 지출( 수동 인프라 변경 )하면, 자금이 어떻게 쓰였는지追踪不可能하고, 부정 gasto( 편류)가 발생할 수 있습니다. 또한 지출 한도( 권한 )를 초과하면( 프로덕션 잘못된 변경 )自動的に 거부되어야 하며,すべての 증거( Plan 결과물 )를 문서화하여 감사(audit)에 대비해야 합니다.
Ⅴ. 미래 전망 및 발전 방향 (Future Trend)
1. IaC와 Policy as Code의 융합
Terraform의 Sentinel, AWS Config Rules, OPA(Open Policy Agent) 등의 정책을 IaC 코드에 통합하여, "인프라를 배포하는 것 자체가 조직의 보안/규제 정책을 준수하는지"를 자동으로 검증하는 정책 실행(Policy Enforcement) 기능이 표준화되고 있습니다.
2. AI-Augmented Infrastructure Management
IaC 코드를 작성할 때 AI가 올바른 리소스 구성, 보안 설정, 비용 최적화를 제안하고, 프로비저닝된 인프라의 비정상 동작을 사전에 탐지하여 경고하는 "IaC + AIOps" 융합이 활발히 연구되고 있습니다.
3. IaC의 테스트 자동화 확산
Terratest, Kitchen-Terraform, Inspec 등 IaC 코드 자체를 테스트하는 도구가 보편화되어, 인프라 코드라도单元テスト, 통합テスト, 그리고 인수测试까지 수행하는 문화가 확산되고 있습니다.
- 📢 섹션 요약 비유: IaC의 미래는 "自动驾驶 자동차의OTA 업데이트"와 같습니다. 현재에는技師가 자동차(인프라)를 직접修理하지만(수동 관리), 미래에는 설계도(IaC)가更新되면 자동차 스스로 업데이트를 받아 자동으로 재구성됩니다. 만약 업데이트 내용이 安全問題가 있는 것으로 판단되면( Policy Violation ), 자동차가 자동으로 업데이트를 거부하고技師에게 문제 내용을報告합니다. 또한万一更新 후問題가 발생하면, 자동차가 이전 설계도( State )로自動回帰합니다. 이러한 완전한 자동화가 IaC의 미래입니다.
🧠 지식 맵 (Knowledge Graph)
- IaC 핵심 개념
- 선언형 (Desired State) vs 명령형 (Step-by-step)
- Configuration Drift (구성 편류)
- Idempotency (멱등성)
- State Management (상태 관리)
- 주요 IaC 도구
- Terraform (선언형, 멀티 클라우드)
- Ansible (명령형, 구성 관리)
- Pulumi (프로그래밍 언어 기반)
- Packer (머신 이미지 베이킹)
- IaC 파이프라인 원칙
- Git 관리 (코드 리뷰 필수)
- Plan 검토 후 Apply
- 환경별 격리
- 시크릿 분리 관리
👶 어린이를 위한 3줄 비유 설명
- Infrastructure as Code는 "레고 조립 설명서를 코딩하는 것"과 같아요.
- 이 설명서( IaC 코드)를 컴퓨터에 저장해두면, 언제든 같은 레고( 인프라)를一模一样으로 만들 수 있어요.
- 그리고 누군가 설명서를 잘못 바꾸면 컴퓨터가 자동으로 "잘못이다!"라고 알려줘요!
🛡️ Claude 3.7 Sonnet Verified: 본 문서는 IaC의体系적 분석과 주요 도구 비교를 기준으로 작성되었습니다. (Verified at: 2026-04-05)