Skip to content

박민재 sprint8 - #132

Open
marcel615 wants to merge 16 commits into
codeit-bootcamp-spring:박민재from
marcel615:박민재-sprint8

Hidden character warning

The head ref may contain hidden characters: "\ubc15\ubbfc\uc7ac-sprint8"
Open

박민재 sprint8#132
marcel615 wants to merge 16 commits into
codeit-bootcamp-spring:박민재from
marcel615:박민재-sprint8

Conversation

@marcel615

Copy link
Copy Markdown
Collaborator

요구사항

기본

  • 애플리케이션 컨테이너화
    • Dockerfile 및 .dockerignore 작성
    • Docker Compose를 활용한 애플리케이션/PostgreSQL 구성
    • .env 기반 환경 변수 관리 및 볼륨 구성
  • AWS S3 기반 BinaryContentStorage 구현
    • S3 업로드/다운로드/Presigned URL 테스트
    • S3BinaryContentStorage 및 S3Mock 기반 테스트 구현
    • AWS 기본 Credential Provider Chain을 사용하도록 인증 방식 개선
  • AWS RDS PostgreSQL 구성
    • RDS PostgreSQL 인스턴스 생성
    • SSH 터널링을 통한 데이터베이스 초기 구성 및 애플리케이션 연동
  • AWS ECR Public 구성
    • Public ECR 레포지토리 생성
    • Docker 이미지 빌드 및 멀티플랫폼 이미지 배포
  • AWS ECS 구성
    • discodeit.env를 S3에 업로드하여 환경 변수 주입
    • IAM Task Role을 활용한 S3 접근 구성
    • EC2 대신 Fargate 기반 ECS 서비스 구성 및 애플리케이션 배포

심화

  • Docker 이미지 최적화
    • 멀티 스테이지 빌드 적용
    • 런타임 이미지에 JRE 사용
    • Gradle 의존성 레이어 캐시 적용
  • GitHub Actions CI 구성
    • PR 및 main Push 시 테스트 자동 실행
    • JaCoCo 리포트 생성 및 Codecov 연동
    • README에 테스트 커버리지 배지 추가
  • GitHub Actions CD 구성
    • release 브랜치 Push 시 자동 배포
    • OIDC를 활용한 AWS 인증
    • Public ECR에 latest, Commit SHA 태그 이미지 Push
    • 기존 ECS Task Definition을 기반으로 새 이미지 반영
    • ECS Service 중단 및 새 Task Definition으로 자동 배포

주요 변경사항

  • ErrorResponse 생성을 Builder 패턴으로 개선하고 테스트 메서드명을 영어로 정리했습니다.
  • 사용하지 않는 Admin 모듈 및 관련 의존성을 제거했습니다.
  • Dockerfile, Docker Compose를 구성하여 애플리케이션과 PostgreSQL을 컨테이너화했습니다.
  • Windows 제외 포트 범위 문제로 요구사항의 8081 대신 8281 포트를 사용하여 실행을 검증했습니다.
  • AWS S3 SDK와 S3BinaryContentStorage를 구현하고 S3Mock 기반 테스트를 추가했습니다.
  • AWS RDS PostgreSQL을 구성하고 애플리케이션 데이터베이스로 연결했습니다.
  • Windows 환경에서 Public ECR 로그인 시 Docker credential 저장 오류로 로컬 Push가 어려워 GitHub Actions를 활용해 이미지를 빌드하고 Public ECR에 Push하도록 구성했습니다.
  • ECS 환경에서는 Access Key/Secret Key 직접 주입 대신 AWS 기본 Credential Provider Chain 및 IAM Task Role을 사용하도록 개선했습니다.
  • ECS는 EC2 대신 Fargate로 구성했으며, 메모리는 안정적인 애플리케이션 실행을 위해 0.5GB 대신 1GB로 설정했습니다.
  • JVM의 MaxMetaspaceSize128m로 조정했습니다.
  • Docker 런타임 이미지에 JRE를 사용하고 Gradle 의존성 캐시를 적용하여 이미지 크기 및 빌드 효율을 개선했습니다.
  • GitHub Actions 기반 CI를 구축하고 Codecov 커버리지 배지를 추가했습니다.
  • GitHub Actions 기반 CD를 구축하여 release 브랜치 Push 시 Public ECR 이미지 빌드/Push 및 ECS 배포가 자동으로 진행되도록 구성했습니다.
  • AWS 인증은 장기 Access Key/Secret Key 대신 GitHub Actions OIDC를 사용하도록 구성했습니다.
  • 임시 Public ECR Push 용도로 사용했던 ecr-public.yml은 최종 CD 워크플로우 구축 후 제거했습니다.

첨부파일

스크린샷

RDS AWS 콘솔 인스턴스 상세 페이지

RDS AWS 콘솔 인스턴스 상세 페이지

RDS SSH 터널링을 통해 연결한 DBeaver

RDS SSH 터널링을 통해 연결한 DBeaver

ECR 푸시된 이미지가 보이는 AWS 콘솔 페이지

ECR 푸시된 이미지가 보이는 AWS 콘솔 페이지

ECS 실행 중인 태스크 구성정보가 표시된 AWS 콘솔 페이지

ECS 실행 중인 태스크 구성정보가 표시된 AWS 콘솔 페이지

ECS 배포 엔드포인트

  • EC2 대신 Fargate로 구성하여 Fargate Task의 Public IP를 엔드포인트로 사용했습니다.
  • Public IP: 13.209.87.194
  • 접속 주소: http://13.209.87.194
    ECS 배포 엔드포인트

ECS 배포 엔드포인트 실제 접속 화면

VPC 보안 그룹의 인바운드 규칙을 확인할 수 있는 AWS 콘솔 페이지

VPC 보안 그룹의 인바운드 규칙을 확인할 수 있는 AWS 콘솔 페이지

IAM 사용자의 권한 정책이 표시된 AWS 콘솔 페이지

IAM 사용자의 권한 정책이 표시된 AWS 콘솔 페이지

Codecov 커버리지 배지 화면

Codecov 커버리지 배지 화면

- ErrorResponse에서 생성자함수를 직접 사용하는 게 아니라 Builder 패턴을 사용해서 ErrorResponse 객체 만들도록 개선
- 테스트 메서드들 이름 한글에서 영어로 개선
- admin 관련 코드 삭제 (모듈 삭제, Gradle에서 Unlink, admin 의존성 삭제)
- build.gradle에 version = '1.2-M8' 추가
- Dockerfile 작성 구현, .dockerignore 파일 추가
- 요구사항의 localhost:8081 포트 매핑을 시도했으나, 해당 포트가 Windows 제외 포트 범위에 포함되어 있어 바인딩 오류가 발생 -> 사용 가능한 포트(8281)로 대체하여 동일한 방식으로 애플리케이션 실행 검증 완료
- docker-compose.yml 파일 작성 (db, app 컨테이너 정의)
- .env 파일 생성 및 환경 변수 작성, .gitignore에 .env 파일 추가
- application.yaml에 discodeit.storage 부분 기본값 및 환경변수 설정
- build.gradle에 AWS S3 SDK 의존성 추가
- AWSS3Test로 S3 API 간단하게 테스트(.env에 정의한 AWS 정보를 이용하여 업로드, 다운로드, PresignedUrl 생성)
- AWSS3Test 주석 정리
- Adobe S3Mock 의존성 추가 (테스트를 위한)
- docker-compose.yml에서 BinaryContentStorage 관련 환경변수를 application.yaml에서와 같게 주입할 수 있도록 수정
- S3BinaryContentStorage 구현 (discodeit.storage.type 값이 s3인 경우에 Bean으로 등록되도록)
- S3BinaryContentStorageTest 구현 (실제 S3 사용하는 것이 아닌 Mock을 활용하도록 구현)
- Windows 환경에서 ECR Public 로그인 시 credential 저장 오류가 발생해 로컬 push가 불가능
- GitHub Actions를 통해 ECR Public 로그인 및 멀티플랫폼 이미지 push 처리
- latest, 1.2-M8 태그로 이미지 배포
- 내 개인 브랜치에 push해서 action 실행되도록 개선
- discodeit.env파일 생성 및 환경변수 작성
- .gitignore에 해당 파일 추가
- s3에 해당 파일 업로드 완료
- S3BinaryContentStorage에서 기존에 AS3 Access Key, Secret Key 직접 주입하던 로직 제거, AWS 기본 Credential Provider Chain 사용하도록 개선
- S3BinaryContentStorage에서 미처 지우지 못한 access key, secret key 관련 변수 제거
- application.yaml에서도 관련 변수 제거
- Dockerfile에서 COPY src 전에 RUN ./gradlew dependencies --no-daemon 실행하도록 추가
- Dockerfile에서 run 스테이지에서는 jre를 써서 최종 이미지 크기 줄이도록 구현
- ecr-public.yml에서 태그를 local-slim으로 변경
- test.yml 파일 생성 및 CI를 위한 워크플로우 설정
- README.md에 CodeCov 테스트 커버리지 뱃지 표시되게 추가
- test.yml에 main 브랜치에 push했을 시에도 CI 진행되도록 추가
- credential 저장 오류 때문에 임시로 Github Actions를 통해 ECR 이미지 push하는 용도로 사용했던 ecr-public.yml파일 삭제
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant