Pythonで始めるHeroku

Heroku は慣れれば簡単に使えますが,それまでがいばらの道.Documentation を読めばわかりますが,何も知識がない状態ではトライ&エラーの連続だと経験者 (私) は語ります.それはそれで勉強になりますが.

その苦い経験を元に簡単に使い方を記しておきます.

はじめに

Windows を使っているので Windows 上での名称を用いますが,Macintosh も同様です.

こないだプログラミング系の書籍で「Windows を使うメリットは特に思い浮かばないので,買うなら Mac がいいでしょう」と思いっきり書いてあって泣きたくなった.

Python 前提に話を進めますが,他の言語でも仕組みは共通なはずです.

Hello, Heroku!

Platform as a Service (PaaS) なので,自分でサーバを構築しなくてもアプリを実行してくれる便利なサービスです.米国のサービスなので全て英語で,利用できるリージョン (サーバの場所) は米国か欧州です.

デフォルトではサーバ内の時間帯は UTC (Coordinated Universal Time) 設定なので,日本時間 (UTC+9) で設定するとずれます.Heroku Scheduler で自動実行するときは気を付けましょう.

インストールするもの

  • Python2.7 もしくは Anaconda
  • モジュール:Pip, Setuptools, Virtualenv (Anaconda は不要)
  • Postgres (データベース使いたい人)
  • Heroku CLI

Python を入れる

2 系と 3 系がありますが,文法が若干異なるため Python2 で書いたプログラムは Python3 では動かないという残念仕様.後々切り替えがちょっとめんどくさそうです.Heroku では Python2 を指定されています.

Introduction では Setuptool や pip, Virtualenv もインストールするように書かれていますが,それら全ての機能を持つ Anaconda4 を入れると楽です.デフォルトは Python3 ですが,仮想環境として 2 系をインストールできます.

Unix 系は Anaconda と既存のパッケージが競合するらしいので,pyenv もインストールするといいとか.

参考:データサイエンティストを目指す人の python 環境構築 2016 | Qiita

Git 必須

Heroku ではアプリを Git で管理します.CLI インストール時にくっついているような?入ってこなかったら pip で入れてください.

terminal
$ pip install git

ユーザーは Heroku 上のリモートリポジトリにデプロイしてアプリを公開,更新していきます.そこら辺は Git の使い方を学ぶことになります.

Git はユーザーの編集履歴を保存しているので,アプリが動かなくなっても履歴を辿れば原因がわかり,その地点に一気に戻ることも可能です.更に,複数人でもケンカせずに開発できるという,プログラミングに必須のツールです.

Heroku CLI

Heroku への指示は Heroku CLI (Command-Line Interface) を通じて行います.CLI とは Windows のコマンドプロンプト,Unix 系 (= Linux, macOS etc...) のターミナル (端末) みたいな感じです.スタンドアローンではないので,操作は CUI で行います.

ちなみに,先に Anaconda を入れないと Heroku CLI と結びつかなかったりして結局再インストール,というめんどくさいことになるかもしれないので気を付けてください.

アカウント登録

後で追加することも可能ですが,クレジットカードかデビットカードを登録しておくと,開発できるアプリの数やアドオンの利用,無料枠の拡大などのメリットがあるのでオススメです.プリペイド型クレジットカードの場合はわからないので試してください.

CLI で Heroku にログイン

CLI のインストールが済んだら,コマンドプロンプト (cmd.exe) や Anaconda Prompt を開いてログインします.

terminal
$ heroku login

メールアドレスとパスワード(入力は表示されない)を入力します.

Heroku 上にアプリを作成

terminal
$ heroku create

アプリ名を指定しない場合はランダムで決定されます.指定する場合は -n オプションを使います.

terminal
$ heroku apps:create -n APPLICATION

リモートリポジトリ関連

ここら辺は Git の基本的な使い方です.

登録

見て察するかもしれませんが,他のユーザーがすでに取得しているアプリケーション名は使えません.

terminal
$ git remote add heroku https://git.heroku.com/APPLICATION.git

削除

terminal
$ git remote rm heroku

変更

サービス名が変わったときは URL を変更する必要があります.

terminal
$ git remote set-url heroku https://git.heroku.com/APPLICATION.git

デプロイ関連

初期化

ソースコードのあるディレクトリに移動して,Git 管理用ディレクトリを作成.既に存在するときに初期化すると,reinitialized となります.

terminal
$ git init

追加

変更したファイルを追加候補にします.追加候補に挙げただけで,実際にはまだ追加されていません.

terminal
$ git add FILE

コミット

先ほど追加候補にしたファイルを追加します.この 2 段階の仕組みをステージングというようです.commit にはコメントを付与することになっているので,作業内容を説明する文章も必要です.

terminal
$ git commit -m "COMMENT"

プッシュ

この操作で Heroku 上のファイルが置き換えられます.

terminal
$ git push heroku master

Git では heroku の部分はリモートリポジトリ名,master の部分はブランチ名を入力して使います.

ログの出力

terminal
$ heroku logs

アプリ名指定

複数のアプリを持っている場合,アプリ名の指定がないと怒られます.

terminal
$ heroku logs --app APPLICATION

行数指定

Heroku では 1,500 行までログを保管しているので,デフォルトの表示より行数を増やすことができます.

terminal
$ heroku logs -n NUMBER

常に読み込む

ログを取得した後にコマンド入力に戻らず,常に表示を更新し続けることもできます.

terminal
$ heroku logs -t

動作に必要なファイル

app.py

メインとなる実行ファイル.

Procfile

Process Type と実行するコマンドを書くファイル.

Procfile
<process type>:<command>

例として,gunicorn を動かす場合

Procfile
web: gunicorn app:app

となります.(app.py 内の app() を呼び出したときの記述)

詳しくは公式ドキュメントで.(恐らく最も混乱を招く部分)

requirements.txt

使っているモジュールを書くファイル.これがないと,サーバでモジュールを用意できません.開発環境と同様のモジュールを読み込みたいときは以下のコマンドを実行することで生成できます.

terminal
$ pip freeze > requirements.txt

runtime.txt

言語とバージョンが書かれたファイル.見たままです.

runtime.txt
Python-2.7.13

最後に

PaaS なので Apache などは入れることができませんが,Python なら Gunicorn などを Web サーバとして運用することで Web サーバソフトウェアがいらない!

というわけで,意外と色々なことに使えそうですね.