IaC (Infrastructure as Code)
물리적 하드을 수동으로 설정하는 대신 코드를 사용하여 인프라를 프로비저닝하고 관리하는 접근 방식입니다.
IaC를 사용하면 인프라 설정을 버전 관리하고, 재사용 가능하며, 자동화할 수 있습니다.
이를 통해 일관성과 효율성이 증가하며 수동 구성으로 인한 오류를 줄일 수 있습니다.
왜 IaC를 찾게 되었는지…
직접 3개월 정도 AWS에서 GUI로 된 관리자콘솔을 사용하면서 만났던 여러 상황들입니다.
- 낮은 사양의 단일 인스턴스를 띄우고 스왑메모리를 설정하는것을 깜빡하여 OOM(out of memory)발생
- 사용하지 않는 프라이빗 서브넷의 Nat gateway를 제거하지 않아서 소량의 과금 발생
- 실수로 다른 리전에 리소스를 생성한 뒤 제거하지 못하여 소량의 과금 발생
- 보안 그룹의 이름과 용도에 대한 컨벤션을 지정하지 않았고, 추후 여러 목적의 인스턴스에서 공용으로 무분별하게 사용하게 되면서 새로운 포트가 필요해졌는데 룰을 추가해도 되는지 판단이 서지 않음
위 상황들 중 보안그룹 이슈 관련해서는 컨벤션을 지정하고 애플리케이션의 목적을 나누어 따로 관리한다면 분명히 개선의 여지가 있습니다.
하지만 알고있음에도 클릭실수로 발생하는 여러 문제들은 개발자의 실력과 무관하게 발생합니다.
여러 구성관리 도구 비교
도구 | 용도 | 특징 |
---|---|---|
Terraform | 인프라 프로비저닝 도구 | - 선언적 구성 파일 사용 - 클라우드 및 온프레미스 환경 지원 - 상태 파일을 사용한 리소스 상태 추적 - 멀티 클라우드 지원 |
Ansible | 구성 관리 및 프로비저닝 도구 | - 에이전트리스 아키텍처 - YAML 기반의 플레이북 사용 - 구성 관리, 애플리케이션 배포, 태스크 자동화 - 다양한 시스템과 통합 가능 |
CloudFormation | AWS 전용 인프라 프로비저닝 도구 | - 선언적 JSON/YAML 템플릿 사용 - AWS 리소스 프로비저닝 및 관리 - 인프라 변경 사항을 미리 검토할 수 있는 Change Set 기능 |
Pulumi | 코드 기반의 인프라 프로비저닝 도구 | - 실제 프로그래밍 언어(Python, JavaScript, TypeScript 등) 사용 - 멀티 클라우드 지원 - 선언적 및 명령적 프로비저닝 가능 |
Chef | 구성 관리 도구 | - Ruby 기반의 DSL 사용 - Chef 서버를 통해 중앙 집중식 관리 - 인프라 및 애플리케이션 설정을 코드로 관리 |
Puppet | 구성 관리 도구 | - 선언적 언어 사용 - Puppet 서버를 통해 중앙 집중식 관리 - 모듈화된 설정을 통해 재사용성 향상 |
SaltStack | 구성 관리 및 프로비저닝 도구 | - 에이전트 기반 아키텍처 - YAML 기반의 상태 파일 사용 - 실시간 이벤트 기반 작업 수행 - 스케일링 및 오케스트레이션 기능 |
Vagrant | 가상화된 개발 환경 구축 도구 | - 개발 환경을 코드로 정의 - 가상 머신 및 컨테이너 환경 지원 - 여러 가상화 제공자와 통합 가능 |
Terraform과 문법요소
aws cloudformation과 비교해서 다중 클라우드 벤더사(aws, gcp, azure 등)의 인프라를 같은 코드베이스로 관리할 수 있다는 장점이 있습니다.
hcl의 선언적 문법으로 큰 학습곡선 없이 사용 가능합니다.
공급자 (Provider)
- AWS, GCP, Azure 등 다양한 클라우드 서비스와 통신하기 위한 플러그인입니다.
리소스 (Resource)
- 생성, 수정, 삭제할 인프라 요소를 정의합니다.
상태파일 (State File)
- 현재 인프라의 상태를 저장하여 Terraform이 변경 사항을 추적할 수 있도록 합니다.
변수와 출력 (V & O)
- 변수를 사용해서 재사용성, 가독성을 높입니다.
- 출력을 통해서 한 모듈간 의존성을 관리합니다.
- ex) A모듈을 통해 만든 IP주소/ 인스턴스 ID등등 받아서 B모듈의 설정값으로 사용하기
모듈화 (Modules)
- 테라폼은 기본적으로 현재 디렉토리안의 상태파일만 처리하기 때문에 특정 디렉토리를 로컬 모듈로 사용할 수 있습니다.
- 공유되어있는 모듈 레지스트리에서 필요한 모듈을 가져올 수 있습니다.
- Terraform Registry
명령어
기본 기능
terraform init
: 테라폼의 실행에 필요한 모듈을 불러옵니다.terraform plan
: 실행을 위한 계획을 수립합니다. -out ${filename} 옵션으로 계획 고정을 권장합니다.terraform apply
: 실제 환경에 계획을 반영합니다. 고정한 파일을 적용하는것을 권장합니다.terraform destroy
: 인프라 요소를 제거합니다.
추가
terraform import
: 기존의 수동으로 구성된 인프라를 테라폼으로 가져오기terraform validate
: 테라폼 유효성 검사terraform fmt
: 테라폼 코드 스타일 포맷팅
Terraform Cloud로 협업하기
인프라 상태를 여러사람이 함께 수정하다보면 레이스컨디션 관리가 필요합니다.
여러가지 방식에 따라 테라폼 락을 사용해서 자원을 잠그고 해당 작업이 완료되었을 때 다른사람 접근할 수 있도록 합니다.
- 옵션 1. S3 backend + dynamoDB
- 상태파일을 S3에 넣고 DynamoDB를 락으로 사용
- 대규모 관리에 적합
- 옵션 2. 테라폼에서 제공하는 클라우드서비스 사용
- 락 자동관리
- 소규모 팀에 적합
harmony
하모니 팀의 기술 블로그 입니다. 🌈
harmonytech-blog