楽屋

Azure Container Instances でお手軽にクローラー実行環境を作成

はじめに

Azure Container Instancesは Docker コンテナを動作させることができる環境です。 Azure Container Service(AKS)は複数コンテナのオーケストレーションを可能にしますが、 Azure Container Instances は単一のコンテナをデプロイして実行するのに向いています(注:複数のコンテナを実行ができないという意味ではありません)。本稿では、 Azure Container Instances を利用して、簡単にクローラーを作成する方法を紹介します。

なお、 Azure Container Instances は 2018 年 3 月現在プレビュー版での提供となっているため、今後本稿の手法が再現できなくなることもありますが、あらかじめご承知おきください。

作業の流れ

以下の流れでクローラーを作成します。なお、 Azure CLI および Docker はすでにインストールされているものとします。

  1. Docker イメージの準備
  2. ストレージの準備
  3. インスタンスの作成
  4. クローラーの作成と実行

下記では主に Azure CLI のコマンドラインで実行していますが、ポータルでも簡単なクリック操作で実行することができます(例外あり)。

Docker イメージの準備

クローラーを実行する基盤は Jupyter Notebook とします。コンテナ化させた Jupyter Notebook 上クローラーの処理を作成し、実行させることでデータの収集を行います。

Dockerfile を作成します。ここでは miniconda を利用して Jupyter Notebook をインストールする例を示します。必要に応じてフォントなど必要なパッケージがあれば追加してください。

作成した Dockerfile をビルドします。

作成した Docker イメージをレジストリーに登録します。ここでは登録先に Azure Container Registry を選択します。

現時点では Azure Container Instances が Azure Container Registry から Docker イメージを pull できるためには、 Azure Container Registry の admin user を有効にする必要があります。以下は Azure CLI を用いて Azure Container Registry を新規作成し、作成した Docker イメージを push するまでの例です。

ストレージの準備

Docker のコンテナを用いる際に、データの永続化が必要な場合にデータボリュームコンテナを作成するように、 Azure Container Instances もデータの永続化が必要であればストレージを作成する必要があります。

Azure Container Instances がデータの永続化を可能にする方法は複数ありますが、 Azure Files 経由で行うのが最も単純でしょう。 Azure Files はストレージアカウントを作成してファイル共有を作成します。

ファイル共有は最大 5 TiB(5,120 GB)で、それ以上のデータの蓄積はできないことに注意しましょう。

ちなみにファイル共有のポータルでの作成方法は、本ブログの「Azure Files でお手軽ファイル共有」に詳しく書かれています。

インスタンスの作成

登録した Docker イメージを Azure Container Instances にデプロイします。この際、先程作成したファイル共有に接続してインスタンスからファイルを保存できるようにします。

現時点では、インスタンス作成時にファイル共有への接続を行うことはできませんので、この操作はコマンドラインで実行する必要があります。なお、ファイル共有(つまりインスタンスを停止してもファイルが残る状態にする)が不要であれば、ポータルからも実行できます。

しばらくすると、インスタンスが動き出すので、ウェブブラウザーからコンテナにアクセスします。上記コマンドの結果に fqdn という完全なドメイン名が含まれるので、 http://<ドメイン名>:8888 にアクセスすると Jupyter Notebook のログイン画面が表示されます。 Jupyter Notebook にログインするための必要なトークンはコンソールに出力されるため、 Azure CLI でログを取得します。

クローラーの作成と実行

Jupyter Notebook にアクセスすると、 data というフォルダーが表示されます。 Docker イメージの設定で /notebooks をワーキングフォルダーに設定し、インスタンスの作成時に /notebooks/data をファイル共有のマウントパスに指定しているため、この data フォルダーにファイルを保存すると、ストレージアカウント上のファイル共有にもファイルが保存されます。

Jupyter Notebook はバックグラウンド実行が可能であるため、クローラースクリプトを記述し、実行・保存すればあとはインスタンス上で実行が継続し、データは自動でストレージアカウントに保存されます。以下にサンプルとして単純な JSON を 1 分おきにファイルに吐き出すだけの例です。

何かストレージに接続するための特別な記述もなく、ローカルマシンで実行するのと完全に同じように記述できることがわかると思います。 Jupyter Notebook はファイルのアップロード機能もあるので、ローカルマシン上で作成した試験用のノートブックを、 Azure Container Instances にアップロードして継続実行させるようなことも簡単ですね。必要なライブラリーは Dockerfile であらかじめイメージに含めておく、ノートブック上で pip 経由でインストールさせれば良いでしょう。

まとめ

本稿では、 Azure Container Instances を中心にしたクローラーの作成方法を解説しました。 Azure Container Instances は単純な Docker コンテナの実行環境であり、 Jupyter Notebook 上でクローラーを実現することが簡単にできます。コンテナで面倒なファイルの永続化もファイル共有を利用することで、クローラーのコードに特別な変更を加えることなく実現できます。

Azure Container Instances はまだプレビュー版でポータルで実現できないことも多いのですが、そのうち改善されていくことと思います。今の段階でも少しのコマンドを要求されるだけで便利になるので、ぜひ使ってみて下さい。

参考文献