데브옵스의 등장.
전통적인 조직에서의 개발과 운영은 대립 관계에 있다.
개발은 서비스의 변화를, 운은 서비스 안정을 위해 유지하는 것을 선호한다.
이로인해 다음과 같은 문제들이 발생하게 된다.
- 릴리즈 주기 지연 (개발부터 배포까지 아주 많은 시간이 소요됨)
- 커뮤니케이션 부재 (릴리즈 주기 지연의 문제부터 사일로 현상 등 다양한 문제) - 비효율적, 비용 증가
다음과 같은 현상, 문화의 확산으로 인해 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
- 상태 파일과 실행 계획을 기반으로 리소스를 삭제
테라폼과 다른 코드형 인프라 도구
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 |