이전 글에선 도커 이미지 빌드와 Compose에서 로컬 환경 실행에 그쳤다면,
이번에는 실전으로 들어가 AWS EC2 실제 서버 배포 + AWS RDS 연동 두 가지를 동시에 시도했습니다.
우선 AWS RDS Free tier에 맞는 데이터 베이스 인스턴스 생성
RDS도 하나의 서버입니다.
기존 EC2와 동일하게 서버 간의 연결에 신경쓰려면 딱 두가지를 신경쓰면 됩니다.
1) 접속할 IP와 PORT에 대한 인바운드 보안 규칙 설정
2) 서버의 EndPoint (+PORT 이 경우 5432)
그 외에서 신경 쓰일 일은 없었습니다.
데이터 베이스에 접근할 유저와 비밀번호를 잘 기억해서 환경변수에 적어주는 것 정도?
이제 이 DB에 접근할 IP에 대해 인바운드 규칙을 설정 해주겠습니다.
(가운데는 본인 IP니 무시해주세요)
열어준 소스는 두 개입니다.
노트북에서 실행과 DB관리를 위한 공유기 IP와 EC2의 private IP
EC2의 public IP를 사용하지 않는 이유는 두 서버가 같은 VPC안에 있기 때문이라고 합니다.
보안 관련한 설정인데, 일단 배포니깐 자세한 설명은 넘어 가겠습니다.
다행히 로컬에서 TEST 결과, 잘 Connection이 된 것을 볼 수 있습니다.
만약 와이파이가 바뀌거나 하여 IP가 바뀐다면 연결이 되지 않겠죠?
이제 이 DB 접속 정보를 스프링 환경변수에 담은 후 Nginx와 연결해 Docker-compose를 할 차례입니다.
build 지시어는 CI/CD를 위해 추가했으니 뒤 게시물로 넘기겠습니다.
image는 기본적으로 서버에 존재하는 이미 생성한 Docker 이미지 명이며,
DockerHub를 이용해야하는 배포에선 "{repo 이름}/springboot:0.1" 와 같은 이름을 갖습니다.
port expose depends_on은 이전 docker-compose에서 사용했던 지시어들입니다.
networks는 있어도 없어도 괜찮지만, 이후 네트워크 구성이 복잡해 질 수 있기에 명시적으로 작성했습니다. (없어도 됨!)
뺄거 빼면 생각보다 많은 양은 아니네요.
다음은 Nginx 설정입니다.
nginx_Dockerfile
#nginx_Dockerfile
FROM nginx
RUN rm -rf /etc/nginx/conf.d/default.conf
COPY ./conf.d/app.conf /etc/nginx/conf.d/app.conf
COPY ./conf.d/nginx.conf /etc/nginx/nginx.conf
VOLUME ["/data", "/etc/nginx", "/var/log/nginx"]
WORKDIR /etc/nginx
CMD ["nginx"]
EXPOSE 80
app.conf
#app.conf
server {
listen 80;
listen [::]:80;
server_name "";
access_log off;
location / {
proxy_pass http://demo-docker-springboot:8080;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
nginx.conf
#nginx.conf
daemon off;
user www-data;
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
use epoll;
accept_mutex off;
}
http {
include /etc/nginx/mime.types;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
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"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
client_max_body_size 300m;
client_body_buffer_size 128k;
gzip on;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_min_length 0;
gzip_buffers 16 8k;
gzip_proxied any;
gzip_types text/plain text/css text/xml text/javascript application/xml application/xml+rss application/javascript application/json;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;
include /etc/nginx/conf.d/*.conf;
}
기본적으로 nginx를 서버에서 다뤄보신 분들이면 한번 쯤 봤을 config 파일들입니다.
신경 써야할 건 딱 하나입니다.
app.conf -> Proxy Pass 여기서 http://{스프링 container명}:8080 으로 해주셔야 WAS로 프록시가 전달됩니다.
마지막으로 루트 파일의 스프링 Dockerfile 입니다.
FROM openjdk:18-ea-jdk-slim
VOLUME /tmp
COPY build/libs/demo-0.0.1-SNAPSHOT.jar codingtest-service.jar
ENTRYPOINT ["java","-jar","codingtest-service.jar"]
별거 없습니다. Gradle로 생성한 jar 파일을 root 디렉토리에 복사합니다.
이후 이미지 실행시 컨테이너에서 복사한 jar 파일을 실행시킵니다. 끝
DATABASE_URL: 데이터베이스 url
DATABASE_USER: 유저
DATABASE_PASSWORD: 비밀번호
마지막으로 .env 파일 설정입니다. 앞서 RDS 생성 당시 기억해둔 user password를 각자 사용하시면 됩니다.
최종적인 폴더구조
최종 실행
1. 현재 스프링 Jar 파일로 빌드
2. docker-compose build 실행
3. docker-compose up 실행
다음 글에선 이 과정을 Git Action을 이용해 CI/CD를 하는 과정을 서술하겠습니다.
'인프라' 카테고리의 다른 글
Git Action로 Push 한번에 EC2에 배포 적용하기 (2) | 2024.07.23 |
---|