01. 인스턴스 생성 및 Python 개발 환경 구축 - YBIGTA/EngineeringTeam GitHub Wiki

개요

  • 이 문서는 AWS EC2 서버 1대에 PySpark을 이용해 개발하기 위한 개발 환경 구축 과정을 담은 문서입니다.
  • 이 문서는 리눅스 서버에 Jupyter Notebook Server를 설치하는 과정을 다룹니다.
    multi-user를 위한 JupyterHub를 설치하는 것이 아니고 개인이 이용하기 위한 Jupyter Notebook Server를 설치합니다.
  • 사용하는 EC2 머신의 운영체제의 버전은 Ubuntu Server 18.04 LTS입니다.
  • 이 문서는 AWS 공식 문서Jupyter Notebook 공식 문서를 참고하여 작성되었습니다.
  • 마지막 업데이트 : 2020-09-10

설치할 소프트웨어

  • Anaconda for Python3

설치

다음의 단계로 나누어 설치를 진행합니다.

  1. AWS 가입 & EC2 인스턴스 생성
  2. SSH를 이용해 EC2 인스턴스에 접속
  3. 기본 셋팅
  4. Python 환경 구성

1. AWS 가입 & EC2 인스턴스 생성


2. SSH를 이용해 EC2 인스턴스에 접속


# https://aws.amazon.com/ko/getting-started/tutorials/launch-a-virtual-machine/ 에서 참고했습니다.

c. SSH를 사용하여 인스턴스에 연결합니다.
이 사례에서는 사용자 이름이 ubuntu이고, SSH 키는 2단계 파트 d에서 저장한 디렉터리에 보관되어 있으며,
IP 주소는 2단계 파트 f에서 적어두었습니다. 형식은 ssh -i {.pem 파일의 전체 경로} ubuntu@{인스턴스 IP 주소}입니다.

- Windows 사용자: ssh -i 'c:\Users\yourusername\.ssh\MyKeyPair.pem' ubuntu@{IP_Address}
(예: ssh -i 'c:\Users\adamglic\.ssh\MyKeyPair.pem' [email protected])를 입력합니다.

- Mac/Linux 사용자: ssh -i ~/.ssh/MyKeyPair.pem ubuntu@{IP_Address}
(예: ssh -i ~/.ssh/MyKeyPair.pem [email protected])를 입력합니다.

참고: Amazon Linux 이외에 다른 Linux 인스턴스를 시작한 경우, 다른 사용자 이름이 사용될 수 있습니다. 일반적인 사용자 이름에는 ec2-user, root, ubuntu 및 fedora가 있습니다. 로그인 사용자 이름을 알 수 없는 경우, AMI 공급자에게 문의하십시오.

다음과 유사한 응답이 표시됩니다.

The authenticity of host 'ec2-198-51-100-1.compute-1.amazonaws.com (10.254.142.33)' can't be established. RSA key fingerprint is 1f:51:ae:28:df:63:e9:d8:cf:38:5d:87:2d:7b:b8:ca:9f:f5:b1:6f. Are you sure you want to continue connecting (yes/no)?

Yes를 입력하고 Enter 키를 누릅니다.


3. 기본 셋팅

$ cd $HOME

# 파일을 다운로드하고 저장할 디렉터리 생성
$ mkdir downloads

# package manager(apt-get)을 최신화
$ sudo apt-get update


4. Python 환경 구성

4-1. Anaconda 설치

지금 구성하는 환경은 Jupyter Notebook을 이용해 1대의 머신에서 Spark를 공부하기 위한 환경입니다.
환경 구성의 편의를 위해 Anaconda를 이용해 파이썬 환경을 구축하도록 하겠습니다.
문서를 쓰는 시점(2020.09.10) Anaconda 최신 배포판에서 사용하는 파이썬 버전은 3.8입니다. 하지만 pyspark가 아직 python3.8을 지원하지 않기 때문에 python3.7을 이용하는 Anaconda를 설치하겠습니다.

# change directory to install
$ cd ~/downloads

# archive for anaconda: https://repo.continuum.io/archive/

# wget 명령어를 사용하여 파일을 다운로드 합니다.
# wget 명령어는 `Web Get`의 약어로 웹에서 파일을 다운로드 받을 때 사용하는 명령어입니다.
# 기본적인 사용법은 wget [options] .. url 입니다.
$ wget https://repo.continuum.io/archive/Anaconda3-2019.10-Linux-x86_64.sh

# 다운로드 받은 파일의 확장자를 보면 .sh입니다.
# .sh는 실행 가능한 쉘 스크립트 파일입니다. 
# bash를 이용해 해당 스크립트 파일을 실행시켜줍니다.  
$ bash Anaconda3-2019.10-Linux-x86_64.sh

# License 관련된 것을 묻는 화면에서 엔터, 'yes'를 입력해 진행합니다.

# 설치 과정에 아래와 같은 메세지가 나올 것입니다.
# /home/ubuntu/anaconda3 이라는 경로에 anaconda3를 설치할 것이라는 메세지입니다.
# 특별히 선호하는 위치가 없다면 엔터를 눌러 진행합니다.
Anaconda3 will now be installed into this location:
/home/ubuntu/anaconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below
  
# 쭉 엔터를 누르다가
Do you accept the license terms? [yes|no]
[no] >>>
# 가 나오면 yes를 입력합니다.

# 그 다음 이런 메시지가 나옵니다.
# 우리는 별도로 환경변수 설정을 해줄 것이기 때문에 no라고 입력합니다.
installation finished.
Do you wish the installer to prepend the Anaconda3 install location
to PATH in your /home/ubuntu/.bashrc ? [yes|no]
[no] >>>

#
# 다음에 'Do you which the installer to initialize Anaconda3 by running conda init?'
# 메시지가 나오면 yes 라고 입력하고 설치를 종료합니다.

아나콘다를 설치한 이후 환경 변수를 설정해줍니다.
환경 변수는 bash_profile을 통해 설정해줄 수 있습니다. bashrc 파일과 bash_profile 의 차이는 아래의 문서들을 참고합니다.

# vim으로 bash_profile를 엽니다. 없으면 만듭니다.
# vim을 이용하여 터미널에서 파일을 편집할 수 있습니다.
$ vim ~/.bash_profile

# 편집 창이 열리면 아래 내용을 복사해서 넣어줍니다.

완성된 ~/.bash_profile의 내용은 아래와 같습니다.

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

## User specific environment and startup programs

# Anaconda
export ANACONDA_HOME="/home/ubuntu/anaconda3"
export PATH=${ANACONDA_HOME}/bin:$PATH

편집을 완료하면 esc 를 누르고 :wq 라고 입력하여 저장하고 빠져나갑니다.

bash_profile를 수정한 이후에는 source를 꼭 해줘야 합니다.

$ source ~/.bash_profile

4-2. Jupyter 관련 설정

Jupyter Notebook의 관련 문서를 참고합니다.
여기서 구성하는 Jupyter Notebook Server 환경 구성법은 multi-user를 위한 설정이 아닙니다.
multi-user를 위한 환경은 JupyterHub를 찾아보도록 합니다.

- 준비: notebook configuration 만들기

방금 Anaconda를 이용해 설치했기 때문에 notebook configuration 파일이 없을 것입니다.
아래와 같이 입력해 설정 파일을 만들어주도록 합니다.
별도의 설정을 하지 않는다면 해당 명령어는 ~/.jupyter 경로 아래에 jupyter_notebook_config.py 라는 파일을 만듭니다.

$ cd $HOME

# jupyter 설정을 위한 파일을 만들어준다.
$ jupyter notebook --generate-config

- Password를 자동으로 설정하기

아래의 명령어를 이용하여 Jupyter Notebook의 password를 설정할 수 있습니다.
비밀번호를 잃어버렸거나 노출되었을 때 서버에 들어와서 아래와 같이 입력해 비밀번호를 재설정해 줄 수도 있습니다.
비밀번호를 재설정하고 서버를 재시작해주면 이전 패스워드는 무효화됩니다.

비밀번호를 입력해도 우리에게 보이지 않습니다. 간단한 비밀번호로 실수 없이 입력하세요~

$ jupyter notebook password
Enter password:  ****
Verify password: ****
[NotebookPasswordApp] Wrote hashed password to /Users/you/.jupyter/jupyter_notebook_config.json

아래의 방법을 따라하면 패스워드를 수동으로 설정하고 설정 파일에 추가해줄 수도 있습니다.

- 통신 과정에서 암호화를 위해 SSL 설정하기

비밀번호를 사용할 때 비밀번호가 브라우저에서 암호화되지 않은 상태로 전송되지 않도록 웹 인증서와 함께 SSL을 사용하는 것이 좋습니다.
먼저 아래의 과정을 통해 self-signed 인증서를 생성합니다.

# 인증서를 생성할 디렉터리 만들기
$ mkdir ~/certs
$ cd ~/certs

# 다음 명령은 365일동안 유효한 인증서를 작성합니다.
# 옵션을 입력하라고 뜨면 엔터 치며 넘어가 주시면 됩니다.
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem

설정 파일에 내용을 추가해주어야 합니다.

$ cd ~

# vim으로 설정 파일을 엽니다.
# 아래의 경로는 jupyter_notebook_config 의 default 생성 경로입니다. 
# 생성 경로를 별도로 수정해주었다면 다른 경로에 파일이 있을 수 있습니다.
$ vim ~/.jupyter/jupyter_notebook_config.py

jupyter_notebook_config.py 파일을 열면 많은 내용이 주석처리 되어있습니다. 아래의 내용을 파일에 추가한 뒤 파일을 닫습니다 ( vim에서 i를 누르면 쓰기 모드로 변경됩니다.)

c = get_config()

# Notebook config this is where you saved your pem cert
c.NotebookApp.certfile = u'/home/ubuntu/certs/mycert.pem'
c.NotebookApp.keyfile = u'/home/ubuntu/certs/mykey.key'

# Set ip to '*' to bind on all interfaces (ips) for the public server
c.NotebookApp.ip = '*'
# Don't open browser by default
c.NotebookApp.open_browser = False
# Fix port to 10001
c.NotebookApp.port = 10001

설정을 마친 뒤엔 jupyter를 실행시켜줍니다.

$ jupyter notebook

각자의 ec2 주소로 jupyter에 접속합니다. http가 아닌 https임에 유의합니다. 접속이 되는 것을 확인한 뒤에 쥬피터 서버를 종료합니다.

https://${ec2-ip-address}:10001

만약 접속이 되지 않고, permission 관련 에러가 뜬다면, jupyter를 종료하고 아래와 같이 해주세요.

$ cd certs
$ ls -alh

# 만약 mycert.pem과 mykey.key의 권한이 ubuntu가 아니라 root라고 되어 있으면, 이 두 파일을 삭제 합니다.
# 지울거냐고 물어보면 yes라고 대답해줍니다.
$ rm -r ./*
>>> rm: remove write-protected regular file 'mycert.pem'? yes
>>> rm: remove write-protected regular file 'mykey.key'? yes

# 제대로 지워졌나 확인해봅니다.
$ ls -alh

# 아래의 코드로 다시 생성해줍니다.
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem

# 다시 jupyter 실행
$ cd $HOME
$jupyter notebook

참고: Mac OS 에서는 크롬 말고 사파리로 접속해 주세요.