AWS Elastic Beanstalk에 Java SE 플랫폼 기반으로 API 서버를 구축한 기록입니다
아래와 같이 총 3가지 상황에 따른 구축방법과 주의할 점에 대한 글로 나누어 작성할 예정입니다.
1편 실행가능한 단일 JAR
3편 Procfile 기반 다수 JAR + Arguments + ebextentions NGINX Reverse Proxy 설정
단일 Jar를 Beanstalk에 배포하기 위해 필요한 준비물입니다.
준비물
1. Executable JAR
- 저는 spring boot 2 기반 JAR를 사용했습니다.
2. AWS 계정
첫번째로 HTTP 기반 API 서버를 만들기 위해 환경 티어 선택에서 웹 서버 환경을 선택합니다.

다음엔 Beanstalk 생성시 플랫폼을 Java로 선택하고 생성하면 됩니다.
(만약 WAR로 배포하고 싶으시면 플랫폼을 Tomcat으로 선택하면 됩니다.)

추가적으로 필요한 옵션을 선택 하고 생성된 빈스톡에 foo.jar를 배포하면 됩니다.
(Beanstalk은 Java 플랫폼을 선택하면 기본적으로 Java 8 환경에서 동작합니다.)
(Beanstalk은 Java 플랫폼을 선택하면 기본적으로 Java 11 환경에서 동작합니다.)

그리고 빈스톡 URL로 API를 호출해보면 당연하게도 동작하지 않는다.

이유는 Beanstalk Java SE플랫폼은 기본적으로 5000 포트에서 해당 application을 수신하게끔 설정되어있기 때문인데
(https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/java-se-procfile.html)
가장 쉬운 해결방법은 환경속성에서 내부에서 동작한 foo.jar의 포트를 5000으로 변경하는 방법이 있습니다.

왜 5000번일까요?

빈스톡에 있는 EC2에 있는 nginx설정을 보면 알 수 있는데
/etc/nginx/nginx.conf
# Elastic Beanstalk Nginx Configuration File
user nginx;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 32725;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
include conf.d/*.conf;
map $http_upgrade $connection_upgrade {
default "upgrade";
}
server {
listen 80 default_server;
access_log /var/log/nginx/access.log main;
client_header_timeout 60;
client_body_timeout 60;
keepalive_timeout 60;
gzip off;
gzip_comp_level 4;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# Include the Elastic Beanstalk generated locations
include conf.d/elasticbeanstalk/*.conf;
}
}
마지막에 include conf.d/elasticbeanstalk/*.conf; 로
/etc/nginx/conf.d/elasticbeanstalk에 있는 모든 .conf파일을 include 하게 되어있는 걸 확인할 수 있습니다.

그리고 해당 경로에 가보면 00_application.conf가
location / {
proxy_pass http://127.0.0.1:5000;
proxy_http_version 1.1;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
모든 경로가 5000포트로 reverse proxy 설정이 되어 있는 걸 확인할 수 있습니다.
간단하게 JAR하나로 beanstalk를 구성해봤는데 실제 운영에서는 각종 JVM옵션과 Argument를 사용하는 경우가 많습니다.
안타깝게도 위 상황이면 JAR하나만 간단하게 Beanstalk에 배포해서는 해결할 수 없고 Procfile이라는 파일명에 옵션을 적어서 zip으로 묶은 파일을 배포해야 합니다.
이 상황은 다음 글에서 다뤄보겠습니다.
'AWS' 카테고리의 다른 글
| AWS Elastic Beanstalk + Java SE환경 API 서버 구축기 (3) (0) | 2020.01.06 |
|---|---|
| AWS Elastic Beanstalk + Java SE환경 API 서버 구축기 (2) (0) | 2020.01.03 |