Infrastructure as Code/ TIL

IaC의 의미와 필요성

Featured image

Infrastructure as Code


DevOps의 주요 가치 중 하나는 자동화이다. IaC는 설정을 코드로 작성하여 클라우드 *인프라스트럭처의 생성/수정/삭제를 자동화하는 방법이다.

이는 서버, DB, 네트워크, 배포 프로세스, 테스트 등 거의 모든 것을 코드로 관리할 수 있다는 의미이다. 실제로 선을 연결하고, 하드웨어를 준비하는 것 처럼 기존에는 서버 준비, 네트워킹과 같은 운영적 측면이 물리적 영역과 대응한다.

현재와 같은 *클라우드 네이티브 환경에서는, 운영적 측면이 모두 코드로 대체될 수 있다. 이는 달리 얘기하면, IaC는 인프라스트럭처의 설계도가 될 수 있다.

IaC의 장점

AWS 콘솔을 이용하여 인프라를 구성한 그림이다.

위와 같은 수동 설정의 경우 쉽게 서비스를 제공하고, 아키텍처를 빠르게 실험해 볼 수 있다는 점에서 유리하다. 하지만 다음과 같은 한계가 존재한다.

필요성


Configuration Drift : 예상치 못한 인프라 변경에 따른 사고


일반적으로 IAM을 통해 각 팀 또는 개인에게 필요한 만큼의 권한을 주고 인프라를 사용한다. 예를 들어, 프로덕션 레벨에 있는 특정 인스턴스 권한을 가지고 있는 누군가가 실수로 삭제하여 제품에 영향을 미치면, 이를 어떻게 알아내고 고칠 수 있을까? 지우는 것 이외에도 어떤 보안 그룹의 설정을 변경하여 시스템 전체에 영향을 미치는 경우는 어떨까?

접근 방법, 도구

위와 같은 접근 방법에 따른 도구들이 있다. 그렇다면 방지하는 방법에 대해 알아보자. 불변한(Immutable) 인프라 스트럭처는 인프라 변경을 원천적으로 막을 수 있는 방법론이다. 실제로 인프라를 수동 설정으로 변경할 수 있지만, 다음의 실천적 방법을 통해 애초에 그 가능성을 막으면 된다.

원칙


가변적 인프라와 불변적 인프라의 차이


가변적 인프라는 기존 인프라 구성 요소를 직접 수정할 수 있는 반면, 불변적 인프라는 인프라를 변경할 수 없는 것으로 취급하고 원하는 변경 사항으로 새 인스턴스를 생성한다. 불변적 인프라는 일관성 및 재현성과 같은 이점을 제공하지만, 자동화된 배포 방식으로 전환해야 한다.



*인프라스트럭처 : 사회, 경제 또는 조직의 운영, 기능에 필요한 기본적인 물리적 및 조직적 시스템, 시설, 구조를 의미한다.

*클라우드 네이티브 환경 : 클라우드 컴퓨팅 원칙과 기술을 활용하여 애플리케이션을 구축하고 실행하는 소프트웨어 개발, 배포 및 운영에 대한 접근 방식을 의미한다. 클라우드 플랫폼 용으로 특별히 애플리케이션을 설계하고 클라우드의 확장성, 유연성 및 복원력을 활용하는 것이 특징이다.

*프로비저닝 : 클라우드 서비스를 시작하고 구성하는 것. 시스템, 데이터 및 소프트웨어로 서버를 준비하고 네트워크 작동을 준비한다. Puppet, Ansible 등과 같은 구성 관리 도구를 사용해 서버를 프로비저닝 할 수 있다.

*배포 : 배포는 프로비저닝된 서버를 실행하기 위해 애플리케이션 버전을 제공하는 작업이다. (AWS CodePipeline, Jenkins, Github Actions 등)

*오케스트레이션 : 여러 시스템 또는 서비스를 조정하는 작업. 마이크로서비스, 컨테이너 및 쿠버네티스로 작업할 때 일반적인 용어이다. (Kubernetes, Saly, Fabric 등)