Dashで作成したアプリをHerokuにデプロイ


はじめに

Dashで世界遺産を世界地図にプロットでアプリを作成してみたので、Heroku を使ってデプロイしてみる。準備はGetting Started on Heroku with Pythonを、Dash アプリのデプロイはDeploying Dash Appsを参考に進める。実行環境は以下の通り。
- Windows10 Pro
- Python 3.7.6
- Anaconda 4.9.2

コマンドライン上で行うものはすべて Anaconda Prompt で実行している。

準備

Heroku にデプロイするにあたり、以下が必要となる。
- Git
- Heroku Command Line Interface (CLI)

Git はすでにインストールしてあるため、Heroku CLI をインストール。Getting Started on Heroku with Pythonにインストーラがあるので、該当するものをダウンロードし、インストールする。インストールはデフォルトのまま行った。

Anaconda Prompt 上で $ heroku login コマンドを実行すると、ウェブブラウザが立ち上がるのでログイン(アカウントがない場合は作成)する。ログインが完了したらこのブラウザは消しても問題ない。

Dash アプリのデプロイ

Deploying Dash Appsに従って進める。なお、仮想環境は venv ではなく Anaconda を用いている。

1. プロジェクトディレクトリの作成

$ mkdir world-heritage-cite
$ cd world-heritage-cite

2. Git によるディレクトリの初期化

test はもともと使用していた仮想環境。デプロイには gunicorn が必要となるため、インストールする。

$ git init
$ conda activate test
$ pip install gunicorn

3. app.py, .gitignore, requirements.txt, and Procfile の作成

app.py

app.py はDashで世界遺産を世界地図にプロットで作成したものを data とともにそのまま置く。名前は必ず app.py である必要があるようなので、名前を変更しておく。また import osserver = app.server の二文をプログラムに追記しておく。

.gitignore

参考記事とは違いがあるので、いくつか削除して作成。正直理解していないので、詳しい方いたらコメントください。

# venv       # venv は使用していない
*.pyc
# .DS_Store  # Mac OS 特有のもの(?)
.env         # 正直よくわかっていないので残しとく

Procfile

以下内容で作成。

web: gunicorn app:server

requirements.txt

$ pip freeze > requirements.txtで自動で生成されるとのことだったが、以降で行う 4 のプッシュ時にエラーを吐いたので、自分で書く。(Anaconda を使っているので、pip freeze がうまく機能しないのかも。)

dash
dash-core-components
dash-html-components
gunicorn
numpy
pandas
plotly

4. Heroku の初期化、Git へのプッシュ、デプロイ

以下コマンドを実行。(余談ですが Windows は ' ' だとエラーを吐くようなので、" " を使う必要があるらしい。)

$ heroku create whc-app
$ git add .
$ git commit -m "Initial commit"
$ git push heroku master
$ heroku ps:scale web=1

https://whc-app.herokuapp.comに接続するもエラー。

heroku logs --tail でエラーログを見てみると、app.py での単純なプログラムのミス(データの読み込みをローカルにおける絶対パスにしていた)ためだった。修正後はうまく動いた。次は Heroku でのデプロイができたので、AWS におけるデプロイなども試したい。