[Terraform 튜토리얼 1-2] 누가 내 설정 바꿨지? 그래서 필요한 불변 인프라

[Terraform 튜토리얼 1-2] 누가 내 설정 바꿨지? 그래서 필요한 불변 인프라

Immutable Infrastructure(불변 인프라) — 최근 클라우드와 DevOps, IaC(코드형 인프라)에서 자주 등장하는 멋진 용어지만, 실제로 어떤 의미일까요?
그리고 Terraform과 같은 도구에서는 어떻게 활용될까요?

이번 글에서는 Immutability(불변성)이라는 개념이 인프라에서 왜 중요한지, 실무에서는 어떻게 적용되는지에 대해 다뤄보겠습니다.


✅ Immutability vs. Mutability

Immutability(불변성)이란, 한 번 생성된 대상은 변경하지 않고, 변경이 필요할 경우 전체를 새로 생성하는 방식입니다.
반대로, Mutability(가변성)은 기존 대상을 직접 수정하거나 덮어쓰는 방식입니다.


📸 실생활 예시로 이해하기

  • Immutable 한 대상: 80년대의 폴라로이드 카메라 사진
    → 한 번 찍은 사진은 수정할 수 없습니다. 그 상태 그대로 남아 있죠.
  • Mutable 한 대상: 화이트보드
    → 언제든 지우고, 덧붙이고, 덮어쓸 수 있습니다. 상태는 계속 바뀝니다.

🖥️ 인프라에선 어떻게 적용될까?

🛠️ 전통적인 mutable 방식: 클릭옵스 (ClickOps)

  • 포털에서 클릭으로 VM 생성, 설정 변경
  • SSH 접속해서 직접 설정 수정
  • 콘솔에서 수동으로 리소스 변경
    → 이런 행위들은 전부 mutable 한 작업입니다.

📦 immutable 인프라란?

수동 변경 대신, 코드로 정의된 상태만으로 인프라를 구성하고, 상태가 어긋날 경우 언제든 원래대로 되돌릴 수 있는 구조

예를 들어:

  • VM 이미지를 미리 Bake 해서 배포 (Packer, AMI)
  • Terraform으로 환경을 코드로 정의하고 Git으로 버전 관리
  • 변경은 직접 수정이 아닌, 새 버전을 정의함으로써 전체 교체

🧱 Terraform과 Immutability

Terraform은 그 자체만으로는 완전한 불변성을 보장하진 않지만, 다음을 조합하면 가능합니다:

  1. HCL 코드: 선언적 정의 = 목표 상태 (desired state)
  2. Terraform Plan: A → B로 가기 위한 실행 계획
  3. Terraform State: 현재 환경 상태를 기록
  4. Git Commit: 코드 변경 이력 = 불변 아티팩트

즉, Git + Terraform이 결합되었을 때, 우리는 인프라의 상태를 스냅샷처럼 관리할 수 있습니다.
문제가 생기면, 마지막으로 잘 작동하던 스냅샷으로 "롤백"이 가능해지죠.


📌 정리하자면

불변 인프라(Immutable Infrastructure)란,
직접 수정하는 대신, 정의된 상태만을 기준으로 인프라를 구성하고 관리하는 방식입니다.

Terraform을 단순히 쓰는 것만으로는 완전한 불변 인프라가 되지는 않지만,
버전 관리된 코드와 이미지 아티팩트를 통해 불변에 가까운 안정성을 확보할 수 있습니다.


🔜 다음 글 예고

다음 포스트에선 Terraform 모듈 설계를 깔끔하게 만드는 핵심 개념,
캡슐화(Encapsulation) 이야기를 풀어볼게요.

[Terraform 튜토리얼 1-3] 내부는 감추고, 필요한 것만 보여줘 – 캡슐화란?
Encapsulation, 캡슐화라고 하면 뭔가 개발자스럽고 어려워 보이죠? 객체지향 프로그래밍 할 때나 듣던 단어 같고요. 그런데 이 개념은, Terraform 같은 Infrastructure as Code(IaC)에서도 아주 중요합니다. 이번 글에서는 ”캡슐화가 무엇이고”, ”왜 필요한지”, 그리고 “Terraform에서는 어떻게 쓰이는지”를 쉽게 풀어보겠습니다. ✅ 캡슐화, 한 마디로 뭐야? “필요한 것만 보이게 하고, 나머지는 숨기는 것”

Read more

[시리즈 2편] 실무로 배우는 메시지 큐 - RabbitMQ

[시리즈 2편] 실무로 배우는 메시지 큐 - RabbitMQ

들어가며 [시리즈1]에서는 프로세스 내부 메시지 큐를 다뤘습니다. 이번엔 네트워크 메시지 큐인 RabbitMQ를 다룹니다. RabbitMQ 공식 문서나 기술 블로그는 많지만, 실무에서 어떻게 사용하는지에 대한 글은 의외로 적습니다. "Producer가 뭐고 Consumer가 뭔지는 알겠는데, 그래서 실제로는 어떻게 쓰는데?" 이번 글에서는 우리 MES 시스템에서 RabbitMQ를 어떻게 활용하고 있는지 실제 코드와 함께 공유합니다. 우리

By Jeonggil
[시리즈 1편] 실무로 배우는 메시지 큐 - Windows Message Loop

[시리즈 1편] 실무로 배우는 메시지 큐 - Windows Message Loop

들어가며 이 글은 "실무로 배우는 메시지 큐" 시리즈의 첫 번째 글입니다. 실무에서 발견한 문제를 해결하는 과정에서, IME 입력 문제와 해결 과정을 공유합니다. 메시지 큐는 RabbitMQ, Kafka 같은 네트워크 레벨만 있는 게 아닙니다. 우리가 매일 쓰는 Windows 애플리케이션도 메시지 큐 기반으로 동작합니다. * 시리즈1 (이 글): 프로세스 내부의 메시지 큐 - Windows

By Jeonggil
[시리즈 2편] 그림으로 풀어낸 SaaS 알림 시스템

[시리즈 2편] 그림으로 풀어낸 SaaS 알림 시스템

이 글은 1편 - 그림으로 풀어낸 SaaS 알림 시스템의 후속편입니다. 들어가며 1편에서는 설비 연속 OFF 알림 기능의 핵심 로직과 어떤식으로 해결했는지 그림으로 알아봤습니다. 이번 글에서는 실무에서 마주한 진짜 고민들을 공유합니다: * 왜 3개의 새로운 테이블이 필요했나? * 어떻게 확장 가능한 구조를 만들었나? * SMS 14원짜리 알림이 왜 무서운가? * 운영 레벨로 나가기까지 무엇을 준비했나?

By Jeonggil
[시리즈 1편] 그림으로 풀어낸 SaaS 알림 시스템

[시리즈 1편] 그림으로 풀어낸 SaaS 알림 시스템

들어가며 제조업 IoT 플랫폼에서 N대 이상의 설비를 실시간으로 모니터링하고, 설비가 연속으로 꺼졌을 때 담당자에게 즉시 알림을 보내는 기능을 개발하게 되었습니다. 데이터는 실시간으로 쌓이지만, 설비이상을 체크하는 스케줄러 주기는 1분으로 설정하였습니다. 시스템 아키텍처 기존 인프라와 Push 기능은 이미 구축되어 있었습니다. 저는 중간에 들어가는 Alert Scheduler만 구현하면 되는 상황이었습니다. ┌──────────────────────────────────────────────────────────┐ │ 설비 IoT 센서 (실시간)

By Jeonggil