[IaC]Terraform에 관하여
클라우드 서비스가 대중화되면서, 기존의 온프레미스 방식의 서버 운영하던 방법과는 많이 달라졌다. 이제 하드웨어적인 관리는 AWS와 같은 클라우드 벤더사가 담당하고 개발자들은 서버 인프라를 소프트웨어처럼 다룰 수 있게 되었다. 즉, Infrastructure를 code로 다룰 수 있게 되었는데 그것이 바로 IaC이다.
IaC의 등장 배경
실제 클라우드 서비스의 콘솔은 정말 잘되어있다. 마우스 클릭만으로 모든 서비스를 동작할 수 있다. 그러나 많은 서비스들이 있고 복잡한 아키텍처를 통해 관리를 하다보면 다음과 같은 유지보수 문제를 만나곤 한다.
- 서버를 내릴 수 없다.
- 장애가 나지 않으면 굳이 설정이나 구성을 바꾸지 않는다.
- 이상한 설정이 있어도 개선하지 않는다.
- 누가 변경을 해도 알기가 어렵다.
- 어떤 리소스가 있는지 알 수 없다.
이를 효율적으로 관리하기 위해 IaC가 필요하다.
IaC의 특징
- 프로그래밍 가능
- 인프라스트럭처를 소프트웨어처럼 다룬다.
- 소프트웨어 개발의 경험을 인프라스트럭처 관리에 적용한다.
- 버전 관리 도구(VCS)
- 코드 리뷰
- 테스트 자동화
- 지속적 통합
- 지속적 배포
- 온 디멘드
- 반복 가능해야 한다. 다른 팀원, 리전으로 인프라를 똑같이 쉽게 옮길 수 있어야 한다.
- 서버가 고장나면 교체한다.
- 수동으로 작업하지 않는다.
IaC의 종류
- 절차형(procedural) IaC
- 프로그래밍 언어를 이용해서 직접 순차적으로 인프라를 생성하도록 코드를 작성하는 방법
- 실제 적용된 결과를 가늠하기 어렵고, 직관적이지 않음.
- 원하는대로 로직을 구성하여 보다 강력하게 인프라 구성 가능
- 작성하기 위해서는 인프라에 대한 깊은 이해가 우선시 되어야하며, 별도의 학습이 필요함
- AWS CDK, Pulumi 등
- 선언형(declaritive) IaC
- JSON, YAML과 같은 선언형 언어를 사용
- 실제 적용된 결과(desired state)와 적용할 내용(YAML)이 직관적으로 매핑되어 이해하기 쉬움
- 인프라에 대한 깊은 이해가 필요없이 인프라 구성가능
- CloudFormation, Azure Blueprint, Cloud Deployment Manager, Terraform
Terraform
- 오픈소스
- 다양한 프로바이더 지원. AWS, Azure 등
- HCL언어로 리소스 선언
- 커맨드라인 인터페이스 사용
- 간단하다!
Mutable vs. Immutable Infrastructure
인프라를 관리하기 위한 두 가지 방법이 있다. 가변적 방법과 불변적 방법. 서버가 On premise 방식에서 On demend 방식으로 변경되면서 점점 immutable한 관리 방법이 필요하기 시작했다. IaC와 Terraform을 사용하는 이유를 알기위해 알아야 하는 개념이다.
- A mutable infrastructure approach
- 서버 인프라를 관리하기 위해서 기존의 인프라를 수정하는 것이다.
- 새로운 버전의 앱과 서버를 설치하기 위해 A 인스턴스에 직접 들어가서 업그레이드를 진행한다.
- 예상치 못한 인프라 변동 사항(Configuration drift)에 대응하기 어렵다.
- 위험이 크고, 버전이 복잡해진다.
- An immutable infrastructure approach
- 절대 한번 만든 인프라는 수정하지 않는다.
- 수정사항이나 버전 변경이 있다면 새로운 B 인스턴스를 만들어서 새로 프로비저닝과 배포를 진행한다.
- 즉, 변경은 삭제 후 생성이라는 의미를 가진다.
- 직접 인프라를 수정해서 나타나는 Configuration drift를 원천적으로 막는다.
- IaC를 사용한다.
- 만약, 기존의 애플리케이션이 로컬 디스크를 DB로 쓰고 있다면?
- 기존 DB를 모두 삭제하고 새로운 애플리케이션을 만들순 없으니, DB를 외부화한다.(externalization)
- 마이크로 서비스 느낌으로 EBS와 같은 볼륨 저장소에 DB를 넣을 수 있다.
- 블루, 그린 배포를 위해 불변 인프라를 사용한다면, 로드밸런서가 지워지면 안된다.
절차적 언어 vs. 선언적 언어
- 선언적 언어
이 상황에서 내가 ec2 개수를 5개 더 추가하고 싶다면 count = 15로 해주면 된다. 이것이 선언적 언어이다. 이것만 보면 ec2의 개수가 15개 인것을 직관적으로 파악할 수 있다.
- 절차적 언어
앞뒤로 맥락이 있어야한다. 대표적으로 앤서블이 있다. 처음에 ec2를 5개 생성하고, 10개를 더 생성하고 싶다면 count: 10으로 한다. 그렇다면 결과적으로 총 15개가 생성된다. 엔서블은 이전 5개 생성을 절차적으로 기억한다.
Terraform의 작동 원리
Terraform의 선언적 방식으로 작성된 코드는 항상 인프라의 최신 상태를 의미하는데, Terraform은 어떤 방식으로 인프라를 최신 상태로 유지할 수 있는 걸까?
"상태"라는 것을 사용하고 있기때문, 그것을 .tfstate파일에 저장한다.
.tf 설정 파일을 바탕으로 terraform apply를 한다면, ec2가 생성되고 그 상태정보를 .tfstate에 저장한다.
만약 .tfstate 파일을 지운다면, 이전 상태를 기억하지 못하기때문에 그것에 대한 작업을 하지 못한다.
콘솔에서 ec2를 수정한다고 해서 .tfstate에 변경 사항이 반영되는 것은 아니다.
출처
https://www.hashicorp.com/resources/what-is-mutable-vs-immutable-infrastructure
Immutable Infrastructure: Benefits, Comparisons & More
An immutable infrastructure refers to servers that are never changed after deployment. Learn best practices for handling immutable infrastructure today.
www.hashicorp.com
Build secure immutable infrastructure in the cloud - DevSecOps
In the pre-digital era, infrastructure provisioning and security scanning were done manually. Because of this, a major release took months…
medium.com
https://www.hashicorp.com/resources/what-is-mutable-vs-immutable-infrastructure
Immutable Infrastructure: Benefits, Comparisons & More
An immutable infrastructure refers to servers that are never changed after deployment. Learn best practices for handling immutable infrastructure today.
www.hashicorp.com