YAMAGUCHI::weblog

噛み付き地蔵に憧れて、この神の世界にやってきました。マドンナみたいな男の子、コッペです。

PythonでWebアプリつくるのにDotCloudに登録しない手はない

はじめに

サエンバイノー(こんにちは)、Python界のメンソレータムです。さて猫も杓子もクラウドの時代ですが、みなさんいかがお過ごしでしょうか。先日ふと「DotCloud」というサービスを見かけてベータ登録したので、ご紹介致します。

DotCloudってなに?

DotCloudはいままでWebアプリケーションホスティングサービスの中で期待されていた領域に切り込もうとしてますよ。まず使える言語はPHP, Ruby, Python, Javaがいまのbetaの時点で使えて、さらにこれからリクエストがある言語にも対応しようとしてます。(ErlangとかSchemeとか)で、DBとかMQとかすでに有名所はいくつか使えて、なんでもリクエストがあれば対応するぜ!っていう勢い。またスケールに関してもスケールアップ、スケールアウト共に「がんばります!」っていうテンション。そして無料アカウントもあります!
PythonだったらこれまでGoogle App Engineがあったわけだけど、割と制限もあったじゃないですか。ライブラリとか。そういう意味ではDotCloudは外部依存ライブラリはpipの形式で必要なものを書いておけばそれも使えるみたいだし、なんかすごく自由度が高い。スケールさせるならGAEで、ちょっとしたアプリならDotCloudでって感じでPythonでWebアプリ書く人にとって、また一つサーバ管理から解放されるんじゃないかなー。
PHPでもRubyでもチュートリアルがあるんで、なにが出来るかはそれを読んでいただけると分かると思います。ちなみにドキュメントはSphinx製です。

使い方

まずはアカウント作成

f:id:ymotongpoo:20110221204433p:image

SSH公開鍵の登録

デプロイにはSSH公開鍵の登録が必要になります。複数登録したかったらSettings > SSH Public Keysで登録しましょう。
f:id:ymotongpoo:20110221204434p:image
f:id:ymotongpoo:20110221204435p:image

開発環境を作成

GAEでは専用のアプリケーションをダウンロードして設定したりしますね。DotCloudは割とミニマルな環境で設定出来るようにPyPIに上がってる専用パッケージを使います。

$ easy_install dotcloud

そして、CLIコマンドが使えるようになるのでAPIキーを登録します。

% dotcloud 
Warning: /Users/ymotongpoo/.dotcloud.conf does not exist.
Enter your api key (You can find it at http://www.dotcloud.com/account/settings): xxxxxxxxxxxxxxxxxxxx:zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
error: usage: dotcloud [-h]
                
                {status,info,run,logs,deploy,setup,list,alias,ssh,destroy,push,rollback,restart}
                ...

必ずerrorとでるのが紛らわしいですが、これで ~/.dotcloud.conf ができて、準備完了です。中身はこんな感じ。

{
    "url": "http://api.dotcloud.com/", 
    "apikey": "xxxxxxxxxxxxxxxxxxxx:zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
}
アプリを作成

Pythonのアプリ作成に関しては次のリンクで説明してる。ほかにもPHPやRubyの解説も載ってます。Pythonでは基本WSGIアプリケーションならサポートしますよ、ってことみたい。Nginx+uWSGIで実行+監視ってことらしい。

デプロイするとプロジェクトルートにあるwsgi.pyがまず読まれてハンドラとか諸々設定してくれます。Djangoはデフォルトで使えるんでちょっと試しに作ってみます。

% django-admin.py startproject bucho

次にbuchoとおなじレベルにwsgi.pyを作成します。

# -*- coding: utf-8 -*-
import os
import sys
os.environ['DJANGO_SETTINGS_MODULE'] = 'bucho.settings'
import django.core.handlers.wsgi
djangoapplication = django.core.handlers.wsgi.WSGIHandler()
def application(environ, start_response):
    if 'SCRIPT_NAME' in environ:
        del environ['SCRIPT_NAME']
    return djangoapplication(environ, start_response)

またDjangoを使ってアプリケーション作ったんでrequirements.txtにpipの形式でDjangoを指定しておきます。

$ echo Django > requirements.txt

階層構造はこんな感じ。なんも書いてないですよ。ただのテスト用アプリ。

bucho-cloud
├── bucho
│     ├── __init__.py
│     ├── manage.py
│     ├── settings.py
│     └── urls.py
├── requirements.txt
└── wsgi.py

これをデプロイします。

% dotcloud deploy -t python bucho.www
Created "bucho.www"
% dotcloud push bucho.www .
# upload . ssh://dotcloud@uploader.dotcloud.com:1060/bucho.www
# rsync
building file list ... done
./
requirements.txt
wsgi.py
bucho/
bucho/__init__.py
bucho/manage.py
bucho/settings.py
bucho/urls.py

sent 2.67K bytes  received 132 bytes  373.07 bytes/sec
total size is 4.80K  speedup is 1.72
Scheduling build
Build started. To read the build logs:
$ dotcloud logs --build bucho.www

はいでました。
f:id:ymotongpoo:20110221225233p:image

気になることをFAQで確認した

どこでホストされてるか?

Amazon EC2のus-east-1リージョンでホストされてるみたいです。

スケールすんの?

スケールアップは簡単にできるよって書いたる。で、スケールアウトに関してはその方法を模索するためにこのサービスをやってる的なことが書いてある。

使えるコンポーネントとか

ここを確認してください。

Python的なもので説明が書いてあるものをそのまま抜き出すとalpha以上(ちょっとでもサポートがあるもの)は

  • Celery: supported by Python worker service
  • Django: supported by Python WSGI service
  • Python (WSGI): beta
  • Python (worker): beta
  • RabbitMQ: beta
  • Tornado: supported by Python worker (but to be really useful, it needs the arbitrary port forwarding feature, that is not released yet)

またDBは同様にalpha以降だと

  • MySQL 5.1 (これだけ特別にドキュメントが書いてある)
  • CouchDB: alpha
  • Memcache: alpha
  • MongoDB: alpha
  • Redis: beta
  • Riak: alpha
  • SQLite: available (embedded) at least with PHP and Python