TSUBOCK★LABO-ツボックラボ-

とあるセキュリティエンジニアの技術メモブログ

MENU

HerokuにFlaskアプリをアップロードして動かしてみた。

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にデプロイができちゃいました。何かアプリ作って動かしてみたいなぁ

参考サイト