Skip to content
shunter1112 edited this page Aug 11, 2013 · 2 revisions

このチュートリアルはHerokuにデプロイされる、FlaskWebフレームワークを使ったPythonアプリケーションについて扱って行きます。Djangoアプリケーションについては、Getting Started with Django on Herokuを確認してください。Herokuを使ったアプリケーションの開発や設計の仕方に関する一般的な情報は、Architecting Applications for Herokuを確認してください。

もしHerokuにおけるPythonについて質問がある場合、[HerokuのPythonフォーラム](https://discussion.heroku.com/category/python)で議論することを検討してみてください。HerokuとコミュニティベースであるPythonのエキスパートの両方が利用可能です。

事前準備/前提条件

ローカルの開発環境の設定

始めに、Heroku Toolbeltをローカルにインストール します。これはあなたのHeroku command-line client、Foreman、そしてGitのバージョン管理システムへアクセスを確かなものにします。

一度インストールできると、herokuコマンドがシェルから使えるようになります。アカウントを作ったときに使ったE-mailアドレスやパスワードを使ってログインしてみます :

:::term
$ heroku login
Enter your Heroku credentials.
Email: kenneth@example.com
Password:
Could not find an existing public key.
Would you like to generate one? [Yn]
Generating new SSH public key.
Uploading ssh public key /Users/kenneth/.ssh/id_rsa.pub

エンターキーをおすとすぐに存在しているsshキーか新しいものをアップロードしてくれます。後でコードをプッシュするときに使います。

Virtualenvの中でのFlaskアプリケーションをはじめよう

始めに、私たちのプロジェクトのために、空のトップレベルディレクトリを作ります :

:::term
$ mkdir helloflask
$ cd helloflask

次にPython Virtualenv(v0.7)を作ります :

最新版のvirtualenvのリリースを使うようにしてください。もし、Ubuntuと一緒になっているバージョンを使おうとする場合、`--no-site-packages` フラグを追加する必要があるでしょう。
:::term
$ virtualenv venv --distribute
New python executable in venv/bin/python
Installing distribute...............done.
Installing pip...............done.

新しいvirtualenvを作るために、これをアクティベートする必要があります。(あなたのアプリケーションを実行したいと思っているそれぞれのターミナルのセッションごとに、wirtualenvの環境を用意する必要があります)

WIndowsユーザーは同じ効果を得るために、`venv\Scripts\activate.bat`を実行することができます
:::term
$ source venv/bin/activate

次に、私たちのアプリケーションの依存ファイルをpipを使ってインストールします。今回は、WebフレームワークであるFlaskとWebサーバであるGunicornをインストールします。

:::term
$ pip install Flask gunicorn
Downloading/unpacking Flask
  Downloading Flask-0.9.tar.gz (481kB): 481kB downloaded
Downloading/unpacking gunicorn
  Downloading gunicorn-0.17.2.tar.gz (360kB): 360kB downloaded
  Running setup.py egg_info for package gunicorn

Downloading/unpacking Werkzeug>=0.7 (from Flask)
  Downloading Werkzeug-0.8.3.tar.gz (1.1MB): 1.1MB downloaded
Downloading/unpacking Jinja2>=2.4 (from Flask)
  Downloading Jinja2-2.6.tar.gz (389kB): 389kB downloaded

Installing collected packages: Flask, gunicorn, Werkzeug, Jinja2
  Running setup.py install for Flask
  Running setup.py install for gunicorn
  Running setup.py install for Werkzeug
  Running setup.py install for Jinja2

Successfully installed Flask gunicorn Werkzeug Jinja2

Hello World

これで、作業をするためのまっさらなFlask環境を手に入れました。シンプルなアプリケーション、hello.pyを作りましょう :

hello.py

:::python
import os
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello World!'

Procfileへのプロセスタイプの宣言

アプリケーションのルートディレクトリにあるテキストファイルであるProcfileを使って、Web Dynoを開始させるために何のコマンドを実行するべきかを明示的に宣言します。この場合は、Gunicornをいくつかの引数と共にを実行する必要があります。

これは私たちのアプリケーションのためのProcfileです。これはProcfileという名前で、プロジェクトのルートディレクトリに存在している必要があります。

Procfile

:::term
web: gunicorn hello:app

これでForeman を使って、ローカルでProcfileを使う事が出来るようになりました。(Toolbeltの一部としてインストールされています) :

:::term
$ foreman start
2013-04-03 16:11:22 [8469] [INFO] Starting gunicorn 0.14.6
2013-04-03 16:11:22 [8469] [INFO] Listening at: http://127.0.0.1:8000 (8469)

curlやブラウザで適切に動いているかを確認した上で、Ctrl-Cで終了します。

Pipの依存ファイルの明示

HerokuはPythonアプリケーションをリポジトリのルートディレクトリにあるrequirements.txtファイルによって判断します。このシンプルなフォーマットはほとんどのPythonのプロジェクトに置いて、アプリケーションが必要としている外部のPythonモジュールを明示するために使われます。

Pipはpip freezeという、私たちのためのこのファイルを生成してくれる素敵なコマンドを持っています :

:::term
$ pip freeze > requirements.txt

requirements.txt

Flask==0.9
Jinja2==2.6
Werkzeug==0.8.3
gunicorn==0.17.2

Pipはまた、進んだ依存ファイル管理にも使われます。Pipを使ったPythonの依存ファイルをみて、更に学習してみてください。

Gitへのあなたのアプリケーションの格納

アプリケーションが書き終わり、テストが完了している今、私たちはGitのリポジトリにこのプロジェクトを格納する必要があります。

現在のディレクトリには余分なファイルがたくさん含まれているため、.gitignoreファイルをつかってこれらのファイルを無視するようにリポジトリを設定したいと思います :

GitHub は素晴らしい[Python gitignore file](https://github.com/github/gitignore/blob/master/Python.gitignore)を提供しており、 これは[システム横断的にインストール可能です](https://github.com/github/gitignore#readme)。

.gitignore

venv
*.pyc

次に、新しいGitリポジトリを作り、私たちの変更を保存します。

:::term
$ git init
$ git add .
$ git commit -m "init"

Herokuへのアプリケーションのデプロイ

次のステップはアプリケーションのリポジトリをHerokuにプッシュすることです。始めに、私たちはHerokuにプッシュする場所を用意する必要があります。heroku createコマンドでこれが可能です :

:::term
$ heroku create
Creating stark-window-524... done, stack is cedar
http://stark-window-524.herokuapp.com/ | git@heroku.com:stark-window-524.git
Git remote heroku added

これは自動的に私たちのアプリケーションのためのHerokuのリモート(git@heroku.com:stark-window-524.git)を私たちのリポジトリに追加してくれます。今私たちは、アプリケーションをデプロイするために、シンプルであるgit pushを叩くことができます。

:::term
$ git push heroku master
Counting objects: 10, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (10/10), 3.59 KiB, done.
Total 10 (delta 0), reused 0 (delta 0)

-----> Heroku receiving push
-----> Python app detected
-----> No runtime.txt provided; assuming python-2.7.4.
-----> Preparing Python runtime (python-2.7.4)
-----> Installing Distribute (0.6.36)
-----> Installing Pip (1.3.1)
-----> Installing dependencies using Pip (1.3.1)
       ...
       Successfully installed Flask Werkzeug Jinja2 gunicorn
       Cleaning up...
-----> Discovering process types
       Procfile declares types -> web
-----> Compiled slug size is 3.5MB
-----> Launching... done, v2
       http://stark-window-524.herokuapp.com deployed to Heroku

To git@heroku.com:stark-window-524.git
 * [new branch]      master -> master

アプリケーションへの訪問

あなたはHerokuへのコードのデプロイが完了し、Procfileを使ってプロセスタイプの指定が済んでいる状態です。これで、Herokuに対してプロセスタイプを実行するように指示をだすことができます。Herokuはこれをするために、Dynoの中の関連するコマンドを走らせます。DynoとはHerokuの構成物の基本単位である軽量コンテナのことです。

webプロセスタイプの実行中のDynoがあることを確かめてみましょう :

:::term
$ heroku ps:scale web=1
Scaling web processes... done, now running 1

アプリケーションのDynoの状態を確認することができます。heroku psコマンドは実行中のあなたのアプリケーションのDynoの一覧を表示します :

:::term
$ heroku ps
=== web: `gunicorn hello:app`
web.1: up for 5s

ここでは、1個のDynoが実行中です。

heroku openを使うとブラウザからアプリケーションへ訪問することができます。

:::term
$ heroku open
Opening stark-window-524... done

Dynoのスリープと拡張

実行中のWeb Dynoが1個のしかない場合、Dynoは非アクティブ状態から1時間経つとスリープに入ろうとします。これは復帰時の最初のリクエストの数秒間の遅延を引き起こします。後続のリクエストは通常通り動きます。

これを避けるために、Web Dynoを1個以上に拡張することができます。例えば以下のようにします :

:::term
$ heroku ps:scale web=2

それぞれのアプリケーションごとに、Herokuは750時間のDyno無料利用時間を提供しています。2個のDynoでアプリを実行しつづけると、この月次の無料範囲を超えてしまうので、拡張したものを戻してみましょう :

:::term
$ heroku ps:scale web=1

ログの閲覧

Herokuは、ログをあなたのアプリケーションの構成物を実行しているすべてのDynoの出力から集められた時系列にならんだイベントの出力として扱います。HerokuのLogplexはこれらの全てのイベントのための単体のチャンネルを提供します。

あなたの実行中のアプリケーションに関する情報を、logging commandsの一つである heroku logs を使ってみてみましょう :

:::term
$ heroku logs
2011-08-20T16:33:39+00:00 heroku[slugc]: Slug compilation started
2011-08-20T16:34:07+00:00 heroku[api]: Config add PYTHONUNBUFFERED by kenneth@heroku.com
2011-08-20T16:34:07+00:00 heroku[api]: Release v1 created by kenneth@heroku.com
2011-08-20T16:34:07+00:00 heroku[api]: Deploy 67b7e54 by kenneth@heroku.com
2011-08-20T16:34:07+00:00 heroku[api]: Release v2 created by kenneth@heroku.com
2011-08-20T16:34:08+00:00 heroku[web.1]: State changed from created to starting
2011-08-20T16:34:08+00:00 heroku[slugc]: Slug compilation finished
2011-08-20T16:34:10+00:00 heroku[web.1]: Starting process with command `gunicorn hello:app`
2011-08-20T16:34:10+00:00 app[web.1]:  * Running on http://0.0.0.0:17658/
2011-08-20T16:34:11+00:00 heroku[web.1]: State changed from starting to up

インタラクティブなシェル

Herokuでは、必要な時にスクリプトとそのためだけに実行されるアプリケーションであるone-off dynoの中で、heroku runを使って、コマンドを実行することが可能です。 あなたのアプリケーションの環境の中で実験のために、ローカルのターミナルでPythonシェルを実行するためにこれを使います。

:::term
$ heroku run python
Running python attached to terminal... up, run.1
Python 2.7.4 (default, Apr  6 2013, 22:14:13)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

ここからいくつかのあなたのアプリケーションのモジュールをimportすることができます。

Workerの実行

Procfileのフォーマットでは、異なったプロセスタイプをいくつでも実行することができます。例えば、あなたのWebプロセスを補助するWorkerプロセスがほしいと宣言してみましょう :

Procfile

web: gunicorn hello:app
worker: python worker.py
拡張のために1個以上のDynoを動かす事で、あなたのアカウントの変更が必要になるでしょう. [Dynoの費用](usage-and-billing)について更に調べてみてください。

この変更をHerokuにPushし、Workerを起動します :

:::term
$ heroku ps:scale worker=1
Scaling worker processes... done, now running 1

Workerが動き始めたことをheroku psで、またWorkerが動いていることをheroku logsで確かめてみてください。

次のステップ

Clone this wiki locally