はじめに
HerokuでOpenCVを扱いたい場合、従来はDockerfileを用意してデプロイする必要がありましたが、heroku.ymlの登場によりよりお手軽にデプロイできるようになりましたので紹介します。
環境
OpenCVを使わない場合のPython Flask アプリケーションのデプロイ
Herokuは、GitHubのように、Heroku上のリポジトリにソースコードをPushすると自動的にビルドしてWebアプリケーションを公開してくれます。
今回はPythonのFlaskというWebフレームワークを利用してWebサービスを公開しようと思っています。まずはOpenCVを使わない場合を考えます。Flaskのアプリケーションをデプロイする場合、リポジトリのrootに以下の3つのファイルが必要です。
- runtime.txt
- requirements.txt
- Procfile
また以上の3つのファイル以外に当然アプリケーションのコードが必要です。順に簡単に説明します。
アプリケーションコード
まずアプリケーションコード(Flask)の本体として main.py
を用意します。今回は凄くシンプルなものを用意しました。
# -*- coding: utf-8 -*- import os from flask import Flask @app.route("/") def index(): return "Hello Flask" if __name__ == "__main__": port = int(os.environ.get("PORT", 5000)) app.run(port=port, debug=True)
Herokuでアプリケーションを動かす場合は、シェルの環境変数で指定されたポートで動かす必要がありますので、なんらかの方法でポート番号をPythonに渡してやる必要があります。今回はPythonのコード上でシェルの環境変数からポート番号を取ってくるようにしています。
runtime.txt
runtime.txt の中身は以下の通りです。
python-2.7.14
アプリケーションコードの実行環境を書くだけです。
requirements.txt
Pythonの場合必要なやつです。pipでインストールするやつを書きます。
Flask==0.10.1 gunicorn==19.7.0
こういう感じで。
Procfile
Webアプリケーションの起動方法を書きます。今回はこういう感じになります。
web: gunicorn app:app --log-file=-
デプロイ
これらのファイルを配置します。
$ ls app.py Procfile runtime.txt requirements.txt
git remoteにherokuが追加されていることを確認してpush(herokuの追加方法はここでは省略)。
$ git remote -v heroku https://git.heroku.com/xxxxx.git (fetch) heroku https://git.heroku.com/xxxxx.git (push) $ git push heroku master
これで xxxx.herokuapp.com にアクセスすると Hellow Flask が動くはずです。
このままだとOpenCVが使えない
このままだとopencvは使えません。python-opencv自体はrequirements.txt
に追加すれば利用できるようになるのですが、opencv本体がheroku側にインストールされていないので動かないのです。
Flask==0.10.1 gunicorn==19.7.0 numpy==1.13.1 opencv-python==3.3.0.10
ではどうしたらいいのでしょうか。
従来はDockerを使ってデプロイしていました。
従来はDockerを使ってデプロイしていました。
しかしDockerは触れたことがない人にはなかなか難解ですし、とくにherokuのDockerデプロイはかなり難解でした。僕は結局Dockerを使ってのデプロイ方法が分からず投げました。
Dockerの変わりにheroku.yml が使える
実は、heroku.yml
を書くと、Dockerを利用しなくても、opencvがインストールされている環境を簡単にheroku上に用意できることがわかりました。
heroku.yml とは
公式の解説はこちらです。
公式のサンプルはこのようになっています。
build: languages: - ruby packages: - imagemagick run: web: bundle exec puma -C config/puma.rb
heroku.ymlでOpenCVが動くheroku環境を構築する
公式の解説を読むと、Procfile
のかわりにheroku.yml
を用意しろと書いてありました。そこで、herokuでPython2 + OpenCVを動かすにはこうします。
build: languages: - python packages: - libopencv-dev run: web: gunicorn app:app --log-file=-
packages
のところにlinopencv-dev
を書くと、デプロイ時にapt-get install
でOpenCVがインストールされます。これでOpenCVが使えるようになります。Dockerfileよりもずっと簡単ですよね。
Procfile
の中身はheroku.yml
のrun
の所に書いてありますので、これでProcfile
は必要なくなりましが、runtime.txt
とrequirements.txt
は必要なので注意してください。また。Procfile
とheroku.yml
が両方存在する場合、heroku.yml
が優先されるので、一旦Procfile
は消さずに放置しておいても構いません。
デプロイ方法は、heroku.yml
をリポジトリのルートディレクトリに置いてpushするだけです。今回はとりあえずProcfileはそのままデプロイしました。
$ ls app.py heroku.yml Procfile runtime.txt requirements.txt $ git add heroku.yml $ git commit $ git remote -v heroku https://git.heroku.com/xxxxx.git (fetch) heroku https://git.heroku.com/xxxxx.git (push) $ git push heroku master
pushすると、runtime.txt
を元にpython2がインストールされ、heroku.xml
を元にpackages
がインストールされ、requirements.txt
が解決されたうえでアプリケーションが起動します。パッケージのインストールなどが挟まるのでデプロイ時間は結構長くなってしまうのですが、Dockerfileよりも断然お手軽です。
OpenCV以外もheroku.yml
でインストールできるパッケージは多数あると思うので是非ためしてみてください。
まとめ
まだdeveloper preview版ですが、heroku.yml
を使い、Dockerを使うことなくheroku上にOpenCV環境を整える方法を紹介しました。かなりざっくりで、本当はちゃんとリポジトリとか公開できると良いのですが、僕もまだちょっと試したばかりなので公開できるようなものがありません><。もし漏れなどありましたらご指摘頂ければと思います。(公式のドキュメントみるとまだPython対応してないようで、もしかしたらDockerコンテナのpushとかも必要?)
Herokuは規模小さなアプリケーションのデプロイであれば無料で使えますので、ぜひ活用してみてください。
詳解 OpenCV ―コンピュータビジョンライブラリを使った画像処理・認識
- 作者: Gary Bradski,Adrian Kaehler,松田晃一
- 出版社/メーカー: オライリージャパン
- 発売日: 2009/08/24
- メディア: 単行本(ソフトカバー)
- 購入: 17人 クリック: 272回
- この商品を含むブログ (35件) を見る
プロフェッショナルのための 実践Heroku入門 プラットフォーム・クラウドを活用したアプリケーション開発と運用 (書籍)
- 作者: 相澤歩,arton,鳥井雪,織田敬子
- 出版社/メーカー: KADOKAWA/アスキー・メディアワークス
- 発売日: 2014/09/19
- メディア: 大型本
- この商品を含むブログ (3件) を見る