Skip to content

♻️ Refactor: AWS S3를 Railway Bucket으로 마이그레이션 #444

Description

@si-zero

🛠️ Issue Overview

파일 스토리지를 AWS S3에서 Railway 자체 Bucket(S3 호환 API)으로 교체합니다. Railway가 개발/운영 환경이 분리되어 있으므로, 코드는 환경변수만으로 두 스토리지를 스위칭할 수 있게 만들고 개발 서버에서 충분히 검증한 뒤 운영 서버 환경변수를 교체하는 방식으로 진행합니다. 문제가 생기면 운영 환경변수를 기존 AWS 값으로 되돌리기만 하면 즉시 롤백됩니다.

📝 Issue Description

AS-IS: AWS S3 (S3Client/S3Presigner, spring.cloud.aws.s3.* 프로퍼티) 사용
TO-BE: Railway Bucket (S3 호환 API) 사용, AWS SDK 코드는 유지하고 endpoint/credentials만 환경변수로 교체

변경 대상

  • application.ymlspring.cloud.aws.s3.endpoint 추가, region.static/credentials를 환경변수 기반으로 유지(값만 환경별로 다르게 세팅)
  • S3Config.javaS3Presigner.endpointOverride() + path-style access 설정 추가
  • S3UploadServiceImpl.java / S3PresignedUrlService.java / ResourceRedirectController.amazonaws.com/ 하드코딩된 URL 파싱(key 추출) 로직을 Railway 도메인 형식에도 대응하도록 수정
  • Railway 개발 서버 환경변수 — AWS_S3_BUCKET, AWS_REGION, AWS_ACCESS_KEY, AWS_SECRET_KEY, S3_ENDPOINT(신규)를 Railway Bucket 값으로 교체
  • Railway 운영 서버 환경변수 — 개발 서버 검증 완료 후에만 동일하게 교체 (그 전까진 기존 AWS 값 유지)

영향받지만 코드 변경 불필요

  • ApnsConfig.java (.p8 키 다운로드, 동일 S3Client 빈 재사용)
  • LocalDraftFileStorageService, BattleServiceImpl의 promote 로직
  • build.gradlespring-cloud-aws-starter-s3 의존성 (그대로 유지)

✅ To do

  • Railway 개발 서버 프로젝트에 Bucket 생성, Credentials 확보
  • application.yml + S3Config.java에 endpoint/path-style 설정 추가
  • S3UploadServiceImpl/S3PresignedUrlService/ResourceRedirectController의 URL 파싱 로직을 도메인 하드코딩 없이 수정
  • Railway 개발 서버 환경변수만 Railway Bucket 값으로 교체 후 배포
  • 개발 서버에서 아래 회귀 체크리스트로 검증
    • 관리자 파일 업로드 API(/files/upload, 카테고리별: PHILOSOPHER/CHARACTER/BATTLE/SCENARIO)
    • 로컬 draft 업로드(/files/upload/local) → 조회
    • 배틀 생성/수정 → 발행 시 썸네일 로컬 draft → S3 promote → 각 응답 DTO 이미지 URL 노출
    • 배틀 옵션(철학자) 이미지 동일 플로우
    • 기존 이미지 교체 시 이전 객체 삭제(orphan 방지)
    • 시나리오 오디오 파이프라인(조각 다운로드 → FFmpeg 병합 → 업로드 → 리다이렉트 조회)
    • 마이페이지 캐릭터/철학자/Recap 카드 이미지 presigned URL
    • 관점(Perspective)/댓글 응답의 캐릭터 이미지 presigned URL
    • ResourceRedirectController 302 리다이렉트 정상 동작
    • 콘텐츠 발행 스케줄러(ContentPublishScheduler)를 통한 예약 발행 플로우
    • 기존 S3Client mock 통합테스트 6종 통과 확인 (ShareApiIntegrationTest, ContentPublishSchedulerIntegrationTest, AdminNotificationTestPushIntegrationTest, AdminScenarioPublishFlowIntegrationTest, AdminNoticeIntegrationTest, AdminContentCreationIntegrationTest)
  • 개발 서버 검증 완료 후 운영 서버 환경변수 교체 및 배포
  • 운영 배포 후에도 문제 생기면 운영 환경변수만 기존 AWS 값으로 즉시 롤백 가능한 상태 유지
  • 기존 AWS S3에 남아있는 파일 마이그레이션 여부 결정 및 처리

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

♻️ Refactor (리팩토링)코드 구조 개선 및 성능 최적화를 위해 사용합니다.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions