Heroku スターターガイド (Python) | Heroku Dev Centerチュートリアルを通して躓いた箇所と理解した内容をメモしたもの。
Herokuとは
Heroku の概要 単元 | Salesforce Trailhead
HerokuはSalesforceのクラウドサービスの一つ。PaaS。
AWS, Heroku, Salesforce
- AWSはIaaS。ハードウェアまたは仮想ベアメタルリソース(ソフトウェアがインストールされていない、まっさらな状態)だけをユーザに提供する。
- HerokuやLightning PlatformはPaaS。
- SalesforceはSaaS。SaaSはローカルにソフトをインストールすることなく、クラウドからソフトウェアを使うことができる。
SaaSはPaaSの上に構築され、PaaSはIaaSの上に構築される。 HerokuはAWS上に構築されているPaaSの一種。
Salesforce, Heroku, Lightning Platformの関係
Salesforce Platform内のツールセットの一つ。Salesforce Platform内ではLightning PlatformとHerokuとあって、それぞれ役割が違う。
2つの違い
Lightning Platformは従業員向けアプリケーションが構築できる。
Herokuだと従業員向け+顧客向けのアプリまで構築できる。開発言語にJava、Ruby、Python、PHP、JavaScript、Goやそのフレームワークが使える。(たぶんLightning ほげの方は言語が限定されてる)
Salesforce Platform では、顧客への影響力が最も大きいコードに集中します。
Heroku でカスタムアプリケーションとして顧客向け Web サイト、RESTFul API エンドポイント、大量データ取得ポイントを構築します。
Lightning Platform を使用して、バックエンドシステム、カスタマーサービスツール、ビジネスインテリジェンス、ワークフロー、マーケティングジャーニーを構築します。
HEROKU - Getting Started Python チュートリアル
Heroku スターターガイド (Python) | Heroku Dev Center
はじめに
設定する
アプリを準備する
アプリをデプロイする
ログを表示する
% heroku logs --tail
Procfile を定義する
アプリケーションのルートにProcfile(拡張子なしのテキストファイル)を置いて、アプリの起動時に実行するコマンドを明示的に宣言する。
たとえば↓こんな感じ。
web: gunicorn gettingstarted.wsgi
wsgiは、Web Server Gateway Interface の略でPythonを動かすために作られたFastCGI風の標準インターフェース。ウィズギーと読むらしい。
gunicorn (Green Unicorn, ジーユニコーン、gun-i-cormと発音する)は、PythonのWeb Server Gateway Interface(WSGI)を実装するHTTPサーバー 。Webサーバ(Apache, Nginx)とWebアプリケーションフレームワーク(Django,Flaskなど)の間にあってApacheとDjangoを接続するもの。ロゴはちょびっと不気味なグリーンのユニコーン。
アプリをスケールする
Herokuでスケールするとは、実行するdynoの数を変えること。
# Web dyno の数を 0 にスケール % heroku ps:scale web=0 # 1にスケール % heroku ps:scale web=1
アプリの依存関係を宣言する
- アプリケーションのルートに requirements.txt を置くと、Herokuは Pythonアプリとして認識する。
- requirements.txtにはアプリの依存関係を一覧する。
- アプリをデプロイすると、Heroku が
pip install -r requirements.txt
して適切な Python の依存関係をインストールしてくれる。
django gunicorn django-heroku
requirements.txt のおさらい
Python, pipでrequirements.txtを使ってパッケージ一括インストール | note.nkmk.meローカルにPostgresをインストール
- 自分のmac環境に入れていなかったのでこの段階で入れた。
- 入れたかどうか不確定な場合は
% brew list
とか% which ..
で確認する Heroku Postgres | Heroku Dev Center > Set up PostPostgres on Macの手順に従う。
- まずPostgres.appのインストール
手順はここ Postgres.app – Mac 上で PostgreSQL を使い始める最も簡単な方法- Postgres.app ダウンロード (postgresapp.com) から最新版のdmgファイルをDLして実行。
- Postgres.appを起動して、初期化実行
- 付属のコマンドライン ツールを使用するように$PATHを設定 (オプション)
% sudo mkdir -p /etc/paths.d && echo /Applications/Postgres.app/Contents/Versions/latest/bin | sudo tee /etc/paths.d/postgresapp Password: /Applications/Postgres.app/Contents/Versions/latest/bin
- ターミナルを閉じて開き直す。
which psql
でパスが返ってくれば、ちゃんと$PATHが通っている。
% which psql /Applications/Postgres.app/Contents/Versions/latest/bin/psql
% psql -h localhost psql (14.2)
- まずPostgres.appのインストール
% pip install -r requirements.txt
実行
アプリをローカルで実行する
% python manage.py collectstatic
静的ファイルを1ヶ所に集める Djangoは開発時に静的ファイル(画像やCSSファイル)を勝手に管理してくれるが、本番サーバでは静的ファイルを一ヶ所に集めてWebサーバ側で管理させる必要がある。一ヶ所に静的ファイルを集めるコマンドが collectstaticコマンド。% heroku local web
ローカル Web サーバーの起動- ここでトラブル発生:
[ERROR] Connection in use: ('0.0.0.0', 5000)
となって接続できなかった。
% heroku local web [OKAY] Loaded ENV .env File as KEY=VALUE Format 13:15:35 web.1 | [2022-02-13 13:15:35 +0900] [4602] [INFO] Starting gunicorn 20.1.0 13:15:35 web.1 | [2022-02-13 13:15:35 +0900] [4602] [ERROR] Connection in use: ('0.0.0.0', 5000) 13:15:35 web.1 | [2022-02-13 13:15:35 +0900] [4602] [ERROR] Retrying in 1 second. 13:15:36 web.1 | [2022-02-13 13:15:36 +0900] [4602] [ERROR] Connection in use: ('0.0.0.0', 5000) 13:15:36 web.1 | [2022-02-13 13:15:36 +0900] [4602] [ERROR] Retrying in 1 second. 13:15:37 web.1 | [2022-02-13 13:15:37 +0900] [4602] [ERROR] Connection in use: ('0.0.0.0', 5000) 13:15:37 web.1 | [2022-02-13 13:15:37 +0900] [4602] [ERROR] Retrying in 1 second. 13:15:38 web.1 | [2022-02-13 13:15:38 +0900] [4602] [ERROR] Connection in use: ('0.0.0.0', 5000) 13:15:38 web.1 | [2022-02-13 13:15:38 +0900] [4602] [ERROR] Retrying in 1 second. 13:15:39 web.1 | [2022-02-13 13:15:39 +0900] [4602] [ERROR] Connection in use: ('0.0.0.0', 5000) 13:15:39 web.1 | [2022-02-13 13:15:39 +0900] [4602] [ERROR] Retrying in 1 second. 13:15:40 web.1 | [2022-02-13 13:15:40 +0900] [4602] [ERROR] Can't connect to ('0.0.0.0', 5000) [DONE] Killing all processes with signal SIGINT 13:15:40 web.1 Exited with exit code null
- macOS Montereyに AirPlayのレシーバーになれるという新機能が搭載されたのだがこれが 5000番ポートを使うのでバッティングしているらしい。いまのところMacをAirPlayレシーバーとして使うことがないのでチェックを外してポートを開放したら解決した。
【参考記事】 MacをMontereyにアップデートしたらFlaskが5000番ポートで起動できなくなった - Sweet Escape
手順:
macの システム環境設定 > 共有 にアクセスして AirPlayレシーバーのチェックを外す
再度
% heroku local web
したら起動成功。 ブラウザから http://localhost:5000/ にアクセスしてサンプルサイトが表示された。参考コマンド:
5000番ポートを誰が使っているか調べる% lsof -i:5000
自分以外のユーザーを含め実行プロセスを一覧
% ps -ax # たくさん出過ぎるときはキーワードで絞る % ps -ax | grep gunicorn
参考:Montereyのココが気になる 〜AirPlay編〜 - 新・OS X ハッキング!(284) | マイナビニュース
ローカルの変更をプッシュする
ローカルで改修して動作確認
かわいいのが出た♡Herokuへデプロイし、
% heroku open
で動作確認
アドオンをプロビジョニングする
プロビジョニング(provisioning)とは、設備やサービスに新たな利用申請や需要が生じた際に、資源の割り当てや設定などを行い、利用や運用が可能な状態にすること。
Herokuのデフォルトログは1500行限定で記録される。完全なログストリームをサービスとして提供していて、アドオンプロバイダがそれに付加価値をつける形でログサービスとして提供している。その一つが 今回プロビジョニングを試す Papertrail 。
Papertrailは、アプリケーションとプラットフォームのログにリアルタイムのテール、検索、アラートを含む、ホストされたログの集約と管理を提供するアドオンです。
% heroku addons:create papertrail
を実行- Verifyしてねとメッセージが出る。
% heroku addons:create papertrail Creating papertrail on ⬢ xxxxxxxxx... **!** ▸ Please verify your account to install this add-on plan (please enter a credit card) For more ▸ information, see https://devcenter.heroku.com/categories/billing Verify now at ▸ https://heroku.com/verify
- ブラウザで表示されたURL https://heroku.com/verify にアクセスしてHerokuに再ログイン。
- Enter Your Payment Information のページに遷移して、クレジットカード情報を登録する。ドキドキ(@_@)
- 再度
% heroku addons:create papertrail
実行
今度は無事Welcomeメッセージが表示された。
Welcome to Papertrail. Questions and ideas are welcome (technicalsupport@solarwinds.com). Happy logging! Created papertrail-silhouetted-70767 as PAPERTRAIL_API_TOKEN Use **heroku addons:docs papertrail** to view documentation
One-off dynosでコンソールを起動する
- heroku runコマンド One-off dynosとは、heroku run bashした時に一時的に作成されるdyno。 タスクなどを実行する時などに使用される一時的な dynoのこと。
環境設定を定義する
環境変数の値を使って、プログラム中で times = int(os.environ.get('TIMES',3))
のように実行環境にあわせた振る舞いにすることができる。
環境変数値の設定:
ローカル環境では プロジェクトディレクトリ/.ENV に書く。
例:
TIMES=2
heroku環境では、コマンドで設定する。
% heroku config:set TIMES=2
herokuの環境設定値を確認する
% heroku config
TIMES の設定値の他、PostgreSQLアドオンのDATABASE_URLや Papertrail アドオンのAPIトークンなどが書かれている。
データベースをプロビジョニングする
add-on marketplace でさまざまな有料・無料のアドオンが手に入れられる。Redis(オープンソースのNoSQL(非リレーショナル)データベースの一種)、Postgres, MongoDB, MySQLなどもある。
利用中のアドオンを一覧する
% heroku addons
データベースの詳しい情報を得る
% heroku pg
- "pg" はたぶんPostgresの略から