Skip to content

Infrastructure Optimization

DongHoon Lee edited this page Aug 14, 2024 · 1 revision

Architecture

Architecture Explanation

1. AWS Cloud

  • AWS Amplify:
    • AWS Amplify는 프론트엔드 애플리케이션의 배포 및 호스팅을 담당합니다. 이 시스템에서 프론트엔드 코드가 배포되며, 개발(dev)과 메인(main) 브랜치에 따라 환경이 분리되어 관리됩니다.
  • RDS (MySQL):
    • AWS RDS는 관리형 관계형 데이터베이스 서비스를 제공하며, 이 아키텍처에서는 MySQL을 사용합니다. 주로 애플리케이션의 주요 데이터(예: 사용자 정보, 애플리케이션 상태 등)를 관리하는 데 활용됩니다.

2. GitHub

  • GitHub:
    • GitHub는 소스 코드 저장소로, 백엔드 및 프론트엔드 코드를 관리합니다. 이 아키텍처에서는 Github Flow 전략이 사용됩니다. dev 브랜치와 main 브랜치의 코드가 이곳에서 관리되며, Jenkins를 통해 배포 파이프라인이 트리거됩니다.

3. Jenkins

  • Jenkins CI/CD:
    • Jenkins는 CI/CD 파이프라인을 구현하기 위해 사용됩니다. GitHub에 코드가 푸시되면 Jenkins가 이를 감지하고 빌드 및 배포 프로세스를 시작합니다.
    • dev 브랜치의 경우 개발 환경으로, main 브랜치의 경우 프로덕션 환경으로 배포가 진행됩니다.

4. Google Cloud

  • Compute Engine:
    • Google Cloud의 Compute Engine은 백엔드 서버를 위한 컴퓨팅 리소스를 제공합니다.
    • Develop 환경Production 환경은 Blue-Green Deployment 전략을 통해 각각 두 개의 컨테이너로 구분되며, 이를 통해 서비스 중단 없이 새로운 버전의 코드를 배포할 수 있습니다.
  • Nginx:
    • Nginx는 웹 서버 및 리버스 프록시로서, 사용자 요청을 적절한 백엔드 서버로 라우팅합니다. Nginx는 주로 로드 밸런싱과 정적 파일 제공에 사용되며, Blue-Green Deployment를 지원하기 위해 Green Container가 정상적으로 실행되면 sed -i 명령어로 포워딩 포트를 업데이트하는 전략을 사용합니다.
  • DB (Chatting):
    • RedisMongoDB는 채팅 데이터를 처리하고 저장하는 데 사용됩니다. Redis는 주로 캐싱 및 세션 관리에 사용되며, MongoDB는 비정형 데이터를 저장하는 NoSQL 데이터베이스로 사용됩니다.
  • Fail2ban:
    • Fail2ban은 보안 솔루션으로, 서버에 대한 SSH brute-force 공격을 탐지하고 차단합니다. 3회 이상 로그인 실패한 IP에 대해 영구적으로 접근을 차단하여 서버의 보안을 강화합니다.
  • Monitoring (ELK Stack):
    • ELK Stack(ElasticSearch, Logstash, Kibana)은 애플리케이션 성능 모니터링(APM)과 로그 관리에 사용됩니다. ElasticSearch는 데이터를 저장하고 검색하며, Logstash는 로그를 수집하고, Kibana는 시각화 도구로 사용됩니다. 이를 통해 실시간으로 발생하는 오류 및 성능 문제를 모니터링하고 대응할 수 있습니다.

5. Blue-Green Deployment

  • Blue-Green Deployment:
    • Blue-Green Deployment는 서비스 중단 없이 새로운 애플리케이션 버전을 배포하는 전략입니다. 여기서 BlueGreen 환경은 각각 서로 다른 배포 환경을 나타내며, 배포 후 테스트가 완료되면 트래픽을 새로운 버전으로 전환합니다.

6. 전반적인 흐름

  1. 개발자는 GitHub에 코드를 푸시합니다.
  2. Jenkins가 이를 감지하고, CI/CD 파이프라인을 통해 해당 코드를 빌드 및 배포합니다. 이때, 푸시한 브랜치(dev 브랜치 또는 main 브랜치)에 따라 다른 파이프라인이 작동합니다.
  3. 프론트엔드 코드는 AWS Amplify를 통해 배포되며, 백엔드 코드는 Google Cloud의 Compute Engine 인스턴스에 배포됩니다.
  4. Blue-Green Deployment 전략에 따라 서비스 중단 없이 새로운 버전의 백엔드 애플리케이션이 배포됩니다.
  5. Nginx는 사용자의 요청을 적절한 백엔드 서버로 라우팅합니다.
  6. Redis와 MongoDB는 채팅 데이터와 관련된 작업을 처리합니다.
  7. Fail2ban은 서버를 보호하며, ELK 스택을 통해 시스템 모니터링이 이루어집니다.

What I Have Done (민호)

Code Implementation

  • KakaoLogin 구현: Season 1에서는 소셜 로그인이 없었기 때문에 직접 회원가입을 해야 하는 불편이 있었습니다. 이를 개선하기 위해 카카오 로그인을 구현하여 사용자 인증 과정을 간소화했습니다.
  • 메인 페이지 API 구현: 메인 페이지의 데이터를 제공하는 API를 개발했습니다.
  • 다양한 버그 해결: 개발 과정에서 발생한 여러 버그를 신속하게 수정했습니다.

DevOps

  • 서버 환경 분리: 개발(Dev) 서버와 프로덕션(Prod) 서버를 분리하여 운영 환경의 안정성을 확보했습니다.
  • CI/CD 파이프라인 구현: Jenkins를 활용하여 지속적 통합 및 지속적 배포(CI/CD) 파이프라인을 구축했습니다.
  • Blue-Green 배포 전략 도입: 서비스 중단 없이 빈번한 배포가 가능하도록 Blue-Green Deployment 방식을 구현했습니다.

Security

  • Fail2ban 도입: SSH brute-force 공격에 대응하기 위해 Fail2ban을 도입하여 보안을 강화했습니다.

Monitoring

  • ELK 도입 및 APM 설정: ELK 스택을 도입하여 애플리케이션 성능 모니터링(APM)을 설정하고, 실시간으로 발생하는 API 오류에 대한 대응책을 마련했습니다.
  • 디스크 모니터링: 디스크 사용량을 모니터링하여 디스크 관리에 주의를 기울였습니다.

Error Handling

  • SQL을 이용한 문제 해결: ELK에서 모니터링된 문제를 신속하게 해결하기 위해 SQL을 사용하여 데이터 삭제 작업을 수행했습니다.
  • 근본 원인 분석 및 버그 수정: 문제의 근본 원인을 분석하고, 신속하게 버그를 수정하여 배포했습니다.

FAQ

1. 왜 RDS를 사용했나요?

DB를 Google Cloud로 이관하려고 했으나, RDS에서 Google Cloud SQL로 일관성 있게 데이터를 이관하기 위해서는 CDC(변경 데이터 캡처) 기술이 필요했습니다. 그러나 이 방법은 비용과 시간이 많이 소요되기 때문에, 효율성을 고려하여 기존 RDS를 유지하기로 결정했습니다.