IaC(Infrastructure as Code) 이해하기 및 관련 도구들
IaC(Infrastructure as Code) 란?
IaC(Infrastructure as Code)는 인프라스트럭처를 코드로 정의하고 자동화하는 개념이다.
코드로 원하는 인프라를 구성하고 버전 관리를 할 수 있는데, 이렇게 하면 자동화된 프로비저닝과 일관성 있는 구성이 가능해지고, 유연성과 확장성도 높아진다. 또한 코드 기반으로 인프라를 정의하면 재현성이 증가하고 협업과 공유도 쉬워지는 큰 장점이 있다. IaC 도구로는 크게 AWS CloudFormation, Azure Resource Manager(ARM) 템플릿에서 많이 사용되는데, Terraform, Docker, Ansible과 같은 도구를 사용하면 이 개념을 구현할 수 있다.

IaC 관련 도구
Terraform
테라폼(Terraform)은 인프라스트럭처를 코드로 정의하고 프로비저닝하기 위한 오픈 소스 도구이다. 테라폼을 사용하면 클라우드 서비스 제공업체(AWS, Azure, Google Cloud 등)의 인프라 리소스를 프로그래밍 가능한 코드로 관리할 수 있다. 이렇게 하면 인프라를 버전 관리하고, 일관된 구성을 유지하며, 자동화된 프로비저닝을 할 수 있는 장점이 있다.
테라폼은 간단하고 선언적인 구문을 사용하며, 다양한 인프라 리소스를 관리할 수 있는 확장성이 있어 많이 사용된다.
테라폼은 테라폼 파일(.tf)을 작성하여 원하는 인프라 구성을 정의한 다음, 명령어 "terraform init"으로 초기화하고, "terraform apply"로 정의한 인프라를 프로비저닝할 수 있다.

Docker
도커(Docker)는 소프트웨어를 컨테이너로서 감싸고 실행할 수 있는 플랫폼이야. 컨테이너는 격리된 환경에서 애플리케이션과 필요한 라이브러리, 도구 등을 포함하고 있어. 도커를 사용하면 애플리케이션을 더 쉽게 개발, 배포, 실행할 수 있어. 이렇게 하면 환경에 상관없이 일관된 실행 결과를 얻을 수 있고, 애플리케이션 간의 충돌도 피할 수 있다.
Docker는 기본적으로 Linux 위에서 동작하며, 기본 요소는 DockerFile 로써, 도커 이미지에 들어갈 내용을 DockerFile에 정의해놓고, 이미지를 생성(docker build)한후, 컨테이너를 실행(docker run) 하여 사용할 수 있다.

Ansible
앤서블(Ansible)은 간단하고 자동화된 IT 인프라 관리 도구이다. 서버 설정, 애플리케이션 배포, 구성 관리 등을 코드로 정의하고 자동으로 수행할 수 있다. 앤서블의 장점은 에이전트 없이 SSH를 통해 원격 서버를 제어하고, 선언적인 언어를 사용해 구성을 관리할 수 있다. 간편한 사용법과 확장성으로 많이 사용되고 있는 IaC 도구 이다.
원격 프로토콜을 이용해서 배포, 구성 및 오케스트레이션을 제공하는 자동화 도구로써, 여러개의 서버를 효율적으로 관리하기 위해 고안된 환경 구성 자동화 도구이다. 중앙서버에서 여러 서버에 SSH 로 통신하며 원격으로 서버를 관리할 수 있다.
기본 요소는 Inventory 파일(서버 지정)과 Playbook (무엇을 할것인지 작업 정의)이다. OS 설치, 다운로드, 환경설정, 실행 등의 작업을 자동화 시킬 수 있다.
기본적으로 Ansible을 사용하고자 한다면, Ansible 호스트 파일(Host)에 대상 서버를 정의하고, Playbook 파일에 원하는 작업을 정의한 다음, "ansible-playbook" 명령어를 사용하여 Playbook을 실행하여 대상 서버에 작업을 수행한다.

Kubernetes
쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션(like Docker)을 관리하기 위한 오픈 소스 플랫폼이다. 애플리케이션의 배포, 확장, 관리를 자동화하며, 여러 호스트에서 실행되는 컨테이너를 조율을 통해 통합 자동화 관리를 할 수 있고, 쿠버네티스의 가장 큰 장점은 스케일링, 로드 밸런싱, 자가 치유 등 다양한 기능을 제공하여 안정적이고 확장 가능한 애플리케이션 운영을 가능하게 해줘서 많은 기업에서 채용하고 있다.
기본적으로 Kubernetes YAML 파일에 애플리케이션 구성을 정의하고, "kubectl apply" 명령어를 사용하여 구성을 클러스터에 배포를 진행할 수 있다. 이후 "kubectl get" 명령어를 사용하여 클러스터에서 실행 중인 애플리케이션의 상태와 리소스를 확인이 가능하다.
