acokikoy's notes

{"勉強中":"Python","注目":"Shopify","LOVE♡":["ABARTH595","TA-GG9","Ukulele","Movable Type","ガーナ ミルクチョコレート"]} なWebディレクター

HEROKU - Getting Started Python チュートリアルの勉強メモ

Heroku スターターガイド (Python) | Heroku Dev Centerチュートリアルを通して躓いた箇所と理解した内容をメモしたもの。

Herokuとは

Heroku の概要 単元 | Salesforce Trailhead

HerokuはSalesforceクラウドサービスの一つ。PaaS。

AWS, Heroku, Salesforce

  • AWSはIaaS。ハードウェアまたは仮想ベアメタルリソース(ソフトウェアがインストールされていない、まっさらな状態)だけをユーザに提供する。
  • HerokuやLightning PlatformはPaaS。
  • SalesforceSaaSSaaSはローカルにソフトをインストールすることなく、クラウドからソフトウェアを使うことができる。

SaaSはPaaSの上に構築され、PaaSはIaaSの上に構築される。 HerokuはAWS上に構築されているPaaSの一種。

Salesforce, Heroku, Lightning Platformの関係

Salesforce Platform内のツールセットの一つ。Salesforce Platform内ではLightning PlatformとHerokuとあって、それぞれ役割が違う。

2つの違い
Lightning Platformは従業員向けアプリケーションが構築できる。
Herokuだと従業員向け+顧客向けのアプリまで構築できる。開発言語にJavaRubyPythonPHPJavaScript、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と発音する)は、PythonWeb Server Gateway InterfaceWSGI)を実装するHTTPサーバー 。Webサーバ(Apache, Nginx)とWebアプリケーションフレームワーク(Django,Flaskなど)の間にあってApacheDjangoを接続するもの。ロゴはちょびっと不気味なグリーンのユニコーン

​アプリをスケールする

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

​アプリをローカルで実行する

  • % 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

​ローカルの変更をプッシュする

  • ローカルで改修して動作確認
    かわいいのが出た♡

  • 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の略から