본문 바로가기
DevOps/IaC

IaC(Infrastructure As Code)

by 민우's 코딩 2024. 7. 18.

https://wonderful-morocco-85b.notion.site/IaC-Infrastructure-As-Code-04ba5fc7b93d4452ac3f2b9155753571?pvs=4

 

IaC(Infrastructure As Code) | Notion

What is Iac?

wonderful-morocco-85b.notion.site

 

  • What is Iac?
  • Terraform
  • Ansible

Iac(Infrastructure As Code)란?

  • IaC란 서버, 네트워크, 데이터베이스, 애플리케이션 구성 등 IT 인프라를 수동으로 관리하는 대신 코드로 정의하고 관리하는 방식입니다.
  • IaC는 프로그래밍 언어나 구성 파일을 사용하여 인프라를 자동으로 배포하고 관리할 수 있게 해줍니다

그렇다면 IaC를 사용하는 이점?

• 자동화 및 일관성: 수동 설정에서 발생할 수 있는오류를 줄이고,인프라 배포 및 관리의 일관성을 유지합니다 • 버전 관리: 코드로 정의된 인프라는 버전 관리 시스템(Git 등)을 통해 변경 이력을 추적하고 복구할 수 있습니다 • 재사용성: 코드 모듈화 및 템플릿화를 통해 재사용성을 높여 시간과 비용을 절감할 수 있습니다 • 협업: 코드 기반 접근 방식은 개발팀과 운영팀 간의 협업을 촉진하며, DevOps 문화의 핵심 요소입니다 • 가시성 및 투명성: 코드가 모든 설정을 명시적으로 정의하므로, 인프라 구성 상태를 명확히 파악할 수 있습니다

IaC의 구현 방식 (선언적 접근 방식, 명령적 접근 방식)

  • 선언적 접근 방식: 원하는 최종 상태를 정의하고, 시스템이 그 상태로 자동으로 구성됩니다 사용자는 원하는 결과를 명시하며, 도구가 이를 달성하기 위한 과정을 결정합니다 예: Terraform, AWS CloudFormation, Kubernetes YAML 파일 장점: 설정이 간결하고 이해하기 쉬우며, 인프라의 현재 상태와 원하는 상태를 비교하여 필요한 변경 사항만 적용합니다
  • 명령적 접근 방식: 수행할 명령어와 순서를 명시하고 사용자는 인프라를 설정하기 위한 단계별 명령을 작성합니다 예: Ansible, Chef, Puppet 장점: 세부적인 제어가 가능하며, 복잡한 논리와 조건 처리를 쉽게 구현할 수 있습니다

IaC 도구 종류

Terraform, AWS CloudFormation, Ansible, Chef/Puppet, Kubernetes

IaC의 장점

  • 신속한 배포: 코드로 정의된 인프라는 자동화된 프로세스를 통해 신속하게 배포할 수 있습니다.
  • 효율성: 반복적인 작업을 자동화하여 시간과 비용을 절감할 수 있습니다.
  • 일관성: 모든 환경에서 동일한 설정을 적용하여 환경 간 차이를 줄일 수 있습니다.
  • 복구능력: 코드 기반의 인프라는 장애 발생 시 빠르게 복구할 수 있습니다.
  • 확장성: 필요에 따라 인프라를 쉽게 확장하거나 축소할 수 있습니다.

IaC의 WorkFlow

  • 계획(Planning): 요구 사항을 분석하고 인프라 구조를 설계합니다
  • 코드 작성(Coding): 인프라를 코드로 정의합니다. 이 단계에서 템플릿, 모듈, 변수 등을 사용하여 재사용성과 가독성을 높입니다
  • 버전 관리(Version Control): 작성된 코드를 Git 등의 버전 관리 시스템에 저장하고 이력을 관리합니다
  • 테스트(Testing): 인프라 코드가 예상대로 작동하는지 확인합니다 .테스트 환경에서 코드를 실행하고 결과를 검증합니다
  • 적용(Deployment): 검증된 코드를 실제 환경에 배포합니다. 도구의 apply 명령어를 사용하여 인프라를 프로비저닝합니다
  • 모니터링 및 관리(Monitoring & Management): 배포된 인프라를 모니터링하고 필요에 따라 수정 및 업데이트합니다. 상태를 지속적으로 점검하여 안정성을 유지합니다

Terraform?

인프라를 코드로 관리하는 도구, HashiCorp에서 개발, 인프라를 선언적으로 정의하고 관리하게함

Terraform의 특징

  • 프로바이더: AWS, Azure, GCP 등 다양한 클라우드 서비스 제공자를 지원합니다
  • 인프라 코드화: JSON 유사한 HCL(HashiCorp Configuration Language) 사용합니다.
  • 버전 관리: 인프라 상태를 파일로 저장하여 버전 관리가 가능합니다.
  • 실행계획: 변경 사항을 적용하기 전에 계획을 미리볼 수 있습니다.
  • 모듈화: 재사용 가능한 모듈을 통해 코드 유지보수 용이 해집니다.

Terraform의 구성요소

  • Providers: 클라우드 서비스 제공자와의 인터페이스 (CSP 설정) ex. provider "aws" { region = "apnortheast-2" }
  • Resources: 클라우드 자원을 정의 ex. resource "aws_instance" "example" { ami = "ami-123456" instance_type = "t2.micro" }
  • Variables: 변수 사용을 통해 코드 재사용성 증가 ex. variable "region" { default = "apnortheast-2" }
  • Outputs: 출력 값을 정의하여 다른 구성 요소와 연계 ex. output "instance_ip" { value = aws_instance.example.public_ip }
  • Modules: 코드의 재사용을 위해 모듈화 ex. module "vpc" { source = "./modules/vpc" }

Terraform의 워크플로우

terraform init (초기화) - 프로젝트 디렉토리를 초기화하고 필요한 플러그인을 다운로드 terraform plan (계획 수립) - 변경 사항을 시뮬레이션하고 계획서 출력 terraform apply (적용) - 계획된 변경 사항을 실제 인프라에 적용 terraform state (상태 관리) - 현재 인프라 상태 확인 및 관리

terraform destroy (종료) - 인프라 자원을 제거

Ansible?

IT 자동화 도구로, 서버 구성 관리, 애플리케이션 배포, 작업 자동화를 지원합니다

→ 구성된 인프라에 애플리케이션을 구성되는 것?

Ansible 특징

  • Agentless: 관리 대상 서버에 에이전트를 설치할 필요 없이 SSH를 통해 연결을 진행합니다.
  • 모듈 기반: 다양한 모듈을 통해 다양한 작업을 수행합니다.
  • YAML 언어 사용: 플레이북 작성 시 가독성이 높은 YAML 포맷 사용합니다.
  • 확장성: 커뮤니티 모듈 및 플러그인을 통해 기능 확장 가능합니다.

Ansible의 구성요소

  • Inventory: 관리할 호스트 목록을 정의 ex. hosts.ini
  • Playbooks: 작업 정의서로, YAML 포맷 사용 ex. site.yml
  • Modules: 특정 작업을 수행하는 코드 블록 ex. ansible.builtin.shell
  • Roles: 관련 작업을 그룹화하여 재사용 가능 ex. roles/web
  • Tasks: 실행할 작업을 정의 ex. tasks/main.yml
  • Handlers: 특정 조건에 따라 실행되는 작업 ex. handlers/main.yml
  • Templates: Jinja2 템플릿을 통해 설정 파일 생성 ex. templates/nginx.conf.j2

Ansible의 워크플로우

  • 인벤토리 작성: 관리할 호스트 목록을 작성합니다.
  • 플레이북 작성: 수행할 작업을 정의한 YAML 파일 작성합니다.
  • 작업 실행: ansibleplaybook 명령어로 플레이북 실행합니다.
  • 상태 확인: ansible 명령어로 호스트 상태 확인 및 관리합니다

 

 

이 둘을 써보는 것은 위 notion 링크를 통해 자세히 보실 수 있습니다!