본문 바로가기
AWS/EC2를 이용한 Streamlit 배포

[Streamlit 앱 서비스 배포] 4. AWS EC2 스트림릿 서비스 배포하기

by Fletcher 2024. 7. 7.

※때에 따라서 소프트웨어 또는 프레임워크의 버전 및 인터페이스에 대해,

조회하시는 시간과 본 포스트 작성의 시간적 격차가 있는 경우

해당 설명과 상이한 부분이 있을 수 있습니다!

 

 

 

안녕하세요 ^^

저번시간까지 해서 EC2 인스턴스에 서비스 배포를 위한 준비를 마쳤습니다!

Anaconda 설치, 가상환경 생성, Git 설치, GitHub 원격 리포지토리 Clone까지 했었죠

서버 환경 구축과 소스 코드 준비가 완료되었습니다

그럼 이제 streamlit 앱을 배포해볼까요?

 

근데 잠깐!

지금 streamlit 앱을 배포해도 해당 주소로 접근할 수는 없을겁니다

왜냐하면 보안 그룹 설정을 하나 해줘야하거든요 ^^!

$ streamlit run 파일이름 명령어를 실행하면 default로 8501번 포트로

접근하기 때문에 보안 그룹 중 인바운드 규칙 하나를 추가로 설정해주겠습니다!

 

 

 

 

일단 AWS 로그인 후 Console을 통해 EC2 대시보드 화면으로 접근해주세요 ^^!

 

 

 

 

인스턴스 목록에서 기존에 생성해두었던 인스턴스 ID를 클릭해서 세부 정보 화면으로 넘어가겠습니다 ^^

 

 

 

 

세부정보 화면 하단의 메뉴 탭에서 "보안"을 선택해주시고

"보안 그룹" 아래에 기재되어 있는 해당 보안그룹 이름의 링크를 클릭해주세요!

저 같은 경우에는 streamlit_server라는 이름의 보안 그룹을 생성해 지정해뒀었습니다 ^^

 

 

 

 

그럼 해당 보안 그룹의 정보를 볼 수 있는데요

기존에 추가되어 있는 규칙을 보니 PuTTY를 이용해 SSH 원격 접속을 하기 위해서

22번 포트를 열어놨었던 것이 보입니다!

여기서 인바운드 규칙을 하나 더 추가해주도록 하겠습니다 ^^

화면 우측 하단쯤의 "인바운드 규칙 편집"을 눌러주세요!

 

 

 

 

화면 왼쪽 하단쯤의 "규칙 추가"를 눌러주세요!

 

 

 

 

사용자 지정 TCP에 포트 번호는 8501로 설정해주시고,

접근할 수 있는 소스는 모든 주소(0.0.0.0/0)로 해주시고

화면 우측 하단의 "규칙 저장"을 눌러주세요 ^^!

 

 

 

 

성공적으로 인바운드 규칙이 추가되었습니다!

준비가 끝났으니 이제 PuTTY를 이용해서 EC2 인스턴스에 원격 접속을 해볼까요 ^^?

 

 

 

 

먼저 체크해주셔야 할 부분은, 가상 환경이 작동중인지 확인하는 것입니다!

현재 경로 왼쪽에 저는 (streamlit310)이라고 표시되어 있는데요!

저는 이 가상환경에 python 및 여러 데이터 분석에 관련된 라이브러리, streamlit 프레임워크를 설치했기 때문에

해당 가상환경이 activate 되어 있지 않으면 명령어가 온전히 작동하지 못 할겁니다!

 

가상환경 동작 점검이 확인 되었다면 $ streamlit run app.py 명령어를 실행해주세요!

저는 app.py라는 이름의 파일 안에 streamlit 앱과 관련된 소스코드를 만들어놨었습니다

 

그리고 명령어가 잘 실행되면 세 가지의 IP Address가 나오는데

마지막 세 번째에 표시된 주소가 바로 이 EC2 인스턴스의 퍼블릭 IPv4 주소입니다!

보시는 바와 같이 8501번 포트가 default로 설정되어 있죠?

해당 주소를 웹 브라우저의 주소창에 입력해서 접근해보겠습니다 ^^!

 

 

 

 

웹 브라우저 창에 해당 주소를 입력하니 정상적으로 streamlit 앱에 접근하는 모습을 볼 수 있겠습니다!

아무리 Local에서 잘 돌아갔더라도 서버에 배포했을 때에

어떤 오류나 버그가 발생할지 몰라서 늘 조마조마한 마음이 있는데요 ^^;;

하나하나 단계를 거쳐가서 최종적으로 성공적인 배포를 맛 봤을 때 감정은 매번 정말 즐겁고 기쁩니다 ^^!!

 

 

 

 

혹시나 싶어서 자주 마주할 수 있는 실수에 대해서 말씀드릴게요!

혹시 해당 파일을 찾을 수 없다고 나오면, 꼭 현재 경로를 점검해주세요!

저도 실수로 상위 경로에서 app.py를 실행시켜서 오류 메세지가 출력 되었는데요!

저는 GitHub Repository에서 Clone 해 올 때 /home/ec2-user@~/streamlit-test-server 경로로 디렉토리가 생성되었습니다

해당 디렉토리에 접근해있어야 app.py를 run 할 수 있었던거죠 ^^!

 

 

 

자, 근데 여기서 중요한게 있습니다

지금 배포 방법에 맹점이 있는데요!

바로, 터미널 창을 종료하면 서비스 배포 또한 중단 된다는 것입니다

원격 접속 중에만 서비스가 배포될 수 있다면, 참 허술한 서비스겠죠 ^^?

 

 

 

 

앞전 방법의 $ streamlit run app.py가 아니라,

$ nohup streamlit run app.py & 명령어를 입력해주면 터미널 창을 종료해도

백그라운드에서 계속 run 상태이기 때문에 서비스 배포를 멈추지 않게 할 수 있습니다 ^^!

 

이제는 해당 process를 kill 하거나 또는 해당 EC2 인스턴스를 삭제하지 않는 이상,

계속 정상 배포 중이므로 언제 어디서든 해당 IP 주소와 포트 번호를 이용해 해당 서비스로 접근할 수 있습니다 ^^!!

 

 

 

※ 참고※

여기에 더불어서 하나의 EC2 서버에 포트 번호를 다르게 지정해 여러 streamlit 앱을 배포할 수 있는데요!

$ streamlit run 파일이름 --server.port 8501
$ streamlit run 파일이름 --server.port 8502

$ streamlit run 파일이름 --server.port 8503

등으로 기존 명령어 뒤에 --server.port 포트번호 형식을 추가해주시면 되겠습니다 ^^!

 

이 명령어 또한도 터미널 종료와 상관 없이 백 그라운드에서 계속 구동하게 하려면

$ nohup streamlit run 파일이름 --server.port 포트번호

형식으로 명령어를 실행시키면 되겠죠 ^^?

 

 

 

 

 

이렇게 EC2 인스턴스를 생성해 원격 접속을 통해 서버 환경을 구축하고

성공적으로 streamlit 앱을 배포했습니다!

다음 포스트에서는 서비스 배포와 관련해서 추가적인 사항 몇 가지를 더 말씀드리고 마치겠습니다 ^^!

읽어주셔서 감사드리고 다음 포스트에서 뵙겠습니다!