IaC - Terraform 활용하기

Posted by , November 15, 2024
IaCinfraterraform

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. 테라폼에서 제공하는 클라우드서비스 사용
    • 락 자동관리
    • 소규모 팀에 적합

Connect to HCP Terraform | Terraform | HashiCorp Developer