IaC란 코드형 인프라(Infrastructure as Code), 즉 IaC는 설정을 코드로 작성하여 클라우드 인프라스트럭처의 생성/수정/삭제를 자동화하는 방법입니다.
쉽게 말해 IaC는 인프라스트럭처의 설계도로
서버, 데이터베이스, 네트워크, 배포 프로세스, 테스트 등 거의 모든 것을 코드로 관리할 수 있다.
프로그래밍 언어를 이용해서 직접 순차적으로 인프라를 생성하도록 코드를 작성하는 방법이다. 선언형에 비해 더 강력한 일들을 할 수 있으나, 실제 적용된 결과를 가늠하기 어렵고, 코드를 읽기에 직관적이지 않다.
선언형 언어 JSON, YAML 등을 사용한다. 실제 인프라가 적용된 결과(기대하는 상태)와 적용할 내용(YAML 등)이 직관적으로 매핑된다.
인프라 변경에 의한 사고를 Configuration Drift라고 한다. 사람에 의해 배포된 인프라가 삭제 혹은 잘못 변경되거나 AWS의 경우 보안 그룹등을 잘 못 변경하는 경우 시스템 전체의 영향을 미칠 수 있다.
■ 문제 해결 방법?
AWS를 기준으로 문제를 해결하기 위한 도구들을 설명한다.
한번 생성했으면 수정하지 않는다.
인스턴스 내부 구성(사용자 스크립트 등)이 필요할 경우 AMI로 만들어 놓습니다.
코드형 인프라(IaC)를 사용합니다.
가변적 인프라의 경우 ‘배포 이후’ 변경되도록 설계되어 있다. 불변적 인프라의 경우 ‘변경되지 않고 아예 교체되도록’ 만들어졌다.
가변적 인프라의 도입 시기는 클라우드 컴퓨팅이 상용화 되기 이전 물리서버를 중심으로 서버를 구성할때이다.
불변적 인프라의 서버를 ‘변경’한다는 개념은 가변적 인프라의 도입 시기였던 주된 서버였던 물리서버에서는 ‘교체’를 의미한다.
이는 많은 비용 투자를 수반하기에 서버의 다운타임을 최대한 줄인채 서버를 ‘조금씩 변경하는’것에 초점을 맞추었고 당시에는 이것이 가장 효율적인 방법이었다.
하지만 이런 수동적인 변경은 인프라의 통일성을 해치고 이로 인해 서버 복제에 있어 치명적인 단점을 가지고 있으며 서버 하나하나가 동일하지 않은 각각의 고유한 객체로써 작용하며 매우 취약한 서비스 구조를 가지게 되었다.
하지만 불변적 인프라에 대한 개념이 대두된 시기는 클라우드 컴퓨팅이 상용화되면서 온디멘드/가상화를 통해 저렴하고 적은 시간 비용을 투자해 서버의 생성이 가능해졌다. 이를 통해 기존의 ‘물리적 서버’가 가지는 단점을 개선하는 방향으로 멱등성을 가지는 불변적 인프라의 개념이 등장하게 되었다.
서버에 문제가 발생했을 때 둘의 대처 방법과 그 장단점이 극명하게 드러난다.
가변적 인프라의 경우 서버에 작은 문제가 발생하면 즉흥적인 변경으로 그 문제를 해결하곤 한다. 이를 문서화하려는 노력으로 문제에 대한 로깅을 할 수도 있겠지만 이미 생겨난 수많은 변경점들은 계속해서 새로운 충돌점을 생성해내고 이로인한 컨피그레이션 드리프트의 딜레마에 빠지곤 한다.
불변적 인프라는 이러한 단점을 극복하기 위해 선언적 코드를 통해 서버를 문서화하고 이로 인해 원자성이 보장되기에 급작스러운 트래픽 증감에 따른 유연한 대처에 있어 효율적이다. 또한 서버 에러가 발생시에도 새로운 서버를 간단하게 배포 후 기존 서버를 닫는 형식으로 문제를 쉽게 해결할 수 있다.