Search

AWS에서 Backend 와 TCP Server 연동 연구

카테고리
Back-end
태그
Python
AWS
게시일
2024/02/07
수정일
2024/06/28 09:35
시리즈
AWS-Study
1 more property

1. Intro

AWS에 릴리즈 돼 있던 Backend 서버에서 Provider에서 보내주는 TCP Raw 데이터를 받아 처리해야 하는 이슈가 있었습니다. 해당 이슈에 대응하기 위하여 TCP 서버 코드를 개발하고 다음과 이슈를 해결한 방법을 공유해보고자 글을 작성하였습니다.

Requirements

Provider는 특정 IP/PORT를 향해 TCP Raw 데이터를 2초의 Interval 간격으로 송신함
TCP 데이터는 매일 09:00~18:00 시간에 송신하며, TCP 통신이 불규칙하게 연결/해제될 수 있음
기존 Backend의 특정 API를 요청하면 TCP Raw 데이터를 응답해야 함

Notes

통신 과정에서 TCP 데이터가 불규칙하게 연결/해제되는 이슈를 대비해야 함
Backend 서버로 Request 요청에 맞추어 실시간으로 데이터를 반환해야 함
TCP 소켓 통신 보안 이슈를 최소화 함

2. Infrastructures of each server

기존 Backend 서버와 TCP Server를 위한 전체적인 인프라는 다음과 같이 구성하였습니다. 설명을 위해 필요한 부분만 간소화하여 작성하였습니다. 아래의 구조도를 보면 API 통신을 하기 위한 URL과 TCP 데이터를 조회하기 위한 URL이 구분돼 있습니다.

TCP Server

TCP 데이터를 받기 위한 서버는 별도로 구분하고자 하였습니다. 때문에 별도로 EC2 서버를 구동하고, 서버 구성은 다음과 같습니다. EC2 서버 내에는 모두 Dockerize 돼 있는 서비스가 구동되도록 하였습니다. TCP 서버는 Python 스크립트로 구동되며, TCP 데이터를 저장하는 파일을 외부에서 접근 가능하도록 Nginx를 도커로 구동하였습니다. Python 스크립트는 Docker 볼륨과 연결된 디렉토리의 파일을 생성/수정할 수 있도록 구성해두었습니다.
전체 구조도에서 https://tcp.example.com/path/*.json 으로 외부에서 접근이 가능한 링크로 두게 되면, 언제든 TCP 서버가 적절히 데이터를 반영하고 있는지 확인이 가능합니다. 또한 아래의 Backend Server 통신 방식을 적용하기에 용이하였습니다.

Backend Server

기존 Backend 서버는 Route53 + ACM + ALB(with EC2)를 이용하여 서비스되도록 하였으며, 로깅을 위해 CloudWatch를 연동하고, Database로 AWS Aurora MySQL(Serverless V2)를 이용하였습니다. 해당 인프라 구조에서 보안 이슈를 최소화 하기 위해서는 TCP Server를 가능한 분리하는 것이 좋을 것이라 판단되었습니다. 특히, Database와의 연결과 (구조도에는 없지만) ElastiCache와 연동되지 않는 방법을 고민하였습니다.
따라서 아래와 같은 구조로 Backend 서버에서 TCP 서버로 데이터를 요청하여 고객의 요청에 응답할 수 있도록 하였습니다. 통신 과정을 설명하기 위해 구조도를 간소화 하였습니다.
1.
고객은 (예시)https://api.example.com/tcp-data API 요청
2.
Backend Server는 (예시)https://tcp.example.com/path/some.json 경로로 JSON 데이터 요청
3.
TCP Server의 Nginx는 요청을 받아 json 데이터를 응답함
a.
이때 Nginx는 현재(읽는 시점)의 json 파일 데이터를 읽어 반환함
4.
Backend Server는 JSON 데이터를 파싱하여 고객에게 응답함

Conclusion

기존 Backend에 특정 주기 동안 실시간으로 날아오는 데이터를 API 요청 시 반환해야 하는 독특한 요구사항을 경험해보았습니다. 위와 같은 방법이 정답이라고 할 수는 없겠지만, 빠르게 서버를 연결하기에 적절한 방법이라 판단되었습니다. 위와 같이 코드 작업과 병행하여 인프라를 구성하는 기간은 대략 3일 소요되었습니다. TCP 서버/클라이언트 코드는 아래의 링크를 참고해주시며 감사하겠습니다.