Skip to content

배포 관련 기술 도입 목적

soochan edited this page Mar 17, 2023 · 9 revisions

🔑 Github Actions

CI/CD를 위한 도구로 Github Actions를 적용했습니다.

코드의 품질을 올리며, 자동으로 손쉽게 배포하기 위해서 CI/CD 파이프라인을 구축하였습니다.
이를 위한 도구로 Github Actions를 적용했습니다.

Travis, Jenkins 등 다양한 도구들이 있지만 그 중 Github Actions를 선택한 이유가 있습니다.

  1. 지속적인 통합 (CI)

    • GitHub Actions는 코드베이스가 변경될 때마다 Spring Boot 애플리케이션을 자동으로 빌드, 테스트 및 배포하는 데 사용할 수 있다.
    • 최신 코드가 항상 배포되고 테스트되어 버그 또는 기타 문제가 발생할 위험이 줄어든다.
  2. 사용자 지정 워크플로

    • GitHub Actions를 사용하면 특정 요구 사항에 맞는 사용자 지정 워크플로를 정의할 수 있다.
    • 특정 환경(예: 개발, 스테이징, 프로덕션)에 자동으로 배포하는 워크플로를 만들 수 있다.
  3. 다른 배포 도구와의 통합

    • GitHub Actions는 Docker, AWS, Azure 등과 같은 다양한 기타 도구 및 서비스와 통합할 수 있다.
    • 여러 클라우드를 배포 파이프라인에 쉽게 통합하여 배포 프로세스를 더욱 간소화할 수 있다.
  4. 배포 버전 제어

    • 시간 경과에 따른 배포 파이프라인의 변경 사항을 쉽게 추적할 수 있다.
    • 배포 프로세스 중에 발생할 수 있는 문제를 쉽게 식별하고 해결할 수 있다.
    • 빌드 과정을 보기 편리하고, 빌드가 실패했을 경우에도 로그를 보며 실패 요인을 확인하기 쉽다.

🔑 Nginx

웹 서버 중 Apache와 Nginx가 가장 유명한데, Nginx를 선택한 이유는 다음과 같습니다.

  1. Apache에 비하여 가볍고, 성능이 향상된 서버이다.

  2. 사이드 프로젝트이기 때문에, 시스템 자원 낭비를 고려하지 않아도 된다.

  3. Nginx를 리버스 프록시로 사용하면 기본 서버를 사용할 수 없게 될 경우 트래픽을 백업 서버로 자동 전환하도록 구성할 수 있다.

  4. Nginx를 로드 밸런서로 사용하여 Spring Boot 애플리케이션의 여러 인스턴스에 트래픽을 분산할 수 있습니다. 이렇게 하면 요청이 서버 전체에 고르게 분산되어 단일 서버에 과부하가 걸릴 위험이 줄어든다.

추후에 실서비스로 나아갈 수도 있지만, 초기에 MVP 개발을 생각했기 때문에 가벼운 Nginx를 선택했습니다.


🔑 CodeDeploy

CodeDeploy는 배포를 자동화해주는 지속적 배포 서비스입니다.
Github Actions의 build 결과물로 jar파일이 생성되어 S3에 업로드가 되면, 데이터를 polling하여 최종 배포 파일의 properties를 참고해서 추가 작업을 실행합니다.
또한 AWS CodeDeploy는 EC2 인스턴스, Lambda 함수, 온프레미스 서버 등과 같은 다양한 컴퓨팅 서비스에 대한 소프트웨어 배포를 자동화하는 완전관리형 배포 서비스입니다.

CodeDeploy 배포 서비스를 사용함으로써 얻는 이점은 다음과 같습니다.

  1. 롤링, 블루/그린과 같은 다양한 배포 전략을 지원한다. 애플리케이션과 인프라에 가장 적합한 배포 전략을 선택할 수 있다.

  2. Jenkins, AWS CodePipeline 및 GitLab CI/CD와 같은 널리 사용되는 CI/CD 도구와 쉽게 통합할 수 있습니다. 애플리케이션의 새 버전을 리포지토리에 푸시하면 서버에 대한 배포가 자동으로 트리거될 수 있습니다. 이로 인해 시간이 절약되고 오류 가능성이 줄어든다.

  3. CloudWatch 경보를 사용하여 배포된 Spring Boot 애플리케이션의 상태를 모니터링할 수 있습니다. 문제가 발생할 때 조치를 취하도록 배포 롤백 또는 에러 알림 보내기와 같은 자동화된 작업을 설정할 수 있다.

  4. 완전히 관리되는 서비스이므로 배포 인프라 관리에 대해 걱정할 필요가 없다.

Octopus Deploy, Jenkis 등 많은 지속적 배포 도구가 있지만 EC2를 활용해 서버를 구축했기 때문에 일관적으로 AWS의 서비스를 사용했습니다.


🔑 S3

Amazon S3(Simple Storage Service)는 모든 종류의 데이터에 대해 확장성과 내구성이 뛰어난 스토리지를 제공하는 객체 스토리지 서비스입니다.

S3를 사용함으로써 얻는 이점은 다음과 같습니다.

  1. 동일한 파일의 여러 버전을 저장할 수 있는 버전 관리 기능을 제공합니다. 새 버전에 오류나 문제가 있는 경우 애플리케이션의 이전 버전으로 롤백하는 데 유용하다.

  2. AWS 에코시스템의 핵심 구성 요소이며 CodeDeploy, CodePipeline 및 Lambda와 같은 다른 AWS 서비스와 쉽게 통합할 수 있습니다. S3를 사용하여 애플리케이션 아티팩트를 저장하고 CodeDeploy 또는 Lambda를 사용하여 인프라에 배포하는 지속적 배포 파이프라인을 설정할 수 있다.

Github Actions가 빌드되어 생성된 jar파일은 CodeDeploy로 바로 가는 것이 아니라, S3에 잠시동안 보관됩니다.
CodeDeploy에는 저장 기능이 따로 있지 않기 때문입니다.
jar 파일의 저장소로 S3를 선택했습니다. 이 외에도, 사용자가 이미지를 업로드할 때에도 S3를 통하여 이미지를 저장하도록 구현했습니다.


🔑 AWS Parameter Store

애플리케이션에는 외부에 노출되어서는 안 되는 비밀값들이 있습니다.
이에 대한 적절한 인프라로 AWS parameter store를 사용했습니다.

AWS Parameter Store는 구성 데이터 관리 및 암호 관리를 위한 계층적 스토리지를 제공하는 관리형 서비스입니다.
IAM을 이용하기 때문에 제한된 사용자에게만 파라미터 값을 공유함으로써 훨씬 안전하게 관리할 수 있습니다.
또한 무료 서비스이고, 변경 이력까지 확인할 수 있다는 장점이 있습니다.

AWS Parameter Store 를 사용함으로써 얻는 이점은 다음과 같습니다.

  1. 데이터베이스 암호, API 키 및 기타 비밀과 같은 중요한 데이터를 안전하게 저장하는 데 사용할 수 있습니다. 미사용 및 전송 중에 암호화될 수 있으므로 중요한 데이터를 저장하기 위한 보안 솔루션이 된다.

  2. 애플리케이션의 구성 데이터를 중앙 위치에 저장하고 관리할 수 있습니다. 개발, 스테이징 및 프로덕션과 같은 여러 환경에 대한 구성 데이터를 보다 쉽게 ​​관리할 수 있다.

  3. 실행 중인 애플리케이션을 중단하지 않고 Spring Boot 애플리케이션의 구성을 동적으로 업데이트할 수 있습니다. 애플리케이션을 다시 시작하지 않고도 데이터베이스 URL, 시간 초과 및 로깅 수준과 같은 구성 값을 변경할 수 있다.

  4. 다른 AWS 서비스와 쉽게 통합될 수 있다.


🔑 ElastiCache Redis

토큰 재발급 과정을 위하여 Redis 캐싱 서버를 도입했습니다.
운영 서버에 refresh token을 저장해야, 자동 로그인 혹은 로그인 유지가 가능합니다. 그러나 refresh token은 영구적으로 필요한 데이터가 아니기 때문에 redis를 선택했습니다.
또한 인메모리 상태에서 데이터를 처리하여 다른 DB들보다 빠르고, 가볍다는 장점이 있습니다.

ElastiCache Redis를 사용하여 JWT Refresh Token을 관리함으로써 얻는 이점은 다음과 같습니다.

  1. 인메모리 데이터 스토어이므로 데이터에 대한 빠른 액세스를 제공할 수 있습니다. Refresh Token이 유효한지 여부를 신속하게 확인할 수 있다.

  2. AWS Lambda 및 Amazon API Gateway와 같은 다른 AWS 서비스와 쉽게 통합되어 사용할 수 있다.

  3. 애플리케이션이 다시 시작되거나 서버 오류가 발생하더라도 JWT Refresh Token을 계속 사용할 수 있다.