[분석환경구축]프라이빗 EC2에 Jupyter 분석환경 구축하기
이 글의 목적
- 프라이빗 EC2에서 구동하는 JupyterLab 구동 환경 구축
1. Pre-requisite (환경 전제 조건)
항목 |
설명 |
운영체제 |
Amazon Linux 2023 (AL2023) |
EC2 접속 방식 |
AWS Systems Manager Session Manager (SSM) |
EC2 IAM Role |
SSM StartSession 권한 포함되어야 함 |
외부 접속 방식 |
Route53 + ALB or 로컬 포트포워딩 |
Python 버전 |
3.11 이상 (AL2023 기본 제공됨) |
실행 사용자 |
ssm-user (or 해당 EC2 사용자) |
접속 인증 방식 |
비밀번호 로그인 |
실행 관리 방식 |
systemd 서비스로 등록 (자동 실행/복구) |
- EC2 생성 및 보안그룹 설정, ALB 설정은 이 문서에서는 다루지 않음
2. 요구사항 요약
- JupyterLab은 Python 3.11 기반 가상환경에서 실행
systemd
로 관리되어 EC2 재부팅 후에도 자동 실행됨
- 비밀번호 설정하여 토큰 URL 필요 없이 비밀번호만으로 Jupyter 노트북 접근함
- ALB 도메인 or 로컬 SSM 포워딩 중 하나 선택 가능
- 운영 / 스테이징 서버 모두 자동화되어 동일하게 구성 가능
- 로컬 접속 시 SSM 포트포워딩 포트는 스테이징 8888 / 운영 9999
3. JupyterLab 설치 및 실행 자동화 스크립트
파일명: setup_jupyterlab.sh
#!/bin/bash
set -e
read -p " 도메인(ALB) 접속용으로 설정하시겠습니까? (y/n): " domain_mode
if [[ "$domain_mode" =~ ^[Yy]$ ]]; then
JUPYTER_IP="0.0.0.0"
echo " 외부 접속 허용 (0.0.0.0)"
else
JUPYTER_IP="127.0.0.1"
echo " 로컬 전용 접속 (127.0.0.1)"
fi
echo "[1/9] 필수 패키지 설치"
sudo dnf install -y python3.11 python3.11-devel gcc make libpq-devel
echo "[2/9] pip 설치 및 alias 설정"
sudo /usr/bin/python3.11 -m ensurepip
sudo /usr/bin/python3.11 -m pip install --upgrade pip
grep -q 'alias python=' ~/.bashrc || echo 'alias python=python3.11' >> ~/.bashrc
grep -q 'alias pip=' ~/.bashrc || echo 'alias pip=\"python3.11 -m pip\"' >> ~/.bashrc
source ~/.bashrc
echo "[3/9] 가상환경 생성 및 활성화"
rm -rf ~/pyenv
/usr/bin/python3.11 -m venv ~/pyenv
source ~/pyenv/bin/activate
echo "[4/9] 필수 패키지 설치"
pip install --upgrade pip
pip install requests pandas psycopg2-binary jupyterlab
pip install 'notebook<7.0'
echo "[5/9] Jupyter 디렉토리 생성"
mkdir -p ~/jupyter
echo "[6/9] Jupyter 설정 생성 (비밀번호: {PASSWORD})"
mkdir -p ~/.jupyter
HASHED_PASSWORD=$(/home/ssm-user/pyenv/bin/python -c "from notebook.auth import passwd; print(passwd('{PASSWORD}'))")
cat > ~/.jupyter/jupyter_lab_config.py <<EOF2
c = get_config()
c.ServerApp.ip = '${JUPYTER_IP}'
c.ServerApp.port = 8888
c.ServerApp.open_browser = False
c.ServerApp.password = u'''${HASHED_PASSWORD}'''
c.ServerApp.notebook_dir = '/home/ssm-user/jupyter'
c.ServerApp.trust_xheaders = True
c.ServerApp.allow_remote_access = True
EOF2
echo "[7/9] systemd 서비스 등록"
sudo tee /etc/systemd/system/jupyter-lab.service > /dev/null <<EOF3
[Unit]
Description=Jupyter Lab (venv with password)
After=network.target
[Service]
Type=simple
User=ssm-user
ExecStart=/home/ssm-user/pyenv/bin/jupyter-lab --config=/home/ssm-user/.jupyter/jupyter_lab_config.py
WorkingDirectory=/home/ssm-user/jupyter
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF3
echo "[8/9] systemd 서비스 실행"
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable jupyter-lab
sudo systemctl restart jupyter-lab
echo "[9/9] 완료!"
if [[ "$domain_mode" =~ ^[Yy]$ ]]; then
echo "외부 접속 주소: http://<도메인>:8888 (ALB 연결 시)"
else
echo "로컬 접속 주소: http://localhost:8888 (SSM 포트포워딩 필요)"
fi
echo "로그인 비밀번호:{PASSWORD}"
4. SSM 포트포워딩 자동 스크립트
- 로컬에서 SSM을 이용하여 프라이빗 EC2 상의 Jupyter 노트북 접근 시 사용
- pre-requisite : 보안그룹에서 로컬 IP 등록, 로컬 콘솔에 AWS configuration 등록
파일명: port_forward.sh
#!/bin/bash
if [ $# -ne 1 ]; then
echo "사용법: $0 [stg|prd]"
exit 1
fi
ENV="$1"
case "$ENV" in
stg)
INSTANCE_ID="i-스테이징인스턴스ID"
LOCAL_PORT=8888
;;
prd)
INSTANCE_ID="i-운영인스턴스ID"
LOCAL_PORT=9999
;;
*)
echo "잘못된 인자입니다. 사용법: $0 [stg|prd]"
exit 1
;;
esac
REMOTE_PORT=8888
echo "[$ENV] 환경 ($INSTANCE_ID)에 포트포워딩 연결 중..."
echo "로컬 접속 주소 → http://localhost:$LOCAL_PORT"
aws ssm start-session \
--target "$INSTANCE_ID" \
--document-name "AWS-StartPortForwardingSession" \
--parameters "{\"portNumber\":[\"$REMOTE_PORT\"],\"localPortNumber\":[\"$LOCAL_PORT\"]}"
결과
- 로컬에서:
./port_forward.sh stg → http://localhost:8888
./port_forward.sh prd → http://localhost:9999
- 운영/스테이징 모두 동일한 스크립트로 구성
- 접속 후 비밀번호
{PASSWORD}
입력 시 로그인 성공