AWS EC2 서버 도메인 없이 https 붙이기

Sia Hwang·2023년 4월 11일
1
post-thumbnail

0. 고생길 시작

최근에 AWS 프리티어가 끝나가서 운영중이던 사이드 프로젝트의 스프링 서버를 새로운 계정을 파서 옮기려고 했다.
이건 백엔드 api 서버인데 http로는 배포된 웹에서 호출이 되지 않기 때문에 https도 붙이려고 했다.
옛날엔 EC2 서버에 SSL 인증서를 직접 설치하는 방식으로 https를 달았지만 이게 무료 인증서라 그런건지 시간이 지나니까 신통치가 않아서 다른 방법을 찾아보았다.

먼저 구글에 검색하면 흔하게 널려있는 방법인, 도메인을 구매한 뒤 로드밸런서와 Route53, AWS의 인증서 발급 서비스를 이용해 https를 붙이는 방법으로 시도해 보았다. 전에도 도메인을 구매해서 다는 방식으로 했으니까...
하지만 뭐가 문젠지 나는 안 됨
ㅠ.ㅠ
그래서 한 3일 헤메다가 EC2 HTTPS without domain 이라는 검색 키워드를 발견하게 되었고... 드디어 나의 api 서버에 https를 붙이는 데 성공했다. 흑흑... 역시 영어로 검색해야 자료가 많구먼
다음에 또 EC2로 서버 구축할 때 까먹지 말고 써먹어야 하니까 과정을 기록한다.

1. 새 EC2 인스턴스 생성

지메일을 아무거나 만들고 새로운 AWS 계정을 만들어서 EC2와 RDS 인스턴스를 만든다. 이건 구글에 이미 방법을 올려놓은 사람이 많기 때문에 과정은 생략하겠다.

2. EC2에 Caddy 설치

Caddy란 https를 붙여주는 DNS라고 하는데, 오픈소스다. 그래서 무료로 사용할 수 있다.

https://stackoverflow.com/questions/60943536/how-to-use-ssl-for-a-backend-ec2-instance-without-a-domain
최초로 참고한 글은 이 글이다. 다만 여기엔 Caddy 설치방법은 나와있지 않기 때문에 또 구글링을 해서 EC2에 Caddy를 설치했다.

https://stackoverflow.com/questions/73347341/cannot-download-caddy-package-on-yum
나는 아마존 리눅스2를 썼는데 공식 Caddy 사이트에 있는 설치법으로는 설치가 되지 않아서 이 글을 따라 했다. 우분투 쓰면 공식 홈페이지에 있는 우분투 설치법으로 해도 될 거 같다.
go/bin/xcaddy build에서 시간이 꽤 걸리는데 절대 멈춘거 아니니까 완료될 때까지 유튭 보면서 기다리면 된다.

일단 sudo mkdir /etc/caddy 여기까지만 실행한 뒤 config 파일을 만들어 줄 것이다.

3. Caddy config 파일 생성

https://stackoverflow.com/questions/73347341/cannot-download-caddy-package-on-yum
이 글에 나와있듯이 설치가 완료되고 나면 몇몇 설정 파일을 수동으로 만들어줘야 한다.

sudo vi /etc/systemd/system/caddy.service

root 관리자 권한으로 위 경로에 caddy.service라는 이름의 파일을 만든 다음에

[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target

[Service]
Type=notify
User=caddy
Group=caddy
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile --force
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

파일 내용에는 얘네를 복붙하고 저장한다.
더 자세한 내용은
https://caddyserver.com/docs/running
여기에 들어가서 확인할 수 있다. 스택오버플로우의 Caddy 설치법 작성자가 써 놓은대로 확인하면 된다.

다음으로

sudo vi /etc/caddy/Caddyfile

역시 root 권한으로 위 경로에 Caddyfile이라는 이름으로 파일을 만든 뒤 내용에는

{
    admin 0.0.0.0:2020
}
<EC2 인스턴스의 퍼블릭 IPv4 주소>.nip.io {
    reverse_proxy localhost:8080 # 들어오는 요청을 8080포트로 포워딩
}
# 예시 : 
10.100.100.100.nip.io {
    reverse_proxy localhost:8080
}

이렇게 복붙한다.
맨 위에 admin 어쩌고는 Caddy를 실행했을 때 Tcp 127.0.0.1:2019: bind: address already in use와 같은 에러로 실행이 되지 않으면 추가하면 된다.
이와 관련한 내용은
https://stackoverflow.com/questions/60943536/how-to-use-ssl-for-a-backend-ec2-instance-without-a-domain
여기를 참고하면 이해가 쉽다.

4. Caddy 실행

다시 Caddy 설치법 글로 돌아가서

sudo systemctl daemon-reload
sudo systemctl enable --now caddy
systemctl status -l caddy

이 명령들을 마저 실행한다.

$ systemctl status caddy.service
● caddy.service - Caddy
   Loaded: loaded (/etc/systemd/system/caddy.service; enabled; vendor preset: disabled)
   Active: active (running) since 화 2023-04-11 13:27:50 UTC; 5s ago
     Docs: https://caddyserver.com/docs/
 Main PID: 11243 (caddy)
   CGroup: /system.slice/caddy.service
           └─11243 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile

정상 활성화되었다면 이런식으로 로그가 나와야 한다.

이제 Caddy를 실행하면 내 서버는 ssl 인증을 받아 https를 달 수 있게 된다.

sudo caddy start

root 권한으로 실행한다. Caddy를 실행하는 명령어는 caddy runcaddy start 두 가지가 있는데,
caddy run은 그냥 실행하는 것이라 ctrl+c를 누르면 꺼지고(다른 행동 할 수 없음)
caddy start는 백그라운드에서 실행하는 것이다. 서버가 혼자 돌게 둬야 하니까 백그라운드 모드로 실행한다.

2023/04/11 13:56:33.748	INFO	using adjacent Caddyfile
2023/04/11 13:56:33.749	WARN	Caddyfile input is not formatted; run the 'caddy fmt' command to fix inconsistencies	{"adapter": "caddyfile", "file": "Caddyfile", "line": 2}
2023/04/11 13:56:33.749	INFO	admin	admin endpoint started	{"address": "0.0.0.0:2020", "enforce_origin": false, "origins": ["//0.0.0.0:2020"]}
2023/04/11 13:56:33.750	WARN	admin	admin endpoint on open interface; host checking disabled	{"address": "0.0.0.0:2020"}
2023/04/11 13:56:33.750	INFO	http	server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS	{"server_name": "srv0", "https_port": 443}
2023/04/11 13:56:33.750	INFO	http	enabling automatic HTTP->HTTPS redirects	{"server_name": "srv0"}
2023/04/11 13:56:33.751	INFO	http	enabling HTTP/3 listener	{"addr": ":443"}
2023/04/11 13:56:33.751	INFO	failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 2048 kiB, got: 416 kiB). See https://github.com/quic-go/quic-go/wiki/UDP-Receive-Buffer-Size for details.
2023/04/11 13:56:33.751	INFO	http.log	server running	{"name": "srv0", "protocols": ["h1", "h2", "h3"]}
2023/04/11 13:56:33.751	INFO	http.log	server running	{"name": "remaining_auto_https_redirects", "protocols": ["h1", "h2", "h3"]}
2023/04/11 13:56:33.752	INFO	http	enabling automatic TLS certificate management	{"domains": ["10.100.100.100.nip.io"]}
2023/04/11 13:56:33.752	INFO	autosaved config (load with --resume flag)	{"file": "/root/.config/caddy/autosave.json"}
2023/04/11 13:56:33.752	INFO	serving initial configuration
2023/04/11 13:56:33.753	INFO	tls	cleaning storage unit	{"description": "FileStorage:/root/.local/share/caddy"}
2023/04/11 13:56:33.754	INFO	tls	finished cleaning storage units
2023/04/11 13:56:33.754	INFO	tls.cache.maintenance	started background certificate maintenance	{"cache": "0xc000335490"}
Successfully started Caddy (pid=23624) - Caddy is running in the background

대충 이런식으로 나오면 성공적으로 실행된 것이다.

5. Spring boot 서버 실행

이제 마지막으로 Spring boot 프로젝트를 깃에서 클론받아서 실행하면 된다.

https://velog.io/@jonghyun3668/SpringBoot-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-EC2-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0#3-%EC%9A%B0%EB%B6%84%ED%88%AC-%EC%BD%98%EC%86%94%EC%97%90%EC%84%9C-git-ssh-%EC%97%B0%EB%8F%99%ED%9B%84-git-clone-%ED%95%98%EA%B8%B0

이 글이 보기 좋으니까 참고해서 연동하자.

그러면 이렇게... 도메인을 따로 사고 SSL 인증서를 추가하기 위한 각종 노력등등을 하지 않아도 https가 붙는다!
이제 프론트엔드에서 배포 후에도 api 호출이 가넝한

참고

profile
당면한 문제는 끝까지 해결하기 위해 노력하는 주니어 개발자입니다.

0개의 댓글