Herokuで動かされているアプリの挙動が知りたくて、自分で簡単なFlaskアプリを作成してアップロードして動かしてみた。
確認環境
macOS Big Sur : 11.2.3
事前準備
Herokuを使うのに必要なことを順に挙げてみた。
- Herokuアカウント作成
- ローカル環境の準備
- アップロードするWebアプリの用意
- gitリポジトリの作成
- Herokuアプリの作成
- Herokuへアプリをデプロイする
- 動作確認
Herokuアカウント作成
Herokuの公式サイトにアクセスし、アカウントを作成する。すでにアカウントを持っている場合はここはスキップしても問題ない。
ローカル環境の準備
手元の環境にHeroku CLIをインストールする。今回はmacOS上に用意する。
https://devcenter.heroku.com/ja/articles/heroku-cli
上記には
Heroku CLI には、一般によく使われている Git というバージョン管理システムが必要です。まだ Git をインストールしていない場合、CLI をインストールする前に以下を完了してください。
とあるので、Gitがインストールされていないようであれば、先にインストールしてください。
すでにインストール済みであればHeroku CLIのインストールを実施します。
brewで導入しようとしましたが、gccをインストールしてくれエラーが出て、gccをインストールして再挑戦してもgccをインストールしてくれエラーが出るので、上記のインストーラーからインストールしたら問題なくインストール完了できました。
アップロードするWebアプリの用意
今回はアクセスしたときのRequestHeaderを表示するだけの簡単なFlaskアプリを作成します。
from flask import Flask, Response, request import os FLAG: str = os.environ.get("FLAG") or "flag{fake_flag}" app: Flask = Flask(__name__) def text_response(body: str, status: int = 200, **kwargs) -> Response: return Response(body, mimetype="text/plain", status=status, **kwargs) @app.route("/") def main_page() -> Response: print("************************") print(request.headers) return text_response(str(request.headers), 200) if __name__ == '__main__': app.run(debug=True)
デプロイ資材の作成
動作させるアプリケーションをheroku環境にデプロイするために、アプリケーションで使用している外部モジュールのリストを生成する必要があります。
pipで直接インストールしている場合は下記コマンドで出力をさせます。
$ pip freeze > requirements.txt
私はpoetryでパッケージ管理をすることが多いので、
$ poetry export -f requirements.txt > requirements.txt
こちらのコマンドでrequitremments.txtを生成します。
gitリポジトリの作成
アプリケーションのあるディレクトリをgitリポジトリとして初期化します。
$ git init $ git add . $ git commit -m "commit message."
Herokuアプリの作成
Herokuにログインを行い、Herokuアプリを作成します。
まずは heroku login
コマンドを実行します。
$ heroku login heroku: Press any key to open up the browser to login or q to exit: Opening browser to https://cli-auth.heroku.com/auth/cli/browser/ed9a26c0-f7b2-439f-aa28-2a12d2244171?requestor=SFMyNTY.g2gDbQAAAA0xMjQuMjE1LjMyLjU0bgYAsx1UnXgBYgABUYA.bppHvmZAG_p-vg1q00Wb8UHKbw48d57B6QwYr8R8QGk heroku: Waiting for login... ⣻
実行するとbrowserで開いてよいか聞いてくるのでEnterを押すと、browserでHerokuのログイン画面が開きます。
ボタンを押して、loginを実行するとコンソール側にレスポンスが返ります。
Logging in... done Logged in as <登録アカウント>
herokuにアプリケーションを作成するため、heroku createコマンドを実行します。
$ heroku create › Warning: heroku update available from 7.35.0 to 7.51.0. Creating app... done, ⬢ cryptic-earth-07674 https://cryptic-earth-07674.herokuapp.com/ | https://git.heroku.com/cryptic-earth-07674.git
これでheroku側の設定は完了です。
Herokuへアプリをデプロイする
Herokuにローカルのアプリをデプロイしてみましょう。先程の heroku create
コマンドでリモートリポジトリが作成されているので、アプリをPushしましょう。
$ git remote heroku $ git push heroku master
これでheroku側にWebアプリがデプロイされました。
動作確認
heroku open
コマンドを使うとブラウザが起動して、デプロイしたアプリへアクセスできます。
$ heroku open
[おまけ]herokuアプリのログを確認する。
自分がアップロードしたアプリの標準出力結果を確認するすべがわからん!
と調べてみたところ下記コマンドでログとして確認できるようです。
$ heroku logs
ちなみに -t
オプションを使用すると tail -f
のようにリアルタイムにログを出力させられます。
$ heroku logs -t
[おまけ]herokuアプリを停止する
herokuアプリを公開しているとアクセスされるだけでdynoが消費されてしまうので、使用していなければ止めたほうがいいと思いますので、停止方法についても調べてみたところ、使っていないHerokuアプリを停止してdynoの消費を節約するに記載されているとおりで行けそうです。
herokuはデフォルトで30分間アクセスがないと停止という仕様になっていますが、そもそもアクセスをさせないようにするにはdynoを0にするという認識のようです。
だそうですが、
リソース画面からdynoを停止するだけ
探してみれば簡単でした。
Herokuのダッシュボードのアプリ>リソース画面で、鉛筆マークを押して、ボタンをオフにするだけです。
これでdynoが0になるようです。
これだけで良いそうです。
また、herokuコマンドでdynoを0にすればいいそうなので、
$ heroku ps:scale web=0
dynoを0にすると停止するので、アクセスするとエラーになるようです。
まとめ
ということでherokuを使ってみました。結構難しそうだと思って敬遠してたのですが、意外とそんなに難しくなくherokuにデプロイができちゃいました。何かアプリ作って動かしてみたいなぁ