서비스를 제공할 Infrastructure를 구성, 구축하는 것을 Infrastructure Provisioning이라고 한다.
연차가 많이 쌓인 개발자들은 코웃음을 칠 수준이겠지만, 본격적으로 개발이라는 것에 손대기 시작한 8월부터
이에 대해 관심을 가져왔고, 본격적으로 인프라의 구성과 배포를 배우기 시작한 10월부터는
배포 환경을 끊임없이 만들어왔다.
처음에는 AWS EC2 단일 인스턴스 하나 + Docker 사용을 통한 것이 전부였다.
아직도 사용하는 것은 AWS뿐 이지만
그 안에서도 차근 차근 내가 다루지 못했던 인스턴스들, 서비스를 사용하며 영역을 넓혀가고 있었다.
하면 할 수록 느끼는 것은 인프라를 구축하는 데는 시간이 꽤 걸리고, 손이 많이 간다는 것이다.
도중에 어떤 값을 사용했는지도 일일이 확인해줘야하고.. 기억할 것도 많다. 빼놓기 쉬운 것도 많다.
전체적인 방식 자체는 스마트하다고 할 수 있으나,
여전히 사람의 손을 많이 타고 Human Error가 발생할 수 있는 상황이라고 본다.
그러다가 새로운 방식의 인프라 구성 방법은 없는지 찾게 되었고
그중 하나가 HashiCorp에서 제공하는 오픈 소스 툴인 Terraform이다.
1. 명령형 프로그래밍 (Imperative Tool)
이전에 Docker-Compose 관련 연재 글에서 설명한 개념 중 하나가 선언형 툴인데,
Docker (3) - 다중 컨테이너를 묶어 정의하기 : docker-compose
Docker가 배포, 실행의 차원에서 실행되는 것이라면 여러 개의 이미지를 각각 Dockerfile을 통한 build를 해주어야 하는가?에 대한 의문이 있다. 물론 2-3개라면 충분히 그럴수 있지만 docker를 통해 더
namucy.tistory.com
간단히 짚고 넘어가자면 명령형 툴은 개발자가 일반적으로 프로그래밍을 하는 과정이 바로 그것이다.
어떤 것을 만들고 싶을때, 이것이 필요한 것을 적고, 그것을 어떻게 다루는지를 짚어줘야 하는 것이 바로 명령형 툴이다.
가령, 다음과 같은 계산기 Class 가 있다고 하자.
public class Calculator {
public static Integer add(Integer a, Integer b) {
return a + b;
}
public static Integer multiple(Integer a, Integer b) {
return a * b;
}
public static Double divide(Integer a, Integer b) {
if (b == 0) {
throw new IllegalArgumentException("나눌 수에는 0이 들어갈 수 없습니다.")
}
return (double) a / b;
}
}
이는 명령형 프로그래밍, 명령형 툴의 대표적인 예시이다.
내가 직접 어떤 값이 들어갔을 때(Integer 값이 2개)와
어떻게 반환해야 하는지 (두 개의 값을 더한다, 곱한다, 나눈다, 나눌 수에 0이 들어가면 throw 한다)를 표현해주어야 한다.
2. 선언형 도구 (Declarative Tool)
그렇다면 선언형 툴은 그냥 "만들겠다" 만을 표현한다.
docker에서 Dockerfile의 경우, 어떤 jar를 사용하겠다. 어떤 entrypoint만 정의해 두겠다, 어떤 환경 변수를 사용하겠다.
라고 설정한다면 이러한 환경을 가진 Application 격리환경을 생성해준다.
Docker를 생성할 때 namespace의 격리환경 설정이나
cgroup를 통한 자원 할당 등의 프로세스를 관리하지 않아도 된다.
그냥 단순히 아래처럼 매우 간단한 Dockerfile만을 만들어 두면 된다.
FROM amazoncorretto:17-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENV JASYPT_PASSWORD=1234
ENV SPRING_PROFILE=jang
ENTRYPOINT ["java", "-Djasypt.encryptor.password=${JASYPT_PASSWORD}", "-Dspring.profiles.active=${SPRING_PROFILE}", "-jar","/app.jar"]
이렇게만 정의해 놔도 알아서 amazoncorretto, linux 기반 격리 환경을 구축한다.
Docker Engine만 있다면 알아서 실행할 수 있는 이미지를 구축하는 것이다.
사견으로, 선언형과 명령형의 경계 자체는 애매하다고 생각되기는 하다.
왜냐하면 선언형 툴 또한 내부를 확인해 보면 명령형 프로그래밍으로 만들어져 있을 것이기 때문이다.
그렇지만 우리가 API를 사용할 때 내부 구현체가 어떻게 되는지 관심을 가지지 않는 것처럼,
라이브러리를 사용할 때 내부 구현을 신경 쓰지 않는 것처럼,
사용을 하는 입장에서 봤을 때를 기준으로 생각해 보면 여전히 이 두 개로 명쾌하게 구분될 수는 있을 것이다.
선언형(Declarative) 프로그래밍은 “무엇을 하고 싶은지(What)”에 집중하고,
명령형(Imperative)은 “어떻게 할 것인지(How)”에 집중한다.
3. Infrastructure as Code
Terraform도 이와 같은 "선언형 툴"이다. Infrastructure as Code라고 불리는데,
코드를 기반으로 인프라를 구축하는 것이다.
가령 AWS에서 EC2 단일 인스턴스에 서버를 올리겠다고 가정해 보자.
이를 위해서 필요한 것은 가장 먼저 VPC의 구축이고, 그다음 VPC에 구성되어 있는 Subnet,
그리고 Subnet들을 라우팅 할 route table이 필요하고,
이를 외부로 라우팅할 Internet Gateway가 필요하다.
이와 같은 모든 것들을 다 설정해주어야 하는데, 이는 솔직히 좀 번거롭고, 누락할 여지도 있을 것이다.
추가적으로, 의존성 또한 고려해주어야 한다.
물론 Terraform도 의존성을 고려하지 않는 것은 아니다. 하지만 최소한의 의존성만을 고려해 주면 되기 때문에
편리하다고 할 수 있다.
다만 러닝 커브가 조금 있다고는 생각된다.
먼저, 사용하고자 하는 Infrastructure Provider(AWS, GCP, OCI 등...)에 대한 기본적인 인프라 지식이 있어야 한다.
두 번째로, 인프라 내 인스턴스 간 의존성에 대해서 어느 정도 알고 있어야 한다.
마지막으로, 공식 document에 대한 거부감이 없어야 할 것 같다.
4. 참조할 공식 Document 소개와 앞으로 연재할 글들에 대한 방향성
물론 HashiCorp에서도 공식 문서 자체에 많은 정보를 제공해 주고는 있다.
그렇지만 모든 Provider, 어떤 Instance의 속성이 있는지, 어떻게 적어야 하는지 등은 일일이 확인할 수밖에 없는 것 같다.
https://registry.terraform.io/providers/hashicorp/aws/latest
Terraform Registry
registry.terraform.io
AWS와 같은 경우, 위와 같이 어떻게 resource를 사용해야 하는지 공식 문서를 제공해주고 있으며
일단 먼저 HashiCorp 공식 홈페이지에서 Tutorial을 간략하게 제공해 주고,
그 뒤에 심화된 Tutorial까지 같이 제공해 준다.
https://developer.hashicorp.com/terraform/tutorials/aws-get-started/infrastructure-as-code
What is Infrastructure as Code with Terraform? | Terraform | HashiCorp Developer
Learn how infrastructure as code lets you safely build, change, and manage infrastructure. Try Terraform.
developer.hashicorp.com
위는 내가 직접 만든 Terraform을 통한 develop zone에 대한 Infrastructure이다.
나도 모든 튜토리얼을 다 보고 하지는 않았고, 필요한 것을 봐가면서 공부했다.
내가 이번에 Terraform을 통해서 중점적으로 사용했던 것은 아래와 같다.
- 내가 많이 사용하는 Infrastructure에 대한 Template화
- AWS 서비스 내 요소 하나하나 들에 대한 module화
- Cloud Network에 대한 module화
- 개발 환경 전체 Infrastructure에 대한 module화
- 현재 사용하고 있는 Production Infrastructure에 대한 module화
- HTTPS환경 구축을 위한 CloudFront, ACM, ALB, Route 53, IAM까지의 모듈화
주요 키워드는 Module, Template이다.
앞으로 이에 관해서 몇 가지 글을 연재해볼까 한다.
'연재작 > DevOps' 카테고리의 다른 글
private ECR은 public보다 비싸지만, 잘 사용한다면 어떨까? (0) | 2025.03.09 |
---|---|
Terraform 핵심 프로세스 (0) | 2025.01.29 |
MSA의 분산 트랜잭션, Saga 패턴 (1) | 2024.11.21 |
EC2 Tomcat Server pipeline 구축 + S3 정적 웹서버와 연동 (1) | 2024.11.09 |
AWS S3를 통한 React SPA의 CI/CD Pipeline (0) | 2024.11.07 |