[EC2] AWS EC2 프로젝트 배포 (1) - 도입배경, 설계

1. 도입배경

1) 로컬 환경의 문제점

로컬 환경 시스

  • 처음에는 로컬 환경에서 Docker Compose를 활용해 프로젝트를 운영했습니다.  하지만 몇 가지 문제점이 발생했습니다:
  • 로컬 개발 환 환경의 한계: 로컬 시스템 자원을 활용하다 보니 확장성에서 제약이 발생했습니다. 특히, 사용량이 증가할 때 인프라 확장이 어려워졌습니다.
  • 확장성과 유연성 부족 : 트래픽 증가에 효과적으로 대응하기 어려웠습니다. 트래픽이 몰릴때 서버를 증설하거나, 구성 변경이 필요한 경우, 시간과 노력이 많이 소요되어 비효율적이었습니다.
  • 로드 밸런싱 문제 : 특정시간에 트랙픽 증가시, 효율적으로 분산 처리할 수 있는 로드 밸런싱 솔루션이 필요했지만, 로컬 환경에서는 이를 구현하기에 기술적, 물리적 제약이 있었습니다.
  • 이러한 문제를 해결하기 위해 AWS EC2로의 이전을 결정했습니다. EC2를 활용하면 확장성, 유연성, 안정성을 확보할 수 있으며, AWS의 다양한 서비스(예: 로드 밸런서, 모니터링 도구)와의 연동을 통해 효율적인 클라우드 환경을 구성할 수 있습니다.

2) 왜 EC2인가?

  • AWS EC2(Elastic Compute Cloud)는 클라우드 컴퓨팅을 위한 인프라 서비스로, 다음과 같은 강점 때문에 선택하게 되었습니다:
  • 유연한 확장성과 비용 절감 (Auto Scaling): 트래픽 증가 시 인스턴스를 자동으로 추가(Scale Out)하고, 트래픽 감소 시 인스턴스를 줄이는(Scale In) Auto Scaling 기능을 통해, 사용량에 따라 유연하게 확장 및 축소할 수 있습니다. 이를 통해 리소스를 효율적으로 활용하고 비용을 절감할 수 있습니다.
  • 부하 분산 및 가용성 향상 (Load Balancing) : Elastic Load Balancer를 통해 클라이언트의 요청을 여러 EC2 인스턴스로 분산함으로써, 각 인스턴스의 부하를 낮추고 시스템의 가용성과 안정성을 높일 수 있습니다.
  • 비용 효율성: 필요한 리소스만 사용하고 필요하지 않을 때는 인스턴스를 중지할 수 있어, 클라우드 비용을 최적화할 수 있습니다.
  • AWS 생태계와의 통합 : EC2는 AWS의 다양한 서비스와 원활하게 연동됩니다. 예를 들어, RDS와 쉽게 연결하여 데이터베이스를 관리하거나,  VPC를 활용해 Inbound와 Outbound 트래픽을 세밀하게 제어할 수 있습니다. 이를 통해 백엔드 서비스와 Redis 같은 캐시 서버를 안전하고 안정적으로 운영할 수 있습니다.

2. 설계

1) 공통

  • 서버 운영 시스템으로는 Ubuntu를 사용합니다. Ubuntu는 경량화된 리눅스 배포판으로, 서버 환경에 적합한 성능을 제공합니다.
  • 애플리케이션 배포는 Docker Compose를 사용하여 수행하며, 각 인스턴스의 환경 변수는 .env 파일을 통해 안전하게 전달됩니다.
  • FrontendBackend 인스턴스는 미리 구축된 Docker 이미지를 Docker Hub에 등록하여 사용합니다.
  • 서버 설정을 위해, SSH 접속을 위해 인바운드 22번 포트를 개방합니다.

2) Frontend Instance

  • In Bound 규칙 : 클라이언트 접속을 위해 80(HTTP), 443(HTTPS) 포트를 개방합니다.
  • Out Bound 규칙 : Backend Instance 통신을 위해 8081 포트를 개방합니다.
  • Elastic Ip : EC2는 재부팅시 Public Ip가 초기화 되므로, 클라이언트의 원활한 접근을 위해 Elastic IP를 할당받습니다.

3) Backend Instance

  • In Bound 규칙 : Frontend Instance 통신을 위해 8081 포트를 개방합니다.
  • Out Bound 규칙 : Redis, RDS 인스턴스와 연결하기위해 6379,6380,3306(MySQL 기본값) 포트를 개방합니다.

4) Redis Instance

  • In Bound 규칙 : Backend Instance 통신을 위해 8081 포트를 개방합니다.
  • Out Bound 규칙 :Redis 인스턴스는 외부와의 연결이 필요하지 않으므로, 아웃바운드 포트는 닫습니다..

5) RDS

  • MySQL DB입니다.
  • In Bound : Backend Instance 통신을 위해 8081 포트를 개방합니다.