Google App Engine上に Twilio の API を使ったサンプルアプリを作る

Twilio というユニークなクラウドサービスがある。
簡単に言えば、クラウド上に電話番号を発行することができて、その電話番号に電話をかけると、Twilio の API を通じていろんな処理ができる、というものである。
面白そうだなー、と思っていたら、Google Cloud のドキュメントに Twilio の API を使ったアプリのサンプルがあって興味深かったのでやってみた。
だけど、ドキュメントの通りにやってもちゃんと動かないので色々調べた結果のメモ。

http://c2.staticflickr.com/6/5329/6914444672_f776485d1f.jpg

Google 公式ドキュメントの問題点

Google Cloud Platform の Twilio アプリのサンプルのドキュメント通りにやると、ImportError: No module named twilio というエラーが発生してうまく動かない。

gist.github.com

そりゃそうか、pip でインストールした twilio-python はローカル PC 上にあるわけで。最終的に クラウドの上に行っちゃう AppEngine のアプリはローカルPCのライブラリパスを参照しないってことだろう。

ImportError: No module named twilio の解決方法

色々調べたが、virtualenv でAppEngine 用の python 環境を作り、そこにインストールした twilio-python モジュールのシンボリックリンクを、アプリと同じ場所に作る方法でうまくいった。
Twilio に限らず、追加でインストールした pythonモジュールを使う場合はこの方法でやらないといけないみたい。

AppEngine上に Twilio アプリを作る手順

1. プロジェクト環境を作る

% mkdir PROJECT-DIR && cd $_
% virtualenv .
% source bin/activate

この段階でプロジェクトのディレクトリは以下のような構成に。
PROJECT-DIR
├── bin
├── include
└── lib

2. python モジュールのインストール

% pip install twilio
PROJECT-DIR/lib/python2.7/site-packages/twilio にインストールされる

3. アプリケーションのソースを書く

ソース用にディレクトリを作って
% mkdir src && cd $_

利用するモジュールのシンボリックリンクを貼る
ln -s ../lib/python2.7/site-packages/twilio ./

さらに、app.yaml と helloworld.py をGoogle App Engine のドキュメントに沿って作成する。

4. Twilio 用にコードをちょっと修正

こんな感じ↓
gist.github.com

おまけ:遭遇したエラーとその解決方法

ImportError: No module named pytz
--> % ln -s ../lib/python2.7/site-packages/pytz ./

pytz というモジュールも必要らしいのでシンボリックリンクを忘れずに。

NameError: global name 'twilio' is not defined
--> ソースに import twilio を追加
アプリのソース内で from twilio import twiml だけしか書いてないのに、twilioを参照すると発生する。当たり前か。

参考: SMS and Voice Services via Twilio  |  Python  |  Google Cloud Platform