배포했는데 웹소켓이 안 됨
최근 실시간 웹소켓 통신을 활용한 프로젝트를 진행하였다. 그런데 AWS EC2와 S3에 배포하니 웹소켓부분에서 오류가 발생했다! 왜 이런일이 발생했는지 찾아보았더니 다음과 같은 자료를 얻었다.
기능 | Application Load Balancer | Network Load Balancer | Gateway Loac Balancer | Classic Load Balancer |
로드 밸런서 유형 | 계층 7 | 계층 4 | 계층 3 게이트웨이 + 계층 4 로드 밸런싱 | 계층 4/7 |
대상 유형 | IP, 인스턴스, Lambda | IP, 인스턴스 | IP, 인스턴스 | |
WebSocket | ✔ | ✔ | ✔ | |
지원 네트워크/플랫폼 | VPC | VPC | VPC | EC2-Classic, VPC |
표를 보면 CLB는 WebSocket을 지원하지 않는다는 사실을 발견할 수 있다! 원인을 발견했으니 해결해보자. 방법은 2가지다.
- CLB에서 http, https 프로토콜을 TCP(80, 443)로 바꾼다
- WebSocket을 지원하는 ELB로 교체한다.(ALB, NLB)
1. CLB에서 해결
로드밸런서의 리스너 항목에서 원래 HTTP, HTTPS로 되어있던 부분을 위와 같이 TCP, TCP(with SSL)로 변경하면 CLB를 쓰는 환경에서도 웹소켓을 사용할 수 있다.(물론 HTTP에서 지원하던 스티키세션 옵션 등은 사용할 수 없게된다.)
2. 다른 ELB로 교체
ALB와 NLB 등 이미 웹소켓을 지원하는 ELB 인스턴스로 교체하는 방식이다. 나는 이번에 ELB를 처음 써봐서 어떤 블로그 글을 따라했는데 글에서 CLB를 쓰길래 큰 고민없이 일단 CLB를 썼다. 하지만 더 알아보니 CLB를 쓰지 않고 ALB를 써서 웹서버 배포를 진행하는 글도 많았다. 사실 AWS에서 위 그림처럼 CLB는 이전세대라면서 비활성화된 것처럼 회색으로 표시하길래 '요즘에는 안쓰나?'라는 생각도 들었긴 했다... 배포가 급해서 마음의 여유가 없어 충분한 조사를 하지 못했던 것 같다. 이젠 마음이 급해도 여러 개의 글을 보고 확실하게 기술에 대해 안 다음에 적용해야겠다.
이번에는 이미 CLB로 배포해서 CLB옵션을 변경해서 문제를 해결했지만, 다음 기회가 있다면 ALB나 NLB를 사용하여 배포해봐야겠다. 또한 ALB, NLB, GLB에 대해서도 공부해봐야겠다.
+서버를 재배포했는데 CLB가 제대로 작동하지 않는 오류가 생겨 이 기회에 ALB로 새로 작성했더니 바로 성공했다!
aws.amazon.com/ko/elasticloadbalancing/features/