Proxyが厳しい企業内からも利用できるJupyter NotebookをAWS上に用意する

やりたいこと

  • Deep Learning向けのAIMを、Amazon AWSのEC2で動かす
  • Proxy内からもアクセスできるように、Jupyter NotebookをPort443で動かす
  • 通常は安く動かし、必要なときだけパワフルなGPUで動かす
    • インスタンスタイプを変更したらJupyter Notebookが自動で起動
    • インスタンスタイプを変更してもIPアドレスが変わない

Machine Learning や Deep Leaning を学習していると、自分のPCではパワーが足りなかったり、複数の環境を整えるために容量が足りなくなってきたりします。また、時間がかかる処理をさせている時には、コーヒーを飲みながらサクサクとWebサーフィンして待ちたいです。

そこでAmazonのAWS上にEC2インスタンスとして環境を作ります。Lazy Girlの記事を見ると、まさにDeep Learning向けのAMIが用意されている。GPUも使えます。

A Lazy Girl’s Guide to Setting Up Jupyter on EC2 for Deep Learning

Deep Learning AMIを起動

Lazy Girlの記事に従ってセットアップし、デフォルトのPort 8888 できちんとJupyter Notebookにアクセスできることを確認する。

なお、

source src/anaconda3/bin/activate root

をするだけで、

> which jupyter
~/src/anaconda3/bin/jupyter

となったので、.bash_profile にPATHを追加するくだりは必要なかった。

Port 443 で Jupyter Notebookを起動

Portを8888から、Proxyを通過できる443へ変更します。

nano ~/.jupyter/jupyter_notebook_config.py

c.NotebookApp.port = 443

そのままubuntuユーザでjupyter notebookを起動させようとすると、443のような低い番号のポートはダメだと怒られるので、rootで起動します。

sudo jupyter notebook --allow-root

これで厚いProxyの壁に阻まれた会社内からでもJupyter Notebookへアクセスして学習を続けられます!

自動起動の設定

インスタンスタイプを変更するには、一度EC2インスタンスをStopする必要があります。
自動的にJuypter Notebookが立ち上がるようにserviceとして登録しておくと便利です。
(会社のProxyがPort 22を通してくれないので、SSHして手動で起動させられない問題も解決)

sudo nano /etc/systemd/system/jupyter.service

[Unit]
After=network.target

[Service]
ExecStart=/home/ubuntu/start_jupyter.sh

[Install]
WantedBy=default.target

sudo chmod 664 /etc/systemd/system/jupyter.service

nano /home/ubuntu/start_jupyter.sh

#!/bin/bash

source /home/ubuntu/src/anaconda3/bin/activate root
cd /home/ubuntu/notebook
jupyter notebook

chmod 744 /home/ubuntu/start_jupyter.sh

サービスはrootユーザで起動するので、ubuntuユーザからsudoで起動する場合とは挙動が違うようです。rootユーザとして起動したときに読み込まれるjupyter_notebok_config.pyファイルを用意してあげます。

sudo su
>/home/ubuntu# cd
>~# mkdir .jupyter
>~# cp /home/ubuntu/.jupyter/jupyter_notebook_config.py /root/.jupyter/
>~# exit 

サービスを登録してスタート。きちんと動いていることを確認。

~$ sudo systemctl enable jupyter.service
~$ sudo systemctl start jupyter.service
~$ sudo systemctl status jupyter.service

Elastic IP でIPを固定

EC2インスタンスを再起動すると、IPアドレスが変わってしまいます。
Elastic IPサービスを使用すると、同じIPアドレスでアクセスできるようになります。

EC2 Management Console -> Elastic IPs -> Allocate new address

なお、EC2インスタンスをSTOPしている時にはElastic IPサービスの利用料が掛かります。(EC2インスタンスにattachされている時にはElastic IPサービスの部分は無料)

N.Virginiaでの料金だと、倹約のためにEC2インスタンスをSTOPしていても月に$3.6掛かります。t2.nanoをずっと動かし続けた$4.18とほとんど変わらない。

Instance Type Monthly $
stopped 3.60
t2.nano 4.18
t2.micro 8.35

おまけ (System Shell Command)

会社のProxyは非常に厳しく、Port 22を通してくれません。SSHでサーバにアクセスしてGitHubからexampleをダウンロードしたり、必要なモジュールをインストールしたりしたい時に困ります。

でもJupyter NotebookにさえWebブラウザからアクセスできればなんとかなります。

Jupyter NotebookのPython promptでは、!ping www.bbc.co.ukのように「!」で行をスタートすればシステムシェルコマンドが打てます。

Screen Shot 2017-10-21 at 10.40.29.png

続きを読む

Lambda(Python3.6)でDynamoDBに登録された項目が日付型であるかチェックしてみる

どうも!大阪オフィスの西村祐二です。 DynamoDBで提供されている属性の型は大きく分けて スカラー型、ドキュメント型、セット型となっています。 DynamoDBの命名ルールおよびデータ型 そのため、下記画像のように日 […] 続きを読む

AWS ElasticsearchとlambdaをNAT Gateway経由で繋ぐ

やりたいこと

Elasticsearch Service(ES)をIP制限だけで運用したい
Webhookをlambdaで受け取って(API-Gateway経由)からESにデータを取りに行って戻す

実装方法

lambdaにVPC設定をして、NAT Gateway経由でESにアクセス
NAT GatewayのIPアドレスをESのアクセスポリシーで許可する

注意点

lambdaはプライペートサブネットに設定する必要がある
パプリックサブネットを設定してしまうと、外に接続できなくなる

続きを読む

AWS Elasticsearch ServiceがVPC対応したので、lambda→ESをVPCで括ってみた

VPC Support for Amazon Elasticsearch Service Domains – Amazon Elasticsearch Service http://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/es-vpc.html

FireShot_Capture_065_-_Amazon_Elasticsearch__-_https___ap-northeast-1_console_aws_amazon_com_es_home.png

やること

  1. VPCの設定をする
  2. Elasticsearch Serviceを新規作成してVPC設定する
    (既存のドメインをVPC対応にする・VPCを切り替える方法はまだわからない)
  3. lambdaにVPCを設定する
  4. テスト

VPC設定

  1. プライペートとパブリックの2パターンサブネットを作成する
  2. パブリックサブネット内でNATゲートウェイを作成する
  3. NAT,インターネットゲートウェイをルートテーブルに割り当てる
  4. ESに設定するセキュリティグループを設定する

ES設定

  1. 新しいドメインの作成
  2. ネットワーク設定でVPC, サブネット(プライペート), セキュリティグループを設定する
  3. アクセスポリシーをVPC用に設定
    FireShot_Capture_066_-_Amazon_Elasticsearch__-_https___ap-northeast-1_console_aws_amazon_com_es_home.png

lambda設定

  1. ロールにVPCアクセス権限をアタッチする
  2. lambdaをプライペートサブネットに配置する

API Gateway設定

(疎通確認だけなら、lambda関数に繋がればよいかと)

疎通確認

ESはVPC内なので、外のネットワークからはアクセスできない
そのため、Kibana見れない状態…
VPC内にWindows立ち上げるとかEC2入れてcurlで叩いてみるとか

lambda内のログに出力するなりで確認

はまりどころ

lambdaにパプリックネットワークのサブネットを付けてしまっていた為、外に接続できなかった
原因をAPI Gatewayかと思い、メソッドを設定したものの解決せず時間がかかってしまった

もしかして

ESへのアクセスを制限したいだけであれば、lambdaをVPC内に設置してNAT Gateway経由でESにアクセスすればIP許可だけで十分だったのでは…?

続きを読む