FlaskアプリケーションをHerokuにデプロイする

このチュートリアルでは、FlaskアプリケーションをHerokuにデプロイする方法を学びます。アプリは “Hello World” アプリのようなシンプルなものから、ソーシャルメディアモニタリングプラットフォームまで様々です!

今日、より多くの人にリーチするためのWebアプリを持たないビジネスはありませんし、オンラインポータルを介してサービスを提供することもできます。

今日は、Herokuにアプリをデプロイするためのケーススタディとして、Flaskを使ってAPIを作る方法を学びます。

FlaskでREST APIを構築する

プロジェクトディレクトリで、まず virtualenv を作成します。

$ python -m venv venv/


そして、sourceコマンドで起動しましょう。

$ source venv/bin/activate


次に、pip を使って、アプリをビルドするための flask と、サーバーとして gunicorn というライブラリーをインストールしましょう。

$ pip install flask
$ pip install gunicorn


私たちのアプリケーションは、名前を受け取ってウェルカムメッセージを返すシンプルなAPIになる予定です。

# app.py
from flask import Flask, request, jsonify
app = Flask(__name__)


@app.route('/getmsg/', methods=['GET'])
def respond():
    # Retrieve the name from url parameter
    name = request.args.get("name", None)


# For debugging
    print(f"got name {name}")


response = {}


# Check if user sent a name at all
    if not name:
        response["ERROR"] = "no name found, please send a name."
    # Check if the user entered a number not a name
    elif str(name).isdigit():
        response["ERROR"] = "name can't be numeric."
    # Now the user entered a valid name
    else:
        response["MESSAGE"] = f"Welcome {name} to our awesome platform!!"


# Return the response in json format
    return jsonify(response)


@app.route('/post/', methods=['POST'])
def post_something():
    param = request.form.get('name')
    print(param)
    # You can add the test cases you made in the previous function, but in our case here you are just testing the POST functionality
    if param:
        return jsonify({
            "Message": f"Welcome {name} to our awesome platform!!",
            # Add this option to distinct the POST request
            "METHOD" : "POST"
        })
    else:
        return jsonify({
            "ERROR": "no name found, please send a name."
        })


# A welcome message to test our server
@app.route('/')
def index():
    return "<h1Welcome to our server !!</h1"


if __name__ == '__main__':
    # Threaded option to enable multiple instances for multiple user access support
    app.run(threaded=True, port=5000)


ローカルでアプリケーションをテストするために、http://127.0.0.1:5000/ のエンドポイントをヒットしてみましょう。何も問題がなければ、ウェルカムメッセージが表示されるはずです。

http://localhost:5000/getmsg/?name=Mark` のように、パラメータとして名前を送ることもできます。

{"MESSAGE":"Welcome Mark to our awesome platform!!"}


アプリケーションの準備ができたら、Herokuにデプロイしてみましょう。

Heroku

Heroku は最初の PaaS (cloud platform as a service) の一つで、Ruby, Java, Node.js, Scala, Clojure, Python, PHP, Go という複数の言語をサポートしています。

まず最初に、アプリケーションが使用するライブラリを定義する必要があります。そうすれば、Herokuは、アプリを開発するときにローカルにインストールするのと同じように、どのライブラリを提供すればよいかを知ることができます。

これを実現するには、すべてのモジュールを含む requirements.txt ファイルを作成する必要があります。

$ pip freeze &gt; requirements.txt


このようにして、使用するライブラリとそのバージョンを含む requirements.txt ファイルを完成させます。

Click==7.0
Flask==1.1.1
gunicorn==19.9.0
itsdangerous==1.1.0
Jinja2==2.10.1
MarkupSafe==1.1.1
Werkzeug==0.15.6


注意:よくある間違いのひとつに、requirements のスペルミスがあります。何時間もコードをデバッグして、サーバーがモジュールをダウンロードしなかったためにアプリが動作しないことに気がつくと、本当につらいものです。Heroku が使用しているモジュールを知る唯一の方法は、requirements.txt ファイルにモジュールを追加することです。

Herokuがアプリケーションを正常に動作させるためには、事前に実行すべきプロセス/コマンドを定義しておく必要があります。これらのコマンドは Procfile に記述されています。

web: gunicorn app:app


webコマンドは、Heroku にgunicornを使ってアプリケーション用の Web サーバを起動するように指示します。アプリケーションの名前はapp.pyなので、appの名前もapp` にしました。

Herokuアカウント

さて、Herokuのアカウントを作成しましょう。

ダッシュボードで、New – Create new appを選択します。

アプリケーションの名前を決め、ホストする地域を選びます。

Heroku上にアプリケーションが作成されたら、それをオンラインにデプロイする準備ができました。

Git

コードをアップロードするために、Gitを使用します。まず、Gitのリポジトリを作成します。

$ git init .


そして、ファイルを追加して commit してください。

$ git add app.py Procfile requirements.txt
$ git commit -m "first commit"


Herokuにアプリをデプロイする

最後にアプリケーションをデプロイするために、Heroku関連のコマンドを実行するHeroku CLIをインストールする必要があります。コマンドを実行して、アカウントにログインしてみましょう。

$ heroku login -i


または、ブラウザーを使ってログインすることもできます。

$ heroku login


この時点で、ログインした状態で、リポジトリをリモートのリポジトリに追加してください。

$ heroku git:remote -a {your-project-name}


Your-project-name}` は、先ほどのステップで選択したプロジェクトの実際の名前に置き換えてください。

これで、プロジェクトをHerokuにプッシュしてアップロードしましょう。

$ git push heroku master


ターミナルに長い進捗ログが表示され、次のように終了します。

...
remote: -----&gt; Discovering process types
remote:        Procfile declares types -&gt; web
remote:
remote: -----&gt; Compressing...
remote:        Done: 45.1M
remote: -----&gt; Launching...
remote:        Released v4
remote:        https://{your-project-name}.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/{your-project-name}.git
   ae85864..4e63b46  master -&gt; master


おめでとうございます、あなたは最初のウェブアプリをHerokuにアップロードすることに成功しました。さて、いよいよAPIのテストと検証です。

API のテスト

コンソールに表示されたログには、アプリケーションのリンクとして https://{your-project-name}.herokuapp.com/ が表示されています。このリンクは、[設定] タブの [ドメインと証明書] セクションにも表示されています。

このリンクをクリックすると、アプリケーションがオンラインになり、公開されます。

エラーが発生した場合、ログにアクセスし、そこからトラブルシューティングを行うことができます。

URLを入力し、/getmsg/ルートのパスを追加すれば、ブラウザでアプリを手動でテストすることができます。しかし、アプリケーションがだんだん複雑になってくると、Postmanのようなツールを使うことをお勧めします。

それでは、アプリケーションへの GET リクエストに name パラメータを付けてテストしてみましょう。

では、例えば /newurl のように、どの関数にもバインドされていない URL を GET リクエストでテストしてみましょう。

予想通り、Flaskアプリは404レスポンスを返しました。

Note: 出力のビューは、Pretty、Raw、Previewから変更することができます。

それでは、 POST リクエストをテストしてみましょう。

また、name パラメータを完全に省略するとどうなるかを見てみましょう。

{"ERROR":"no name found, please send a name."}


アプリをテストして、すべてが正常に動作していることを確認しました。サーバーの履歴やどのようなリクエストが行われたかを確認するには、Heroku経由でサイトのログを確認することができます。

ここでは、ページ /post/ に対して行われた POST リクエストを見ることができます。

また、アプリケーションの構築の履歴も見ることができます。さらに、構築中に何か問題が発生した場合は、ログページで確認することができます。

結論

この記事では、Flaskマイクロフレームワークを使用してHeroku上で最初の簡単なAPIを構築する例を示しました。開発プロセスは、アプリケーションの構築を続けても変わりません。

Herokuは無料プランと学生プランを提供しています。無料プランは制限がありますが、例えばスタートアップのアプリ、POC、またはシンプルなプロジェクトにはかなり有効です。しかし、あなたのアプリケーションを拡張したい場合は、ここからサイト上で利用可能なプランのいずれかを検討することをお勧めします。

Herokuの詳細については、Herokuのマニュアルを参照してください。

タイトルとURLをコピーしました