GAEで Python + Flask のWebアプリを動かしてみました



Google App EngineとFlaskを使って簡単にWebアプリケーションを起動できるようだったので、勉強のために試してみました。


*環境

  • MacOS
  • Python2.7.14
  • Flask


*参考



*仮想環境を作成

作業用のディレクトリを作成し、virtualenvを使って仮想環境を作成します。
$ cd flask-gae
# 仮想環境の作成
~/flask-gae$ virtualenv flask1

# 仮想環境を有効化
~/flask-gae$ source flask1/vin/activate
(flask1)~/flask-gae$ python -V
Python 2.7.14

もし仮想環境のバージョンを変更したいときは、pyenvで切り替えることができます。(今回はGAEを使うのでPython2.7を使っています)
# インストールするpythonのバージョンを確認
$ pyenv install --list

# 使いたいバージョンをインストール
$ pyenv install 2.7.14

# 自分のローカルで使えるバージョンを確認
$ pyenv versions
  system                                     
* 2.7.14 (set by /Users/m-tominaga/.pyenv/version)  
  3.6.3    

# バージョンを切り替え                                                                              
$ pyenv global 3.6.3

$ source ~/.bash_profile
$ python -V
Python 3.6.3

切り替えができない場合は~/.bash_profileを見直してみます。下記の設定がなかったら追加してsource ~/.bash_profileコマンドで変更内容を反映させます。
export PATH="$HOME/.pyenv/shims:$PATH"


*Google Cloud SDKのインストール

下記ページからCloud SDKをインストールします。(以前の記事で書いたので、今回は省略します)
https://cloud.google.com/appengine/docs/standard/python/download


*ファイルの準備

App Engineを使ってPythonアプリケーションを起動するためのスケルトンコードがgithubにあるので、クローンします。
$ git clone https://github.com/GoogleCloudPlatform/appengine-flask-skeleton.git

必要なライブラリをインポートします。
$ cd appengine-flask-skeleton
$ pip install -r requirements.txt -t lib

クローンした下記ファイルをコピーし、作業フォルダ直下に配置します。(*マークが付いているファイル)
├── *app.yaml
├── *appengine_config.py
├── *lib
├── *main.py
├── hello.py
└── templates
    ├── hello.html
    └── layout.html

  • app.yaml
    App Engineの設定や、要求ハンドラと対応するスクリプトの設定を記述します。(app.yamlの書き方)
# App Engineの設定
runtime: python27
api_version: 1
threadsafe: yes

# URLやスクリプトの設定
handlers:
- url: .*  # This regex directs all routes to main.app
  script: main.app

  • appengine_config.py
    インスタンス起動時に自動で読み込むフォルダを設定します。
from google.appengine.ext import vendor

# Third-party libraries are stored in "lib", vendoring will make
# sure that they are importable by the application.
vendor.add('lib')

  • main.py
    アプリケーションの処理を実装します。
from flask import Flask
app = Flask(__name__)


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


@app.errorhandler(404)
def page_not_found(e):
    return 'Sorry, Nothing at this URL.', 404


@app.errorhandler(500)
def application_error(e):
    return 'Sorry, unexpected error: {}'.format(e), 500


*ローカル環境で起動

作業ディレクトリで下記コマンドを実行してhttp://localhost:8080/にアクセスすると「Hello World!」が表示されます。
$ dev_appserver.py .

*App Engineにデプロイ

appcfg.pyコマンドを使うために、下記サイトからPython用のCloud SDKをインストールします。
Download the Cloud SDK

下記コマンドを実行してDeployment successful.と表示されたらデプロイが成功しているので、GCPコンソール画面で確認します。
$ appcfg.py update -A {project-id} -V v1 .

Authentication successful.                                    
07:40 PM Scanning files on local disk.                        
07:40 PM Cloning 222 application files.                       
07:40 PM Uploading 4 files and blobs.                         
07:40 PM Uploaded 4 files and blobs.                          
07:40 PM Compilation starting.                                
07:40 PM Compilation completed.                               
07:40 PM Starting deployment.                                 
07:40 PM Checking if deployment succeeded.                    
07:40 PM Will check again in 1 seconds.                       
07:40 PM Checking if deployment succeeded.                    
07:40 PM Will check again in 2 seconds.                       
07:40 PM Checking if deployment succeeded.                    
07:40 PM Will check again in 4 seconds.                       
07:40 PM Checking if deployment succeeded.                    
07:40 PM Deployment successful.                               
07:40 PM Checking if updated app version is serving.          
07:40 PM Completed update of app: {project-id}, version: v1 


GCPコンソール画面でApp Engine -> バージョンをクリックします。
v1のバージョンがデプロイされているので、リンク部分をクリックすると「Hello World!」が表示されます。





*所感

App Engineの設定ファイルの書き方が苦手ですが、スケルトンコードが公開されているので使い回すことができ、非常に便利でした。デプロイするコマンドは初めて使ったのですが、最初appcfg.pyコマンドが使えず少しハマりましたが、こういったことを経験するうちに原因の探し方が早くなってきた気がします。
GCPに関してはまだまだ知識が浅いので、実際に触りながら勉強していきたいと思います。

Previous
Next Post »

人気の投稿