시작하기

시스템 구성 관리(Configuration Management)의 드리프트(Drift) 현상과 장애

증상 확인: 시스템이 예기치 않게 멈추거나, 배포가 실패하나요?

어제까지 완벽하게 작동하던 애플리케이션이 오늘 갑자기 오류를 내뱉습니다. 아니면, 개발 환경에서는 문제없던 코드가 운영 서버에 배포되자마자 장애가 발생합니다. 모든 서버의 설정이 동일해야 함을 알고 있지만, 시간이 지남에 따라 서로 다른 상태로 ‘흐트러져’ 가는 것을 경험한 적이 있을 것입니다. 이것이 바로 구성 관리의 악몽, 구성 드리프트(Configuration Drift) 현상입니다. 이 글에서는 이 드리프트가 어떤 증상으로 나타나고. 왜 위험한지, 그리고 어떻게 확실하게 제어할 수 있는지 현장 중심의 해결책을 제시합니다.

원인 분석: 드리프트는 왜 발생하는가?

드리프트는 시스템의 실제 구성(Actual State)이 원하는 구성(Desired State)에서 점차 벗어나는 현상을 말합니다. 이는 단순한 실수가 아니라, 운영의 본질에서 비롯된 필연적인 문제입니다, 수동 개입이 빈번한 환경일수록 드리프트는 가속화됩니다. 주요 원인은 다음과 같습니다.

  • 수동 핫픽스(Hotfix) 적용: 긴급 장애 해결을 위해 특정 서버만의 설정을 임시로 변경한 후, 변경 사항을 구성 관리 도구에 반영하지 않고 잊어버리는 경우.
  • 권한 통제 실패: 너무 많은 인원에게 시스템 수정 권한이 부여되어, 변경 내역 추적이 불가능해지는 경우.
  • 불완전한 구성 관리: 구성 관리 도구(Ansible, Chef, Puppet 등)의 정책이 모든 시스템 리소스(예: 방화벽 규칙, 크론잡, 사용자 계정)를 커버하지 못하는 경우.
  • 환경 간 차이: 개발, 스테이징, 운영 환경의 초기 구성이 미묘하게 달라, 시간이 지나며 그 차이가 증폭되는 경우.

결국 드리프트는 ‘스노우플레이크 서버(Snowflake Server)’를 양산합니다. 각 서버가 눈송이처럼 유일무이한 설정을 가지게 되어, 재현 불가능한 장애와 배포 실패의 원인이 됩니다.

해결 방법 1: 드리프트 탐지 및 수동 정리 (초기 대응)

이미 드리프트가 발생한 시스템을 정리하는 첫걸음은 현재 상태를 정확히 파악하는 것입니다. 가장 기본적이지만 필수적인 단계입니다.

  1. 구성 스냅샷 생성: 기준이 되는 ‘골든 이미지(Golden Image)’ 또는 마지막으로 안정적이었던 시점의 구성 파일 백업을 확보합니다. 시스템 전체 스냅샷이 이상적입니다.
  2. 현재 상태 수집: 모든 서버에서 핵심 구성 정보를 수집합니다. 예를 들어, sshd_config, nginx.conf, 설치된 패키지 목록(rpm -qa 또는 dpkg -l), 실행 중인 서비스(systemctl list-units --type=service) 등을 비교 대상으로 삼습니다.
  3. 차이점 비교 도구 활용: diff 명령어를 스크립트화하거나, Meld, WinMerge 같은 GUI 비교 도구를 사용해 기준 구성과 현재 구성을 시각적으로 비교합니다. 네트워크 장비라면 구성 파일을 텍스트로 추출하여 동일하게 비교합니다.
  4. 변경 내역 검토 및 적용: 차이점이 발견되면, 각 변경이 의도된 것인지, 누군가의 수정 결과인지 기록(변경 관리 시스템)을 추적합니다. 문서화되지 않은 변경은 드리프트로 간주하고, 기준 구성에 맞춰 수동으로 정리합니다.

이 방법은 소규모 환경이나 일시적인 정리에 적합하지만, 근본적인 해결책이 아닙니다. 수동 작업은 인간 오류를 다시 불러올 뿐입니다.

해결 방법 2: Infrastructure as Code(IaC)와 불변 인프라로의 전환 (근본적 해결)

드리프트를 영구적으로 차단하려면 인프라 운영 패러다임 자체를 바꿔야 합니다. 핵심은 모든 구성을 코드로 정의하고, 서버를 ‘가축(Pets)’이 아닌 ‘소(Cattle)’로 관리하는 것입니다.

Infrastructure as Code 도구 구현

Terraform, AWS CloudFormation, Pulumi 등의 도구를 사용해 인프라 자체(서버, 네트워크, 저장소)의 생성과 구성을 코드로 정의합니다. 이 코드는 버전 관리 시스템(Git)에 저장되어 모든 변경 이력이 추적 가능해집니다.

  1. 코드화: 기존 수동 구성 절차를 분석하여 Terraform HCL(HashiCorp Configuration Language)이나 CloudFormation 템플릿으로 변환합니다. 초기에는 작은 모듈(예: 보안 그룹, 로드 밸런서)부터 시작합니다.
  2. 버전 관리: 모든 IaC 코드를 Git 저장소에 올립니다. 변경은 Pull Request를 통해 검토 후 머지되도록 프로세스를 정립합니다. 이 단계가 드리프트 방지의 핵심 안전장치입니다.
  3. 계획 및 적용: 변경사항을 적용하기 전에 terraform plan 명령어로 어떤 리소스가 생성, 변경, 삭제될지 미리 확인합니다. 이 예측 가능성이 수동 운영과의 가장 큰 차이점입니다.

불변 인프라(Immutable Infrastructure) 채택

기존 서버를 직접 수정하지 않습니다. 대신, 새로운 구성이 적용된 완전히 새로운 서버 이미지(AMI, Docker Image)를 빌드하여 배포하고, 오래된 서버는 교체합니다.

  1. 이미지 빌드 자동화: Packer 같은 도구로 OS, 미들웨어, 애플리케이션까지 모두 포함된 표준화된 이미지를 생성하는 파이프라인을 구축합니다. 모든 구성은 이 빌드 과정에서만 이루어집니다.
  2. 롤링 배포: Auto Scaling Group이나 Kubernetes Deployment를 활용해 새 이미지로 만들어진 인스턴스(또는 Pod)를 점진적으로 롤아웃하고, 기존 인스턴스를 종료합니다.
  3. 장점: 모든 배포는 완전히 새로운 환경에서 시작되므로 드리프트가 발생할 여지가 없습니다. 또한, 문제 발생 시 이전 이미지로의 롤백이 빠르고 정확합니다.

해결 방법 3: 지속적 구성 감시 및 자동 수정 (운영적 안정화)

IaC와 불변 인프라가 구현된 후에도, 런타임 중 예기치 않은 변경(악의적 접근, 다른 팀의 간섭)에 대비해 지속적인 감시 체계를 구축해야 합니다. 이는 최후의 방어선 역할을 합니다.

  1. 구성 관리 도구의 강제 실행: Ansible, Chef, Puppet을 ‘항시 수정(Enforcement)’ 모드로 운영합니다. 에이전트가 주기적으로(예: 30분마다) 서버 상태를 체크하고, 원하는 구성에서 벗어나면 즉시 자동으로 수정합니다. Chef의 경우 chef-client를 데몬 모드로, Puppet은 puppet agent를 데몬으로 실행하여 이 기능을 구현합니다.
  2. 파일 무결성 모니터링(FIM) 도구 도입: OSSEC, Wazuh, AIDE 같은 도구를 사용해 핵심 구성 파일(/etc/passwd, /etc/shadow, 웹 서버 설정 등)의 무결성을 모니터링합니다. 파일이 변경되면 즉시 알림을 발생시키고, 변경 내용을 로그에 저장합니다.
  3. 클라우드 네이티브 감사 로그 활용: AWS CloudTrail, Azure Activity Log, GCP Audit Logs를 필수적으로 활성화합니다. 이러한 로그는 콘솔, CLI, API를 통한 모든 관리 작업을 기록하므로, 누가, 언제, 무엇을 변경했는지 추적하는 데 필수적입니다. 이 로그를 SIEM에 연동해 이상 징후를 탐지합니다.

주의사항: 자동 수정 기능은 신중하게 도입해야 합니다. 잘못된 구성 정책이 자동으로 모든 서버에 적용되면 대규모 장애로 이어질 수 있습니다. 새로운 정책은 먼저 소수의 카나리아(Canary) 서버나 개발 환경에 적용하여 영향을 확인한 후, 점진적으로 롤아웃하는 전략이 필수입니다. 또한. 자동 수정이 발생할 때마다 반드시 알림이 가도록 설정하여 운영자가 인지할 수 있게 하십시오.

전문가 팁: 드리프트 없는 환경을 위한 문화와 프로세스

기술적 해결책만으로는 부족합니다. 드리프트를 근절하려면 조직의 문화와 프로세스가 함께 변화해야 합니다.

  • “서버에 직접 로그인하지 마라”: 이는 팀 내 규칙이 되어야 합니다. 모든 변경은 코드를 통해, 코드의 변경은 Pull Request와 코드 리뷰를 통해 이루어져야 합니다. 콘솔 접근 자체를 최소화하거나. 주목할 만한 것은 just-in-time(jit) 권한 부여 시스템을 도입하는 것을 고려하십시오.
  • 정기적인 드리프트 감사 실시: 분기마다 한 번씩 구성 관리 도구의 보고서를 확인하거나, terraform plan을 실행해 실제 인프라와 코드 정의 사이에 차이가 없는지 검증하는 시간을 가집니다. 이는 방어 체계가 제대로 작동하는지 확인하는 건강 검진과 같습니다.
  • 변경 관리 프로세스와의 연계: 모든 인프라 변경 요청은 IaC 코드 변경으로 연결되어야 합니다. 변경 관리 시스템(Change Management)의 티켓 번호가 커밋 메시지에 반드시 포함되도록 하여, 변경의 이유와 추적성을 보장하십시오.

Pro Tip: 장애 복구 시간 단축을 위한 최후의 카드 모든 구성이 코드로 관리되고 있다면, 재해 복구(DR) 시나리오가 극적으로 단순해집니다. 두 번째 리전이나 재해 복구 센터에서 장애를 복구하는 절차는 단순히 “Git 저장소에서 최신 코드를 가져와 terraform apply를 실행한다”로 요약될 수 있습니다. 평소에 IaC 코드가 항상 실행 가능한 상태로 유지되도록 하고, 정기적으로 DR 훈련 시 이 코드를 사용해 전체 환경을 프로비저닝하는 연습을 하십시오. 이것이 진정한 구성 관리의 완성입니다.

더 많은 정보가 필요하신가요?

NFT Ledger 전문팀이 도움을 드리겠습니다.

홈으로 문의하기