こんにちは。プラットフォームソリューション事業部のはらのです。

 

この記事は 『CRESCO Advent Calendar 2018』 22日目の記事です。
Advent Calendarも残りわずかとなってきて、そろそろ年末モードという感じですね。
今年「は」というか、今年「も」なのですがいろんな技術に触れ、いろんな人と関わ会う中で刺激を受け公私共に充実したの1年ではなかったかと思います。


さて、先日もre:Inventなどで様々なサービスのアップデートや発表があり
進化し続けているAWSですが、今回はJupyterNotebookというツールを利用した
AWSでの運用(AWSに限らずクラウド全般での運用)についてご紹介したいと思います。

1.JupyterNotebookとは?5つのメリット


JupyterNotebookとはNotebookと呼ばれる形式でコードを記述することができ、また作成したプログラムを動かしながら実行結果を残せるツールです。
データ解析ではよく用いられるツールですが、インフラ運用でも効果を発揮できるツールとして注目を浴びています。
Jupyterを使ったクラウド運用論(LC4RI)についてはこちらが参考になります。

運用時の作業と作業結果とメモを1つにできるため私はすごく気にいっており、
例とした以下のようなメリットがあると思います。

  1. 実行結果を後から見たいとき
    分離されている手順書と証跡をまとめることで後から作業結果を確認しやすい
  2. ExcelやWordの手順書から解放されたいとき
    手順書からコピーや手入力をやめてInfraStructure as a codeで半自動化
    運用者のスキルに偏らない(誰でもできる)手順書を作る
  3. 手順書が見つからないとき
    ファイルサーバーに無法地帯のように配置されている手順書を1か所にまとめて整理整頓
  4. 運用者間で引継ぎされたものが使用できるか不安なとき
    シェルスクリプトなどのようなブラックボックス化したものからの解放
    メモと実行手順と実行結果(実行ができる)を引き継ぐことでの安心感
  5. それでもやっぱり完全に自動化したいとき
    初めはJupyterNotebookで作業実績を積み上げ、 慣れてきたらPapermillなどを利用してジョブ化することで自動化が可能。
    運用の自動化については本記事の主旨と少しずれるためこちらを参考

2.JupyterNotebookをインストールしてみた

ここではAWSのAmazon Linux2にJupyterNotebookをインストールしてみたいと思います。

#パッケージを最新化
sudo yum update -y
# Python3とJupyterNotebookのインストール
pip3 install jupyter
# jupyter設定ファイルの作成
jupter notebook --generate-config
# notebookを格納するためのディレクトリを作成
mkdir /home/ec2-user/notebook
# Jupyterに設定するパスワードのハッシュ値を作成
python3 -c 'from notebook.auth import passwd;print(passwd())'
password:********
vertify:********
# 設定ファイルの修正
c.NotebookApp.notebook_dir = '/home/ec2-user/notebook' #{JupyterNotebookを格納するディレクトリのルート階層}
c.NotebookApp.ip = '0.0.0.0' # 接続許可をするIP範囲
c.NotebookApp.password = 'sha~' # ここに先ほど作成したハッシュ値を格納
# systemdで起動するように設定
touch /etc/systemd/system/notebook.service
==notebook.serviceの中身ここから==
[Unit]
Description = Jupyter Notebook
[Service]
Type=simple
PIDFile=/var/run/jupyter-notebook.pid
ExecStart=/usr/local/bin/jupyter notebook
WorkingDirecotry=/home/ec2-user/.jupyter
User=ec2-user
Group=ec2-user
Restart=always
[Install]
WantedBy = multi-user.target
==notebook.serviceの中身ここまで==
# Jupyterのサービス起動と自動起動を設定
sudo systemctl daemon-reload
sudo systemctl enable notebook.service
sudo systemctl start notebook.service
sudo systemctl list-unit-files --type service | grep notebook
# ついでにAnsibleも設定
sudo pip3 install ansible

以下のURLよりアクセスすることができます。

http://{インスタンスのパブリックIPアドレス}:8888

図 アクセスした際の画面

3.JupyterNotebookの設定・拡張機能

JupyterNotebookに拡張機能を設定してみます。

Jupyterには「nbextensions」というものがあり、色々な便利な機能を拡張することができます。

個人的に気に入っている機能もいくつか紹介していきたいと思います。

# 拡張機能のインストール
cd ~
sudo pip3 install jupyter_contrib_nbextensions

以下よりURLよりアクセスすることができます。

http://{インスタンスのパブリックIPアドレス}:8888/nbextensions/

図2 拡張機能の画面

お気に入り機能

  1. 目次の自動生成機能
    notebookに記載した大項目、中項目などにそって目次を自動生成してくれます。
    番号を自動で振ってくれるため途中に項目を挿入しても自動で番号を再割り当てしてくれます。
  1. ②自動保存機能
    notebookで間違って消してしまったり、10分前の状態に戻したいといった時の機能です。
  1. ③セルのロック機能
    セル状態をロックし、実行できないようにする機能です。
    こちらは別途インストールする必要があります。
# gitから拡張ライブラリを取得してインストール
sudo yum install git
cd ~
sudo git clone https://github.com/ipython-contrib/jupyter_contrib_nbextensions.git
sudo pip3 install -e jupyter_contrib_nbextensions
jupyter contrib nbextension install --user

1つ目のセルではロックをかけているので実行ができないのですが、
2つ目のセルはロックがかかっていないので実行することができます。
例えば状態を更新するようなコマンドを羅列したセルはロックをかけておき、作業時に解除してから実行すると事故防止に役立ちそうですね!

4.JupyterNotebook使って運用してみる

今回は特定のセキュリティグループにアクセス許可を与えるという運用を想定したNotebookを作って実行してみたいと思います。

5.まとめ

いかがでしたでしょうか?
セルにコードを入力するのに少しクセがありますが、慣れてしまえばすごく便利なツールかと思います。
JupyterNotebookを使えば少しは運用作業の負担を減らせるのではないでしょうか。

インストールから使った時のイメージまで簡単ではありますが、
この記事が読者の一助になれればと思います。