📘 병원 예약, 챗봇 서비스(HeyDoctor)

한국공학대학교 Graduation Project이다. AI 챗봇을 이용한 건강 자가진단 및 주변 병원 온라인 예약 서비스인데, AI챗봇서버는 Docker을 활용하여 Flask서버이고, 카카오톡 디벨로퍼를 사용하 카카오톡에서 요청이오면 챗봇 서버로 요청이 가게 설계했다. 그리고 자기 자신 주변 병원 위치나 운영시간 등등을 알수있는 웹사이트 하나 만들었다.

이 프로젝트에서는 인프라쪽을 대부분을 맡아서 진행하였다.

CICD나 HTTPS같은 기본 개념적인거를 정리하기 보다 내가 인프라를 설계하면서 얻은 이점같은것들을 정리해보자

NGINX을 이용

사용자의 접속은 HTTPS 프로토콜로 전달되어 NGINX 서버에서 처리되는데, NGINX는 정적 요청의 경우 미리 빌드된 프론트엔드 페이지를 응답하며, 동적 요청의 경우 Django로 전달하기 때문에 부하 분산에 용이다. 아무래도 3명이서 하는 프로젝트다 보니 배포 역할을 한명이 담당해야 했는데 그러다보니 단일 서버만 이용할수밖에없었다. 그래서 nginx을 이용하여 단일서버에 프론트 백 데이터베이스까지 docker compose를 이용하여 비용을 감소하였다. 하지만 이러한 방법은 안좋을수 있다. 확장성이 제약될수있고, 프론트 백이 격리되지 않아 문제가 발생하면 다른 구성에 영향을 미칠 수 있다.

Docker compose 를 이용하여 데이터베이스 비용 감소

위에 docker compose를 이용하여 비용을 감소했다해서 의아했을것이다.

데이터베이스(MYSQL)도 docker compose 를 이용하여 따로 RDS를 이용하지 않고 데이터 베이스를 사용하였다 .

Docker Compose를 사용하여 MySQL 데이터베이스 컨테이너를 관리하면 AWS의 RDS(관계형 데이터베이스 서비스)와 같은 다른 호스팅 솔루션에 비해 잠재적인 비용 절감이나 EC2(Elastic Compute Cloud) 인스턴스에서 전용 MySQL 인스턴스를 관리하는 등 다양한 이점을 제공할 수 있다.

비용적인 측면에서는 nginx와 docker compose를 이용한 데이터베이스의 비용이 감소된다.

내가 한 Graduation Project는 비용감소가 될수도있다. 예를 들어서 RDS사용,frontend를 따로 서버에 올려서 s3를 사용할경우 비용이 들것이고, backend서버도 사용하니까 비용이 들것이다.

하지만 이 비용적인 부분이 엄청난 차이를 내는 것은 아니다.

궁금해서 계산해보았다. aws 1년무료가 없다고 가정하였을때, 서버 2개와 rds1개 사용 리소스가 그렇게 작은것이 아니라고 가정했을때 한달에 약 100원정도가 든다.

그러면 이렇게 Docker compose를 이용하여 비용적인 부분에서 감소가 되긴하는데 이점 까지는 아닌거 같다.

과연 실전에서 특히 회사에서는 이렇게 단일 서버를 이용할까?

실전에서의 Docker compose

예전에 큐시즘이라는 동아리를 하였었다. 그때 Prometheus 와 Grafana 를 docker compose 로 백엔드 서버에 같이 올리게 된적이 있었다. 그때 현직 개발자가 우리것을 평가하였는데 그때 이것에 대해 물어봤었다. 그렇게 한 이유가 있냐고,

Prometheus와 Grafana 모두 상당한 리소스를 소비할 수 있다. 특히 Prometheus에서 스크랩하는 측정항목이 많거나 Grafana에서 대량의 데이터 시각화를 처리하는 경우 더욱 그렇다. 동일한 서버에서 실행하면 리소스 경합이 발생하고 두 응용 프로그램의 성능에 영향을 미칠 수 있다. 트래픽이 많거나 모니터링할 지표가 많은 프로덕션 환경에서는 Prometheus와 Grafana를 별도의 서버나 별도의 클러스터에 배포하는 것이 더 바람직할 수 있다. 동일한 서버에서 Prometheus와 Grafana를 모두 실행하면 초기 설정이 단순화될 수 있지만 유지 관리 및 업그레이드가 복잡해질 수 있다. 한 구성 요소에 업데이트나 변경이 필요한 경우 실수로 다른 구성 요소에 영향을 미쳐 호환성 문제가 발생할 수 있다.

확실히 단일서버에 올리면 유지보수 업그레이드, 격리 확장성등이 단점이 될순 있다.

Docker compose의 이점

Prometheus와 Grafa는 확실히 둘다 상당한 리소스를 소비하기 때문에 백엔드 서버와 같이 Dockercompose해서 올리면 성능에 영향을 미칠 수 있다. 하지만 다른 관점에서 지켜볼 필요가 있다. 이러한 단점들을 커버할만한 이점이 있어서 쓰는것 아니겠나! 맨 처음 작성한 학교 졸업작품에서 적용해보자.

프론트 앤드에 nginx가 있고 요청이 들어오면 flask서버로 라우팅한다 flask서버가 호출되면 데이터베이스를 호출한다. dockercompose를 사용한다면 단일 서비스가 아닌 이 모든 서비스를 관리 할 수 있게 된다. 만약 다른 애플리케이션 서버와 작업이 필요하고 수동으로 관리하는 경우 훨씬 더 많은 컨테이너가 필요할 것이다. 단일로 관리하게 될 경우 매우 효율적이지 않고 매우 생산적이지 않을 수 있다

dockercompose에는 docker-compose.yaml파일이 있으며 이 파일에서 이러한 모든 서비스간의 관계를 정의할 수 있다. 그리고 브리지 네트워크와 같은 설정도 docker-compose에서 모두 설정이 가능하다.

그리고 데이터베이스와 플라스크를 연결하기 위해 네트워크를 만들고 실행시키기 위해 일련의 커맨드를 순차로 입력할 필요가 없고 yaml파일로 정의함으로 관리하게 해 줍니다.

그리고 로그출력을 포함하여 실행중인 모든 서비스의 상태를 볼수 있고 각각의 컨테이너의 로그를 들어가서 확인할 수 있다.

또한 도커 컴포즈는 다양한 환경에서 동일한 YAML 파일을 사용할 수 있으며, 이식성이 높다.

컨테이너의 구성을 YAML 파일로 관리하면 버전 관리 시스템을 통해 변경 이력을 추적할 수 있다.

SSL

SSL(Secure Sockets Layer) 인증서는 웹 사이트와 사용자 간의 통신을 암호화하여 보안을 강화하는 데 사용된다. 일반적으로 웹 브라우저와 웹 서버 간의 통신에서 사용된다.

SSL 인증서에는 공개키 암호화 기술이 사용된다. 이러한 인증서는 공개키 및 개인키의 쌍으로 구성되어 있다. 공개키는 웹 서버에 저장되며 웹 브라우저로 전송된다. 웹 브라우저는 이 공개키를 사용하여 데이터를 암호화한다. 그리고 이 암호화된 데이터는 웹 서버에 전송된다. 웹 서버는 개인키를 사용하여 이 데이터를 해독한다.

SSL 인증서는 인증 기관(Certificate Authority)에 의해 발급된다. 이러한 기관은 신뢰할 수 있는 기관으로서 웹 사이트가 실제로 그들이 주장하는 것과 동일한 것임을 확인한다. 이러한 신뢰할 수 있는 인증 기관에 의해 발급된 SSL 인증서는 웹 브라우저에 내장되어 있으므로, 사용자가 SSL 보호된 웹 사이트에 접속할 때 브라우저는 해당 사이트의 SSL 인증서를 확인하고 신뢰할 수 있는지 확인한다.

요약하면, SSL 인증서는 웹 사이트와 사용자 간의 통신을 암호화하여 보안을 강화하고, 인증 기관에 의해 발급되어 해당 웹 사이트의 신뢰성을 보장한다.

SSH

쉘은 CLI 환경을 떠올리면 되겠다. 기존 원격 접속은 텔넷(Telnet)이라는 방식을 사용했는데, 암호화를 제공하지 않기 때문에 보안상 취약했다. 누구나 쉽게 원격 접속 과정에서 옮겨지는 비밀번호나 파일 내용 등의 데이터를 탈취할 수 있었다고 한다.

그래서 등장한 것이 SSH 프로토콜이다. 현재는 클라우드 서비스에서 제공하는 서버는 기본적으로 원격 접속을 해서 접근하고 사용한다.

주로 원격 서버에 안전하게 접속하고 데이터를 전송하기 위해 사용된다. SSH는 터미널 세션을 보안하고 파일 전송을 위한 프로토콜인 SCP(Secure Copy) 및 SFTP(Secure File Transfer Protocol)와 함께 사용된다.

SSH vs SSL

SSH(Secure Shell)는 원격 서버에 안전하게 접속하고 데이터를 전송하기 위한 프로토콜로, 주로 시스템 관리 및 파일 전송 작업에 사용된다. SSH는 네트워크 계층의 프로토콜로 TCP/IP 위에서 작동하며, 사용자 인증, 데이터 암호화 및 무결성 보호를 제공하여 안전한 원격 접속을 보장합니다. 또한 SCP(Secure Copy) 및 SFTP(Secure File Transfer Protocol)와 함께 사용되어 파일 전송에도 안전한 환경을 제공한다.

SSL(Secure Sockets Layer)은 주로 웹 브라우저와 웹 서버 간의 보안 통신을 제공하기 위한 프로토콜로, HTTPS를 통해 웹 사이트의 보안을 강화하는 데 사용된다. SSL은 응용 계층의 프로토콜로 TCP/IP 위에서 작동하며, 데이터의 기밀성, 무결성 및 인증을 제공하여 웹 사용자의 개인 정보와 데이터를 안전하게 전송한다.

따라서 SSH는 주로 원격 서버에 안전한 접속 및 데이터 전송을 위해 사용되는 반면, SSL은 주로 웹 브라우저와 웹 서버 간의 안전한 통신을 제공하기 위해 사용된다.

태그:

카테고리:

업데이트: