【ハッカソンで使える!】AzureやAWSなどの仮想マシン上にFlaskサーバーをデプロイする


こんなあなたに

  • PythonでWebサーバーを構築して公開したい
  • 深層学習を使用したAPIサーバーを作りたい

ハッカソンでFlaskを使ってAPIサーバーを構築するために色々調べてやったので,イチからまとめました.

前提

  • Azure, AWS, GCPなどで,仮想マシンを作成済み
  • ssh接続ができている
  • 80番ポートが開放されている
  • OSはUbuntu18.04

環境

  • AWS EC2インスタンス
  • Ubuntu18.04

本編

1. 必要なパッケージのインストール

# apache2のインストール #
$ sudo apt install apache2 apache2-dev

# Pythonのインストール #
$ curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
# 最後に表示される設定を~/.bashrcに記述

# インストール可能なanacondaのバージョンを表示
$ pyenv install -l | grep anaconda
# anacondaをインストール
$ pyenv install anaconda3-5.3.1
# anacondaを有効化
$ pyenv global anaconda3-5.3.1

# anacondaの環境を作成
$ conda create -n <hoge> python=3.6
$ conda activate <hoge>
# flask, mod_wsgiのインストール
$ conda install flask
$ pip install mod_wsgi

2. flaskを使ったアプリケーションを作成

/var/www/以下にflask_appディレクトリを作成し,以下のファイルを配置する.

/var/www/flask_app/app.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, Flask!"

if __name__ == "__main__":
    app.run(host='0.0.0.0')
/var/www/flask_app/adapter.wsgi
import sys
sys.path.insert(0, '/var/www/flask_app')

from app import app as application

3. apache2の設定ファイルを追加する

/etc/apache2/conf-available/flask.conf
LoadModule wsgi_module /home/<user>/.pyenv/versions/anaconda3-5.3.1/envs/<hoge>/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so
WSGIPythonHome /home/<user>/.pyenv/versions/anaconda3-5.3.1/envs/<hoge>/
<VirtualHost *:80>
  ServerName <server-ip>:80
  DocumentRoot /var/www/flask_app
  WSGIDaemonProcess flask_app user=<user> group=<user> threads=5
  WSGIScriptAlias / /var/www/flask_app/adapter.wsgi
  <Directory "/var/www/flask_app/">
    WSGIProcessGroup flask_app
    WSGIApplicationGroup %{GLOBAL}
    WSGIScriptReloading On
    Require all granted
  </Directory>
</VirtualHost>

上記はあくまで一例です.
<user><hoge>, <server-ip>の部分はそれぞれ,ログインユーザー,anacondaの環境名,サーバーのIPアドレス(ドメイン)に適宜補完してください.
また,LoadModuleWSGIPythonHomeも環境によって異なることがあります.

LoadModuleの求め方

flaskをインストールした環境を有効にした上で以下のコマンドを実行するとパッケージがインストールされているディレクトリが出てくる.

$ python -c "import sys; print(sys.path)"

その中から,mod_wsgiを探し,パスを確認する.タブ補完していくと間違わない

$ ls /home/<user/.pyenv/versions/anaconda3-5.3.1/envs/<hoge>/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

4. 追加した設定ファイルを有効化する

$ sudo a2enconf flask

5. apache2の再起動

$ sudo systemctl restart apache2.service

接続確認

ブラウザで,http://<server-ip>にアクセス.(httpsではないので注意)
Hello, Flask!と表示されれば成功です.

接続できない・エラーが発生するときは.

  • 仮想マシンの80番ポートが開放されているかを確認する
    • サーバーのコンソールから設定できるはず
  • internal errorとかが出たらとりあえず以下を確認してみる.
$ sudo systemctl status apache2.service

$ sudo tail /var/log/apache2/error.log

Future work

  • SSL対応