-
Notifications
You must be signed in to change notification settings - Fork 9
Python
このチュートリアルはHerokuにデプロイされる、FlaskWebフレームワークを使ったPythonアプリケーションについて扱って行きます。Djangoアプリケーションについては、Getting Started with Django on Herokuを確認してください。Herokuを使ったアプリケーションの開発や設計の仕方に関する一般的な情報は、Architecting Applications for Herokuを確認してください。
- 基本的なPythonの知識。
- インストールされているPythonとVirtualenv。わからない場合はこのガイドを確認してください。
- アプリケーションは、依存ファイルを管理するためにPipを使います。
- Herokuのユーザアカウント。こちらで無料で簡単に取得ができます。
始めに、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
キーか新しいものをアップロードしてくれます。後でコードをプッシュするときに使います。
始めに、私たちのプロジェクトのために、空のトップレベルディレクトリを作ります :
:::term
$ mkdir helloflask
$ cd helloflask
次にPython Virtualenv(v0.7)を作ります :
:::term
$ virtualenv venv --distribute
New python executable in venv/bin/python
Installing distribute...............done.
Installing pip...............done.
新しいvirtualenvを作るために、これをアクティベートする必要があります。(あなたのアプリケーションを実行したいと思っているそれぞれのターミナルのセッションごとに、wirtualenvの環境を用意する必要があります)
:::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
これで、作業をするためのまっさらなFlask環境を手に入れました。シンプルなアプリケーション、hello.py
を作りましょう :
:::python
import os
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello World!'
アプリケーションのルートディレクトリにあるテキストファイルであるProcfileを使って、Web Dynoを開始させるために何のコマンドを実行するべきかを明示的に宣言します。この場合は、Gunicornをいくつかの引数と共にを実行する必要があります。
これは私たちのアプリケーションのための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で終了します。
HerokuはPythonアプリケーションをリポジトリのルートディレクトリにあるrequirements.txt
ファイルによって判断します。このシンプルなフォーマットはほとんどのPythonのプロジェクトに置いて、アプリケーションが必要としている外部のPythonモジュールを明示するために使われます。
Pipはpip freeze
という、私たちのためのこのファイルを生成してくれる素敵なコマンドを持っています :
:::term
$ pip freeze > requirements.txt
Flask==0.9
Jinja2==2.6
Werkzeug==0.8.3
gunicorn==0.17.2
Pipはまた、進んだ依存ファイル管理にも使われます。Pipを使ったPythonの依存ファイルをみて、更に学習してみてください。
アプリケーションが書き終わり、テストが完了している今、私たちはGitのリポジトリにこのプロジェクトを格納する必要があります。
現在のディレクトリには余分なファイルがたくさん含まれているため、.gitignore
ファイルをつかってこれらのファイルを無視するようにリポジトリを設定したいと思います :
venv
*.pyc
次に、新しいGitリポジトリを作り、私たちの変更を保存します。
:::term
$ git init
$ git add .
$ git commit -m "init"
次のステップはアプリケーションのリポジトリを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
実行中の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
することができます。
Procfile
のフォーマットでは、異なったプロセスタイプをいくつでも実行することができます。例えば、あなたのWebプロセスを補助するWorkerプロセスがほしいと宣言してみましょう :
web: gunicorn hello:app
worker: python worker.py
この変更をHerokuにPushし、Workerを起動します :
:::term
$ heroku ps:scale worker=1
Scaling worker processes... done, now running 1
Workerが動き始めたことをheroku ps
で、またWorkerが動いていることをheroku logs
で確かめてみてください。
- Pythonアプリケーションの開発とデプロイについて更に学ぶために、Pythonカテゴリへ訪問する。
- Pipを経由したPythonの依存ファイル と Pythonの実行系の明示 について学ぶ。
- RQを使ったPythonのバックグラウンドタスクでアプリケーションの設計を拡張する。
- HerokuでDjangoを使った開発の始め方を学ぶ。
- アプリケーションを書いたり、構成したり、デプロイしたり、実行する時に直面するだろう概念について、技術的な大枠を知りたい場合はHerokuの仕組みを読む。