AWS, SpringBoot, Nginx, Docker로 무중단 배포하기(1)

1 분 소요


AWS 프리티어 계정으로 EC2 t2.micro 서버를 생성하고, 이 서버에 SpringBoot 기반의 App Server를 구동하고 Nginx와 Docker로 무중단 배포하는 과정을 써보도록 하겠습니다.

먼저, 사용되는 도구 및 기술은 다음과 같습니다.

  1. 서버 인프라 : AWS EC2
  2. 어플리케이션 환경 : 자바11, 스프링부트 2.5.1
  3. 포트 라우팅 : Nginx
  4. 배포 환경 : Git Action, AWS S3, AWS CodeDeploy, Docker

Deploy

간략하게 프로세스를 정리해보면 다음과 같습니다.

  1. 로컬서버에서 개발을 하고 소스코드를 Git으로 업로드 합니다.
  2. GIt Action을 통해서 프로젝트를 빌드하여 생성된 jar파일을 S3에 업로드 합니다.
  3. CodeDeploy는 EC2에 있는 Agent에게 배포 명령을 내리면, Agent는 연동된 S3의 jar를 로드합니다.
  4. Docker 명령에 따라 Docker 빌드를 하고, Nginx 포트 스위칭을 하여 운영

AWS EC2 서버 설정

AWS EC2 서버는 Ubuntu 20.04로 하였으며, 용량은 최대 크기인 30gb로 하였습니다. 스프링부트환경에서 application.yml 설정을 통해 개발과 운영환경에 따른 binding-port를 지정할 수 있습니다.

SpringBoot - application.yml 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
spring:
  profiles:
    group:
      "dev""dev_port"
---
spring:
  config:
    activate:
      on-profile: "dev_port"
server:
  port: 8081
---
spring:
  profiles:
    group:
      "prod""prod_port"
---
spring:
  config:
    activate:
      on-profile: "prod_port"
server:
  port: 8082
 
cs

위에서 보는 바와 같이 프로파일 구분자(—)로 여러 환경의 설정정보를 저장할 수 있습니다. jar파일을 구동할 때 profiles.active를 어떻게 지정하냐에 따라 다른 포트로 구동됩니다.

Nginx 설정

Nginx는 3가지 기능을 합니다.

  1. 웹서버의 기능
  2. SSL 인증서 적용(let’s encrypt 적용)
  3. 서비스로 포트 라우팅(proxy pass)

nginx config 설정은 다음과 같이 하였습니다. (/etc/nginx/sites-available/default)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
server {
        listen 80;
 
        root /var/www/html;
 
        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;
 
        server_name ;
        include /etc/nginx/conf.d/service_url.inc;
        return 301 https://$host$request_uri;
}
 
server {
 
        root /var/www/html;
        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;
 
        server_name ; # managed by Certbot
        include /etc/nginx/conf.d/service_url.inc;
 
        location / {
 
               proxy_ssl_server_name on;
               proxy_pass $service_url;
               proxy_set_header HOST $host;
 
        }
 
    #listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/   /fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/  /privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
 
}
 
 
cs


-. 다음과 같은 명령어로 nginx에 let’s encrypt를 적용한다.

$ wget https://dl.eff.org/certbot-auto 
$ chmod a+x certbot-auto

-. https가 아닌 http 요청은 HTTP 301코드를 리턴한다.

-. $service_url http://127.0.0.1:8081; 로 설정하여 8081 포트로 포워딩한다.

카테고리:

업데이트:

댓글남기기