하나의 서버 EC2에 집중되어 있던 서비스와 컨테이너를 분리 진행했다.
기존의 서버 구성은 다음과 같다
service
postgis
memcached
nginx
certbot
위 5개의 컨테이너를 아래와 같이 분산 구현하려고 한다
1번 EC2: service, nginx, certbot
2번 EC2: postgis
3번 EC2: memcahced
인프라를 분산하여 구현하려는 이유는 다음과 같다.
1. 성능 향상 및 확장성
- service, Nginx, Certbot 인스턴스
- 웹 애플리케이션과 관련된 모든 것이 한 곳에 있기 때문에, 웹 트래픽을 쉽게 관리하고, 애플리케이션의 로드 밸런싱을 구현 가능
- 필요에 따라 인스턴스를 수평적으로 확장하여 더 많은 트래픽을 처리 가능
- memcached 인스턴스
- 캐시 서버를 별도로 둬서 캐시의 부하를 따로 관리할 수 있으며, 메모리 사용량을 최적화
- 캐시를 여러 애플리케이션 서버에서 공유
- PostGIS 인스턴스
- 데이터베이스 서버를 분리하여 데이터베이스의 부하를 다른 애플리케이션 서버와 분리하여 관리
- 데이터베이스 성능 최적화와 보안을 독립적으로 관리
2. 안정성 및 가용성
- 각 서비스 분리할 경우 한 컴포넌트의 장애가 다른 컴포넌트에 영향을 미치지 않는다. 예를 들어, 애플리케이션 서버에 문제나 장애 발생시 데이터베이스 서버나 캐시 서버는 정상적으로 동작할 수 있다.
- 개별 인스턴스를 독립적으로 재시작하거나 유지보수할 수 있어, 서비스 다운타임을 최소화
3. 보안 강화
- 각 서비스가 분리되어 있으면, 보안 정책을 더욱 세밀하게 적용할 수 있다.
- 데이터베이스 서버에 대한 접근을 제한, 애플리케이션 서버와 캐시 서버는 필요한 포트만 열어 보안 위협을 줄일 수 있다.
4. 관리 용이성
- 서비스가 분리되어 있으면, 각 서비스의 로그, 모니터링, 백업 등을 독립적으로 관리가 가능하기 때문에 문제를 쉽게 진단하고 해결할 수 있다.
- CI/CD 파이프라인을 개별 서비스에 맞춰 구축이 가능하기 때문에 배포 속도를 높일 수 있다.
1. 보안그룹 설정
인프라 분산을 구현하기 위해 AWS EC2 인스턴스를 추가로 생성한다. 인프라마다 설정이 다 다르기 때문에 생성하는 방법은 따로 설명하지 않음, 본 인프라 구현에서는 t3.medium ubuntu로 생성하여 사용.
생성시에 보안그룹을 설정해줘도 되고 생성시에 설정해줘도 된다.
보안그룹 생성 설정은 다음과 같다.
서비스 EC2-보안그룹 1
인바운드:22(SST), 80(HTTP), 443(HTTPS) 모든 IP (0.0.0.0/0)에서 접근 허용
아웃바운드: 모든 IP (0.0.0.0/0)로 나가는 트래픽을 허용
DB EC2-보안그룹 2
인바운드: 22(SST), 5432(postgis) 보안그룹 1에서 접근 허용
아웃바운드: 5432 모든 IP (0.0.0.0/0)로 나가는 트래픽을 허용
캐시 EC2-보안그룹 3
인바운드: 22(SST), 11211(memcached): 보안그룹 1에서 접근 허용
아웃바운드: 11211 모든 IP (0.0.0.0/0)로 나가는 트래픽을 허용
이렇게 설정시 외부에서는 서비스 서버로만 접근이 가능하며 DB, 캐시 서버로는 접근이 불가능하고, 위에서 언급한 장점을 살릴 수 있다.
실제로 포트가 연결됐는지 확인하는 방법은 다음과 같다.
telnet {privateIP} {port}
실제로 연결해보면 아래와 같이 Connected to {private ip} 문구가 나온다면 제대로 설정한것이다.
그러면 기존의 배포는 하나의 EC2 인스턴스에 몰아서 했지만 3개의 EC2 인스턴스로 분리하면서 docker-compose.yml도 3개로 분리후 적용 시켰다. 서비스 EC2 인스턴스는 주기적으로 버전관리와 업데이트가 발생하지만 DB와 캐쉬의 서버는 업데이트가 주기적으로 발생하지 않기 때문에 실제로 CI/CD가 주기적으로 배포되는것은 서비스 docker-compose 밖에 없다.
'배운내용 정리' 카테고리의 다른 글
Github Actions + Docker compose 버전관리 + nginx (0) | 2024.04.20 |
---|---|
Nginx + Certbot을 통한 Https 및 TimeZone 적용 (0) | 2024.04.15 |
Github Action CI/CD + Docker (0) | 2024.04.02 |
JDBC (0) | 2023.11.13 |
Spring IoC와 DI (0) | 2023.11.10 |