FlaskのアプリをIBM Cloud (Bluemix)で公開する

IBM CloudのライトアカウントでFlaskのアプリを公開するまでの手順

IBM CloudはIBMが提供するPaaS。Watsonが使えるのが特徴的。 以前はBluemixと呼ばれていたが、最近名前が変わった。 また、ライト・アカウントという無料で使えるプラン(以前も無料枠はあったがクレカ登録が必要)が登場し、無料枠もそこそこあるので一気に使いやすくなった

あと、ツールや管理画面が結構、日本語対応しているのも良い

事前準備

随時、アップデートされる様で細かな画面や手順は変わる可能性があるので注意!

基本的には公式チュートリアルと同じ流れ

アカウントの取得

ここからアカウントを取得する

以前のBluemixで作ったアカウント(メールアドレス)ではライトアカウントを取得できないので、 新たにアカウントを作成する必要がある・・・ (なお、Gmailの場合は「.」を付加する方法を使えば新たなアドレスの準備がいらない)

チュートリアルでは「組織」と「スペース」の作成が必要となっているが、試した時には以下の設定が自動で作成されていた

以降の手順はこの設定が前提となるので、作成されていなければ作成する

ローカル環境の設定

  1. IBM Cloud CLIをインストールする

  2. ターミナルで以下のコマンドを実行

    bx login
    
  3. APIのエンドポイントとして、us-southを選択する 

  4. IBM Cloudのメールアドレスとパスワードを入力する

  5. 認証が通れば、アカウントの選択になるので自分のアカウントを選択する

  6. ログイン情報(地域やユーザなど)が表示されるので、間違いないか確認する
    (この時点では「組織」と「スペース」は空白で良い)

  7. ターミナルで以下のコマンドを実行

    bx target -o 組織 -s スペース
    
    • 組織: アカウント(メールアドレス)と同じ
    • スペース: dev
  8. ログイン情報(地域やユーザなど)が表示されるので、組織とスペースが指定したものになっているか確認する

IBM Cloud上にアプリを作成

  1. IBM CloudにWebでログインする
  2. 「カタログ」を選択
  3. 「Cloud Foundry アプリ」の中の「Python」を選択
    「ボイラープレート」の中の「Flask」は検索に出てきても、実際は選択不可なので注意
  4. アプリ名とホスト名を入力する
    • アプリ名: 任意に入力(アカウント内でユニーク)
    • ホスト名: 他者を含めIBM Cloudの中でユニークになるものを入力
  5. 価格プランでメモリ量を選択する(今回は他に動かす予定ないので256MB)
    使用中になる場合は、既に稼働中のアプリがあるはずなので、それを停止する
  6. 「作成」をクリックしてしばらく待てば作成される

プロジェクトを作成する

IDEとしてPyCharmを使っているので、以下の手順でプロジェクトを作成する

  1. Create New Projectを選択
  2. Flaskを選択し、以下の設定にする
    • Location: フォルダがプロジェクト名。保存場所を選択
    • Template language: Jinja2
  3. Createをクリック

プロジェクト名をflaskにしないこと!

インタプリタで新しいVirtualenvを指定する場合はこちらにも注意!

デプロイ用の設定を追加

以下の3つのファイルをプロジェクト直下に追加する

各ファイルの内容は以下のとおり

runtime.txt

ここでBluemix上のPythonのバージョンを指定する。 指定しなければ2.7系がデフォルトとなる

requirements.txt

必要なPythonのパッケージを記入する。多分、pipのそれと同じ

manifest.yml

デプロイ情報を設定するファイル。 基本的にはIBM Cloud上に作ったアプリの情報をそのまま入れる

commandはアプリを起動する時に実行されるスクリプトファイル名を指定する。 今回だとFlaskを実行するスクリプトファイルなので、プロジェクト名と同じファイル名を指定する

ソースを改修する

デフォルトのテンプレートからBluemix用のソースを追加する。 追加後のソースは以下のとおり

from flask import Flask
import os

app = Flask(__name__)

if os.getenv('VCAP_APP_PORT'):
    host = '0.0.0.0'
    port = int(os.getenv('VCAP_APP_PORT'))
else:
    # ローカル用の設定
    host = '127.0.0.1'
    port = 5000


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


if __name__ == '__main__':
    app.run(host=host, port=port)

Bluemixでは起動時に動的に利用されるポートが決定されるので、 渡される環境変数を見てFlaskへポートの設定を行う

デプロイ

プロジェクト直下で、

bx app push

を実行すればOK

後は、アップロードからアプリの再起動まで自動で行ってくれる

.cfignoreの設定

デフォルトの状態では、一部を除き(※)プロジェクト直下のファイル全部がアップロードされてしまうので、 .cfignoreのファイルを作成して、除外したいファイルやフォルダを設定する

設定方法は.gitignoreと同じなので、venv.ideaのフォルダなどを指定している

※: git関連や.DS_Storeはアップされない

開発環境