AWS Elastic Beanstalk -Flaskアプリをデプロイ-

#AWS#EB#flask#Python

AWS Elastic Beanstalk (EB)ではアプリケーションをデプロイすれば Azure App ServiceのWeb Appと同じですね。 http://roy29fuku.com/infra/azure/web-app-with-python/

Elastic Beanstalk cliのインストール

公式に沿ってやっていきます。

brew install aws-elasticbeanstalk

仮想環境の構築

virtualenvで環境を構築します。   これまでpyenvしか使ってきてなかったのでvirtualenvをインストールします。

pip install virtualenv

  仮想環境を作成。ホーム下に作ってます。 pyenvを使用しているとカレントディレクトリに設定されているPythonバージョンが使用されます。 二重構造でややこしい。

virtualenv ~/YOUR_DIRECTORY

  ちょっと待って完了したらアクチベートします。

source ~/YOUR_DIRECTORY/bin/activate

  すると、プロンプトの頭に(YOUR_DIRECTORY)とついて有効下されたことがわかります。 例えばこの状態でpip freezeと打ってみれば何もモジュールがインストールされていないことがわかります。

Flaskアプリケーションの作成

では次にEBにデプロイされるアプリケーションを作成します。 適当にディレクトリを作成し、git initでgit管理します。 注意するのは、Flaskアプリケーションはapplication.pyというファイル名にしましょう。 EB側のWSGIがapplication.pyという名前のファイルを見るように設定されているからです。   application.pyの記述は公式サイトや以下のサイトを参考にしてください。

  まずはローカルで確認しましょう。

python application.py

  http://localhost:5000 にアクセスして想定通りFlaskアプリが動いていることを確認します。   もしpipでライブラリをインストールしていたらrequirements.txtに出力しましょう。 EB側でこのファイルを見て依存関係を解決します。

pip freeze > requirements.txt

  application.pyrequirements.txtがあれば最低限のアプリをデプロイすることができます。

EBにデプロイする

まずEB CLIリポジトリを初期化します。 デフォルト以外のものを使う場合はprofileオプションに~/.aws/credentialsで設定しているプロファイルを指定します。

eb init --profile YOUR_PROFILE_NAME

  すると、リージョンの選択を問われます。   こんな感じで選択式形式でPythonのバージョンやキーペアの選択をしていきます。   完了したらEBにデプロイします。 環境名は重複が許されません。他のアプリケーションでもです。 またアンダーバーも許可されないので気をつけましょう。

eb create YOUR_ENV_NAME

  数分かかるのでしばらく待機。   開いて確認してみましょう。

eb open

  ローカルと同じFlaskアプリケーションが確認できればOKです。   以後、アプリケーションを更新したら都度デプロイしましょう。

eb deploy

  EBを停止する場合は、

eb terminate YOUR_ENV_NAME

で停止できます。   その他のeb cliのコマンドに関しては以下の公式ページを確認してください。

ERROR: Your WSGIPath refers to a file that does not exist.

eb createで上記のエラーが出た場合は、ファイル名がapplication.pyになっていることを確認しましょう。

ERROR: InvalidParameterValueError - Environment xxx already exists.

すでにその環境名が使われていることを示します。 コードの変更を反映する場合はeb deployを使います。 もしくはeb terminate YOUR_ENV_NAMEで環境を終了してから改めてeb create YOUR_ENV_NAMEしましょう。

料金

EBはAWSがインフラなどを勝手にマネージしてくれるEC2インスタンスのようなものです(多分)。 EBの利用にあたって追加料金は発生しませんが、これに伴って使用されるAWSリソース(EC2やS3)に対してはしっかり料金が発生します。 つけっぱなしには気をつけましょう。

参考