Skip to content

Conversation

@sondonghyuk
Copy link
Collaborator

@sondonghyuk sondonghyuk commented Apr 21, 2025

요구사항

기본

Dockerfile

  • Amazon Corretto 17 이미지를 베이스 이미지로 사용하세요.
  • 작업 디렉토리를 /app으로 설정하세요.
  • 불필요한 파일은 .dockerignore를 사용하여 제외하고 프로젝트 파일을 컨테이너로 복사하세요.
  • Gradle Wrapper를 사용하여 애플리케이션을 빌드하세요.
  • 80 포트를 노출하도록 설정하세요.
  • 프로젝트 정보를 환경 변수로 설정하세요.
  • - PROJECT_NAME: discodeit
    
  • - PROJECT_VERSION: 1.2-M8
    
  • JVM 옵션을 환경 변수로 설정하세요 (기본값은 빈 문자열로 설정).
  • 애플리케이션 실행 명령어를 설정하세요. 이때 환경변수로 정의한 프로젝트 정보를 활용하세요.
이미지 빌드 및 실행 테스트
  • Docker 이미지를 빌드하고 'local' 태그를 지정하세요.
  • 빌드된 이미지를 활용해서 컨테이너를 실행하고 애플리케이션을 테스트하세요.
  • 'prod' 프로필로 실행하세요.
  • 로컬 환경에서 구동 중인 PostgreSQL 서버를 사용하여 데이터베이스를 설정하세요.
  • http://localhost:8081로 접속 가능하도록 포트를 매핑하세요.

docker-compose.yml

  • 애플리케이션과 PostgreSQL 서비스를 포함하세요.
  • 각 서비스에 필요한 모든 환경 변수를 설정하세요. .env 파일을 사용하되, .env는 형상 관리에서 제외하여 보안을 유지하세요.
  • 애플리케이션 서비스를 로컬 Dockerfile에서 빌드하도록 설정하세요.
  • 애플리케이션 볼륨을 구성하여 컨테이너가 재시작되어도 BinaryContentStorage 데이터가 유지되도록 하세요.
  • PostgreSQL 볼륨을 구성하여 컨테이너가 재시작되어도 데이터가 유지되도록 하세요.
  • PostgreSQL 서비스 실행 후 schema.sql이 자동으로 실행되도록 구성하세요.
  • 서비스 간 의존성을 설정하세요 (depends_on).
  • 필요한 포트 매핑을 구성하세요.
  • Docker Compose를 사용하여 서비스를 시작하고 테스트하세요:
  • - --build 플래그를 사용하여 서비스 시작 전에 이미지를 빌드하도록 합니다.
    
AWS S3 버킷 구성
  • AWS S3 버킷을 생성하세요.
    • 버킷 이름을 discodeit-binary-content-storage-(사용자 이니셜) 형식으로 지정하세요.
    • 퍼블릭 액세스 차단 설정을 활성화하세요(모든 퍼블릭 액세스 차단).
    • 버전 관리는 비활성화 상태로 두세요.
AWS S3 접근을 위한 IAM 구성
  • S3 버킷에 접근하기 위한 IAM 사용자(discodeit)를 생성하세요.
  • AmazonS3FullAccess 권한을 할당하고, 사용자 생성을 완료하세요.
  • 생성된 사용자에 엑세스 키를 생성하세요.
  • 발급받은 키를 포함해서 AWS 관련 정보는 .env 파일에 추가합니다.
# AWS
AWS_S3_ACCESS_KEY=**엑세스_키**
AWS_S3_SECRET_KEY=**시크릿_키**
AWS_S3_REGION=**ap-northeast-2**
AWS_S3_BUCKET=**버킷_이름**
AWS S3 테스트
  • AWS S3 SDK 의존성을 추가하세요.
    • implementation 'software.amazon.awssdk:s3:2.31.7'
  • S3 API를 간단하게 테스트하세요.
    • 패키지명: com.sprint.mission.discodeit.stoarge.s3
    • 클래스명: AWSS3Test
    • Properties 클래스를 활용해서 .env에 정의한 AWS 정보를 로드하세요.
    • 작업 별 테스트 메소드를 작성하세요.
      • 업로드
      • 다운로드
      • PresignedUrl 생성
AWS S3를 활용한 BinaryContentStroage 고도화
  • 앞서 작성한 테스트 메소드를 참고해 S3BinaryContentStorage를 구현하세요.
  • discodeit.storage.type 값이 s3인 경우에만 Bean으로 등록되어야 합니다.
  • S3BinaryContentStorageTest를 함께 작성하면서 구현하세요.
  • BinaryContentStorage 설정을 유연하게 제어할 수 있도록 application.yaml을 수정하세요.
    • AWS 관련 정보는 형상관리하면 안되므로 .env 파일에 작성된 값을 임포트하는 방식으로 설정하세요.
    • Docker Compose에서도 위 설정을 주입할 수 있도록 수정하세요.
  • download 메소드는 PresignedUrl을 활용해 리다이렉트하는 방식으로 구현하세요.
AWS RDS 구성
  • AWS RDS PostgreSQL 인스턴스를 생성하세요.

  • SSH 터널링을 통해 개발 환경에서 접근할 수 있도록 EC2를 구성하세요.

  • 보안 그룹에서 인바운드 규칙을 편집하세요.

    • 유형: SSH
    • 소스: 내 IP
    • 작업 환경의 네트워크(와이파이 등)가 달라지면 계속 수정해주어야 할 수 있습니다.
  • DataGrip을 통해 연결 후 데이터베이스와 사용자, 테이블을 초기화하세요.

  • 데이터 소스 추가 시 SSH/SSL > Use SSH tunnel 설정을 활성화하세요. 이때 이전에 다운로드한 .pem 파일을 활용하세요.

  • 연결이 성공하면 데이터베이스와 사용자, 테이블을 초기화하세요.

-- 1. 새 유저 'discodeit_user' 생성 (비밀번호는 원하는 값으로 설정)
CREATE USER discodeit_user WITH PASSWORD 'discodeit1234';
-- 2. postgres 계정은 AWS RDS 환경 특성상 완전한 super user가 아니므로, discodeit_user에 대한 권한을 추가로 부여해야함.  
GRANT discodeit_user TO postgres;
-- 3. 'discodeit' 데이터베이스 생성 (소유자는 'discodeit_user')
CREATE DATABASE discodeit OWNER discodeit_user;
-- 4. schema.sql 실행하여 테이블 생성
  • 구성이 완료되면 rds-ssh 인스턴스는 완전히 삭제하여 과금에 유의하세요.
AWS ECR 구성
  • 이미지를 배포할 퍼블릭 레포지토리(discodeit)를 생성하세요.

    • 프라이빗 레포지토리는 용량 제한이 있으므로 퍼블릭 레포지토리로 생성합니다.
  • AWS CLI를 설치하세요.

  • aws configure 실행 후 앞서 생성한 discodeit IAM 사용자 정보를 입력하세요.

    • 엑세스 키
    • 시크릿 키
    • region: ap-northeast-2
    • output format: json
  • discodeit IAM 사용자가 ECR에 접근할 수 있도록 다음 권한을 부여하세요.

    • AmazonElasticContainerRegistryPublicFullAccess
  • Docker 클라이언트를 배포할 레지스트리에 대해 인증합니다.

  • 멀티플랫폼을 지원하도록 애플리케이션 이미지를 빌드하고, discodeit 레포지토리에 push 하세요.

    • 태그명: latest, 1.2-M8
    • 멀티플랫폼: linux/amd64,linux/arm64
  • AWS 콘솔에서 푸시된 이미지를 확인하세요.

AWS ECS 구성
  • 배포 환경에서 컨테이너 실행 간 사용할 환경 변수를 정의하고, S3에 업로드하세요.
    • discodeit.env 파일을 만들어 다음의 내용을 작성하세요.
# Spring Configuration
SPRING_PROFILES_ACTIVE=prod

# Application Configuration
STORAGE_TYPE=s3
AWS_S3_ACCESS_KEY=엑세스_키
AWS_S3_SECRET_KEY=시크릿_키
AWS_S3_REGION=ap-northeast-2
AWS_S3_BUCKET=버킷_이름
AWS_S3_PRESIGNED_URL_EXPIRATION=600

# DataSource Configuration
RDS_ENDPOINT=RDS_엔드포인트(포트 포함)
SPRING_DATASOURCE_URL=jdbc:postgresql://${RDS_ENDPOINT}/discodeit
SPRING_DATASOURCE_USERNAME=RDS_유저네임(DataGrip을 통해 생성했던 유저)
SPRING_DATASOURCE_PASSWORD=RDS_비밀번호

# JVM Configuration (프리티어 고려)
JVM_OPTS="-Xmx384m -Xms256m -XX:MaxMetaspaceSize=64m -XX:+UseSerialGC"
  • 이 파일을 S3에 업로드하세요.

  • 이 파일은 형상관리되지 않도록 주의하세요.

  • AWS ECS 콘솔에서 클러스터를 생성하세요.

  • 태스크를 정의하세요.

  • discodeit 클러스터 상세 화면에서 서비스를 생성하세요.

  • 태스크의 EC2 보안 그룹의 인바운드 규칙을 설정하여 어디서든 접근할 수 있도록 하세요.

  • EC2 보안 그룹에서 인바운드 규칙을 편집하세요.

  • 규칙 유형으로 HTTP를 선택하세요.

  • 소스로 Anywhere-IPv4를 선택하여 모든 IP를 허용하세요.

  • 태스크 실행이 완료되면 해당 EC2의 퍼블릭 IP에 접속해보세요.

리뷰를 위해 PR에 포함해야할 정보

  • .env 파일 (AWS 키는 제외)
# docker-compose
POSTGRES_VERSION=15
DB_NAME=discodeit
DB_USER=discodeit_user
DB_PASSWORD=discodeit1234
APP_PORT=8081

# AWS
AWS_S3_ACCESS_KEY=
AWS_S3_SECRET_KEY=
AWS_S3_REGION=ap-northeast-2
AWS_S3_BUCKET=discodeit-binary-content-storage-sondonghyuk

  • RDS

    • AWS 콘솔 인스턴스 상세 페이지 스크린샷 이미지
    • 데이터베이스 연결 정보
    • RDS 보안 그룹의 인바운드 규칙 임시 수정 (모든 IP의 PostgreSQL 연결 허용)
      image
  • ECR

    • 푸시된 이미지가 보이는 AWS 콘솔 페이지 스크린샷 이미지
      image
  • ECS

    • 실행 중인 태스크 구성정보가 표시된 AWS 콘솔 페이지 스크린샷 이미지
    • 배포된 EC2 엔드포인트
      image
      image
  • VPC

    • 보안 그룹의 인바운드 규칙을 확인할 수 있는 AWS 콘솔 페이지 스크린샷 이미지
      image
  • IAM

    • 사용자의 권한 정책이 표시된 AWS 콘솔 페이지 스크린샷 이미지
      image

심화

  • 심화 항목 1
  • 심화 항목 2

주요 변경사항

스크린샷

image

멘토에게

  • 셀프 코드 리뷰를 통해 질문 이어가겠습니다.
  • 서비스 배포에서 계속 오류가 발생해 이후 심화진도를 못했습니다.

@sondonghyuk sondonghyuk changed the title [sprint8] 손동혁 [손동혁] sprint8 Apr 21, 2025
@sondonghyuk sondonghyuk added 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. 미완성🛠️ 스프린트 미션 제출일이지만 미완성했습니다. 죄송합니다. 지각제출⏰ 제출일 이후에 늦게 제출한 PR입니다. labels Apr 21, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. 미완성🛠️ 스프린트 미션 제출일이지만 미완성했습니다. 죄송합니다. 지각제출⏰ 제출일 이후에 늦게 제출한 PR입니다.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant