※때에 따라서 소프트웨어 또는 프레임워크의 버전 및 인터페이스에 대해,
조회하시는 시간과 본 포스트 작성의 시간적 격차가 있는 경우
해당 설명과 상이한 부분이 있을 수 있습니다!
안녕하세요 ^^
저번시간까지 해서 EC2 인스턴스에 서비스 배포를 해보았습니다
이제 추가사항 몇 가지를 더 해보고 완전히 마무리해보도록 하겠습니다!
1.
$ nohup streamlit run app.py & 명령어를 통해
원격접속 터미널을 종료해도 백그라운드에서 계속 실행 중이도록 했었습니다
근데 이 배포 중인 서비스를 잠시 중단해야 한다면, 어떻게 해야할까요?
백 그라운드에서 계속 실행 중이라는 것은,
EC2라는 서버 컴퓨터 안에서 해당 작업의 프로세스가 생성되어 있다는 뜻이고,
프로세스 목록을 조회해보면 해당 프로세스 ID가 존재할겁니다
그럼 해당 프로세스를 종료시키면 응당 배포 중인 서비스가 중단이 되겠죠?
여러 개인 경우에는 특정 프로세스만 중단시켜 마찬가지로 특정 app만 배포를 멈출 수 있죠 ^^!
2.
또한, GitHub Repository로부터 Clone을 해와서 해당 소스코드 파일을 실행시켰었는데요
수정 사항이 생겨서 원격 Repo에 push를 할 때마다
사용자가 일일히 PuTTY 등으로 원격 접속을 해서
변경사항이 반영된 새 버전의 코드를 Repo로부터 EC2로 번번히 가져와야만 할까요?
GitHub Actions를 이용하면 CD(Continuous Deploy)가 가능합니다 ^^!
자, 이번 포스트에서는 위 두 가지 주제를 함께 살펴보도록 하겠습니다 ^^!!
먼저 PuTTY를 이용해서 EC2 인스턴스에 원격 접속 해주세요!
저번 시간에 $ nohup streamlit run app.py & 명령어를 통해,
터미널 종료와 상관없이 백그라운드에서 실행되게끔 했기 때문에 생성 되어 있는 프로세스가 있을겁니다
그럼 현재 생성되어 있는 프로세스가 뭐가 있는지 한 번 살펴볼까요?
$ ps -ef | grep streamlit 명령어로 검색해보겠습니다!
streamlit이라는 단어가 들어가 있는 프로세스를 검색해보니 process ID가 각각 26889, 26901 두 개가 나오네요!
첫 번째 프로세스가 바로 $ nohup streamlit run app.py & 명령어로 생성된 프로세스입니다
$ kill 프로세스ID 명령어를 이용해서 해당 프로세스를 종료시키겠습니다 ^^
그랬더니 해당 사이트에 접근할 수 없다면서 연결이 끊겼습니다!
EC2 서버에 백 그라운드 실행으로 서비스를 배포할 때는
$ nohup streamlit run 파일 이름 --server.port 포트번호 &
현재 생성된 프로세스를 조회할 때는
$ ps -ef | grep streamlit
해당 프로세스를 종료할 때는
$ kill 프로세스ID
명령어를 사용해주시면 되겠습니다 ^^!!
이제 GitHub Actions를 이용한 CI/CD 구축을 해보겠습니다!
먼저 .pem 형식의 키 페어가 필요한데요 ^^
우리 EC2 인스턴스를 생성할 때 키 페어를 발급 받았는데,
이 때 .pem 형식으로 발급 받고 PuTTYGen을 이용해 .ppk 파일 형식으로 변환해 사용했었죠?
다들 .pem 파일을 잘 저장해두셨을거라 생각합니다 ^^!
우리 저번 시간을 통해 GitHub Repository도 생성해뒀었죠?
해당 리포지토리로 이동해서 상단 메뉴 탭 중 Settings를 클릭해주세요 ^^!
그리고 좌측 사이드바를 보시면 여러 메뉴들 중에서
Secrets and variables → Actions를 클릭해서 해당 화면으로 이동해주세요 ^^
그럼 위와 같은 화면에 접근하실 수 있으실겁니다
여기서 3가지를 등록할건데요!
먼저 "New repository secret"을 클릭해주세요 ^^
1.
먼저, GitHub Actions 컴퓨터가 사용자 대신에 어디로 접근해야 하는지에 대한 정보가 필요한데요!
우리가 생성한 EC2 인스턴스의 퍼블릭 IPv4 주소를 입력해주시면 되겠습니다!
Name * 부분에는 여러분이 원하시는 임의의 문자열로 이름을 지정해주시고,
Secret * 부분에는 해당 IPv4 주소를 입력해주시고 "Add secret"을 클릭해서 등록해주세요!
2.
GitHub Actions 컴퓨터가 어디로 접근해야 하는지에 대한 정보를 줬다면,
해당 IP에 원격접속 할 수 있도록 키 값도 알려줘야겠죠?
여러분들이 발급 받은 .pem 형식의 키 파일이 있을겁니다
이 파일을 메모장으로 열람하셔서 그 안에 기록된 문자열들을 싹 복사해서 붙여넣기 해주시면 되겠습니다!
마찬가지로 "Add secret"을 클릭해서 등록을 마무리해주세요 ^^!!
※ 참고※
-----BEGIN RSA PRIVATE KEY-----
~ 문자열 ~
-----END RSA PRIVATE KEY-----
메모장으로 .pem 파일을 열람하시면 위와 같은 형식으로 되어 있을텐데요
BEGIN부분 부터 END부분까지 모두 복사해서 넣어주셔야 합니다!
그 사이의 문자열 부분만 secret value 값으로 넣어주시면 Actions workflow 중 SSH 접속 단계에서 오류가 생깁니다 ^^!
3.
우리가 EC2 인스턴스에 접속할 때 터미널 창이 나오면 가장 먼저 "login as"라면서
어떤 유저인지에 대해서 묻는 단계가 있었습니다
여기서 우리가 ec2-user라고 입력을 했었죠?
마찬가지입니다 이 부분에서도 Name * 부분은 여러분 임의로, Secret * 부분은 ec2-user로 입력해주시고
"Add scret"을 클릭해서 등록을 마무리해주세요 ^^!!
자, 준비 작업이 끝났습니다 ^^
이제 상단 메뉴탭에서 Actions를 눌러서 해당 화면으로 이동해주세요!
여기서 "Get started with GitHub Actions" 글자 밑에 조그마하게 있는
"set up a workflow yourself" 부분을 클릭해주세요 ^^!
여기 .yml파일에
특정 이벤트 발생시에 어떤 동작을 수행하게 할건지 명령어를 기입하면 되겠습니다!
위 이미지와 같이 코드를 입력해주시면 되겠습니다 ^^!
main 브랜치에 push 이벤트가 생기면 그 이하의 작업을 수행하되,
①먼저 EC2 인스턴스로 원격 접속(SSH)하고
②해당 디렉토리로 경로를 이동해서
③git pull을 받으라는 흐름이 되겠습니다 ^^!
코드 하단의 scripts 부분에서 cd(chane directory) 명령어가 있는데
그 이하의 경로는 여러분이 Clone 받으신 Local 리파지토리 디렉토리의 이름으로 지정해주시면 되겠습니다 ^^!
Actions workflow 목록에서 해당 run이 생긴 것을 볼 수가 있겠습니다!
저는 동작이 완료된 후에 캡쳐한 거라서 이미 완료 표시가 되어 있는데,
등록하자마자 해당 메뉴로 이동하시면 노란색으로 동작중일겁니다 ^^
SSH 프로토콜을 이용한 원격 접속 작업이 완료 되었다고 표시되는 것을 보니 새삼 기쁘네요 ^^
위와 같이 로그가 찍히는데 여러 메세지들 중
"Successfully executed commands to all host."라는 메세지가 출력 되어 있는 것을 볼 수 있겠습니다 ^^
자, 이제 소스코드를 작업하시고 해당 원격 리포지토리에 push 하시면
이제는 EC2 인스턴스로 접속해서 또 git pull 받거나 하는 번거로운 작업이 필요 없어졌습니다!
Actions의 workflow를 통해서 알아서 git pull을 받을테니까요!
근데 여기서 중요한게 있습니다
프로세스가 계속 동작 중이고, 해당 프로세스는 새로운 git pull 이전의 데이터를 바탕으로 실행되고 있는데
새로운 git pull 때마다 streamlit run 관련 명령어가 새로운 데이터를 반영하게 하려면 어떻게 해야할까요?
$ nohup streamlit run 파일이름 --server.port 포트넘버 --server.runOnSave true &
명령어를 사용해주시면 되겠습니다 ^^!
nohup은 no hang up 곧, 백 그라운드에서 실행하라는 뜻이고
--server.port 포트넘버는 해당 포트로 연결,
--server.runOnSave true는 git pull을 통해 데이터가 갱신 되었을 때 해당 데이터를 반영하는 뜻이 되겠습니다 ^^!!
이렇게 해서 "AWS EC2 인스턴스를 이용한 streamlit 앱 배포+CI/CD 구축"의 대장정을 마치겠습니다
설정들도 복잡하고 단계들도 참 많아서 여러가지로 어렵게 느껴졌을 수도 있는데요
그래도 수많은 난관을 뚫고 성공적으로 서버에 배포되었을 때의 짜릿함은 늘 새롭고 행복하다고 생각합니다 ^^
소스코드 개발도 언제나 즐겁지만,
그래도 수많은 난관을 뚫고 그 개발의 결과물이 성공적으로 서버에 배포 되는
순간의 짜릿함은 늘 새롭고 행복하다고 생각합니다 ^^
특히나 참 저는 즐겁습니다 ^^..!!
드넓은 개발의 세계를 항해하는 모든 분들 건승하시고 행복하시기 바랍니다!
포스트 마치겠습니다
읽어주셔서 감사합니다 ^^!
'AWS > EC2를 이용한 Streamlit 배포' 카테고리의 다른 글
[Streamlit 앱 서비스 배포] 4. AWS EC2 스트림릿 서비스 배포하기 (0) | 2024.07.07 |
---|---|
[Streamlit 앱 서비스 배포] 3-2. AWS EC2 인스턴스 서버 환경 구성하기(2)Git 설치와 GitHub Repository에서 Clone하기 (0) | 2024.07.07 |
[Streamlit 앱 서비스 배포] 3-1. AWS EC2 인스턴스 서버 환경 구성하기(1) Anaconda 설치 및 실행 (0) | 2024.07.07 |
[Streamlit 앱 서비스 배포] 2. AWS EC2 인스턴스 접속하기 (0) | 2024.07.07 |
[Streamlit 앱 서비스 배포] 1. AWS EC2 인스턴스 생성하기 (0) | 2024.07.06 |