본문 바로가기

spring

Jlaner 개발기록 7 배포 Elastic Beanstalk

이번 포스팅에서는 배포에 앞서 엘라스틱 빈스토크 구성을 먼저 해보도록 하겠다.

엘라스틱 빈스토크 구성은 처음이라 하다 잘 안될 것 같으면 EC2와 RDS으로 구성하도록 하겠다.

 

구성은 구성한 이미지를 토대로 설명하도록 하고 특이점이 있다면 설명하도록 하겠다.

 

역할이 필요하기 때문에 IAM에서 역할을 생성해 주도록 하자.

 

다음은 권한 정책을 추가해야하는데 다음 3가지를 추가해 주자.

AWSElasticBeanstalkWebTier

AWSElasticBeanstalkWorkerTier

AWSElasticBeanstalkMulticontainerDocker

 

다음은 역할 이름을 추가하고 추가한 권한 정책이 잘 선택되었는지 확인해야 한다.

 

IAM을 생성했다면 다음으로 ElasticBeanstalk를 구성해 보자.

 

 

필자는 자바 버전을 21을 사용하기 때문에 21로 설정했다.

아래에 사전설정이 있는데 필자는 프리티어를 사용해서 단일 인스턴스 프리티어로 했다.

 

다음으로 넘어와서 서비스 역할은 새 서비스 역할 생성 및 사용을 하고 이전에 설정한 IAM 역할 이름을 사용하면 된다.

다음에서는 데이터베이스 설정을 할 수 있다.

 

DB는 각자가 사용하게 되는 데이터 베이스와 각 버전에 맞는 버전을 설정하고 사용자 이름과 암호는 데이터베이스에서 사용하는 사용자의 이아이디와 암호를 기입하면 된다.

데이터베이스 삭제 정책은 추가 비용이 발생할 수 있으므로 그대로 두었다.

이후 검토로 넘어가서 제출해 주면 된다.

 

이후에 데이터베이스 엔드포인트를 복사해 주자.

 

구성으로 이동해서 업데이트, 모니터링 및 로깅을 편집하자.

환경변수를 설정하는 부분에 위와 같이 필드를 생성해서 값을 채워 넣으면 된다.

SPRING_DATASOURCE_URL : jdbc:mysql://rds엔드포인트:포트/DB이름
SPRING_DATASOURCE_USERNAME : 앞서 설정한 RDS 사용자 이름
SPRING_DATASOURCE_PASSWORD : RDS 비밀번호

각각 필드에 값을 채워 넣어주면 된다.

인텔리제이에서 application.yml에서도 datasource에서도 위 설정한 값과 동일하게 바꿔줘야 한다.

 

위에서 서버 포트가 5000으로 자동으로 설정되어 있는데 이를 SERVER_PORT로 바꿔주고 5000으로 설정되는 이유에 대해 알아보자.

SERVER_PORT를 5000으로 설정하는 이유
Elastic Beanstalk는 nginx를 역방향 프록시로 사용하여 애플리케이션을 포트 80의 Elastic Load Balancing 로드 밸런서에 매핑한다. Elastic Beanstalk는 확장하거나 자체 구성으로 완전히 재정의할 수 있는 기본 nginx 구성을 제공한다.
기본적으로 Elastic Beanstalk는 요청을 포트 5000의 애플리케이션에 전달하도록 nginx 프록시를 구성한다. PORT 환경 속성을 기본 애플리케이션이 수신 대기하는 포트로 설정하여 기본 포트를 재정의할 수 있다.

 

다음은 로컬에서 RDS를 연결해야 한다.

데이터베이스 엔드포인트를 복사한 곳이 링크로 되어 있는데 이동하게 되면 RDS로 이동한다.

로컬에서 DB에 접근할 수 있도록 로컬 ip를 허용해야 한다.

 

RDS - 데이터베이스 - VPC보안 그룹을 눌러준다.

Name을 눌러주고 인바운드 규칙 편집으로 들어간다.

 

 

이미 설정되어 있는 default의 모든 tcp 유형 인바운드 규칙은 삭제하고 새로운 인바운드 규칙을 위와 같이 생성해 소스 유형을 내 IP로 바꿔준다.

 

 

이제 인텔리제이에서 엘라스틱 빈스토크의 DB에 연결할 수 있는지 확인해야 한다.

 

데이터베이스 내비게이터라고 있다 이 플러그인을 받아준다.

 

위에 DB Navigator에서 settings에 들어가면 위와 같은 화면이 나오게 되고 +를 눌러 추가해야 한다.

 

mysql 설정 후 name, host, user, password를 설정해야 한다.

name은 알아서 설정하면 되고 user와 password는 mysql에서 사용하는 값을 넣어주면 된다.

host는 RDS에 데이터베이스 연결 및 보안에 들어가면 엔드포인트를 복사할 수 있다 이를 복사해서 넣어주면 된다.

이후 오른쪽 아래에 testConnection을 눌러보면 테스트가 되니 테스트해서 아래와 같은 확인을 받으면 연결이 되는 것이다.

 

DB 브라우저를 열어주고 터미널 같이 생긴 것을 눌러보면 Open SQL console이 있다 new SQL console을 누르면 sql을 작성할 수 있다.

 

환경설정에서 아래와 같이 ddl을 create나 create-drop으로 한다면 따로 작성할 필요는 없지만 실제 서비스하게 될 때는 none, validate로 진행하는 것이 좋다. 위 ddl에서 빨간 오류 표시가 있긴 하지만 이는 무시하고 진행해도 좋다.

ddl-auto: create

 

여기까지 했다면 일단 배포를 진행해 보도록 하겠다.

 

build를 통해 왼쪽에 보이는 libs에 jar 파일이 생긴 것을 확인할 수 있다.

0.0.1-SNAPSHOT은 build.gradle에서 version으로 수정할 수 있다. 지금은 그냥 진행하도록 하겠다.

이후 Elastic Beanstalk에 업로드 및 배포에 방금 생성된 jar 파일을 업로드해 주자.

 

위처럼 시작했다고 되고 환경을 업데이트할 것이다.

이후 EC2 - 보안그룹 - 인바운드 규칙 편집으로 이동해서 아래와 같이 SSH는 내 IP로 HTTP, HTTPS는 Anywhere-IPv4로 지정하자. 아래 이미지에서는 SSH가 사용자 지정으로 되어 있지만 IP가 노출되기 때문이고 내 IP로 바꿔주면 된다.

 

여기까지 설정했고 이제 필자 프로젝트는 소셜 로그인과 jwt를 사용하는 데 있어서 환경 변수가 더 필요하다.

이 환경 변수를 위해서  아래의 값들을 설정한 환경 변수에 따라 채워주었다.

 

이로써 설정이 끝났고 엘라스틱 빈스토크의 환경에 가보면 도메인이 있다 도메인으로 접속이 가능한데 접속해 보자.

 

접속되는 것을 확인할 수 있고 로그인을 진행해 보면 로그인 시 아래와 같은 문제가 발생한다.

 

 

문제가 발생하는 이유는 각 소셜 로그인을 구성할 때 redirect uri를 localhost에만 허용하고 배포된 uri에는 허용해주지 않았기 때문이다. 그러므로 각 구글, 네이버, 카카오에서 redirect uri를 넣어주기로 하자.

카카오를 예시로 이미지를 가져왔지만 구글과 네이버에도 각각 수정했다.

다음은 백엔드 서버의 application.yml에는 네이버와 카카오가 각 redirect-uri를 설정해 주는 부분이 있다. 이 부분을 위와 같이 바꿔 줘야 하니 바꾸고 다시 빌드해서 배포하도록 하겠다.

 

위와 같이 uri를 지정해 주고 조금 기다렸다가 확인해 보도록 하자.

연결이 잘 되지만 로그인이 되지 않는다...

 

당황했지만 로그를 확인해 보기로 하자.

 

로그로 이동하면 로그를 확인할 수 있다 다운로드해서 확인하면 된다.

 

 

위와 같이 web.stdout.log에서 로그를 확인하면 된다.

com.jlaner.project.service.RefreshTokenRedisService.findByMemberId(Long) time=577ms ex=org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis
Aug 15 21:43:33 ip-172-31-10-160 web[19492]: 2024-08-15T21:43:33.921Z ERROR 19492 --- [project] [nio-5000-exec-8] c.j.p.config.outh2.OAuth2SuccessHandler  : Error during redirect
Aug 15 21:43:33 ip-172-31-10-160 web[19492]: org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis

 

위와 같은 로그가 보인다. 레디스 설정 때문이다.

로그인 시 레디스에 토큰 정보와 사용자 정보를 저장해서 세션 저장소와 같이 사용하기에 DB와 서버의 부담을 줄여주려고 레디스를 사용하는데 레디스는 EC2 인스턴스가 아닌 로컬 환경에서 구동 중이기 때문이다.

이 때문에 레디스가 사용되지 않았던 것이고 그렇다면 레디스를 AWS에 띄워야 한다.

그렇다면 여기서 고민이 시작되었다.

물론 ec2 키페어를 생성해서 SSH를 실행해 레디스를 직접 설치해서 연결해 줄 수 있다. 보안 포트 열어주고 환경 설정 바꿔주고 하면 될 것 같다는 생각을 하고 있지만 초기에 구상한 배포는 EC2와 RDS를 각각 구성해 띄워서 db 구성하고 EC2에는 도커 컨테이너에는 레디스와 백엔드 서버를 묶어서 실행해서 구성하는 것을 생각을 하고 있었다가 EB를 통해 구성하는 것이 빠르게 배포도 되고 로드 밸런싱 모니터링 등 자동 처리를 해주고 리소스에 대한 비용만 지불하면 되기 때문에 편한 부분도 많았다. 그래서 관심이 가서 이처럼 진행해보았는데 이미 자바 플랫폼으로 EB를 구성했고 EB 구성하는 것을 알아가기 위해 지금까지 구성했다.

하지만 레디스도 따로 띄워서 구성하는 것은 필자가 구성하려고 한 것도 아니기에 EB를 사용해서 서버를 띄우고 RDS로 데이터베이스 구성도 해서 진행을 해서 확실히 띄워지는 것을 확인했으니 다음 포스팅으로 도커를 사용해서 진행해 보도록 하겠다. RDS도 이전처럼 직접 구성보다는 docker-compose로 묶어서 한 번에 실행될 수 있도록 구성해 보도록 하겠다. RDS에서 발생하는 비용도 줄일 수 있을 것이라 생각된다. 지금 진행한 인스턴스는 삭제하도록 하고 새로 생성해서 진행하도록 하겠다.

 

'spring' 카테고리의 다른 글

Jlaner 개발기록 9 AWS SWAP  (0) 2024.09.05
Jlaner 개발기록 8 배포 AWS (DOCKER)  (1) 2024.09.04
Jlaner 개발기록 6 오류 처리  (0) 2024.08.14
Jlaner 개발기록 5 기능 구성 (2)  (0) 2024.08.13
Jlaner 개발기록 4 기능 구성  (0) 2024.08.11