AWS EC2 로드밸런서 없이 https 인증까지...

rosi_bg99·2024년 8월 28일
1

왜 AWS 사용 안하고 힘들게 바꾸었나

일단 프리티어에서 ELB가 없어져서 로드밸런서를 두면 과금이 되었다. 가용 영역을 두 개만 두어도 관리형 Ip가 두 개씩 할당되어서 요금이 두배...!

사실 한 ipv4 주소 당 만원도 안하지만 돈없는 대학생은 이 돈이 아까웠다.

그리고 마침 저번주에 네트워크 관리사 필기에 붙었기 때문에 도메인에 대한 지식도 생겼겠다 내가 직접 DNS를 설정하고 SSL까지 연결해보자는 마음으로 시작하였다.

기존 환경

AWS

먼저 기존에 설정해 놓은 EC2 환경은 우리 구름톤 2기 프로젝트
'생성형 AI를 활용해 유기견을 자세히 들여다보고, 대화할 수 있는 서비스' 봄멍의
스프링 부트 기반 메인 백엔드 서버이다.

초창기 해커톤을 위해서 프론트와 빠르게 연결만 되게 하자는 생각에서 8080 포트를 열고 ssl 인증과 도메인 없이 개발했었다.

이후 구름톤 in Jeju 에서 적용하기 위해 가비아에서 bommeong.site 라는 도메인을 1년 샀고 AWS Certificate Manager 에서 SSL 인증서를 발급받아 Route53 과 ELB 설정을 통해 아주 간단하게 도메인 연결과 https 인증을 했었다.

가비아 도메인 연결

먼저 Route53으로 등록했던 DNS 서비스를 삭제해주고 가비아 DNS를 사용했다.

가비아 에서 도메인 관리 - 네임서버를 가비아 네임서버로 설정하고, DNS - 도메인 연결에서 DNS를 설정해 주었다.

A 레코드로 호스트를 추가해 준 다음, ip주소를 넣어서 등록해주었다.
도메인 연결까지는 약 1시간 정도 걸린 것 같다.

SSL 인증서 발급

리눅스 환경에서 SSL 인증서를 발급받기 위해서 Let's Encrypt를 사용하였다.
아마존 리눅스 3 환경에서 필요한 패키지를 먼저 설치해주었다.

sudo yum install epel-release
sudo yum install certbot
sudo yum install nginx

그 다음 certbot을 사용하여 인증서를 발급하였다

sudo certbot certonly --standalone -d {domain} -d www.{domain} --debug-challenges

nginx 설정

nginx 를 설치하고 실행한 다음 설정 파일을 수정해 주었다.

sudo systemctl start nginx
sudo systemctl enable nginx
sudo vim /etc/nginx/nginx.conf

http 요청을 https 로 리다이렉트되게 해주었고,
https로 들어오는 SSL/TLS 암호화 된 요청을 처리하는데,
이 전 Let's Encrypt에서 발급받은 SSL 인증서와 개인 키의 경로를 지정해준다.
그 아래에는 SSL/TLS 프로토콜 버전 지정, 암호화 방식을 지정해주고
모든 요청을 localhost:8080으로 프록시 설정을 해주어서 백엔드 서버와 연결해주었다.

server {
        listen 80;
        server_name {domain} www.{domain};
        return 301 https://$server_name$request_uri;
    }

    server {
        listen 443 ssl;
        server_name {domain} www.{domain};

        ssl_certificate /etc/letsencrypt/live/{domain}/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/{domain}/privkey.pem;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

        location / {
            proxy_pass http://localhost:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

설정 테스트 후 재시작

sudo nginx -t
sudo systemctl restart nginx

certbot 인증 자동화

cron job을 설정하여 매월 1일 오전 3시에 인증서 갱신을 시도하고, 갱신 후 nginx를 재로드한다.

sudo crontab -e

아래 줄 추가

0 3 1 * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"

갱신 후 웹서버가 재시작 되도록 설정

sudo nano /etc/letsencrypt/renewal/bommeong.site.conf

파일 끝에 추가

renew_hook = systemctl reload nginx

0개의 댓글