대규모 인프라를 운영할수록 수동 설치 방식은 오류 발생률이 높고, 관리 효율이 떨어진다.
이러한 문제를 해결하기 위해 인프라를 코드로 정의하여 자동으로 배포하고 관리하는 개념인 IaC가 등장했다.
인프라스트럭처를 코드를 통해 설정하고 배포하는 방식
클라우드 환경, 특히 OpenStack과 같은 인프라 플랫폼에서 IaC는 인프라의 배포, 관리, 확장(스케일링) 작업을 표준화하고 자동화하는 데 핵심적인 역할을 한다.
선언적 접근 방식은 시스템이 갖추어야 할 원하는 상태를 정의한다.
어떤 리소스가 필요하고, 각 리소스가 어떤 속성을 가져야 하는지 등을 코드로 명시하면 IaC 도구가 현재 상태를 파악해 원하는 상태가 되도록 자동으로 인프라를 구성한다.
명령형 방식은 원하는 구성을 갖추기 위해 필요한 명령을 정의한다.
개발자는 특정 구성에 도달하기 위한 모든 단계를 직접 작성하고, IaC 도구가 이를 순차적으로 적용한다.
Terraform은 사람이 읽기 쉬운 설정 파일을 사용하여 클라우드 및 온프레미스 리소스를 안전하고 효율적으로 구축, 변경, 버전 관리를 지원하는 도구이다.
작성된 코드는 버전 관리, 재사용, 공유가 가능하며, 이를 통해 전체 인프라 생명주기에 걸쳐 일관된 워크플로우로 리소스를 프로비저닝하고 관리할 수 있다.

테라폼은 AWS, GCP 같은 클라우드 서비스에 직접 명령을 내리는 것이 아니라, 각 서비스가 외부에 제공하는 API(Application Programming Interface)를 이용해 통신한다.
예를 들어 "EC2 인스턴스를 하나 만들어줘"라는 요청을 AWS API가 이해할 수 있는 형태로 보내는 방식이다.
이때 프로바이더(Provider)가 번역기처럼 동작하여, 사용자가 테라폼 고유 언어(HCL)로 작성한 코드를 AWS, GCP, GitHub 등 각 서비스의 API가 알아들을 수 있는 언어로 변환해주는 역할을 한다.
이 프로바이더 덕분에 테라폼은 특정 클라우드에 종속되지 않고 거의 모든 서비스를 관리할 수 있다.
필요한 프로바이더는 테라폼 레지스트리(Terraform Registry)를 통해 다운로드하고 설치할 수 있다.
레지스트리에는 Amazon Web Services(AWS), Azure, Google Cloud Platform(GCP), Kubernetes, Helm, GitHub, Splunk, DataDog 등의 프로바이더를 포함한다.
동작 과정은 다음과 같은 세 단계로 구성된다.
Ansible은 에이전트가 설치가 필요 없는 오픈소스 자동화 도구로, YAML 형식의 플레이북(playbook)을 사용하여 시스템 구성 및 소프트웨어 배포 같은 복잡한 작업을 자동화한다.
사용자가 플레이북에 원하는 상태를 선언하면 Ansible이 해당 상태를 보장하며, 여러 번 실행해도 결과가 동일하게 유지되는 멱등성을 통해 안정적인 관리를 지원한다.

출처 - Getting started with Ansible
대부분의 Ansible 실행 환경은 위 그림과 같으며 세 가지 주요 구성 요소가 있다.
실제 작업은 제어 노드에서 ssh를 통해 관리 노드로 원격 접속하여 수행하기 때문에, 별도의 agent가 필요하지 않다.
자동화 작업은 플레이북을 통해 정의되며, 다음과 같은 구조를 가진다.
Pulumi는 TypeScript, Python, Go와 같은 범용 프로그래밍 언어를 사용하여 클라우드 인프라를 관리하는 현대적인 코드형 인프라(IaC) 플랫폼 이다.
Pulumi는 선언적(Declarative) 모델을 따르기 때문에, 사용자는 코드에 원하는 최종 상태만 정의하면 된다. 특히 기존 프로그래밍 언어의 모든 기능(반복문, 함수, 클래스 등)과 개발 도구(IDE 자동 완성, 타입 검사 등)를 그대로 활용할 수 있어 인프라를 더욱 유연하고 효율적으로 관리할 수 있다.
Pulumi는 무료 오픈소스이며, 선택적으로 Pulumi Cloud와 연동하여 팀의 작업 내역과 상태를 안전하게 관리할 수도 있다.

출처 - How Pulumi works
이러한 Pulumi는 다음과 같은 핵심 구성 요소들의 상호작용을 통해 동작한다.
각 도구를 간단히 비교하면 다음과 같다.
| 항목 | Terraform | Ansible | Pulumi |
|---|---|---|---|
| 접근 방식 | 선언형 | 명령형 + 일부 선언형 | 선언형 |
| 특징 | 인프라 프로비저닝 | 구성 관리 및 애플리케이션 배포 | 범용 프로그래밍 언어를 이용한 인프라 프로비저닝 |
| 사용 언어 | HCL (HashiCorp Configuration Language) | YAML (Playbook) | Python, TypeScript, Go, Java 등 범용 언어 |
| 동작 방식 | API 기반 (프로바이더) | SSH 기반 원격 실행 | API 기반 (프로바이더) |
| 에이전트 여부 | 없음 | 없음 | 없음 |
https://en.wikipedia.org/wiki/Infrastructure_as_code
https://aws.amazon.com/ko/what-is/iac/
https://www.redhat.com/en/topics/automation/what-is-infrastructure-as-code-iac
https://developer.hashicorp.com/terraform/intro
https://www.pulumi.com/docs/iac/concepts/
https://docs.ansible.com/ansible/latest/getting_started/index.html
ansible한 하루 보내길 바래용~