* 시작 전에: EC2 무료사용의 경우 한달 750시간인데, 이는 EC2 전체 사용시간을 통틀어 한달 750시간 이내라는 것 입니다. 즉 EC2를 두대를 켜놓게 되면 하루에 48시간 사용하는 것과 같은 효과라 한대치는 유료로 사용하는 것이 됩니다. 이걸 이번달에 돈내면서 알게 되었으니 다들 저같이 피같은 돈을 쓰시지 않으시기를 바랍니다... 저희는 온전히 무료로 서버를 이용하는게 목적이니까요... 흑흑..

 

사실 이전까지의 모든 것으로 python을 사용할 수 있는 한대의 컴퓨터가 더 생긴 것은 맞지만, 보안을 위해서 ssh 접속으로 설정해 놓았기 때문에 정말 아무런 컴퓨터 혹은 아무런 디바이스에서나 막 접속할 수는 없습니다.

 

이를 위해서 8888번 포트를 미리 개방해 놓았는데요, 오늘은 이 포트를 가지고 어디에서나 접속할 수 있는 주피터 노트북 서버를 만들어 보도록 하겠습니다.

 

현재 아나콘다를 설치하여 주피터 노트북은 설치가 이미 되어있는 상태입니다.

그리고 현재 버전의 아나콘다(정확히는 주피터 노트북 5버전 이상)를 사용중이시면 주피터 노트북에서 비밀번호 설정이 매우 쉽습니다.(중요) 나중에 차근히 알려드리겠습니다.

 

그리고 자신하건데 주피터 노트북 서버를 만드는데 지금 이 포스팅보다 더 간단한 방법은 없다고 자부할 수 있습니다.

 

1) 먼저 설정에 필요한 정보들을 모아야 합니다.

      1] AWS에 접속하여 대시보드에서 EC2를 검색합니다. (혹은 최근에 이 항목을 쓰셨다면 대시보드 검색창 아래에 EC2가 있을 것입니다.)

      2] EC2 대시보드에서 좌측의 '인스턴스'를 클릭합니다.

      3] 현재 저희들은 인스턴스를 하나만 만들어 놓았기 때문에 현재 'running'이라고 떠 있는 인스턴스를 클릭합니다.

      4] 아래쪽에 인스턴스의 상세한 설명들이 나오는데 여기서 '프라이빗 IP'라고 써있는 항목을 찾습니다. 점(.) 세개로 구분된 네 뭉텅이의 숫자가 IP입니다. (ex 172.30.29.125)

      5] 과거에 처음에 만들었던 설정에서 '보안그룹'에 '인바운드'탭에 8888번 포트가 개방되어 있는지 확인합니다. 만약에 개방되어 있지 않다면 개방하여 줍니다. (jupyter notebook은 기본적으로 8888번 포트를 사용합니다.)

 

2) 이제 인스턴스에 CLI로 접속합니다. PuTTY(Windows) 혹은 Command Line(Mac, Linux)을 사용하여 접속합니다.

 

3) 명령줄에 [jupyter notebook --generate-config]를 입력하고 엔터를 칩니다.

      1] 이 명령을 수행하고나면 [/home/ubuntu/.jupyter] 폴더 아래에 jupyter_notebook_config.py라는 python 파일이 생성됩니다.

 

4) 명령줄에 [vi /home/ubuntu/.jupyter/jupyter_notebook_config.py]를 입력한 뒤 엔터를 치면 vim 에디터가 열리며 문서가 열립니다.

      1] 아래에 모든 항목이 #으로 주석처리 되어있으며, 사실 여기서 찾아보면 저희가 설정하고자 하는 모든 항목들이 나와있으나 하나하나 찾기 힘드니 그냥 위에다가 새로 써 줄 것입니다.

      2] 맨 첫줄 맨 앞에서 i키를 누른 뒤 엔터를 두번 쳐줘서 맨 위에 공간을 만들고 다시 맨 위로 올라와 아래의 커맨드를 씁니다.

            c.NotebookApp.ip = '___.___.___.___' #아까.찾은.프라이빗.IP [필수!]

            c.NotebookApp.open_browser = False #자동으로 브라우저 여는 것에 대해 False. 어차피 CLI 환경이라 꺼줍니다.

            c.NotebookApp.notebook_dir = u'/home/ubuntu/' #Jupyter notebook에 처음 접속하였을 때 보여줄 디렉터리 경로입니다. CLI로 처음 접속하였을 때의 기본 디렉터리가 ubuntu/이며, 이 뒤에 새로 생성한 dir이 있으면 주소형식으로 추가해주시면 됩니다. 만약 안써주시면 CLI 상에서 jupyter notebook 명령을 친 디렉터리 위치가 브라우저상에서 열리게 됩니다.

            c.NotebookApp.port_retries = 8888 #주피터 노트북이 사용할 포트를 지정하는 곳입니다. 기본 포트인 8888을 사용할 경우 이 부분을 입력하지 않으셔도 되지만, 만약에 포트를 바꾸고 싶으시면 이 부분을 수정함과 동시에 EC2에서 보안그룹의 인바운드 포트를 추가적으로 개방해주셔야 합니다.

      3] 위의 네 줄(혹은 필수 한줄 이외 옵셔널 몇 줄)을 모두 입력하셨으면 :wq를 누르셔서 저장하고 CLI환경으로 다시 나오시면 됩니다.

 

5) 주피터 노트북을 브라우저로 열 때 비밀번호를 설정합니다.

      만약 설정되어 있지 않다면 접속이 아예 안되거나, 첫 접속시 token(이라고 jupyter notebook을 실행한 환경에 주소뒤에 붙어나오는 특별한 값이 있습니다.)을 입력하거나 토큰입력 후 비밀번호를 설정하라는 페이지가 나옵니다.

      위의 상황 모두 짱 귀찮으니 그냥 주피터 노트북에 비밀번호를 먼저 설정해줍시다.

      여기서 주피터 5번 버전대 이후가 편해진 부분이 이 부분입니다. 과거에는 비밀번호를 설정하거나 재설정 할때 정말 핵귀찮았지만, 5버전대 이후에는 명령어 한줄만 쓰면 새로 설정과 변경이 자유롭습니다.

      1] CLI 명령줄에 [jupyter notebook password]을 칩니다.

      2] 차례대로 Enter password:, Verify password: 식으로 나오는데, Enter password: 라고 나오고 아무리 키를 눌러도 입력되는 것으로 나오지 않으나 입력되는 상태이므로 그냥 먹통인 상태로 패스워드 입력 후 엔터치면 자동으로 Verify password: 로 넘어가고 여기서도 같은 pw를 입력하면 password가 설정됩니다.

      3] 이후에 패스워드를 바꿀때도 간편하게 CLI 명령줄에 [jupyter notebook password]입력 후 새로 쓸 패스워드를 입력하면 패스워드가 바뀝니다.

 

      참고) 과거에는 ipython 혹은 python을 직접 CLI환경에서 구동한 뒤

              [from notebook.auth import passwd]

              [passwd()]

              의 두 줄을 따로 입력하여 'sha1:~~~~~'라고 하는 해시값을 얻은 뒤 이것을 다시 jupyter_notebook_config.py에다가 다른 항목들 처럼 c.NotebookApp.password = 'sha1:~~~~'이런식으로 써 주어야 했으며 패스워드 변경은 훨씬 어려웠습니다.

 

6) 서버를 24시간 켜두고 언제든지 접속하는 것을 목표로 하기 때문에(서버에 들어가서 따로 켜 주었을 때만 작동하는 거라면 그냥 로컬에서 jupyter notebook을 쓰는 것과 다름이 없습니다... (적어도 사용하는 관점에서는)) 사용자가 로그아웃 하여도 24시간 서버컴에서 돌아가는 방법을 사용하겠습니다. screen이라는 기능인데, 이 명령어를 사용하여 만든 screen안에서 동작하는 것은 사용자가 로그아웃을 하여도(서버를 떠나도) 계속 작동합니다.

      1] screen -S [스크린 이름] 을 명령줄에서 실행합니다. 여기서 -S는 새로 스크린을 스크린 이름으로 만들겠다는 것입니다. 처음에는 만들자마자 스크린으로 자동으로 attach 됩니다.

      2] 여기에서 jupyter notebook을 명령줄에 입력하여 jupyter notebook을 켭니다. 이제 jupyter server가 꺼지지 않고 돌아가는 서버 컴퓨터를 만든 것입니다.

      3] 이후 Ctrl+a+d키를 차례로 눌러 원래 CLI 환경으로 돌아옵니다. 다시 스크린에 돌아가고 싶으시면 screen -r [스크린 이름]을 치시면 해당 스크린으로 다시 attach되며 다시 Ctrl+a+d를 누르시면 detach 됩니다. (어떤 경우에 제대로 detach되지 않은채 CLI환경 자체가 꺼진경우 다시 접속하면 CLI 환경인데 스크린이 detach되지 않아 -r로 attach할 수 없을 경우 -dr로 접속하면 그 스크린을 자체적으로 detach시켰다 다시 attach하므로 접속이 가능해집니다.)

      4] 추가적으로 현재 사용하고 있는 스크린의 목록을 보고 싶으시면 screen -ls를 치시면 볼 수 있습니다.

      5] 어떤 스크린을 끄고 싶으시면 원래 CLI 환경에서 screen -X -S [스크린 이름] quit 혹은 screen -X -S [스크린 이름] kill을 하시면됩니다.

      6] 동일한 이름의 스크린을 만드셨다면, screen -ls 를 쳤을 때 스크린 이름 앞에 숫자가 .으로 붙어있는데 이것으로 같은 이름의 스크린이더라도 구별하여 없애거나 다시 접근하거나 하실 수 있습니다.

 

7) 이제 직접 접속해 봅시다.

      1] 이전까지 파일질라나 PuTTY에서 썼던 퍼블릭 IP를 [http://퍼블릭 IP:8888]로 브라우저에 입력하고 접속합니다.

          예를들어 퍼블릭 IP가 54.127.52.125 였다면 http://54.127.52.125:8888로 접속합니다.

      2] 비밀번호를 입력하라는 페이지가 나오면 성공입니다. 여기서 비밀번호를 입력하면 처음에 보여주기로 설정했던 디렉토리가 보일 것이며, 한번 입력 후 브라우저가 기억하는 한 다음 접속부터는 비밀번호를 입력하지 않아도 주소만 입력하면 자동으로 접속 될 것입니다.

 

8) 따라! 성공하였습니다!

 

 

이제 자유자재로 프로그래밍 가능한 강력한 interpreter 도구를 얻으셨으며, 언제 어디서든 자유롭게 인터넷으로 접속할 수 있습니다. 게다가 고정된 ip주소를 가지고 있으니 한번 접속만 하면 자동으로 브라우저가 자동완성으로 페이지 주소를 만들어 줄 것입니다.

 

그러나 컴퓨팅 성능 자체는 그리 좋지 못하여 과한 deep learning tasks 같은 것을 돌리면 컴퓨터 자체가 뻗어버려 EC2환경에서 다시 재부팅 해줘야 하는 일도 발생할 수 있으니 컴퓨팅 환경은 제한적이라는 것을 꼭 기억해주시기 바랍니다.(그래도 일반적인 코딩 수준에서는 문제가 하나도 될 것이 없습니다.)

 

이제 이 서버컴퓨터로 개발을 할 수 있는 준비는 다 끝났습니다. 이것을 활용하여 더욱 많은 프로젝트들을 협업하고, 언제 어디서나 작업하실 수 있기를 바랍니다!

+ Recent posts