Dev/Cloud

ELB 없이 SSL 인증서 적용: ipv4 과금에 따른 VPC 에서의 public ip 주소 사용하지 않도록

rryu09 2024. 8. 27. 14:13

EC2 프리티어에 딸린 퍼블릭 ip 주소 하나는 과금되지 않는다. 

원래는 ELB 에 인증서 붙여서 https 설정을 했었는데

VPC 를 보니까 public ip 를 많이 쓰고있어서 과금이 많이 됐었다

구성할 때에는 로드밸런서가 있어야 https 달 수 있는 줄 알고.. 그땐 검색해 봤을 때 저렇게 달면 된다고 쓰인 블로그 포스팅들이 많았다

도전학기 마감한다고 배포에 신경 쏟을 시간도 없었던 터라

이제 여유가 생긴 겸 한달에 만 얼마씩이나 뜯어가는 AWS를 단단히 손봐주리라 생각했다..

프리티어 기간이 거의 되어 가기도 하고

도메인도 한번 갈아야 하는데 프론트 도메인은 계속 사서 가는 게 좋을지 고민이긴 하다

더 업글해서 GA 달고 유입을 늘려보는 게 더 좋을 것 같기는 한데 시간을 좀 들여야 할 것 같다

아무튼 이번 구성을 해보면서 얼마나 서버와 인프라쪽에 무지한지 다시한번 깨닫게 된다

  1. 일단 프리티어가 끝나가서 기존에 있던 지우고 계정도 닫았다.
  2. 계정을 하나 파서 EC2 인스턴스를 하나 만든다.
    프리티어 지원되는 t2.micro 로 디폴트 설정 적용해서 만들었다.
    시큐리티 그룹 오래 전에 해서 내용 까먹었는데다시 보니 그래도 기억난다. ipv6 때문인가 블럭 형태가 다른 있었다.
    인바운드 룰만 설정해주면 된다.
    인바운드 트래픽은 명시적으로 허용된 것만 허용되고 나머지는 다 차단하는데 아웃바운드 트래픽은 기본적으로 전부 허용되기 때문이다. 또 stateful 해서 인바운드로 들어온 요청에 대한 응답은 자동으로 아웃바운드로 나갈 수 있도록 허용되어서 인바운드만 설정해주면 된다.
    80 443 8080 22ssh
    포트 이렇게 뚫어준 같다

3. EC2 원래 만들어뒀던 도커 이미지를 pull 받았다.
도커 이미지 태그 명시 했더니 latest 태그가 자꾸 붙은 문제가 되었는지.. pull 받을 문제가 있었다.

도커 허브에서 복붙하면 되는 복붙하면 쉽게 풀받을 있다.
도커 허브 아이디 비번 까먹었을까봐 무서웠는데 한방에

 

4. 도커 컨테이너를 실행시키고 퍼블릭 ip 주소로 접속해서 돌아가는지 봤다.

docker run 명령어에 --name -d --rm -p -e 같은 옵션을 너무 붙였더니 복잡하길래 카톡에서 만들고 복붙했더니 짧은 대시 두개가 대시로 변환되어서 문제가 생겼다..
대시 수정했더니 돌아갔다.

 

5. 이제 구매해둔 도메인을 연결한다. route53에서 호스팅 영역 설정 해서 가비아랑 네임서버 주소 연결하는 간단한 작업

 

6. ssl 인증서를 받아와야 한다.

Certbot 를 이용해서 받아왔다. 도메인 소유권을 확인하기 위해 잠시 HTTP 서버를 실행하기 때문에 80번 포트를 사용하는 것 같다. 80 포트에 뭐 돌아가고 있으면 잠깐 꺼줘야 한다. 

Requesting a certificate for --- An unexpected error occurred: Error retrieving account "https://acme-v02.api.letsencrypt.org/ ---" Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.

이런 오류가 뜨기도 했는데.. firewall-cmd 설정을 해줬다

 

인증서 파일(fullchain.pem): /etc/letsencrypt/live/[your_domain.com]/fullchain.pem
개인 파일(privkey.pem): /etc/letsencrypt/live/[your_domain.com]/privkey.pem

이 위치에 이런 이름으로 저장된다.

 

7. docker-compose 를 설치했다

8. docker-compose.yml 야믈 파일이랑 config 파일을 이리저리 건드렸다. 포트가 헷갈린다
포트 내부 외부 어떻게 달라야하는지 몰라서 처음에 몽땅 8080으로 했는데 내부 외부가 겹치는 문제가 있어서

내부를 8081 포트로 설정해줬다.
이리저리 서치를 해본 결과 /etc/nginx/sites-available/default 경로에 설정파일이 있다고 많이들 했는데

나는 경로에 파일이 없었다
/etc/nginx/nginx.conf 경로에 있었다. 이미 내용이 적혀있는 파일을 찾아서 수정해주어야 한다

 

docker-compose.yaml 파일에 image: 이미지 이름 써야 했는데 컨테이너 이름을 써버려서
Error response from daemon: pull access denied for typolab, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
이런 오류도 떴었다.

 

curl http://localhost:8081 (포트 번호는 내부 서버에 맞춰서) 로 서버가 잘 돌아가고 있는지 확인할 수 있다.

docker logs -f 컨테이너이름
으로 실시간 로그 찍히는 있다

 

중간에 env 없어서 발생하는 문제도 있었다. 전에는 docker run -e 옵션으로 env 같이 줬었는데, 슬슬 길어지기도 하고 야믈 파일 있는김에 docker-compose 야믈 파일에 갖다 넣었다

 

https 라우팅은 성공한 것 같은데 계속 nginx 디폴트 화면만 뜨길래 설정파일을 잘 뒤져보니 리버스 프록시 설정을 잘못한 발견했다.

80포트, 443 포트가 있을 80 포트로 접근하면 return 301 https://$host$request_uri; 통해서 https 리다이렉트를 해주어야 하고 443 경우에 포트포워딩 해서 내부 서버로 전달해 처리해줘야 하는데, 두개 처리하는 문을 설정하거나 반대로 되어있거나 했다.

80인 경우 https 리다이렉트, 443인 경우 내부 서버로 전달해주도록 잘 설정했다.

 

여기까지 고치니 서버가 잘 작동했다.

 

 

인증서 자동 갱신은 cronie 깔아서 (crontab) certbot renew 를 타이머 설정해서 돌려놨다.