일전에 EC2를 사용해서 Spring Boot 프로젝트를 배포해본 적이 있었다.
이번에 참여하게된 JSCODE 게시판 서비스를 고도화해나가는 프로젝트에서 멘토님이 Elastic BeanStalk를 사용하여 배포하라는 요구사항을 주어서, Elastic BeanStalk를 처음 사용해보았다.
EC2를 통해서 배포하였을 때는 운영체제가 설치되어 있는(linux) 컴퓨터 하나를 터미널로 다루는 느낌이었다. java 설치부터 docker나 필요한 기술을 설치하고 jar파일을 scp나 프로그램을 통해 EC2 서버로 가져와서 실행하면 잘 되었다.
Elastic BeanStalk를 처음 써봐서 그런지 더 쉽게 사용하는 Heroku같은 느낌의 서비스라고 하는데 실제로는 고생을 좀 겪었다. (EC2도 돌이켜보면 훨씬 더 많이 겪었던 것 같긴하다.. )
다시 볼 때는 이것만 보면 되게 정리해보겠다.(제발)
업로드 한 뒤에 생기는 문제들
502 Bad Gateway 문제
- 첫번째 해결방법
이 문제는 애플리케이션 로드 밸런서가 기본적으로 EC2 인스턴스에서 nginx 서버의 port 80을 가리키기 때문에 발생한다. nginx는 기본적으로 포트 5000으로 요청을 전달하도록 구성되어 있지만, 애플리케이션 서버는 포트 8080에서 실행된다.
- 이 문제는 PORT라는 이름의 환경 속성을 사용하여 해결할 수 있으며 8080 구성 > 환경 속성으로 이동하여 속성을 추가한다
https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-se-nginx.html
[Configuring the reverse proxy - AWS Elastic Beanstalk
The port that your application listens on doesn't affect the port that the nginx server listens to receive requests from the load balancer.
docs.aws.amazon.com](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-se-nginx.html)
- 이렇게 하던가, 아니면 application.yml에서 port를 5000번으로 열리도록 하면 된다. 아래 내용만 yml에 추가해주면 된다.이렇게 해서 해결되면 성공이다.
server: port: 5000
5000번으로 port를 열었는데, local에서 실행이 안되는 경우!*
5000번으로 열고 확인할려고 local에서 실행했는데, 안되는 경우가 있을 것이다. port가 이미 사용중이라고 뜨는 경우였는데, kill -9 명령어로 계속 죽여도 다시 살아난다(ㄷㄷ)
나의 경우에는 mac에서 5000포트를 airplay를 사용하는 경우 때문에 생겼었다. 설정에 들어가서 해당 airplay를 꺼두면 local에서 실행이 된다.
물론, 배포할때는 아무 문제 없기 때문에 local에서 5000번 포트로 돌릴때만 문제가 된다.
https://jaynamm.tistory.com/entry/%EB%A7%A5%EB%B6%81%EC%97%90%EC%84%9C-5000%EB%B2%88-%ED%8F%AC%ED%8A%B8%EA%B0%80-%EC%82%AC%EC%9A%A9%EC%A4%91%EC%9D%B4%EB%8B%A4-MacOS-Montrey
이렇게 해도 계속 오류인 경우 -> log를 살펴보자
나는 이렇게 해서 업로드가 되었지만 warning이 계속 뜨는 오류가 발생하였다.
해당 오류를 확인하기 위해서 log를 확인하였다.
No Active Profile Set
: 실제 502 Gateway의 오류가 나왔을 때, 로그에서 확인한 오류이다. Spring은 잘 실행되는데, Spring에서 오류가 생겼다.
그럼 서버는 제대로 실행하려고 하는데 서비스의 오류일 가능성이 높다. 서비스에서 오류가 생길만한 건 데이터베이스 서버밖에 없었다. (나머지는 local에서 잘 실행되므로..)
나의 경우는 데이터베이스 연결의 문제였다. 이때는 하나하나씩 차례대로 진행하여서 로컬에서 먼저 데이터베이스의 엔드포인트를 통해서 접속이 되는지 확인해야 한다.
데이터베이스 보안 그룹 열어주기!
AWS EC2(Elastic BeanStalk도 결국 EC2 생성해주는 것이다!)에서 보안 그룹 규칙을 통해서 EC2 인스턴스로 들어오고 나가는 트래픽을 세부적으로 제어할 수 있도록 해준다. 예를 들어 80번 포트는 모든 사람들이 접근할 수 있도록 열어주고 SSH 통해 접속하는 22번은 나만 접근하도록 허용할 수도 있다.
VPC
VPC는 하나의 네트워크 그룹이다.
인바운드 규칙
인바운드란 외부에서 인스턴스로 들어오는 요청을 의미한다. 유형을 선택하면 프로토콜과 포트가 자동으로 선택이 된다.
아웃바운드 규칙
아웃바운드는 인스턴스에서 외부로 나가는 트래픽인데, 디폴트 값이 모두 허용이기 때문에 건들지 않았다.
데이터베이스 설정을 위해서는 인바운드 규칙을 수정했어야 한다. MySQL 서버가 접속 되도록 해야하기 때문이다.
인바운드 규칙 편집에 들어가서 유형 중 MYSQL/AURORA를 선택하면 프로토콜과 포트가 TCP, 3306으로 자동 설정된다.
그리고 소스 유형을 AnyWhere IPv4를 선택하여 규칙을 저장한다. 그럼 데이터베이스 보안 그룹 설정이 완료된다.
어떤게 데이터베이스 endpoint?
여기서 문제가 어떤게 해당 Elastic BeanStalk랑 연결된 데이터베이스인지가 의문이였다. 먼저 처음 Elastic BeanStalk 환경 구성을 설정해줄때 데이터베이스를 추가했을 것이다.
해당 페이지의 환경에 들어가면 아래와 같은 화면이 있다. 해당 내용이 존재하면 RDS 창에 들어가면 데이터베이스가 생성되어 있다는 의미이다. 거기서 endpoint를 찾아야 한다! RDS를 AWS 검색창에 검색해서 들어가자.
그럼 아래와 같은 창 중에서 elastic bean stalk에서 만든 이름과 유사한 DB 식별자가 있다!(인스턴스 확인하면서 맞는지 체크한다)
해당 DB식별자 안으로 들어가면 엔드포인트가 나와있다. 해당 엔드포인트를 통해서 로컬에서 돌아가는지 먼저 확인해보았다.
나는 MySQL을 사용하기 때문에, workbench에서 확인하였다. +버튼을 클릭하여 접속한다.
그리고 Connection Name은 그냥 앱 이름, Hostname은 엔드 포인트를 입력하면 되고, password는 우리가 Elastic BeanStalk에 설정한 비밀번호를 입력해주면 된다!
그래서 잘 연결된다면, DB설정이 잘된 것이다. 해당 DB 엔드포인트를 yml파일에 설정해주고 jar로 배포해주면 된다!
(만약 안된다면, DB가 연결이 안된 것이므로 Elastic BeanStalk에 들어가 DB를 다시 확인해주어야 한다.)
이제 위에서 뜬 No Active Profile Set 오류는 뜨지 않았다. database가 없다는 오류가 떠서, 그냥 해당 workbench에서 board라는 db를 만들어주었다!
(해결)
일단 보안그룹 설정에 대해서 확실히 몰랐던 것이 컸던 것 같다. 인바운드 규칙과 아웃바운드 설정을 먼저 살펴봐야한다.
또, ElasticBeanStalk는 새로운 서비스라기 보다는 EC2에서 하던 것 그대로인데 더 편리하게 설정해 주는 거라고 생각하면 될 것 같다.
똑같이 EC2 인스턴스가 생기고 RDS가 생기므로, 결국 EC2에 대한 설정과 동일하다.
Elastic BeanStalk는 단일 서비스일때는 유용하게 사용할 수 있을 것 같다.
EC2와 Elastic BeanStalk의 차이
- 관리 수준:
- EC2: Amazon EC2는 InfraStructure 서비스로, 가상 서버를 프로비저닝(운영체제 선택, 네트워크, 보안 등등의 설정)하고 관리해야 한다. 서버의 운영 체제 선택, 네트워크 구성, 보안 설정, 스케일링 등을 직접 관리해야 한다.
- Elastic Beanstalk: Elastic Beanstalk은 관리형 플랫폼 서비스로, 애플리케이션 배포와 관리를 단순화한다. 코드를 업로드하면 Elastic Beanstalk이 인프라와 런타임 환경을 자동으로 프로비저닝하고 애플리케이션을 배포한다. 서버 인스턴스, 로드 밸런서, 스케일링 등의 관리 작업은 Elastic Beanstalk이 자동으로 처리한다.
- 배포 방식:
- EC2: EC2는 단일 가상 서버 또는 가상 서버 그룹으로 애플리케이션을 배포한다. 서버 인스턴스를 직접 프로비저닝하고 로드 밸런서를 구성하여 트래픽을 분산시켜야 한다.
- Elastic Beanstalk: Elastic Beanstalk은 애플리케이션을 여러 개의 EC2 인스턴스로 배포한다. Elastic Beanstalk이 자동으로 로드 밸런싱, 자동 스케일링, 로깅 및 모니터링을 처리하므로 개발자는 배포에 집중할 수 있다.
- 확장성:
- EC2: EC2는 가상 서버 인스턴스를 수동으로 확장하거나 축소해야 한다. 서버 수준에서 수평 스케일링이 이루어지며, 필요한 만큼의 가상 서버를 추가하거나 제거하여 처리량을 조정할 수 있다.
- Elastic Beanstalk: Elastic Beanstalk은 애플리케이션 수준에서 자동으로 확장된다. 트래픽이 증가하면 Elastic Beanstalk이 필요한 수의 EC2 인스턴스를 자동으로 생성하고 관리한다. 이로 인해 애플리케이션의 확장성이 향상된다.
Elastic BeanStalk를 사용했을 때 편리했던 점은 업로드 할 때 따로 프로그램을 사용하거나 리눅스 명령어 필요없이 jar 파일을 바로 업로드하면 된다는 점이다. 또, EC2가 바로 생기고 데이터베이스가 바로 연결된다.(물론 보안 그룹 설정을 못해서 한참 고생하였다)
아래는 멘토님께서 알려주신 방법이다. 하나하나 차례대로 확인해보면 좋을 것 같다. (덕분에 너무 잘 해결할 수 있었던 것 같다)
Elastic Beanstalk가 제대로 실행되지 않아서 디버깅을 해야 할 때 / Elastic Beanstalk 디버깅 방법
1. 이벤트 확인하기
2. 로그 확인하기
3. EC2에 직접 들어가서 서버 실행시켜보기
여기서 아래에 연결 부분을 복사하여 접속하면 된다.
$ sudo su # root 권한으로 변경하기
$ cd /var/app/current # EB를 통해 업로드한 파일이 있는 디렉토리이다.
해당 위치에서 직접 명령어를 하나하나 쳐보면서 잘 작동하는지 디버깅 해보고, 여기서 디버깅 해봄으로써 에러 코드를 바로바로 직접 확인할 수 있어서 어디에 버그가 존재하는지 쉽게 찾을 수 있다.
'백엔드' 카테고리의 다른 글
GithubAction을 이용해서 Spring 프로젝트 CI/CD(with Docker) (0) | 2023.09.06 |
---|---|
세션 (0) | 2023.08.25 |
[Spring] Spring으로 웹 개발을 진행할 때 알아야할 정보 (0) | 2023.05.23 |
Gradle (0) | 2022.12.27 |
Amazon S3 (0) | 2022.07.12 |