IaC(Infrastructure as Code)와 도구

030·2025년 8월 1일

대규모 인프라를 운영할수록 수동 설치 방식은 오류 발생률이 높고, 관리 효율이 떨어진다.

이러한 문제를 해결하기 위해 인프라를 코드로 정의하여 자동으로 배포하고 관리하는 개념인 IaC가 등장했다.

IaC란?

인프라스트럭처를 코드를 통해 설정하고 배포하는 방식

클라우드 환경, 특히 OpenStack과 같은 인프라 플랫폼에서 IaC는 인프라의 배포, 관리, 확장(스케일링) 작업을 표준화하고 자동화하는 데 핵심적인 역할을 한다.

IaC 접근 방식

선언적 접근 방식 (Declarative Approach)

선언적 접근 방식은 시스템이 갖추어야 할 원하는 상태를 정의한다.

어떤 리소스가 필요하고, 각 리소스가 어떤 속성을 가져야 하는지 등을 코드로 명시하면 IaC 도구가 현재 상태를 파악해 원하는 상태가 되도록 자동으로 인프라를 구성한다.

  • 핵심: 무엇을 원하는 지에 집중
  • 과정: 도구가 현재 상태와 원하는 상태를 비교하고, 차이가 있을 경우 원하는 상태를 적용
  • 상태 관리: 시스템의 현재 상태를 지속적으로 추적하여 변경 및 삭제 작업이 간단하고 안정적
  • 장점: 코드를 여러 번 실행해도 시스템이 이미 원하는 상태라면, 불필요한 변경 작업을 수행하지 않아 안전하고 예측 가능함
  • 대표 도구: Terraform, Kubernetes, AWS CloudFormation 등

명령형 접근 방식 (Imperative Approach)

명령형 방식은 원하는 구성을 갖추기 위해 필요한 명령을 정의한다.

개발자는 특정 구성에 도달하기 위한 모든 단계를 직접 작성하고, IaC 도구가 이를 순차적으로 적용한다.

  • 핵심: 어떻게 만들 것 인지에 중점
  • 과정: 명령어를 정의된 순서대로 실행하여 인프라를 구성
  • 상태 관리: 현재 상태를 추적하지 않아, 변경이 필요할 경우 추가 명령을 작성해야 함
  • 장점: 세밀한 제어가 가능하고, 기존 쉘 스크립팅 방식에 익숙한 사용자에게 친숙함
  • 대표적인 툴: Ansible, Chef 등

IaC 장점

  1. 비용 절감
    • 인프라를 수동으로 구성하던 작업을 자동화함으로써 운영 인력의 부담을 줄이고, 인력을 더 중요한 업무에 집중할 수 있다.
  2. 빠른 속도
    • 인프라를 코드로 관리하면 반복적인 작업을 자동화할 수 있어, 신속하고 일관된 방식으로 인프라스트럭처를 배포하고 확장할 수 있다.
  3. 오류 감소와 일관성
    • 수작업 대신 코드로 인프라를 정의하면 사람의 실수로 인한 오류를 최소화할 수 있다.
    • 동일한 코드를 다양한 환경(개발, 테스트, 운영)에 재사용할 수 있어 환경 간 불일치 문제를 방지하고 일관된 구성 유지가 가능하다.

대표적인 IaC 도구

Terraform

Terraform은 사람이 읽기 쉬운 설정 파일을 사용하여 클라우드 및 온프레미스 리소스를 안전하고 효율적으로 구축, 변경, 버전 관리를 지원하는 도구이다.

작성된 코드는 버전 관리, 재사용, 공유가 가능하며, 이를 통해 전체 인프라 생명주기에 걸쳐 일관된 워크플로우로 리소스를 프로비저닝하고 관리할 수 있다.

출처 - How does Terraform work?

테라폼은 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 등의 프로바이더를 포함한다.

동작 과정은 다음과 같은 세 단계로 구성된다.

  1. 작성: 만들고 싶은 인프라 설계를 코드로 작성한다.
  2. 계획: 테라폼이 작성된 코드와 기존 인프라 상태를 비교하여 업데이트할 내용을 설명하는 실행 계획을 생성한다.
  3. 적용: 사용자가 계획을 확인하고 이를 승인할 경우, 테라폼은 리소스의 의존성을 고려하여 제안된 작업을 올바른 순서로 수행한다.

Ansible

Ansible은 에이전트가 설치가 필요 없는 오픈소스 자동화 도구로, YAML 형식의 플레이북(playbook)을 사용하여 시스템 구성 및 소프트웨어 배포 같은 복잡한 작업을 자동화한다.

사용자가 플레이북에 원하는 상태를 선언하면 Ansible이 해당 상태를 보장하며, 여러 번 실행해도 결과가 동일하게 유지되는 멱등성을 통해 안정적인 관리를 지원한다.

출처 - Getting started with Ansible

대부분의 Ansible 실행 환경은 위 그림과 같으며 세 가지 주요 구성 요소가 있다.

  • 제어 노드(Control Node): Ansible을 실행하는 노드로, 컨테이너에서도 실행할 수 있다.
    • 여러 개의 제어 노드도 가능하지만, Ansible 자체는 이들 간의 조정을 수행하지 않는다.
  • 인벤토리 (Inventory): Ansible이 관리할 서버들의 목록이다.
  • 관리 노드(Managed Nodes): Ansible을 사용하여 관리하려는 대상 노드(원격 서버들)이다.

실제 작업은 제어 노드에서 ssh를 통해 관리 노드로 원격 접속하여 수행하기 때문에, 별도의 agent가 필요하지 않다.

자동화 작업은 플레이북을 통해 정의되며, 다음과 같은 구조를 가진다.

  • 플레이북(Palybooks): Ansible이 수행할 모든 작업 시나리오를 정의하는 최상위 스크립트(YAML)로, 하나 이상의 Play를 포함한다.
  • 플레이(Plays): 플레이북 내에서 정의되는 작업 실행의 핵심 단위로, 어떤 관리 노드 그룹에게 어떤 작업(Task)을 적용할지 연결해준다.
  • 태스크(Task): 관리 노드에 적용될 가장 작은 개별 작업 단위이다.
    • 예: “패키지 설치”, “서비스 시작”, “파일 복사” 등
  • 핸들러(Handlers): 특수한 형태의 Task로, 다른 Task에 의해 변경이 발생했을 때만 호출되어 실행된다.

Pulumi

Pulumi는 TypeScript, Python, Go와 같은 범용 프로그래밍 언어를 사용하여 클라우드 인프라를 관리하는 현대적인 코드형 인프라(IaC) 플랫폼 이다.

Pulumi는 선언적(Declarative) 모델을 따르기 때문에, 사용자는 코드에 원하는 최종 상태만 정의하면 된다. 특히 기존 프로그래밍 언어의 모든 기능(반복문, 함수, 클래스 등)과 개발 도구(IDE 자동 완성, 타입 검사 등)를 그대로 활용할 수 있어 인프라를 더욱 유연하고 효율적으로 관리할 수 있다.

Pulumi는 무료 오픈소스이며, 선택적으로 Pulumi Cloud와 연동하여 팀의 작업 내역과 상태를 안전하게 관리할 수도 있다.

출처 - How Pulumi works

이러한 Pulumi는 다음과 같은 핵심 구성 요소들의 상호작용을 통해 동작한다.

  1. 먼저 사용자가 원하는 프로그래밍 언어로 인프라 코드를 작성하면, 언어 호스트(Language Host)가 이 코드를 실행하여 인프라의 '목표 상태'를 계산한다.
  2. 배포 엔진 (Deployment Engine)은 이 목표 상태와 현재 인프라의 상태를 비교하여 어떤 리소스를 생성, 업데이트, 또는 삭제해야 할지 실행 계획을 수립한다.
  3. 리소스 프로바이더 (Resource Provider)가 엔진의 지시에 따라 실제 클라우드 API를 호출하여 계획된 작업을 수행하고, 배포 엔진은 그 결과를 바탕으로 인프라의 최신 상태를 기록한다.

각 도구를 간단히 비교하면 다음과 같다.

항목TerraformAnsiblePulumi
접근 방식선언형명령형 + 일부 선언형선언형
특징인프라 프로비저닝구성 관리 및 애플리케이션 배포범용 프로그래밍 언어를 이용한 인프라 프로비저닝
사용 언어HCL (HashiCorp Configuration Language)YAML (Playbook)Python, TypeScript, Go, Java 등 범용 언어
동작 방식API 기반 (프로바이더)SSH 기반 원격 실행API 기반 (프로바이더)
에이전트 여부없음없음없음

오픈스택에서의 IaC 구현

  • Heat
    • 오픈스택의 오케이스트레이션 도구
    • HOT(Heat Orchestration Template)라는 템플릿 형식에 필요한 리소스들을 YAML 언어로 정의하여 스택이라는 리소스 집합을 생성
  • Terraform OpenStack Provider
    • 테라폼(Terraform)을 이용해 오픈스택 리소스를 관리할 수 있도록 해주는 플러그인(연결 도구)
  • Kolla-Ansible
    • 오픈스택의 각 서비스들을 컨테이너(Docker)로 배포하는 것을 자동화하는 도구
  • OpenStack-Ansible
    • 앤서블을 사용하여 오픈스택을 서버에 직접 배포하고 관리하는 도구

참고 자료

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

1개의 댓글

comment-user-thumbnail
2025년 9월 29일

ansible한 하루 보내길 바래용~

답글 달기