AWS Fargate 에서 Socket.io 사용하기

Jake Yang
9 min readMar 4, 2019

--

안녕하세요, 트남 Jake 입니다.

이전 강좌에서 AWS Fargate+Docker를 사용하여 HTTPS Web Application을 구성해 보았습니다.

Stateless/Restful 한 처리와 다르게 실시간성이 중요하거나 Server → Client 로 Push가 필요한 경우 WebSocket 또는 Socket.io 를 사용하는데요, 안타깝게도 AWS 에서 이걸 그냥 제공해 주질 않습니다 ㅠㅜ.

이번 강좌에서는 Socket.io를 Fargate에서 사용하는 법을 배워보겠습니다. 이번 강좌에서 진행될 내용은 다음과 같습니다.

  1. [이론] HAProxy란?
  2. [이론] 샘플 프로젝트 리뷰
  3. [실습] Socket.io 프로젝트 도커 이미지화 & ECR에 업로드
  4. [실습] NLB(Network Load Balancer) 생성
  5. [실습] 보안 그룹 수정
  6. [실습] ECS 작업 생성
  7. [실습] ECS 서비스 생성
  8. [실습] 도메인 연동

VPC와 ECS 클러스터 세팅은 생략하겠습니다. 생성 방법은 이전 강좌를 참고하시길 바랍니다.

HAProxy란?

http://www.haproxy.org

원래는 소프트웨어 레벨 로드밸런싱에 많이 사용하는 오픈소스 입니다만, 우린 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에 업로드

위 강좌를 참고하여 샘플 프로젝트(sample-hello-socket)의 이미지를 업로드 합니다. (저는 ECR 레포지토리명을 “sample-hello-socket” 로 하였습니다)

NLB(Network Load Balancer) 생성

  1. https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2#LoadBalancers:sort=loadBalancerName 로 이동합니다.
  2. “로드 밸런서 생성" 클릭
  3. “로드 밸런서 유형 선택” 에서 Network Load Balancer (TCP/TLS) 생성

단계 1: 로드 밸런서 구성

  • 로드 밸런서의 이름을 정하여 입력합니다.
  • 외부 접속이 필요하므로 “인터넷 연결"을 선택합니다.
  • TCP:80, TLS:443을 입력합니다. TCP:80은 HTTP, TLS:443은 HTTPS 통신을 처리할 것입니다. (아직 도메인과 인증서 발급이 안된분은 강좌를 참고하시기 바랍니다)
  • 이전 강좌에서 생성한 VPC와 서브넷을 선택합니다.

단계 2: 보안 설정 구성

“ACM에서 인증서 선택" 을 선택 후 이전에 생성한 인증서를 선택합니다.

단계 3: 라우팅 구성

  • 사용할 라우팅 이름을 정하여 입력합니다.
  • 대상 유형은 IP를 선택합니다.
  • HAProxy에서 4000포트로 받고 있으므로, TCP 프로토콜과 4000 포트를 입력합니다.
  • 우리의 Application은 “/”으로 접근 시 “Hello Socket!”을 전송해 줍니다. 이걸 상태 검사로 사용하도록 하겠습니다.

단계 4: 대상 등록

아직 등록할 대상(인스턴스)가 없으므로 넘어갑니다.

단계 5: 검토

입력한 정보가 이상이 없다면 “생성" 합니다.

보안 그룹 수정

HAProxy가 4000번 포트를 사용하므로, 보안그룹에서 TCP:4000을 추가합니다. (꼭 기존 보안 그룹을 사용하지 않고 새로 만들어도 됩니다. 전 그냥 귀찮아서 기존 보안 그룹에 4000번만 추가하겠습니다)

  1. https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2#SecurityGroups:sort=groupName 로 이동합니다.
  2. 보안 그룹 선택
  3. “인바운드" 탭 선택 → 편집
  4. TCP 4000 추가

ECS 작업 생성

이전 강좌를 참고하시어 작업을 생성해주세요.

작업 생성 시 주의점

  • FARGATE용으로 만들어 주세요
  • 새로 추가한 ECR 이미지를 사용해 주세요
  • 컨테이너 추가 시 “포트 매핑"에 TCP:4000번 포트를 추가해 주세요

ECS 서비스 생성

  1. https://ap-northeast-2.console.aws.amazon.com/ecs/home?region=ap-northeast-2#/clusters 로 이동합니다.
  2. 기존에 생성한 클러스터(HelloCluster)를 선택합니다. 없다면 여길 참고하시어 만들어주세요.
  3. “생성" 클릭

단계 1: 서비스 구성

  • FARGATE 를 선택합니다.
  • 위에서 정의한 작업을 선택합니다.
  • 서비스 이름을 정하여 입력합니다.
  • 작업 개수는 필요한만큼 입력합니다. (일단 1)

단계 2: 네트워크 구성

  • 이전 강좌에서 생성했던 VPC, 서브넷, 보안 그룹을 선택합니다.
  • Network Load Balancer를 선택한 후 위에서 추가한 NLB를 선택합니다.
  • 위에서 생성한 대상 그룹을 선택합니다.

단계 3: Auto Scaling

자동 확장이 필요하다면 이전 강좌를 참고하시어 설정하시길 바랍니다.

단계 4: 서비스 검토

입력한 모든 정보가 정확하다면 “서비스 생성" 클릭

로드 밸런서 연결 확인하기

추가한 로드 밸런서의 DNS 이름으로 두가지 연결을 확인합니다.

#1. HTTP Request 확인하기

브라우저에서 로드 밸런서의 DNS를 붙여넣고 확인해 봅니다.

“Hello Socket!” 이 나와야 합니다.

#2. Socket.io 연결 확인하기

  1. https://amritb.github.io/socketio-client-tool/#url=d3M6Ly9sb2NhbGhvc3Q6MzAwMA==&opt=&events=chat 접속합니다.
  2. “ws://[로드밸런서DNS]” 를 입력 후 Connect합니다.
  3. “Emitting” 탭으로 이동한 후 “chat” 이벤트를 입력합니다. 그리고 아래 data:plaintext에 메시지를 입력 후 “Emit” 해봅니다.
  4. 다시 “Listening” 탭으로 돌아온 후, “On “chat” Events” 을 보시면 서버가 echo 한 메시지를 확인 할 수 있습니다.

현재 TLS(HTTPS)가 아니므로 경고가 뜰 수 있습니다. 크롬의 경우 상단 URL 입력창에 경고 박스가 뜨는 걸 확인하면 접속이 가능합니다.

#2 가 확인되었다면 기본적인 socket.io 연동이 완료된 것입니다.

도메인 연동

이제 TLS(HTTPS) 접속이 가능하도록 도메인을 연결해 보겠습니다.

  1. https://console.aws.amazon.com/route53/home?region=ap-northeast-2#hosted-zones: 로 이동합니다.
  2. 전에 생성해 둔 도메인을 선택합니다.
  3. “Create Record Set”을 클릭합니다.
  4. Name에 원하는 서브 도메인을 입력합니다.
  5. Type은 “A — IPv4 address”를 선택합니다.
  6. Alias Target 은 위에서 추가한 NLB를 선택합니다.
  7. “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 세팅하느라 개고생 안하시길 기도하며…그럼 이만…

--

--