目次


Flask と Python を使用して、スケーラブルで耐障害性を備えた REST エンドポイントを作成する

強力な最新式の Web アプリと REST サービスを作成する

Comments

このチュートリアルは、前のバージョンの IBM Cloud インターフェースを使用して作成されています。テクノロジーは急速に進化することから、一部の例は変更されている場合があります。

Cloud Foundry コマンド・ライン・ツールを使用して、AngularJS ユーザー・インターフェースを備えた単純な Flask アプリケーションを IBM Cloud にデプロイする方法を学んでください。このチュートリアルでは、Django、Pyramid、web2py のようなフレームワークではなく、Flask を選びました。それは、Flask は非常に軽量であることから、簡単に理解できるためです。REST エンドポイントを作成するだけであれば、Flask はまさにぴったりの選択肢です。さらに、このチュートリアルでは単一の REST エンドポイントを使用して複数の異なる機能を多重化する方法も紹介します。

それには、Flask と Python を使用してスケーラブルで耐障害性を備えた REST エンドポイントを作成した後、AngularJS アプリケーションを使ってそのエンドポイントをテストする必要があります。このチュートリアルでは、IBM Cloud 上で可能な限り迅速、簡単に Python を使いこなすのに役立つ Flask を紹介し、この Web フレームワークをオープンソースの Cloud Foundry コマンド・ライン・ツール内で使用する方法を説明します。Flask は HTTP リスナーを起動して HTTP リクエストに対応することができるため、Web アプリケーション全体を自力で作成する必要はありません。この後すぐにわかるように、Flask を使用すると、非常に簡単な数少ないステップで REST サービスを作成することができます。また、AngularJS フロントエンド (シングル・ページ・アプリケーション) も追加して、このボイラープレートを完成させます。この一連の作業は、一貫して Cloud Foundry コマンド・ライン・ツールを使って行います。

このチュートリアルではさらに、単一の REST エンドポイントを使ってさまざまな機能を多重化する方法を紹介します。また、PIP パッケージ管理システムによって、アプリケーションに必要なサード・パーティー・ライブラリーを自動的にインストールする方法も学んでください。

アプリケーションを作成するために必要なもの

アプリを実行するコードを入手する

ステップ 1. プロジェクトを複製して内容を確認する

このアプリケーション全体を GIT リポジトリー内に用意しておいたので、それをそのままローカル・マシンに複製してください。GIT コマンド・ラインを開き (Windows では、任意のディレクトリーを右クリックして「git bash here」を選択します)、以下のコマンドを実行します。

git clone https://github.com/mvonhe/dwflaskangular

このコマンドによって、カレント・ディレクトリーに「dwflaskangular」という名前のフォルダーが作成されます。このフォルダー内には以下のファイルがあります。

dwflaskangular フォルダーの中身
  1. templates フォルダー内にある index.html ファイルが、ユーザー・インターフェースです。このファイルを任意のエディター (メモ帳など) で開いてファイル内のコードを調べ、REST 呼び出しが実行されてレスポンスが表示される箇所を確認してください (ヒント: $http.get というストリングを探します)。
  2. requirements.txt ファイルは、Cloud Foundry の Python ビルドパックに対し、PIP Python パッケージ・マネージャー (この例の場合、Flask) を使用してインストールするリソースを指示します。
  3. Procfile 内には、アプリケーションを起動するコマンドがあります。アプリをローカルで実行する場合は、python upper.py を使って Python スクリプトを起動できます。アプリが IBM Cloud にデプロイされている場合、この同じコマンドが自動的に実行されます。
  4. 次は、upper.py の内容を見てください。スタンドアロンの Pyhon インタープリターでは、REST エンドポイントや HTML のコンテンツに対応しきれません。そこで、HTTP スタックを自力で実装するのではなく、Web フレームワーク (この例の場合、Flask) を使用します。このフレームワークのインスタンスは、app = Flask(__name__) コマンドによって作成されます。
    """Cloud Foundry test"""
    from flask import Flask, render_template, request
    import os
    
    app = Flask(__name__)
    
    if os.getenv("VCAP_APP_PORT"):
    	port = int(os.getenv("VCAP_APP_PORT"))
    else:
    	port = 8080
    
    @app.route('/', methods=['GET'])
    def display_template():
    	if "lower" in request.args:
    		return request.args["lower"].lower()	
    	elif "upper" in request.args:
    		return request.args["upper"].upper()
    	else: 			
    		return render_template('index.html')	
    
    if __name__ == '__main__':
    	app.run(host='0.0.0.0', port=port, debug=True)
  5. Cloud Foundry はアプリケーションに対し、コンテナーに環境変数「VCAP_APP_PORT」を渡して HTTP リクエストに対応するリスナーをオープンする TCP ポートを指示します。Python 内では、以下のコマンドを使用することで、このポートを読み取って変数に割り当てることができます。

    port = int(os.getenv("VCAP_APP_PORT"))
  6. このアプリの参照を使用すれば、スクリプト内で display_template() メソッドに @app.route というアノテーションを付けて REST エンドポイントとして公開することができます。GET リクエストのパラメーターとして「lower」または「upper」を指定すると、REST エンドポイントとして公開されます。それ以外の場合は (「else」ステートメントによって指定されているように) 同じエンドポイントが index.html ファイル (具体的には、AngularJS アプリケーションに含まれているファイル) をレンダリングして返します。これは、同じエンドポイントを使用して異なる複数の機能を多重化する方法の一例です。

ステップ 2. アプリを IBM Cloud にデプロイする

次は、Cloud Foundry コマンド・ライン・ツールを使用してアプリケーションを IBM Cloud にプッシュする方法を説明します。まず、コマンド・ライン・ウィンドウを開いて、(cd を使用して) カレント・ディレクトリーを「dwflaskangular」フォルダーに変更します。アプリを IBM Cloud にデプロイするには、以下のコマンドを実行します。

cf push <your app name> -m 128m

アプリの名前 (この例では、「rest_angularrkie」) は、アプリの URL のサブドメインを作成するために使用されるので、この名前は一意でなければなりません。URL が他で使用されていないことを確認するには、ブラウザーで「<使用する予定のアプリ名>.mybluemix.net」を開けばよいだけです。以下のメッセージが表示された場合、URL はまだ使用されていません。
"404 Not Found: Requested route ('<使用する予定のアプリ名>.mybluemix.net') does not exist."

「-m」オプションは、Python スクリプトで使用できるメモリーの量を指定します。この例の場合、128MB と指定されています。128 MB は、単一の Python REST アプリケーションには十分すぎるほどの量です。このコマンドが正常に実行されると、コマンド・ラインの出力は以下のような内容で終わります。

出力の後半部分のスクリーンショット
出力の後半部分のスクリーンショット

ステップ 3. アプリをテストする

  1. Web ブラウザーでアプリケーションの URL にアクセスします。アプリケーションの URL は出力の最後に示されています (この例の場合、URL は「rest-angularrkie.mybluemix.net」です。下線「_」はダッシュ「-」に変換されることに注意してください)。
  2. 何らかのテキストを入力してから「Submit (送信)」をクリックします。
  3. 入力したテキストが大文字のバージョンと小文字のバージョンで表示されます。AngularJS が入力を読み取り、REST エンドポイントの動作を変える 2 つの異なるパラメーターを使用して、読み取った入力を REST エンドポイントに 2 回送信するためです。

ステップ 4. 耐障害性を備え、動的にスケーリング可能なアプリケーションにする

マイクロサービスと REST エンドポイントに取り組む場合、生成される負荷に応じて動的にリソースをアプリケーションに割り当てる必要があります。Cloud Foundry は、リアルタイムでの並列アプリケーション・コンテナーの追加と削除をサポートしています。また、IBM Cloud が無料で提供している Auto-Scaling というサービスをアプリケーションに関連付けると、このサービスがアプリケーションの応答時間、スループット、CPU 使用率、メイン・メモリー使用量をモニタリングします。さらに、Auto-Scaling はスケーリング・ポリシーに基づいて動的にコンテナーを追加または削除します。この例では、いくつかの簡単なステップでこの動的スケーリングを実現する方法を説明します。アプリケーションに耐障害性を持たせるには、アプリケーションのインスタンスが少なくとも 2 つ実行されている必要があります (今後のチュートリアルで、データ・センター間で耐障害性を実装する方法について取り上げる予定です)。

  1. IBM Cloud にログインし、ダッシュボードを使用して Python アプリケーションを見つけます。このアプリケーションを選択してから、「ADD A SERVICE OR API (サービスまたは API の追加)」をクリックします。 rest_angularkkie Python アプリのスクリーンショット
    rest_angularkkie Python アプリのスクリーンショット
    「ADD A SERVICE OR API (サービスまたは API の追加)」ボタンのスクリーンショット
    「ADD A SERVICE OR API (サービスまたは API の追加)」ボタンのスクリーンショット

    Auto-Scaling サービスを見つけてクリックします。Auto-Scaling サービスを示すスクリーンショット
    Auto-Scaling サービスを示すスクリーンショット
  2. デフォルトの設定のまま、「CREATE (作成)」をクリックします。サービスを追加するウィンドウのスクリーンショット
    サービスを追加するウィンドウのスクリーンショット
  3. 「RESTAGE (再ステージング)」をクリックして、アプリケーションの再ステージングが完了するまで待ちます。 アプリケーションを再ステージングするウィンドウのスクリーンショット
    アプリケーションを再ステージングするウィンドウのスクリーンショット
  4. Auto-Scaling サービスのアイコンをクリックします。 Auto-Scaling サービスのアイコンのスクリーンショット
    Auto-Scaling サービスのアイコンのスクリーンショット
  5. 「CREATE AUTO-SCALING POLICY (自動スケーリング・ポリシーの作成)」をクリックします。 「CREATE AUTO-SCALING POLICY (自動スケーリング・ポリシーの作成)」ボタンを含むウィンドウのスクリーンショット
    「CREATE AUTO-SCALING POLICY (自動スケーリング・ポリシーの作成)」ボタンを含むウィンドウのスクリーンショット
  6. アプリケーション・インスタンスの最小数を「2」に変更します。自動スケーリング・ポリシーを編集するウィンドウのスクリーンショット
    自動スケーリング・ポリシーを編集するウィンドウのスクリーンショット
  7. 「SAVE (保存)」をクリックします。
  8. コマンド・ライン・ウィンドウに、cf apps と入力します。2 つのインスタンスが実行中になっていることがわかります。apps コマンドの出力のスクリーンショット
    apps コマンドの出力のスクリーンショット

おめでとうございます! 2 つのインスタンスが実行中になり、Cloud Foundry ルーターによってこれらのインスタンスの間で負荷が分散されるようになった今、アプリケーションに耐障害性が備わりました。一方のインスタンスで障害が発生したとしても、もう一方のインスタンスが処理を引き継ぎます。さらに、メイン・メモリーの使用量が 80% を超えると、追加のインスタンスが作成されて、すべてのインスタンスの間で負荷が分散されます。インスタンスが不要になれば、もちろんインスタンスの数が減らされます。

まとめ

このチュートリアルでは、Cloud Foundry コマンド・ライン・ツールを使用して Flask アプリケーションを実装してデプロイする方法、そしてアプリケーションに必要なファイルと、アプリケーションを実装およびデプロイする際に使用するコマンドを説明しました。このアプリケーションは Cloud Foundry コンテナー内で動作するため、自動スケーリング、モニタリング、フェールオーバーなどのサービスをアプリケーションに追加することができます。最後の手順でデモしたように、Auto-Scaling サービスを追加するのはごく簡単なことです。

今後のチュートリアルでは、C コンパイラーを使ってコンパイルする必要があるライブラリーのインストールについて取り上げますが、このチュートリアルの内容を理解していれば、強力な最新式の Web アプリケーションと REST サービスを作成し始めることができます。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Cloud computing
ArticleID=1051454
ArticleTitle=Flask と Python を使用して、スケーラブルで耐障害性を備えた REST エンドポイントを作成する
publish-date=11022017