Deploy Jupyter Notebook on AWS EC2 instance

Avnish
PyFinance
Published in
6 min readFeb 6, 2019

--

To make Python environment setup in cloud instance easier, I have added a shell script that installs required packages and a conda virtual environment that contains frequently used python libraries in this repository.

But I recommend that you go through all the steps at least once before executing aforementioned shell script, just so you have an idea of what we are doing.

Advantages of using cloud instance

Photo by Sergey Zolkin on Unsplash

By using jupyter notebook on cloud, anyone can take benefits of professional grade hardware from their personal computer system. Rather than setting up a workstation or server and keeping it up to date with latest hardware as time passes, you can just pay for a virtual machine that suits your needs and get your work done easily.

Other than hardware to test our models, we also get storage for scripts and all the files containing data.

Some options for cloud computing are : Google Cloud Platform, Digital Ocean, and Amazon Web Service(AWS).

You are charged on the basis of hours. See AWS pricing here.

Tutorial

The Virtual machine I am using here has following specifications but the choices are completely arbitrary :

Amazon Machine Image (AMI) : Ubuntu Server 18.04 LTS

Instance Type : t2.micro

Physical Memory : 1GB

Storage : 8 GB (Amazon EBS)

CPU : Intel Xeon family

Step 1 : Make an AWS account from here

Step 2 : Sign in

Step 3 : Go to EC2 and Launch Instance

Step 4 : Select Ubuntu

Step 5 : Select t2.micro as instance type

Step 6 : Go to “Configure Security Groups” tab

Give group name and group description that you like .

Step 7 : Add a rule and enter the following values

Type: Custom TCP

Protocol : TCP [Set by Default]

Port Range : 8888

Source : Anywhere

Step 8 : Review & Launch

Step 9 : AWS will prompt you to create a new key pair or select a new one

NOTE : If you select an existing key pair, you need to have that “.pem” file on your local machine.

For this tutorial we will make a new key pair.

Download the key pair you’ve just made.

Step 10 : Click on Launch Instances.

Scroll down and click on View Instances.

Your instance will have status : running.

Step 11 : Copy the downloaded key pair to any directory you want and change access permissions for it.

I am making a new directory “notebooks” and copying key pair into it. I will also change its permissions to 400(read permission to root user only).

Use these commands in your bash shell or you can do it using GUI.

# Making a new directory "notebooks" and switching to it
mkdir notebooks && cd notebooks
# Copying key pair into "notebooks" directory
cp ~/Downloads/for-tutorial.pem ./
# Changing permissions for key pair
chmod 400 for-tutorial.pem

Step 12 : Right click on your running instance and click on Connect.

The example will have a command like

ssh -i "for-tutorial.pem" ubuntu@ec2-XX-XXX-XX-XX.XX-XXXX-X.compute.amazonaws.com

Run that command on shell in your local machine.

Answer yes to any prompt by shell and you’ll be connected to terminal of your cloud instance.

You could notice that your terminal now identifies machine as

@ubuntu@ip-xxx-xx-xx-xx:~$ 

Step 13 : Now you have to do following at cloud instance :

1. Install bzip2, gcc, git, htop, screen, vim, and wget.

2. Download and install anaconda (or miniconda).

3. Add conda to PATH variable.

4. Install necessary python libraries from conda (in this tutorial : jupyter notebook and ipython)

All of these four steps are covered in following command

or you can download the bash script that does it all from here.

#Step 1
apt-get update
apt-get upgrade -y
apt-get install -y bzip2 gcc git htop screen vim wget
apt-get upgrade -y bash
apt-get clean
#Step 2
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O Miniconda.sh
bash Miniconda.sh -b
rm -rf Miniconda.sh
#Step 3
echo "export PATH=~/miniconda3/bin:$PATH" >> ~/.bashrc
source ~/.bashrc
#Step 4
conda install -c anaconda notebook --yes
conda install ipython --yes

Step 14 : Generate an OpenSSL certificate for Jupyter Notebook

Run this command on the cloud instance terminal.

openssl req -x509 -nodes -days 365 -newkey rsa:1024 -out mykey.pem -keyout mykey.pem

The name of file after -out and -keyout flag should be same.

Shell will prompt you to enter some details about yourself, you can fill them or just leave them blank using “ . ” as input.

A file named “mykey.pem” will be generated.

Step 15 : Generate a password hash for jupyter notebook

Run the following command in cloud instance terminal

ipython

This will execute an interactive session for ipython in the terminal, now import passwd() method from notebook.auth and generate hash for any string, here I used “mypassword” but you can use something more secure.

In [1]: from notebook.auth import passwdIn [2]: passwd("mypassword")                                                                                                           
Out[2]: 'sha1:553c099eea73:2e8fda20a9878dd5abc84965d4a81e09eb48995f'
In [3]: exit

The string you generate hash for will be the password of jupyter notebook.

Do not clear the terminal window, you will need this hash in following steps.

Step 16 : Generate a Jupyter Notebook Configuration File (jupyter_notebook_config.py)

Run this in the terminal of cloud instance

jupyter notebook --generate-config

Step 17 : Open config file (~/.jupyter/jupyter_notebook_config.py)

and using text editor (like vim or nano), add the following lines

c.get_config()
c.NotebookApp.certfile=u'home/ubuntu/mykey.pem'
c.NotebookApp.ip='0.0.0.0'
c.NotebookApp.port=8888
c.NotebookApp.password=u'sha1:553c099eea73:2e8fda20a9878dd5abc84965d4a81e09eb48995f'

Here, c.NotebookApp.certfile takes the location of certificate generated by OpenSSL (mykey.pem)

and c.NotebookApp.password takes the hash generated from Step 15 as input.

Step 18 : Run jupyter notebook on cloud instance

jupyter notebook --no-browser --port=8888

Step 19 : Open a new terminal tab or window on your local machine (keeping the existing jupyter notebook terminal open)

connect to cloud instance terminal but with a new flag -L

ssh -i "for-tutorial.pem" -L 8890:localhost:8888 ubuntu@ec2-XX-XXX-XX-XX.XX-XXXX-X.compute.amazonaws.com

This command will forward the output from 8888 port of cloud instance to port 8890 of your local machine.

Step 20 : Open localhost:8890 in your browser on you local machine and enter the password (string from step 15).

NOTE : If your browser warns you about an insecure connection, you can just choose to “continue anyway”.

If password is said to be incorrect, then copy the token from terminal that is running jupyter notebook and paste it in password field.

If something goes wrong, relaunch jupyter notebook on a different port and use a different port on your local machine as well.

--

--