はじめてのFargate~FargateとDocker Hubを使ってJupyter Notebook環境を用意する~

綺麗な君(Jupyter Notebook環境)が欲しくて、私はFargateに挑んだよ
2020.04.28

オンラインコミュニケーションを、多分人一倍満喫しております。


▲ Slackが俺のホームタウンだぜ

テキストベースのやり取りが大好きで、オンラインの住人になっているAWS事業本部のShirotaです。私の実体を覚えている人がいなくなるまで、各方面で努力していこうと思っています。オンライン快適!

本日は「Fargate + Docker HubでJupyter Notebook環境を用意してみた」お話をしたいと思います。
今回、作業の前提となる準備の話が結構な分量を占めているので、実際の作業手順のみを手っ取り早く確認したい方は、目次から「FargateとDocker HubでJupyter Notebook環境を用意する」の項目に飛んで頂けますと作業内容が書かれた箇所に移動できます。
良かったらご活用下さい。
経緯からゆっくりとお付き合い下さる方はこのまま読み進めて下さい。

手軽に綺麗なJupyter Notebook環境を手に入れたい

先日、私はあるオンラインハンズオン勉強会へ参加させて頂きました。

量子コンピューター超入門ハンズオン - connpass

勉強会の概要はリンク先を参照頂ければと思います。
こちらの勉強会でハンズオンに参加する為には、事前に Qiskit という 量子コンピュータを扱う為のOSS をインストールした環境を用意する必要がありました。
このQiskitには、以下の要件が存在します。

Qiskit supports Python 3.5 or later. However, both Python and Qiskit are evolving ecosystems, and sometimes when new releases occur in one or the other, there can be problems with compatibility.
If you're having trouble installing or using Qiskit after updating Python, check the Qiskit Package metadata for Programming Language to see which specific versions of Python are supported.
科学技術計算用クロスプラットフォームのPythonディストリビューションである Anaconda をインストールすることをおすすめします。Qiskit tutorials とのやり取りには、Anacondaに含まれるJupyter Notebookをおすすめします。
Qiskitは以下の64ビットシステムでテストされサポートされています。
- Ubuntu 16.04またはそれ以降
- macOS 10.12.6またはそれ以降
- Windows 7またはそれ以降

Qiskitのインストール — Qiskit 0.14.1 ドキュメント

上記要件にざっと目を通してQiskitをインストールして利用する為に必要な、用意するものについて考えました。

  • Anaconda(科学技術計算用クロスプラットフォームのPythonディストリビューション)
  • Python 3.5以降の環境(Anacondaに含まれる)
  • Ubuntu 16.04以降の環境

これらから単純に考えると、「EC2でUbuntuの環境を立ち上げて、そこにAnacondaをインストールしてPythonを用意し、併せてインストールされているJupyter Notebookを起動する」事で環境の準備は整う筈です。

面倒だなぁ。

今までJupyter Notebookを使う時はちょっとした図の描画や計算をやる事が多く、普段私はブラウザ上のJupyter Notebookを使ってきました。

Project Jupyter | Home

私の中でのJupyter Notebookはこれくらい手軽な存在でした。つまり、「EC2でUbuntuの環境を立ち上げて〜」と考え出した時点で 面倒だなぁ となる訳です。

勿論この面倒を解消する為の解決策はとっくにAWSの提供するサービスとして提供されています。
そう、 Amazon SageMaker です。

Amazon SageMaker(機械学習モデルを大規模に構築、トレーニング、デプロイ)| AWS

SageMakerを使えば、Jupyter Notebookの起動はあっという間です。
弊社でも、実際に「やってみた」ブログがあります。どこからどう見ても簡単です。

SageMaker でお手軽に Jupyter Notebook から Python を実行してみた | Developers.IO

ですが、今回は 私がFargateとDocker Hubを触ってみたかった 為、このようなアプローチをしてみました。
勉強会に参加するついでにコンテナも触れて一石二鳥やんけの心持ちです

FargateでJupyter Notebook環境を立ち上げる準備

やるべき事を整理してみました。

  • Jupyter NotebookのDockerイメージを用意する
  • Dockerコンテナを起動させる環境を用意する
  • 実際にDockerコンテナを起動してJupyter Notebookを利用する

やる事を整理してみましたが、 どれも初めての事ばかり です。
それぞれ、もう少し詳しく詰めていきましょう。

Jupyter NotebookのDockerイメージを用意する

これについては調べてみたところ、DockerイメージがDockerコンテナレジストリである Docker Hub に存在する事が分かりました。
Jupyter Notebookの公式ページを読みながら、今回利用したい環境が整っているDockerイメージを確認します。

Selecting an Image — docker-stacks latest documentation

今回は、 jupyter/base-notebook を利用する事にしました。

jupyter/base-notebook - Docker Hub

このDockerイメージのDockerfileを確認すると以下の記述がありました。

# Ubuntu 18.04 (bionic)
# https://hub.docker.com/_/ubuntu/?tab=tags&name=bionic
# OS/ARCH: linux/amd64
ARG ROOT_CONTAINER=ubuntu:bionic-20200311@sha256:e5dd9dbb37df5b731a6688fa49f4003359f6f126958c9c928f937bec69836320

まずは、初めに挙げていた条件の Ubuntu 16.04以降の環境 はこれでクリアしている事が分かりました。
また、このDockerfileには以下の記述もあります。

# Install conda as jovyan and check the md5 sum provided on the download site
ENV MINICONDA_VERSION=4.8.2 \
    MINICONDA_MD5=87e77f097f6ebb5127c77662dfc3165e \
    CONDA_VERSION=4.8.2

RUN cd /tmp && \
    wget --quiet https://repo.continuum.io/miniconda/Miniconda3-py37_${MINICONDA_VERSION}-Linux-x86_64.sh && \
…

Python 3.7がインストールできるMinicondaが入っている事が分かりました。
あれ、条件に挙げていた Anaconda ではないじゃないかと思われた方もいるかもしれません。
今回、本題からは逸れてしまうので詳細は省きますが、MinicondaはAnacondaの縮小版のようなPythonディストリビューションで、具体的には初期導入されるパッケージがAnacondaよりも少なくなっています。
使いたいパッケージは後からパッケージマネージャであるcondaを利用してインストールする事ができます。
よって、 MinicondaはAnacondaよりも容量が小さく、今回のようなコンテナに導入する時により適したPythonディストリビューション であると考えられます。
今回はJupyter Notebookが動く環境がゴールなので、Minicondaで十分対応できます。
個人的にはDockerイメージでMinicondaを使うという考え方がコンテナに即した考え方で素敵だなと思いました。
コンテナほぼ未経験の初心者がそのように感じられたのは、つい最近社内でコンテナ初心者向けの勉強会があり、そこで聞いたコンテナの考え方と近しい思想で「 あ!これコンテナ勉強会で聞いたやつだ! 」となった為です。ありがたい限りです。

Dockerコンテナを起動させる環境を用意する

AWSでコンテナといえば Amazon ECS
今回はなるべく簡単にJupyter Notebook環境を用意するのが目的なので、サーバをあまり意識する必要の無い AWS Fargate を利用していきます。
ECS自体は触った事があったのですが、Fargateは今回初めて触ります。
FargateにDocker Hubと初めてのもの尽くしですが、とにかく手を動かしてみたいと思います。

実際にDockerコンテナを起動してJupyter Notebookを利用する

今回のゴールです。早速、次からやっていきましょう。

FargateとDocker HubでJupyter Notebook環境を用意する

今回の目的とやりたい事についてはここまででお話し尽くしたので、後はひたすら手を動かします。

作業手順

今回は、以下の作業を実施します。

  1. タスク定義を作成する
  2. クラスターを設定する
  3. サービスを設定する

これでFargateが起動したら、Jupyter Notebookを利用する為の作業を実施します。

  1. セキュリティグループの設定を変更する
  2. Jupyter Notebookにアクセスしてみる
  3. 環境の片付け

1. タスク定義を作成する

今回は、Fargateのタスク定義を作成します。


▲ まずは新規作成


▲ Fargateを選んで進める

今回は、元々ECSを利用した事があった為CloudWatchコンテナのログを吐き出す時に利用するIAMロールが作成されていた事からそのロールを選択しています。


▲ 初めての場合でも、ここからIAMロールが作成できる

今回は、最小のメモリ・CPUサイズでタスクを作成します。


▲ どちらかを決めると、選択できるそれぞれのサイズを教えてくれる

ここでようやくDockerイメージを追加するのですが、個人的にはDocker Hubを利用する事が初めてで一番勝手が分からなかったところがここでした。


▲ Dockerイメージってどう指定すれば良いの?と一度詰まった

Dockerイメージの書式については、Docker Hubから該当イメージの「Tags」タブを開くと確認できます。


▲ この形式で記載しましょう

ここまで完了すれば、タスク定義の作成ができます。

2. クラスターを設定する

次にクラスターを設定します。


▲ 力強くFargateと記されたテンプレートを選択

クラスター名を入力して、クラスターを作成しましょう。
先ほどと比べると、ここはサクッと完了したかと思われます。
この調子で進めていきます。

3. サービスを設定する

先ほど作成したクラスターを選択して、ここからサービスを設定します。


▲ ここが終わればFargateのタスクが起動します、後少し

1.で作成したタスク定義を選択し、必要なタスク数を定義します。


▲ 一旦テストで1つ立ち上げたいので「1」を入力

後は、ネットワークの設定をすれば完了です。


▲ 今回は元々あったネットワークを利用。セキュリティグループは自動で作成されます

Fargateの環境自体は、これで準備完了です。
ここからは、Fargateタスク上にあるJupyter Notebookに接続する為の準備を進めましょう。

4. セキュリティグループの設定を変更する

先ほど作成したサービスを選択し、セキュリティグループの設定を変更します。


▲ 自動で作成されたセキュリティグループがある

今回は、Jupyter Notebookへ接続する為に必要な「8888ポート」を設定します。


▲ 懐かしの旧UIに飛ばされた

これで全ての準備が整いました。いよいよJupyter Notebookとの対面です。

5. Jupyter Notebookにアクセスしてみる

起動しているタスクを選択して、アクセスに必要なパブリックIPアドレスを確認します。


▲ 今、会いにいきます

Chromeからhttp://パブリックIPアドレス:8888 にアクセスしてみます。


▲ イエーイ!あれ?私が知っているJupyter Notebookとちょっと違う

どうやら、ログイン用のパスワードの設定もしくはトークンが必要なようです。
そんなものあったっけ……と思いつつ、コンテナのログを取得している為サービスの「Logs」タブから確認します。


▲ ちゃんとログに出力されていました!やったね!

トークンを確認したら、先ほどの画面に戻り入力してログインしましょう。


▲ 勝利!

後は、いつも通りJupyter Notebookを使いましょう。

6. 環境の片付け

使い終わった環境は削除するか、タスク定義の必要数を「0」に更新してタスクを停止しましょう。


▲ タスク定義と実際のタスクが0になっている事を確認しましょう

環境を削除する際は、ECSのコンソール上から削除できる範囲だと セキュリティグループの削除が実施されません
完全に環境を片付けたい場合は、別途セキュリティグループの削除を実施する事を忘れないようにして下さい。


▲ 検証で生まれていたセキュリティグループの残滓たち

欲しいものが手に入ると、楽しい

今回は、勉強がてらFargateとDocker Hubを用いてJupyter Notebook環境を作ってみました。

「綺麗なJupyter Notebook環境が欲しいけど、そこまでの事はやってないし良いか……」と先延ばしにしてしまっていた事がちょっと恥ずかしいです。
触ってみると、マネージドな面が大きいFargateは便利だし、Docker Hubに必要なDockerイメージは揃っているしで初めてでもサクサクと環境構築ができました!
一回手でやって感覚を掴んだので、今度はCloudFormationを作ってより効率良く作業を進められるようにしたりもしたいなと思いました。一回慣れるとモチベーションがぐんと上がる事を体感させられています。
勿論、機械学習でJupyter Notebookを用いたい時はSageMakerでより簡単に環境を構築する事をお勧めします。

この記事は、FargateやDocker Hubを触ってみたいけど最初の一歩が踏み出せていない人のお役に立てれば幸いです。