상세 컨텐츠

본문 제목

AWS EC2 서버 만들기(#ubuntu #apache #flask)

컴퓨터

by 잘못된 선택 2022. 4. 3. 22:16

본문

일전에 AWS EC2 서버를 무료로 하나 만들어보는 실습을 진행하였다. (https://choice37.tistory.com/90)

이후 간단하게나마 내가 만든 웹 프로그램을 띄우는 서버를 완성해보고자 하였는데, 최근에 웹캠을 이용한 간단한 프로젝트들을 진행했기 때문에 웹사이트에서 웹캠의 정보를 띄워보는 간단한 사이트를 만들기로 하였다.

 

기존에 apache와 tomcat으로 구성된 서버를 만들어 보았는데 tomcat은 spring과 같은 자바 프레임워크를 동작시키기에 적합한것 같았다. 나는 주로 파이썬을 이용하였기 때문에 파이썬으로 이루어진 간단한 웹 프레임워크인 flask를 이용하는 것이 좋다고 생각했고, 따라서 필요없어진 tomcat을 제거하고 apache-flask로 구성된 웹 서버로 만들어주었다. 파이썬에서 웹서버(apache)와 flask를 통신할 수 있게 도와주는 WSGI(Web Server Gateway interface) 미들웨어를 사용하였다. 여러 사이트를 참고하여 apache의 conf 파일에 flask 정보를 입력해주는 방식으로 만들 수 있었다.

 

여기까지 완성하면 ip를 통해서 내가만든 사이트에 접속 가능하게 된다. 해당 사이트에 접속하면 내가 만든 html파일을 실행시키게 되고 여기에 웹캠 정보를 띄워보기로 하였다. 웹캠을 화면에 띄우기 위해서는 자바스크립트를 통해서 동작시키면 된다. 자바스크립트는 클라이언트쪽 컴퓨터에서 실행되기 때문에 빠르게 카메라 정보를 화면에 띄울 수 있었다. 다만 보안상의 이유로 클라이언트가 카메라 사용을 허가해주어야 하는데 이를 위해서는 ssl을 사용하여 https로 접속해 주어야한다. 나는 무료로 ssl 인증서를 받기 위해서 certbot을 사용하였다. 참고로 ssl를 사용하기 위해서는 도메인이 필요하다. freenom 사이트에서 무료로 도메인을 할당 받을 수 있었다. 내 이름으로된 suntaek.ml을 도메인 이름으로 사용하였고 여기까지 진행되면 suntaek.ml을 통해서 https로된 나의 사이트에 접속할 수 있게된다.

 

이후 웹사이트에서 얻어진 카메라 정보를 서버컴퓨터로 가져와서 서버측에 존재하는 인공지능 모델을 사용하여 의미있는 결과물을 도출하여 그 결과를 클라이언트에게 전송하고자 하였다. 이때 클라이언트와 서버측의 통신을 위해서 socketio 라이브러리를 사용하였다. (flask에서는 flask_socketio 라이브러리 사용) 개인적으로는 https://stackoverflow.com/questions/71642441/flask-live-stream-not-working-with-host-attribute 사이트를 참고하였고, 클라이언트쪽에서 일정 시간마다 서버측에 이미지 프레임 정보를 전달해주는 방식이다. 전송 주기를 너무 짧게해버리면 서버측에서 감당하지 못하여 서버가 멈추게 된다. 이러면 서버를 재시작시키고 새로 발급된 ip로 다시 연동해야하는 번거로움이 발생하게 된다. 따라서 클라이언트측 웹캠에서 얻는 모든 프레임을 전송하기는 무리가 되기 때문에 서버측에서 모든 프레임에 대한 실시간 처리는 불가능하게 된다.

 

실험결과 클라이언트의 카메라가 25프레임정도의 성능일때 10~13프레임정도의 주기로 전송했을때 서버가 터지지 않고 실행될 수 있었다. 이후 최근에 진행했던 딥페이크 프로젝트(https://choice37.tistory.com/91)를 사용해보고자 하였으나 무료 클라우드 서버 성능이 상당한 한계가 있다는 것을 알게 되었다. AWS EC2 스펙은 30gb ssd와 1gb 메모리를 갖고 있다. RAM 1G는 인공지능 모델을 실행시키기에는 너무 부족한 용량이다. 우선 비교적 간단한 용량으로도 실행 가능한 인공지능 API mediapipe를 사용하여 결과물을 출력해보는 것으로 진행하였다. 최종 결과는 아래 영상과 같다.

 

사이트의 가운데는 클라이언트측에서 실시간 웹캠 영상을 띄워주었고 왼쪽 아래는 해당 영상에서 face mesh를 검출한 결과를 보여주고 있다. mediapipe의 경우 javascript에서도 API로 사용가능하기 때문에 서버측으로 데이터를 보내지 않고 클라이언트측에서 실시간으로 인공지능 모델의 결과를 볼 수 있었다.

관련글 더보기

댓글 영역