본문 바로가기

IaC

테라폼 스터디 - 2주차

데브옵스의 등장.

 

전통적인 조직에서의 개발과 운영은 대립 관계에 있다.

 

개발은 서비스의 변화를, 운은 서비스 안정을 위해 유지하는 것을 선호한다.

 

이로인해 다음과 같은 문제들이 발생하게 된다.

  • 릴리즈 주기 지연 (개발부터 배포까지 아주 많은 시간이 소요됨)
  • 커뮤니케이션 부재 (릴리즈 주기 지연의 문제부터 사일로 현상 등 다양한 문제) - 비효율적, 비용 증가

 

다음과 같은 현상, 문화의 확산으로 인해 devops가 전파되기 시작한다.

 

  • 애자일 개발론 : 빠른 개발 주기와 팀 간 협업을 강조 (빠르고, 반족적인)
  • 애자일의 빠른 개발주기에 맞춰 운용의 자동화가 필요해짐
  • CI : 코드를 자주 통합하고, 이를 자동화된 방법으로 테스트 및 검증
  • 클라우드 서비스의 대중화

 


코드형 인프라란?

위를 적용하기 위한 방법으로 인프라 정보를 코드로 관리하는 개념이 등장하게 됨 -> IaC (코드형 인프라)

 

서버, 네트워크, DB, 스토리지 등 인프라 리소스의 프로비저닝과 관리를 코드로 작성하여 관리함

 

 

코드형 인프라의 2가지 접근 방식

 

선언형

선언적 IaC를 이용하면 개발자가 원하는 시스템의 최종 상태를 구성하는 리소스와 설정을 설명할 수 있다.

선언형 방식의 사례 (출처: 클루커스)

 

 

명령형

개발자가 리소스를 설정하고 원하는 시스템 및 실행 상태에 도달하는 모든 단계를 설명할 수 있다. 주로 복잡한 인프라의 배포에서는 이러한 방식이 더 적합하다. (순서가 중요한 경우)


우리가 흔히 명령어를 입력하는 방식이라 생각하자..

 

AWS CLI

aws ec2 create-security-group --group-name MySecurityGroup --description "My security group"
aws ec2 run-instances --image-id ami-123456 --count 1 --instance-type t2.micro

 

 

명령형(Imperative) vs 선언형(Declarative)

접근 방식 수행 절차(단계)를 명시적으로 작성 최종 상태를 정의
유연성 복잡한 논리와 조건 처리 가능 상태 정의에 초점, 간결함 제공
가독성 복잡한 구성일수록 읽기 어려움 비교적 간결하고 명확
대표 도구 Ansible(명령형 스타일), Chef, CLI, Shell Terraform, CloudFormation, Pulumi 등

 


코드형 인프라의 장점

  • 자동화, 빠른 배포
    • 코드로 작성된 스크립트를 실행하면, 자동으로 리소스를 생성, 제거할 수 있음
  • 버전 관리
    • git과 같은 형상관리 도구를 이용하여 코드화된 인프라를 손쉽게 추적, 롤백이 가능하다.
  • 일관된 환경 제공에 용이
    • 휴먼 에러의 감소 및 손쉬운 인프라 구축을 통해, 반복적으로 일관된 환경을 구축할 수 있다.
  • 가시성
    • 현재 인프라가 어떤 상태인지 한 눈에 알아볼 수 있다.
  • 테스트
    • 코드로 작성되었기에, 이를 테스트하여 예상 결과를(생성되는 리소스) 확인하고, 발생 가능한 문제를 사전에 방지할 수 있다.
  • 확장성
    • 클라우드 인프라 제공자를 통해 유연하게 문제에 대처가 가능, 확장이 쉬움
  • 비용 절감
    • 불필요한 리소스 제거, 필요한 리소스만 명확하게 배포할 수 있기에 비용 절감
    • 수작업보다 시간 절약이 가능

 


테라폼 작동 방식

Terraform Core

  • 구문 분석 및 실행 계획 생성
    • .tf파일을 읽고 HCL(테라폼 코드 작성 언어) 문법 검사 수행.
    • 설정파일 상태와 현재(실제 리소스 상태)를 비교하여 실행 계획(Execution Plan)을 생성
  • 리소스 그래프 생성
    • 리소스 간의 의존성을 분석하여 DAG를 생성.
    • DAG를 이용하여 리소스를 올바른 순서로 생성, 수정, 삭제할 수 있게됨

 

Provider Plugin

  • 테라폼 코어는 필요한 클라우드 Provider를 동적으로 로드
  • Provider란 테라폼과 클라우드 서비스 간의 중개자 역할을 수행함
  • 테라폼 코어가 Provider에 API(리소스 생성, 업데이트, 삭제)를 요청하면 Provider는 그에 맞는 클라우드 API를 호출하여 작업 수행

 

테라폼 실행 단계

  • Init
    • terraform init
    • 필요한 Provider 플러그인 다운로드 및 초기화를 수행하는 단계
  • Plan
    • terraform plan
    • 실행 계획을 생성하여, live state와 desired state 간의 차이를 분석
    • 변경 사항을 미리 검토
  • Apply
    • terraform apply
    • Plan에서 생성한 실행 계획을 기반으로 실제 작업을 수행 (리소스의 생성, 삭제 등)
    • DAG 기반의 병렬 작업 처리
  • State 저장
    • 리소스 상태를 terraform.tfstate 파일에 저장
    • 현재 인프라의 구성을 추적할 수 있게됨
  • Destroy
    • terraform destroy
    • 상태 파일과 실행 계획을 기반으로 리소스를 삭제

출처: https://malwareanalysis.tistory.com/619

 

 


테라폼과 다른 코드형 인프라 도구

 

Ansible

  • Agentless : Ansible로 관리할 대상 서버에 에이전트 설치가 필요 없으며, SSH 통해 동작한다.
  • Playbook이라는 Yaml 형식으로 작업을 정의한다.
  • 제어 노드에서 직접 명령을 실행해 원격 서버를 관리하는 구조 (Push 방식)
  • 쉬운 러닝 커브 But, 복잡한 흐름 구현은 Jinja2 템플릿이나 고급 기능을 알아야 함
- name: Install and start Apache
  hosts: webservers
  tasks:
    - name: Install Apache
      yum:
        name: httpd
        state: present

    - name: Start Apache
      service:
        name: httpd
        state: started

 

Chef

  • Ruby기반 DSL 코드로 작업을 정의한다.
  • 관리 대상 노드에 에이전트를 설치해 Chef 서버에서 설정 정보를 가져온다. (Pull 방식)
  • Chef 서버 - 클라이언트가 서로 통신하여 작업 수행 (Chef 서버 설치 및 관리가 필요)
  • 중앙 집중화된 관리 (chef 서버)
  • 대규모 환경에서 안정적
package 'apache2' do
  action :install
end

service 'apache2' do
  action [:enable, :start]
end

 

Plumni

  • 프로그래밍 언어 지원 (Javascript, Python, Go, Java 등의 일반 프로그래밍 언어를 사용하여 인프라 정의)
  • Plumni가 상태를 저장하고 실행 계획을 생성
  • 상태 관리를 위해 Plumni 계정이나 스토리지 설정이 필요
  • 반복문, 조건문 등 프로그래밍 기능 활용 가능
  • 클라우드 리소스 관리에 최적
import * as aws from "@pulumi/aws";

// Create an AWS S3 Bucket
const bucket = new aws.s3.Bucket("my-bucket", {
    acl: "private",
});

// Export the bucket name
export const bucketName = bucket.id;

 

 


 

번외 (Terraform vs Plumni)

언어/문법 HashiCorp Configuration Language (HCL) 프로그래밍 언어 사용 (TypeScript, Python 등)
학습 곡선 간결하고 선언적인 문법 기존 프로그래밍 언어에 대한 지식 필요
사용 방식 선언형(Declarative) 선언형 + 명령형(Imperative) 조합 가능
유연성 제한적인 유연성 프로그래밍 언어의 모든 기능(조건문, 반복문 등) 활용 가능
에코시스템 Terraform 전용 모듈, 프로바이더 사용 Terraform 프로바이더를 그대로 활용 가능
상태 관리 로컬 또는 원격(S3, GCS 등) 저장 Pulumi 클라우드 서비스 또는 로컬 저장
적합한 환경 클라우드 리소스 관리에 집중 DevOps + 애플리케이션 레벨 코드 통합

'IaC' 카테고리의 다른 글

스터디 5주차 - 모듈 추가 내용  (0) 2025.01.05
테라폼 스터디 5주차 - 모듈  (3) 2025.01.05
테라폼 스터디 - 4주차  (1) 2024.12.29
테라폼 스터디 - 3주차 추가내용  (1) 2024.12.22
테라폼 스터디 3주차  (1) 2024.12.22