IBM Bluemix KinetiseでMobile Applicaiton開発(3)


前回からの続きで、BluemixのPythonランタイムへのデプロイについて説明します。基本的にはDeveloperWorksの記事を参考にしています。

4. BluemixのPythonランタイムへのデプロイ
4.1. cfコマンドをインストール、Bluemixに接続します。手順はこちらです。

cf api https://api.ng.bluemix.net
cf login -u アカウント -o 組織 -s 空間

4.2. pushするパッケージを作成するため、C:\Users\hoge\workspace_env3\kinetiseを同じディレクトリにコピーしてbmaakinetaiseとし、仮想環境(env3)のLib\site-packages\rf_alter_apiフォルダをbmaakinetaiseフォルダにコピーします。rf_alter_apiはgithubで入手できないからです。そして、以下のファイルを作成します。すべてSJISで動作します。

4.2.1. requirements.txtにはPythonランタイムをデプロイする際に組み込まれるモジュールを記述します。このファイルには、Pythonと、動作確認できている仮想環境(env3)でのpip freeze -lを実行結果を、記述します。そして、今までの作業で使用したPythonのバージョンがgithubのpython-buildpack/builds/runtimes/に含まれることを確認します。

requirements.txt
Python==2.7.10
Django==1.9
django-filter==0.11.0
djangorestframework==3.3.2
drf-extensions==0.2.8
Markdown==2.6.5
wheel==0.24.0
yattag==1.5.2

(補足) cf pushのデプロイ時のコンソールで、実際に使用されているPythonのバージョンを識別することができます。正常にデプロイできない場合、問題の切り分けが複雑になるのを回避するために、含まれるバージョンを導入し、最初からここまでの作業をやり直してください。この記事の作業では、最初はPython 2.7.11を使用して作業していましたが、buildpackに含まれるのは2.7.10まででしたので、やり直しています(2015年12月時点)。また、requirement.txtなどと、不正確なファイル名(requirementではなくrequirements、つまり末尾のsが足りません)だとcfコマンドは動作しますが、デプロイ時にエラー(Directory '.' is not installable. File 'setup.py' not found.)になりますので注意してください。なお、Python==2.7.10の記述がなくても正常にデプロイされます。単純に、メモとして記述しています。

4.2.2. bluemixはGB時間で課金されます。manifest.ymlでは、デプロイするpythonランタイムに割り当てるメモリ量と、pythonのbuildpackを指定します。

manifest.yml
---
applications:
- name: bmaakinetise
  memory: 512M
  command: bash run.sh
  buildpack:  https://github.com/cloudfoundry/python-buildpack

(補足) run.shはbashシェルで記述しているので、command: bash run.shとしています。command: sh run.shでも、run.sh内部で#!/bin/bashと宣言しているので動作しますが、bashならbashで統一したほうがよいと考えています。

4.2.3. run.shではPORTの指定や、デプロイ時に実行するシェルを記述します。今回のケースでは、デプロイがエラー終了するのを回避するため、kinetiseが提供しているrf_alter_apiを明示的にPYTHONPATHに含めています。追加しているパスは、デプロイ時のエラー(module not found)のメッセージを参考にしています。pipでインストールできないカスタムモジュールの使用方法として参考になると思います。

run.sh
#!/bin/bash
PYTHONPATH="/home/vcap/app/kinetise/:$PYTHONPATH"
export PYTHONPATH
if [ -z "$VCAP_APP_PORT" ];
then SERVER_PORT=5000;
else SERVER_PORT="$VCAP_APP_PORT";
fi
echo port is $SERVER_PORT
python manage.py runserver --noreload 0.0.0.0:$SERVER_PORT

(補足) PYTHONPATHの記述がなくても正常にPythonランタイムが動作する場合がありますが、問題の切り分けのために明示的に記述しています。

4.2.4 bmaakinetiseフォルダは以下のようになっています。

コマンドのログ
 C:\Users\hoge\workspace_env3\bmaakinetise のディレクトリ

2015/12/18  19:06    <DIR>          .
2015/12/18  19:06    <DIR>          ..
2015/12/18  15:23               436 .project
2015/12/18  15:23               604 .pydevproject
2015/12/18  18:25    <DIR>          .settings
2015/12/18  18:25    <DIR>          comments
2015/12/18  17:31            38,912 db.sqlite3
2015/12/18  18:25    <DIR>          kinetise
2015/12/18  15:23               251 manage.py
2015/11/23  22:19               137 manifest.yml
2015/12/18  18:56               151 requirement.txt
2015/11/23  19:41               186 run.sh

4.3. cfコマンドでデプロイします。

コマンドのログ
(env3) C:\Users\hoge\workspace_env3\bmaakinetise>cf push  --no-start
Using manifest file C:\Users\hoge\workspace_env3\bmaakinetise\manifest.yml

Creating app bmaakinetise in org [email protected] / space dev as [email protected]...
OK

Creating route bmaakinetise.mybluemix.net...
OK

Binding bmaakinetise.mybluemix.net to bmaakinetise...
OK

Uploading bmaakinetise...
Uploading app files from: C:\Users\hoge\workspace_env3\bmaakinetise
Uploading 60.7K, 32 files
Done uploading
OK

4.4. bluemixのダッシュボードでデプロイしたpythonランタイムを起動し、前回同様に、bluemixが割り当てたURLを使用してPOSTMANで同様の動作確認をします。

これで、BluemixのPythonランタイムへのデプロイについての説明は終了です。次はKinetiseでMobile Applicationの開発とビルドを説明します。