안녕하세요, 트남 Jake 입니다.
이전 강좌에서 AWS Fargate+Docker를 사용하여 HTTPS Web Application을 구성해 보았습니다.
Stateless/Restful 한 처리와 다르게 실시간성이 중요하거나 Server → Client 로 Push가 필요한 경우 WebSocket 또는 Socket.io 를 사용하는데요, 안타깝게도 AWS 에서 이걸 그냥 제공해 주질 않습니다 ㅠㅜ.
이번 강좌에서는 Socket.io를 Fargate에서 사용하는 법을 배워보겠습니다. 이번 강좌에서 진행될 내용은 다음과 같습니다.
- [이론] HAProxy란?
- [이론] 샘플 프로젝트 리뷰
- [실습] Socket.io 프로젝트 도커 이미지화 & ECR에 업로드
- [실습] NLB(Network Load Balancer) 생성
- [실습] 보안 그룹 수정
- [실습] ECS 작업 생성
- [실습] ECS 서비스 생성
- [실습] 도메인 연동
VPC와 ECS 클러스터 세팅은 생략하겠습니다. 생성 방법은 이전 강좌를 참고하시길 바랍니다.
HAProxy란?
원래는 소프트웨어 레벨 로드밸런싱에 많이 사용하는 오픈소스 입니다만, 우린 AWS 로드밸런서로 들어온 패킷을 Application에 전달하는 Proxy용도로 사용할 계획입니다.
샘플 프로젝트
다운로드
git clone https://github.com/yangga/sample-hello-socket
소스 리뷰 — index.js
보시다시피,
- 3000번 포트로 http 연결을 받습니다.
- ”/” 주소로 요청이 들어올경우 “Hello Socket!” 를 보냅니다.
- Socket.io 로 접속 시(3000번 포트를 같이 사용합니다), “chat” 이벤트로 전송하면 “Recv chat: [메시지]” 출력 후, 받은 메시지를 클라이언트에게 재전송(Echo)합니다.
소스 리뷰 — docker_plugins/conf/haproxy.cfg
HAProxy 설정파일입니다.
- 4000번 포트로 들어온 패킷을 3000번 포트로 포워딩합니다.
- 샘플을 참고하시어 추후 필요 시 사용해보세요 ^^
Socket.io 프로젝트 도커 이미지화 & ECR에 업로드
AWS Fargate와 Docker를 활용한 Auto Scale Serverless 개발하기: AWS ECR 리포지토리에 도커 이미지 올리기
안녕하세요 트남입니다.
medium.com
위 강좌를 참고하여 샘플 프로젝트(sample-hello-socket)의 이미지를 업로드 합니다. (저는 ECR 레포지토리명을 “sample-hello-socket” 로 하였습니다)
NLB(Network Load Balancer) 생성
- https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2#LoadBalancers:sort=loadBalancerName 로 이동합니다.
- “로드 밸런서 생성" 클릭
- “로드 밸런서 유형 선택” 에서 Network Load Balancer (TCP/TLS) 생성
단계 1: 로드 밸런서 구성
“ACM에서 인증서 선택" 을 선택 후 이전에 생성한 인증서를 선택합니다.
단계 3: 라우팅 구성
- 사용할 라우팅 이름을 정하여 입력합니다.
- 대상 유형은 IP를 선택합니다.
- HAProxy에서 4000포트로 받고 있으므로, TCP 프로토콜과 4000 포트를 입력합니다.
- 우리의 Application은 “/”으로 접근 시 “Hello Socket!”을 전송해 줍니다. 이걸 상태 검사로 사용하도록 하겠습니다.
단계 4: 대상 등록
아직 등록할 대상(인스턴스)가 없으므로 넘어갑니다.
단계 5: 검토
입력한 정보가 이상이 없다면 “생성" 합니다.
보안 그룹 수정
HAProxy가 4000번 포트를 사용하므로, 보안그룹에서 TCP:4000을 추가합니다. (꼭 기존 보안 그룹을 사용하지 않고 새로 만들어도 됩니다. 전 그냥 귀찮아서 기존 보안 그룹에 4000번만 추가하겠습니다)
- https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2#SecurityGroups:sort=groupName 로 이동합니다.
- 보안 그룹 선택
- “인바운드" 탭 선택 → 편집
- TCP 4000 추가
ECS 작업 생성
이전 강좌를 참고하시어 작업을 생성해주세요.
작업 생성 시 주의점
- FARGATE용으로 만들어 주세요
- 새로 추가한 ECR 이미지를 사용해 주세요
- 컨테이너 추가 시 “포트 매핑"에 TCP:4000번 포트를 추가해 주세요
ECS 서비스 생성
- https://ap-northeast-2.console.aws.amazon.com/ecs/home?region=ap-northeast-2#/clusters 로 이동합니다.
- 기존에 생성한 클러스터(HelloCluster)를 선택합니다. 없다면 여길 참고하시어 만들어주세요.
- “생성" 클릭
단계 1: 서비스 구성
- FARGATE 를 선택합니다.
- 위에서 정의한 작업을 선택합니다.
- 서비스 이름을 정하여 입력합니다.
- 작업 개수는 필요한만큼 입력합니다. (일단 1)
단계 2: 네트워크 구성
- 이전 강좌에서 생성했던 VPC, 서브넷, 보안 그룹을 선택합니다.
- Network Load Balancer를 선택한 후 위에서 추가한 NLB를 선택합니다.
- 위에서 생성한 대상 그룹을 선택합니다.
단계 3: Auto Scaling
자동 확장이 필요하다면 이전 강좌를 참고하시어 설정하시길 바랍니다.
단계 4: 서비스 검토
입력한 모든 정보가 정확하다면 “서비스 생성" 클릭
로드 밸런서 연결 확인하기
추가한 로드 밸런서의 DNS 이름으로 두가지 연결을 확인합니다.
#1. HTTP Request 확인하기
브라우저에서 로드 밸런서의 DNS를 붙여넣고 확인해 봅니다.
“Hello Socket!” 이 나와야 합니다.
#2. Socket.io 연결 확인하기
- https://amritb.github.io/socketio-client-tool/#url=d3M6Ly9sb2NhbGhvc3Q6MzAwMA==&opt=&events=chat 접속합니다.
- “ws://[로드밸런서DNS]” 를 입력 후 Connect합니다.
- “Emitting” 탭으로 이동한 후 “chat” 이벤트를 입력합니다. 그리고 아래 data:plaintext에 메시지를 입력 후 “Emit” 해봅니다.
- 다시 “Listening” 탭으로 돌아온 후, “On “chat” Events” 을 보시면 서버가 echo 한 메시지를 확인 할 수 있습니다.
현재 TLS(HTTPS)가 아니므로 경고가 뜰 수 있습니다. 크롬의 경우 상단 URL 입력창에 경고 박스가 뜨는 걸 확인하면 접속이 가능합니다.
#2 가 확인되었다면 기본적인 socket.io 연동이 완료된 것입니다.
도메인 연동
이제 TLS(HTTPS) 접속이 가능하도록 도메인을 연결해 보겠습니다.
- https://console.aws.amazon.com/route53/home?region=ap-northeast-2#hosted-zones: 로 이동합니다.
- 전에 생성해 둔 도메인을 선택합니다.
- “Create Record Set”을 클릭합니다.
- Name에 원하는 서브 도메인을 입력합니다.
- Type은 “A — IPv4 address”를 선택합니다.
- Alias Target 은 위에서 추가한 NLB를 선택합니다.
- “Create”
이제 모든 연동이 끝났습니다!
브라우저에서 https://socket.hellonode.net로 접근 가능하며, wss://socket.hellonode.net 를 socket.io로 접근이 가능합니다!
이제 AWS Fargate와 socket.io를 활용하여 Auto Scaling 가능한 소켓 서버 Application을 만들 수 있습니다! 자동 확장되는 실시간 서버를 만들 수 있다고요!
혹시나 이 글을 AWS 관계자님이 보신다면 HAProxy나 Nginx을 사용하지 않고 socket.io 패킷 포워딩 처리를 로드 밸런서에서 처리되게끔 개발 해 주셨으면 좋겠네요 ㅎ
여러분은 socket.io 세팅하느라 개고생 안하시길 기도하며…그럼 이만…