Dev-ops

πŸ—οΈ IaC (Infrastructure as Code): μ½”λ“œλ‘œ 인프라λ₯Ό κ΄€λ¦¬ν•˜λŠ” μ‹œλŒ€!

xeunnie 2025. 3. 15. 01:00
728x90
λ°˜μ‘ν˜•

πŸ—οΈ IaC (Infrastructure as Code): μ½”λ“œλ‘œ 인프라λ₯Ό κ΄€λ¦¬ν•˜λŠ” μ‹œλŒ€!

 

“개발 ν™˜κ²½μ—μ„œλŠ” 잘 λŒμ•„κ°€λŠ”λ°, 운영 ν™˜κ²½μ—μ„  μ™œ 깨질까?”

“같은 섀정인데 μ™œ λ‚΄ ν™˜κ²½μ—μ„œλŠ” λ¬Έμ œμ—†λŠ”λ° λ™λ£ŒλŠ” μ—λŸ¬κ°€ λ‚ κΉŒ?”

 

이런 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ“±μž₯ν•œ κ°œλ…μ΄ λ°”λ‘œ IaC(Infrastructure as Code) μž…λ‹ˆλ‹€.

이제 인프라λ₯Ό μ†μœΌλ‘œ ν΄λ¦­ν•˜λ©° μ„€μ •ν•˜λŠ” 게 μ•„λ‹ˆλΌ μ½”λ“œλ‘œ μ •μ˜ν•˜κ³  μžλ™ν™”ν•˜λŠ” μ‹œλŒ€κ°€ λ˜μ—ˆμ–΄μš”! πŸš€

🌱 IaCλž€ 무엇인가?

 

**Infrastructure as Code(IaC)**λŠ” μ½”λ“œλ₯Ό μ΄μš©ν•˜μ—¬ 인프라λ₯Ό μ •μ˜ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 방법을 μ˜λ―Έν•΄μš”.

즉, μ„œλ²„, λ„€νŠΈμ›Œν¬, λ°μ΄ν„°λ² μ΄μŠ€, λ‘œλ“œ λ°ΈλŸ°μ„œ 같은 인프라λ₯Ό μ½”λ“œλ‘œ μ •μ˜ν•˜μ—¬ μžλ™ν™”ν•  수 μžˆμ–΄μš”.

 

βœ… IaC의 핡심 κ°œλ…

인프라 ν™˜κ²½μ„ μ½”λ“œλ‘œ μ •μ˜ν•˜μ—¬ μΌκ΄€λœ 배포 κ°€λŠ₯

λͺ¨λ“  섀정이 μ½”λ“œν™”λ˜μ–΄ **버전 관리(Git)**κ°€ κ°€λŠ₯

μˆ˜λ™ 섀정이 μ•„λ‹Œ μžλ™ν™”λœ 배포

“λ‚΄ λ‘œμ»¬μ—μ„œλŠ” 잘 λ˜λŠ”λ°?” 같은 ν™˜κ²½ 차이 문제 ν•΄κ²°

 

πŸ” κΈ°μ‘΄ 인프라 κ΄€λ¦¬μ™€μ˜ 차이점

전톡적 인프라 μ„€μ • (μˆ˜λ™)IaC 적용 ν›„ (μžλ™ν™”)

직접 μ„œλ²„λ₯Ό ν΄λ¦­ν•˜λ©° μ„€μ • μ½”λ“œλ‘œ 인프라 μ •μ˜
μ„€μ • λ³€κ²½ 이λ ₯ 관리 어렀움 Git을 ν†΅ν•œ 버전 관리 κ°€λŠ₯
ν™˜κ²½ μ„€μ • 차이 λ°œμƒ λ™μΌν•œ μ„€μ • μžλ™ 적용 κ°€λŠ₯
μ‚¬λžŒμ΄ μ‹€μˆ˜ν•  κ°€λŠ₯μ„± 있음 μ½”λ“œ 기반 μžλ™ν™”λ‘œ μ‹€μˆ˜ λ°©μ§€

πŸ’‘ 즉, IaCλ₯Ό μ‚¬μš©ν•˜λ©΄?

ν™˜κ²½λ³„ 차이λ₯Ό 쀄이고, λ™μΌν•œ 섀정을 μœ μ§€ν•  수 μžˆμ–΄μš”.

인프라λ₯Ό μžλ™ν™”ν•˜μ—¬ λΉ λ₯΄κ³  μ•ˆμ „ν•˜κ²Œ 배포할 수 μžˆμ–΄μš”.

μ½”λ“œ 기반으둜 λ³€κ²½ 사항을 좔적할 수 μžˆμ–΄μš”.

πŸ“Œ “λ‚΄ λ‘œμ»¬μ—μ„œλŠ” 잘 λ˜λŠ”λ°?” 문제 ν•΄κ²°ν•˜κΈ°

 

개발 ν™˜κ²½(local) vs 운영 ν™˜κ²½(prod) 차이 문제, IaC둜 ν•΄κ²° κ°€λŠ₯!

 

🚨 전톡적인 문제점

κ°œλ°œμžλŠ” λ‘œμ»¬μ—μ„œ λ™μž‘ν•˜μ§€λ§Œ, 운영 μ„œλ²„μ—μ„œλŠ” μ—λŸ¬κ°€ λ°œμƒ

ν™˜κ²½ λ³€μˆ˜λ‚˜ μ˜μ‘΄μ„± 차이둜 인해 μ˜ˆμƒμΉ˜ λͺ»ν•œ 문제 λ°œμƒ

μ‚¬λžŒμ΄ 직접 μ„€μ •ν•˜λ‹€ λ³΄λ‹ˆ 운영 ν™˜κ²½ 섀정이 개발 ν™˜κ²½κ³Ό 닀름

 

βœ… IaC 적용 ν›„ λ³€ν™”

개발, μŠ€ν…Œμ΄μ§•, 운영 ν™˜κ²½μ„ λ™μΌν•˜κ²Œ μœ μ§€ κ°€λŠ₯

ν™˜κ²½ 섀정을 ν…œν”Œλ¦Ών™”ν•˜μ—¬ μΌκ΄€λœ 배포 κ°€λŠ₯

μžλ™ν™”λœ 배포 νŒŒμ΄ν”„λΌμΈκ³Ό κ²°ν•©ν•˜μ—¬ μ•ˆμ •μ μΈ 배포 보μž₯

πŸ”Ή IaC의 κΈ°λ³Έ ꡬ쑰

 

IaCλ₯Ό μ μš©ν•˜λ©΄ μ½”λ“œλ‘œ 인프라λ₯Ό μ •μ˜ν•˜κ³  이λ₯Ό μ‹€ν–‰ν•˜μ—¬ μ‹€μ œ ν™˜κ²½μ„ ꡬ성할 수 μžˆμ–΄μš”.

μ£Όμš” IaC 도ꡬ듀은 λ‹€μŒκ³Ό 같은 κΈ°λ³Έ ꡬ쑰λ₯Ό λ”°λ¦…λ‹ˆλ‹€.

 

1️⃣ 선언적(Declarative) vs λͺ…λ Ήν˜•(Imperative)

선언적(Declarative): “무엇을 λ§Œλ“€ 것인지”λ₯Ό μ •μ˜ (ex. Terraform, CloudFormation)

→ 예: “AWS에 EC2 μ„œλ²„λ₯Ό ν•˜λ‚˜ λ§Œλ“€μ–΄μ€˜!”

λͺ…λ Ήν˜•(Imperative): “μ–΄λ–»κ²Œ λ§Œλ“€ 것인지”λ₯Ό μ •μ˜ (ex. Ansible, Chef)

→ 예: “SSH 접속 ν›„ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•˜κ³  섀정을 λ³€κ²½ν•΄!”

 

2️⃣ IaC μ£Όμš” ꡬ성 μš”μ†Œ

 

βœ”οΈ λ¦¬μ†ŒμŠ€(Resource): 생성할 인프라(μ„œλ²„, λ°μ΄ν„°λ² μ΄μŠ€, λ„€νŠΈμ›Œν¬ λ“±)

βœ”οΈ ν”„λ‘œλΉ„μ €λ‹(Provisioning): λ¦¬μ†ŒμŠ€λ₯Ό μƒμ„±ν•˜κ³  μ„€μ •ν•˜λŠ” κ³Όμ •

βœ”οΈ μƒνƒœ(State Management): ν˜„μž¬ 인프라 μƒνƒœλ₯Ό 좔적 (ex. Terraform의 state 파일)

βœ”οΈ ν™˜κ²½ λ³€μˆ˜(Environment Variables): ν™˜κ²½λ³„(개발/운영) 차이λ₯Ό 관리

πŸ”Ή λ¦¬μ†ŒμŠ€ 그룹화와 ν…œν”Œλ¦Ώ ν™œμš©

 

IaCμ—μ„œλŠ” 인프라 λ¦¬μ†ŒμŠ€λ₯Ό κ·Έλ£Ήν™”ν•˜κ³ , ν…œν”Œλ¦Ώμ„ ν™œμš©ν•˜λ©΄ λ”μš± νš¨μœ¨μ μ΄μ—μš”.

 

1️⃣ λ¦¬μ†ŒμŠ€ κ·Έλ£Ήν™” (Resource Grouping)

 

βœ”οΈ μ—¬λŸ¬ λ¦¬μ†ŒμŠ€λ₯Ό ν•œ 곳에 λ¬Άμ–΄ 관리할 수 μžˆμ–΄μš”.

βœ”οΈ AWS의 Resource Group, Terraform의 Module 같은 κΈ°λŠ₯을 ν™œμš©ν•˜λ©΄ 됨!

βœ”οΈ λ„€νŠΈμ›Œν¬, DB, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ³„μ μœΌλ‘œ κ΅¬μ„±ν•˜λŠ” λŒ€μ‹  μž¬μ‚¬μš© κ°€λŠ₯ν•œ 그룹으둜 μ„€μ • κ°€λŠ₯.

# Terraform 예제 - λͺ¨λ“ˆμ„ ν™œμš©ν•œ λ¦¬μ†ŒμŠ€ κ·Έλ£Ήν™”
module "network" {
  source = "./modules/network"
  vpc_cidr = "10.0.0.0/16"
}

module "database" {
  source = "./modules/database"
  db_name = "mydb"
}

2️⃣ ν…œν”Œλ¦Ώ ν™œμš© (Templates)

 

βœ”οΈ ν™˜κ²½λ³„ μ„€μ • 차이λ₯Ό 쀄이고 λ™μΌν•œ μ½”λ“œλ‘œ μ—¬λŸ¬ ν™˜κ²½μ„ 배포 κ°€λŠ₯

βœ”οΈ AWS CloudFormation, Terraform 같은 λ„κ΅¬μ—μ„œ 제곡됨

βœ”οΈ 예λ₯Ό λ“€μ–΄, 개발/운영 ν™˜κ²½μ— 따라 λ¦¬μ†ŒμŠ€λ₯Ό λ‹€λ₯΄κ²Œ μ„€μ •ν•˜κ³  싢을 λ•Œ μ‚¬μš©!

# AWS CloudFormation 예제 - ν™˜κ²½λ³„λ‘œ λ‹€λ₯Έ κ°’ μ‚¬μš©
Parameters:
  InstanceType:
    Type: String
    Default: "t2.micro"
    AllowedValues:
      - "t2.micro"
      - "t2.small"

πŸ”Ή ν™˜κ²½ λ³€μˆ˜ ν™œμš© (Environment Variables)

 

ν™˜κ²½ λ³€μˆ˜λŠ” 인프라λ₯Ό ν™˜κ²½λ³„λ‘œ λ‹€λ₯΄κ²Œ μ„€μ •ν•˜λŠ” 데 μœ μš©ν•΄μš”.

 

βœ”οΈ ν™˜κ²½λ³„(개발/운영)둜 μ„€μ • κ°’ 뢄리

βœ”οΈ λ³΄μ•ˆ 정보(API ν‚€ λ“±)λŠ” ν™˜κ²½ λ³€μˆ˜λ‘œ μ„€μ •

βœ”οΈ .env νŒŒμΌμ„ ν™œμš©ν•˜κ±°λ‚˜, Terraform, Ansible 같은 λ„κ΅¬μ—μ„œ ν™˜κ²½ λ³€μˆ˜ μ„€μ • κ°€λŠ₯

# .env 파일 예제
DB_HOST=database.example.com
DB_USER=admin
DB_PASS=secret
# Terraform ν™˜κ²½ λ³€μˆ˜ ν™œμš©
variable "db_host" {
  default = "database.example.com"
}

πŸ”Ή IaC 도ꡬ듀 비ꡐ (Terraform, Ansible, CloudFormation)

λ„κ΅¬λ°©μ‹μ£Όμš” νŠΉμ§•μ£Όμš” ν΄λΌμš°λ“œ

Terraform 선언적(Declarative) λ©€ν‹° ν΄λΌμš°λ“œ 지원, κ°•λ ₯ν•œ μƒνƒœ 관리 AWS, GCP, Azure
Ansible λͺ…λ Ήν˜•(Imperative) μ„œλ²„ μ„€μ • μžλ™ν™”, Agent ν•„μš” μ—†μŒ AWS, μ˜¨ν”„λ ˆλ―ΈμŠ€
AWS CloudFormation 선언적(Declarative) AWS μ „μš© IaC 도ꡬ AWS

βœ… Terraform을 μ‚¬μš©ν•˜λ©΄ AWS/GCP/Azure 같은 ν΄λΌμš°λ“œλ₯Ό ν•œ λ²ˆμ— 관리할 수 μžˆμ–΄μš”!

βœ… Ansible은 SSH 기반으둜 μ„œλ²„ 섀정을 μžλ™ν™”ν•˜λŠ” 데 강점이 μžˆμ–΄μš”.

βœ… CloudFormation은 AWS ν™˜κ²½μ—μ„œ IaCλ₯Ό μ μš©ν•  λ•Œ μœ μš©ν•΄μš”.

πŸ”Ή IaC 적용 ν›„ 배포 μžλ™ν™” (CI/CD)

 

IaCλŠ” CI/CD(지속적 톡합 및 배포) νŒŒμ΄ν”„λΌμΈκ³Ό ν•¨κ»˜ μ‚¬μš©ν•˜λ©΄ λ”μš± κ°•λ ₯ν•΄μ Έμš”.

 

πŸ“Œ GitHub Actions + Terraform을 ν™œμš©ν•œ μžλ™ 배포 예제

name: Deploy Infra

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v3

      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v1

      - name: Terraform Apply
        run: |
          terraform init
          terraform apply -auto-approve

βœ”οΈ GitHub에 ν‘Έμ‹œν•˜λ©΄ μžλ™μœΌλ‘œ 인프라λ₯Ό 배포할 수 μžˆμ–΄μš”! πŸš€

🎯 κ²°λ‘ : IaCλŠ” ν•„μˆ˜λ‹€!

 

“μ½”λ“œλ‘œ 인프라λ₯Ό κ΄€λ¦¬ν•˜λŠ” μ‹œλŒ€!”

μ΄μ œλŠ” μ„œλ²„λ₯Ό μ†μœΌλ‘œ ν΄λ¦­ν•˜λ©° μ„€μ •ν•˜λŠ” 게 μ•„λ‹ˆλΌ, μ½”λ“œλ‘œ μ •μ˜ν•˜κ³  μžλ™ν™”ν•˜λŠ” μ‹œλŒ€μž…λ‹ˆλ‹€.

βœ… ν™˜κ²½ 차이λ₯Ό 쀄이고 μΌκ΄€λœ 배포 κ°€λŠ₯

βœ… μžλ™ν™”λœ 배포둜 λΉ λ₯΄κ³  μ•ˆμ „ν•œ 운영 κ°€λŠ₯

βœ… Gitκ³Ό κ²°ν•©ν•˜μ—¬ λ³€κ²½ 사항을 좔적 κ°€λŠ₯

 

πŸ’‘ ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμžλ„ Terraform, Ansible, CloudFormation 같은 IaC 도ꡬλ₯Ό μ΅ν˜€λ‘λ©΄ 배포가 훨씬 μ‰¬μ›Œμ§ˆ κ±°μ˜ˆμš”!

 

🌷 μ „μ„€μ˜ κ°œλ°œμžκ°€ λ˜μ–΄λ΄…μ‹œλ‹Ή! 🌷 πŸš€

728x90
λ°˜μ‘ν˜•