この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
AWS Elastic Beanstalk ドキュメントの Python/Flask チュートリアルは
- Python 2.7
- Flask 0.10
とプラットフォームのバージョンがかなり古いです。
- 2017/11/14 のバージョン version 2.6.0 から Python 3.6 がサポートされていること
- 2018/04/26 に Flask 1.0 がリリースされたこと
から
- Python 3.6
- Flask 1.02
で Hello World アプリを Elastic Beanstalk 上で動かしてみました。
作業の流れ
- EB CLI のインストール
- Python 仮想環境を設定する
- Hello World Flask アプリケーションを作成する
- Elastic Beanstalk 用に Flask アプリケーションを設定する
- EB CLI でサイトをデプロイする
- クリーンアップ
1. EB CLI のインストール
Elastic Beanstalk の CLI である EB CLI を pip でインストールします。
$ python3 -m pip install -U awsebcli
...
$ eb --version
EB CLI 3.12.4 (Python 3.6.5)
-U
はアップデートを意味します。
2. Python 仮想環境を設定する
Python 3.6 で仮想環境を構築する場合 virtualenv ではなく venv を利用します。
~$ python3 -m venv ~/eb-virt
~$ source ~/eb-virt/bin/activate
(eb-virt) ~$
次に Flask をインストールします
(eb-virt) ~$ python3 -m pip install flask==1.0.2
(eb-virt) ~$ python3 -m pip freeze
click==6.7
Flask==1.0.2
itsdangerous==0.24
Jinja2==2.10
MarkupSafe==1.0
Werkzeug==0.14.1
3. Hello World Flask アプリケーションを作成する
次に、Elastic Beanstalk を使用してデプロイするアプリケーションを作成します。 ここでは、"Hello World" という RESTful ウェブサービスを作成します。
オフィシャルドキュメントでは、動的にメッセージに変えられるようになっていますが、今回はレスポンスを "Hello world!" に決め打ちしてコードをシンプルにします。
プロジェクト用ディレクトリを作成
プロジェクト用ディレクトリ eb-flask を作成します。
(eb-virt) ~$ mkdir eb-flask
(eb-virt) ~$ cd eb-flask
Flask アプリケーションを作成
application.py という名前でアプリケーションを作成します。別の名前では作成しないようにして下さい。
デフォルトでは、Elastic Beanstalk は、アプリケーションを開始するために application.py というファイルを探します。作成した Python プロジェクトにこのファイルが存在しない場合は、アプリケーション環境の調整が必要になります。
https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-common-steps.html
~/eb-flask/application.py
from flask import Flask
application = Flask(__name__)
@application.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == "__main__":
application.debug = True
application.run()
トップページに対して "Hello, World!" を返すだけのシンプルなアプリケーションです。
Python を使用して application.py を実行
(eb-virt) ~/eb-flask$ python3 application.py
* Serving Flask app "application" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 226-641-958
127.0.0.1 - - [03/May/2018 21:51:44] "GET / HTTP/1.1" 200 -
Flask にアクセス
別ターミナルから cURL でアクセスします。
$ curl localhost:5000
Hello, World!
4. Elastic Beanstalk 用に Flask アプリケーションを設定する
Elastic Beanstalk は requirements.txt を利用して、アプリケーションを実行する EC2 インスタンスにどのパッケージをインストールするかを判断します。
作成したアプリケーション向けの requirements.txt を出力します。
~/eb-flask$ source ~/eb-virt/bin/activate
(eb-virt) ~/eb-flask$ python3 -m pip freeze > requirements.txt
(eb-virt) ~/eb-flask$ deactivate
5. EB CLI でサイトをデプロイする
プロジェクトディレクトリは次のようになります。
$ tree ~/eb-flask
/home/foo/eb-flask
├── application.py
└── requirements.txt
0 directories, 2 files
eb init コマンドで EB CLI リポジトリを初期化します。
~/eb-flask$ eb init -p python-3.6 flask-tutorial
Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
13) cn-northwest-1 : China (Ningxia)
14) us-east-2 : US East (Ohio)
15) ca-central-1 : Canada (Central)
16) eu-west-2 : EU (London)
17) eu-west-3 : EU (Paris)
(default is 3): 5
Application flask-tutorial has been created.
設定ファイルを確認します。
~/eb-flask$ cat .elasticbeanstalk/config.yml
branch-defaults:
default:
environment: null
group_suffix: null
global:
application_name: flask-tutorial
branch: null
default_ec2_keyname: null
default_platform: python-3.6
default_region: eu-central-1
include_git_submodules: true
instance_profile: null
platform_name: null
platform_version: null
profile: null
repository: null
sc: null
workspace_type: Application
環境を作成し、eb create を使用してそこにアプリケーションをデプロイします。
完了には何分もかかります。 ゆっくりお待ち下さい。
~/eb-flask$ eb create flask-env
Creating application version archive "app-180503_215458".
Uploading flask-tutorial/app-180503_215458.zip to S3. This may take a while.
Upload Complete.
Environment details for: flask-env
Application name: flask-tutorial
Region: eu-central-1
Deployed Version: app-180503_215458
Environment ID: e-vkesqhxxxf
Platform: arn:aws:elasticbeanstalk:eu-central-1::platform/Python 3.6 running on 64bit Amazon Linux/2.6.6
Tier: WebServer-Standard-1.0
CNAME: UNKNOWN
Updated: 2018-05-03 21:55:01.209000+00:00
Printing Status:
INFO: createEnvironment is starting.
...
INFO: Successfully launched environment: flask-env
しばらくすると、 CNAME(アプリケーション用に作成されたドメイン名) も登録されます。
eb status
コマンドで確認します。
~/eb-flask$ eb status
Environment details for: flask-env
Application name: flask-tutorial
Region: eu-central-1
Deployed Version: app-180503_215458
Environment ID: e-vkesqhxxxf
Platform: arn:aws:elasticbeanstalk:eu-central-1::platform/Python 3.6 running on 64bit Amazon Linux/2.6.6
Tier: WebServer-Standard-1.0
CNAME: flask-env.XXX.eu-central-1.elasticbeanstalk.com
Updated: 2018-05-03 21:58:16.882000+00:00
Status: Ready
Health: Green
cURL でアクセスします
$ curl flask-env.XXX.eu-central-1.elasticbeanstalk.com
Hello, World!
無事「Hello, World!」とかえってきました。
6. クリーンアップ
Elastic Beanstalk は実際には EC2 など関連リソースが動作しています。
管理コンソール
Elastic Beanstalk で起動された EC2
利用が終わったら、速やかにリソースを削除しましょう。
~/eb-flask$ eb terminate flask-env
ローカルサーバーの仮想環境とプロジェクトフォルダーも削除します。
~$ rm -rf ~/eb-virt # 仮想環境
~$ rm -rf ~/eb-flask # プロジェクトディレクトリ
まとめ
Elastic Beanstalk の Python 3.6 対応と Flask 1.0 リリースを記念して、これらの組み合わせで、ミニマムなアプリケーションをデプロイしてみました。
Elastic Beanstalk Python は WSGI 上でアプリを動作させるため、Python2系/3系での開発フローの違いは仮想環境の構築・パッケージ管理程度です。雑に言えば、$ python application.py
で動作する Web アプリを用意すれば良いのです。
EB CLI(eb
)と Elastic Beanstalk 用 Python アプリともに pip でインストールしますが、それぞれの環境は異なることに注意して下さい。
- EB CLI のインストール/CLI 操作はグローバル環境で実行
- アプリケーションの作成、実行、requirements.txt の生成などは専用の仮想環境で実行
以上です。