- 자바
- Git
- string
- 데이터베이스
- 프로그래머스
- 문자열
- jpa
- spring mvc
- 스프링부트
- ORM
- session
- select
- springboot
- SSL
- PYTHON
- Django
- spring boot
- mysql
- @transactional
- Docker
- spring security 6
- sql
- join
- 스프링
- DI
- nginx
- spring
- AWS
- java
- 1차원 배열
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
개발하는 자몽
[TIL] ACM(ELB)와 NGINX 본문
상황
EC2를 사용하고 있어서 SSL 적용을 ACM으로 해보려고 했는데 실패하고 Let's Encrypt를 사용했다.
ACM SSL 인증서는 AWS Load Balancer, CloudFront, API Gateway를 통해서만 사용할 수 있다. 마침 로드 밸런싱을 Nginx로 하고 있었던 차에 ELB로 바꿔야지 하면서 ALB를 생성했었다.
생성하고 난 다음에 문제는 ALB에서 보내는 헬스 체크 요청이 Nginx(웹서버)에 도달하지 않는 것이다. ALB의 리스너 설정이나 대상 그룹 설정 등을 모두 확인했으나 Nginx에 요청이 도달하지 않았다.
나는 총 3개의 포트를 사용했던 것 같다. 아래 세 개 모두를 보안 그룹에 설정해 두었고, ALB 리스너 설정에도 추가해 두었다. (지금 생각해 보면 80, 443번 포트만 열어뒀어도 됐다) 요청을 처리하는 대상 그룹(target group) 문제인가 하고 확인해 봤는데, 인스턴스도 제대로 설정되어 있었다.
- HTTP 요청을 위한 80번 포트
- HTTPS 요청을 위한 443번 포트
- Django 서버를 실행하고 있던 4100번 포트
이 와중에 4100번 포트의 헬스 체크는 `Healthy`로 잘 나타났고, 다른 포트들은 `Unhealthy`로 표시되었다.
알게 된 것
진행하고 있던 프로젝트는 Django를 사용하고 있었고 Django는 배포하려면 웹서버가 필요하다. 이때 사용하는 대표적인 웹서버로 Apache, Nginx가 있지만, 아파치로 사용하는 방법은 더 이상 지원하지 않는 것 같아서 Nginx로 채택했었다.
문제는 Nginx로 SSL을 설정하려면 서버(EC2 인스턴스)에 설치된 SSL 인증서가 필요했다.
ssl_certificate /etc/letsencrypt/live/{domain}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{domain}/privkey.pem;
간혹 이런 ACM + ELB + NGINX 조합으로도 SSL을 잘 적용한 글들이 보였는데, 또 다른 문제는 서버에서 실행되는 Nginx는 서버에 설치된 것이 아닌 도커 컨테이너 형태로 실행하고 있었다. (그래서였을까... 너무 힘들었다...)
이렇게 끊임없는 삽질로 알게된 것은 ACM으로 인증서를 얻어서 서버에 설치하는 것은 불가능하다는 사실이었다. 그래서 AWS에서 ELB나 CloudFront 등을 강제로 사용하게 하는 것 같다. 정확히는 "ELB에서 HTTPS를 사용하려면 ACM을 써라!"인 것 같지만...
ELB에서 HTTPS 리스너를 생성하려면 로드 밸런서에 한 개 이상의 SSL 서버 인증서를 반드시 배포해야 합니다. ...(중략)... AWS Certificate Manager(ACM)을 사용해 로드 밸런서를 위한 인증서를 생성하는 것이 좋습니다. ACM은 2048, 3072, 4096비트 길이의 RSA 인증서와 모든 ECDSA 인증서를 지원합니다. ACM은 Elastic Load Balancing과 통합하여 로드 밸런서에 인증서를 배포합니다. 자세한 내용은 AWS Certificate Manager 사용 설명서를 참조하세요.
- AWS Document ALB -
결국 ACM과 ELB를 포기했다! 어찌 됐건 SSL 적용은 필요했기 때문에 Let's Encrypt를 사용하여 인증서를 발급하고 Nginx에 설정했다.
최근에는 Nitro Enclaves라는 걸로 할 수 있는 것 같은데 별로 사용하지 않는 방법인 것 같다. 혹시 모르니까 링크 남겨두기...
🔗 https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave-refapp.html
🔗 https://aws.amazon.com/ko/about-aws/whats-new/2020/10/announcing-aws-certificate-manager-for-nitro-enclaves/
'Architecture & Tool > AWS' 카테고리의 다른 글
[AWS] ACM을 이용한 HTTPS 적용 (0) | 2024.04.05 |
---|---|
[AWS] ELB 생성 (0) | 2024.04.05 |
[AWS] EC2 인스턴스 용량 확장 (0) | 2024.03.29 |
[AWS] EC2 인스턴스 내 Docker 설치와 Django 프로젝트 설정 (1) | 2024.03.23 |
VSCode로 AWS EC2 인스턴스 접속 (0) | 2024.03.16 |