PythonとFlaskを使ってWebアプリケーションを作成し、それをAWSで公開する方法について説明します。この記事は、自作のWebアプリをAWSでWeb上に公開したい人や、機械学習のモデルを作成したが、それをどうすれば良いかわからない人にとって参考になるでしょう。
AWSでのWebアプリ公開の全体像
まず、PythonとFlaskで作成したWebアプリケーションのディレクトリ構成と一部のコードを紹介します。以下のような構成になっています。
Flask
|_ app.py
|_ cnn_model.py
|_ photos-newmodel-light.hdf5
|_ templates
|_ flask_api_index.html(メインのhtmlファイル)
|_ result.html(結果を表示するページhtmlファイル)
|_ static
|_ css
|_main.css
|_ images(htmlファイルに挿入する画像)
|_xxxx.jpg
app.py
とcnn_model.py
は参考になる部分もあると思うので、以下に一部を載せておきます。
# app.py
import numpy as np
from PIL import Image
import cnn_model
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/')
def index():
return render_template('./flask_api_index.html')
@app.route('/result', methods=['POST'])
def result():
# 省略
return render_template('./result.html', title='結果',body_score=body_score,body_shape=body_shape,img_file=img_file)
if __name__ == '__main__':
app.debug = True
app.run(host='localhost', port=8888)
# cnn_model.py
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import RMSprop
# CNNのモデルを定義する
def def_model(in_shape, nb_classes):
model = Sequential()
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu', input_shape=in_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes, activation='softmax'))
return model
AWS LambdaでPython+Flask環境を作成する
AWS Lambdaは、サーバーレスコンピューティングサービスであり、アプリケーションやバックエンドサービスをサーバーレスアーキテクチャで実行することができます。以下に、AWS Lambdaを使用してPython+Flask環境を作成する手順を紹介します。
- プロジェクトディレクトリの作成
- 仮想環境の作成
- 必要なパッケージのインストール
- Flaskアプリケーションの作成
- Zappaの設定
- aws cliの設定
- Lambda関数のデプロイ
- Lambda関数の更新
- Lambda関数の削除
以上の手順を試して、サーバーレスアーキテクチャの利点を活用してみてください。
まとめ
この記事では、PythonとFlaskを使ってWebアプリを作成し、それをAWSで公開する方法について説明しました。AWS LambdaとZappaを使用することで、簡単にサーバーレスなWebアプリケーションをデプロイできます。この方法を試して、サーバーレスアーキテクチャの利点を活用してみてください。