테라폼(Terraform)이란?
테라폼 도입 이유:
우리 프로젝트는 클라우드 네이티브 환경에서 마이크로서비스 아키텍처(MSA)를 채택하고 있다. 이 과정에서 AWS ECS와 각각의 RDS 인스턴스에 대한 비용이 예상보다 높게 나타나고 있었다. 이러한 비용 문제를 해결하고자 테라폼을 도입하기로 결정했다.
테라폼을 사용하여 AWS ECS 인스턴스의 가동 시간을 조정함으로써 비용을 절감할 수 있다. 일하는 시간 동안에는 ECS를 활성화시켜 서비스를 운영하고, 퇴근 후나 잠을 자는 비활동 시간에는 중지시켜 불필요한 비용을 줄일 계획이다.
수동으로 ECS 클러스터, 서비스, RDS 등등을 삭제 및 시작하는 시간이 너무 불 필요한 시간이고 이를 수동으로 관리하다 보면 예상치 못한 오류를 발생시킬 수도 있을 것 같아서 테라폼을 도입하기로 했다.
테라폼은 현대 클라우드 인프라 관리에 혁신을 가져다준 도구다. 이 도구는 인프라를 코드로 관리하는 IaC(Infrastructure as Code) 방식을 채택하여, AWS, Azure 등 다양한 클라우드 환경에서 리소스를 효율적으로 관리할 수 있도록 도와준다.
1. 테라폼의 핵심 장점
테라폼의 핵심 장점은 여러 가지다.
정확성과 일관성
테라폼은 인프라를 코드로 관리하는 'Infrastructure as Code' 접근 방식을 사용한다. 이 방식은 클라우드 환경을 수동으로 설정할 때 자주 발생하는 실수나 설정 누락을 효과적으로 방지한다.
예를 들어, AWS 환경에서 VPC, 서브넷, 보안 그룹 등을 구성할 때 수동으로 하면 실수가 발생하기 쉬운데, 테라폼을 사용하면 이러한 실수를 크게 줄일 수 있다. 코드로 모든 설정을 정의하기 때문에 한 번 설정된 구조가 다른 환경에서도 동일하게 적용되어 일관성을 유지할 수 있다.
코드 기반 문서화
테라폼 코드 자체가 인프라의 설계 문서 역할을 한다. 코드 안에는 네트워크 구조, 서버 설정, 사용된 클라우드 서비스 등이 명시되어 있어, 누구든지 코드를 보면 인프라의 전체 구조를 쉽게 이해할 수 있다.
예를 들어, Java 애플리케이션을 AWS에 배포하는 경우, EC2 인스턴스, RDS 데이터베이스, ELB 로드 밸런서 등을 구성하는 코드를 작성하고, 이 코드를 통해 실제 인프라 구성이 어떻게 이루어지는지 파악할 수 있다.
재사용성과 공유 용이성
테라폼 코드는 재사용이 가능하며, 다른 프로젝트나 팀원과 쉽게 공유할 수 있다.
예를 들어, AWS에 구축한 특정 아키텍처(예: 웹 애플리케이션의 기본 구조)를 다른 프로젝트에도 적용하고 싶을 때, 해당 테라폼 코드를 그대로 가져와 사용할 수 있다. 또한, 이 코드를 팀원과 공유함으로써 모든 팀원이 동일한 인프라 설정을 쉽게 재현하고, 필요에 따라 수정하거나 확장할 수 있다.
2. 테라폼의 주요 구성 요소
테라폼의 주요 구성 요소로는 테라폼 코드(.tf 파일), 프로바이더, 리소스, 스테이트 파일 등이 있다.
테라폼 코드(.tf 파일)
인프라 구성을 정의하는 코드다. 여기에는 어떤 종류의 서버를 몇 대 만들 것인지, 네트워크 설정은 어떻게 할 것인지 등이 포함된다.
프로바이더
클라우드 서비스(AWS, Google Cloud 등)와 테라폼 사이의 연결고리다. 테라폼이 AWS에 명령을 내리려면 AWS 프로바이더가 필요하다.
리소스
클라우드 상의 구체적인 자원을 의미한다. 예를 들어, AWS에서의 EC2 인스턴스, S3 버킷 등이 리소스에 해당한다.
스테이트 파일
테라폼이 관리하는 인프라의 현재 상태를 기록한 파일이다. 이 파일을 통해 테라폼은 현재 클라우드 상태와 코드 사이의 차이를 파악한다.
3. 테라폼의 작동 과정
테라폼의 작동 과정은 세 단계로 이루어져 있다.
- 초기화(Init): 테라폼을 시작할 때, 필요한 프로바이더와 모듈을 불러오는 단계다.
- 계획(Plan): 코드에 정의된 내용과 실제 클라우드 상태를 비교하여, 어떤 변경이 이루어질지 계획을 세운다.
- 적용(Apply): 계획된 변경사항을 실제 클라우드에 적용한다. 이 단계에서 새로운 서버가 생성되거나 기존 서버가 변경된다.
4. 테라폼 활용 예시
AWS를 예로 들면, 테라폼을 사용하여 EC2 인스턴스의 생성, 구성, 관리를 자동화할 수 있다.
예를 들어, 다음과 같은 테라폼 코드를 작성하여 EC2 인스턴스를 생성할 수 있다:
provider "aws" {
region = "us-west-2"
}
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = "MyExampleInstance"
}
}
이 코드는 AWS의 us-west-2 리전에서 t2.micro 타입의 EC2 인스턴스를 생성하는 내용이다. 더 자세히 설명해 보겠다.
- provider "aws"
- 이 줄은 AWS를 테라폼의 프로바이더로 지정한다. 프로바이더는 테라폼이 인프라를 구축하고 관리하는데 사용하는 클라우드 서비스나 기술을 말한다. 여기서 "aws"는 예약어로, AWS를 나타낸다.
- region = "us-west-2"
- 이 부분은 AWS의 특정 지역을 지정한다. 여기서는 미국 서부(오리건) 지역을 선택했다.
- resource "aws_instance" "example"
- resource는 테라폼에서 관리하려는 인프라 자원을 의미한다. 여기서 "aws_instance"는 또 다른 예약어로, AWS EC2 인스턴스를 생성하려는 것을 나타낸다. "example"은 이 EC2 인스턴스의 이름으로, 사용자가 지정한 변수 이름이다.
- ami = "ami-0c55b159cbfafe1f0" 및 instance_type = "t2.micro"
- 이 줄들은 EC2 인스턴스의 속성을 설정한다. ami는 Amazon Machine Image를 지정하며, instance_type은 인스턴스의 타입을 정한다.
- tags = { Name = "MyExampleInstance" }
- 이 코드는 생성될 인스턴스에 태그를 붙이는 부분이다. 태그는 리소스를 구분하고 관리하는 데 도움이 된다.
이처럼 테라폼을 사용하면 클라우드 리소스를 보다 효율적으로 관리할 수 있으며, 개발 및 운영 환경에서 큰 도움이 된다.
테라폼에서 사용하는 언어 (HCL언어와 Go 언어)
테라폼에서 사용자가 직접 작성하는 코드는 HCL(HashiCorp Configuration Language)을 사용한다.
HCL은 인프라 및 서비스 구성을 명확하고 간결하게 정의하기 위해 설계된 언어다. 사용자는 이 언어를 사용하여 클라우드 리소스의 생성, 관리 및 조정에 필요한 모든 사항을 기술한다.
HCL은 '무엇(What)'을 할 것인지를 설명하는 선언적 언어다. 즉, 사용자는 최종적으로 얻고자 하는 인프라의 상태를 기술하며, 테라폼이 이를 어떻게 달성할지는 내부적으로 처리된다. JSON과 비슷하지만, 훨씬 읽기 쉽고 이해하기 쉬운 구문을 제공한다. 이는 코드의 가독성과 유지보수성을 크게 향상한다. 또한 HCL은 AWS, Azure, Google Cloud 등 다양한 클라우드 제공업체에 대한 설정을 동일한 방식으로 기술할 수 있게 해 줌으로써 클라우드 독립적이라고 할 수 있다.
테라폼 자체의 핵심 엔진과 프로바이더 플러그인은 Go 언어로 작성되어 있다. Go는 고성능, 강력한 동시성 지원, 간결한 구문 등의 장점을 가진 프로그래밍 언어다. 테라폼의 내부적인 작동 과정, 즉 HCL로 작성된 사용자 정의 코드를 해석하고, 클라우드 제공업체의 API를 호출하여 인프라를 생성, 변경 또는 삭제하는 로직은 모두 Go 언어로 구현되어 있다.
5. 테라폼의 고급 사용법과 최적화 전략
테라폼을 사용하여 고급 수준의 인프라 관리를 수행하는 방법은 여러 가지다. 이들 방법은 테라폼의 기능을 최대한 활용하여 인프라 구성의 효율성과 안정성을 높이는 데 초점을 맞추고 있다.
모듈화
테라폼에서 모듈화는 큰 규모의 인프라를 작은, 재사용 가능한 구성 요소로 나누는 것을 의미한다. 이 접근 방식은 코드의 중복을 줄이고, 유지보수를 용이하게 한다. 모듈은 특정 기능 또는 서비스를 위한 코드 블록으로, 필요에 따라 다양한 프로젝트에서 재사용될 수 있다.
예를 들어, 네트워크 설정, 서버 구성, 데이터베이스 설정 등을 별도의 모듈로 분리하여 관리할 수 있다. 이렇게 함으로써, 개발자들은 각 모듈을 독립적으로 개발하고 테스트할 수 있었으며, 전체 인프라 구성의 복잡성을 크게 줄일 수 있다.
상태 관리
테라폼의 상태 파일은 인프라의 현재 상태를 추적하는 중요한 요소다. 이 상태 파일을 적절히 관리하는 것은 여러 팀원이 동시에 인프라 작업을 수행할 때 중요하다. 원격 상태 저장소의 사용은 상태 데이터의 일관성을 유지하고, 팀 내 충돌을 방지하는 데 도움이 된다.
예를 들어, Amazon S3 또는 Terraform Cloud와 같은 원격 저장소를 사용하여 상태 파일을 공유하고 동기화할 수 있다. 이를 통해, 팀원들은 언제든지 최신 상태의 인프라를 파악하고 안전하게 변경을 적용할 수 있다.
환경 분리
개발, 스테이징, 프로덕션과 같은 다양한 환경을 분리하여 관리하는 것은 테라폼에서 중요한 전략이다. 각 환경은 서로 다른 설정과 리소스를 가질 수 있으며, 이를 분리함으로써 각 환경에 적합한 구성을 적용할 수 있다. 환경 별로 별도의 구성 파일을 사용하거나, 워크스페이스를 분리하여 관리함으로써, 개발자는 각 환경의 특성에 맞게 리소스를 조정하고 테스트할 수 있다. 이러한 분리는 실수로 인한 중요한 환경의 손상을 방지하고, 개발 및 테스트 과정을 보다 안정적으로 수행할 수 있게 해 준다.
이러한 고급 사용법과 최적화 전략은 테라폼을 사용하는 조직이 인프라 관리의 효율성과 안정성을 높이는 데 크게 기여했다.
여기까지 테라폼의 기본적인 내용을 알아봤다. 이제 다음 글에서 실제로 테라폼을 설치해 보고 코드를 작성해 보자.
이 포스트는 Team chillwave에서 사이드 프로젝트 중 적용했던 부분을 다시 공부하며 기록한 것입니다.
시간이 괜찮다면 팀원 '개발자의 서랍'님의 블로그도 한번 봐주세요 :)
'테라폼(Terraform)' 카테고리의 다른 글
엉금엉금 테라폼 적용하기 (6) - Dynamic 블록으로 AWS 서비스와 태스크 정의하기 (0) | 2023.12.13 |
---|---|
엉금엉금 테라폼 적용하기 (5) - 테라폼으로 ECS Cluster를 생성할때 사용되는 용량 공급자(capacity provider) 이해하고 적용하기 (1) | 2023.12.11 |
엉금엉금 테라폼 적용하기 (4) - Terraform에서 Launch Template, 오토 스케일링 설정하기 (0) | 2023.12.08 |
엉금엉금 테라폼 적용하기 (3) - Terraform AWS Provider 및 VPC, Subnet 설정 (0) | 2023.12.08 |
엉금엉금 테라폼 적용하기 (2) - MacOS에서 테라폼 설치 및 terraform 명령어 사용법 (0) | 2023.12.08 |