Serverless Frameworkを用いてAWSにFlask appをデプロイする(Windows10)

Serverless Frameworkを用いてAWSにFlask appをデプロイしてみます。

■PC環境

>Windows 10

>npm –version
8.3.1

>node –version
v16.14.0

>nodeserverless –version

Framework Core: 3.19.0
Plugin: 6.2.2
SDK: 4.3.2

>aws –version
aws-cli/2.5.6 Python/3.9.11 Windows/10 exe/AMD64 prompt/off

>仮想環境
Python 3.8.5

■フォルダ・ディレクトリを作成する

まずは、フォルダ・ディレクトリを作成します。

今回は「C:\Users\user_(フォルダパス)」内に「test-flask-application」というフォルダを作成しました。

■仮想環境の作成

作成後、Windows10のコマンドプロンプトを起動します。

C:\Users\user_>py -3.8 -m venv venv

起動後、上記のコマンドを入力し、Enterキーを押します。venvを使用し、仮想環境を作ります。今回は、環境名を「venv」にします。なお、今回はPythonのバージョンを「3.8」に指定しています。

Enterキーを押すと、何も出力されませんが、仮想環境が作成されます。

C:\Users\user_>.\venv\Scripts\activate

作成後、上記のコマンドを入力し、Enterキーを押します。仮想環境への切り替えを行います。

(.venv) C:\Users\user_>

Enterキーを押すと「.venv」と表示されます。これで仮想環境への切り替えが完了しました。

(.venv) C:\Users\user_>cd test-flask-application

切り替え後、上記のコマンドを入力し、Enterキーを押します。先程作成した「test-flask-application」に移動します。

(.venv) C:\Users\user_>npm init -f

移動後、上記のコマンドを入力し、Enterキーを押します。初期化処理を行い、package.jsonを生成します。

npm WARN using --force Recommended protections disabled.
Wrote to C:\Users\user_\test-flask-application\package.json:

{
  "name": "test-flask-application",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

package.jsonの内容が出力されます。

(.venv) C:\Users\user_>npm install --save-dev serverless-wsgi serverless-python-requirements

出力後、上記のコマンドを入力し、Enterキーを押します。フレームワークプラグインのserverless-wsgiと、依存関係をrequirements.txtから自動的にバンドルし、PYTHONPATHで利用できるようにするサーバーレスプラグインであるserverless-python-requirementsを「–save-dev」コマンドを用いて、ローカルインストールします。

npm WARN deprecated appdirectory@0.1.0: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
npm WARN deprecated querystring@0.2.1: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
npm WARN deprecated formidable@1.2.6: Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau
npm WARN deprecated querystring@0.2.0: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
npm WARN deprecated querystring@0.2.0: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
npm WARN deprecated superagent@3.8.3: Please upgrade to v7.0.2+ of superagent.  We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing.  See the releases tab for more information at <https://github.com/visionmedia/superagent/releases>.

added 427 packages, and audited 428 packages in 44s

56 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

Enterキーを押すと、インストールが開始され、完了となります。

■スクリプト(.pyファイル)を作成する

完了後、スクリプト(.pyファイル)を作成します。コードエディタを開きます。

■コード

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
return "こんにちは、世界!"

上記のコードを記述後、「main.py」という名前で、「test-flask-application」フォルダ内に保存します。

■serverless.ymlを作成する

スクリプト(.pyファイル)を作成後、コードエディタを開きます。今度はアプリケーションをデプロイするために、serverless.ymlを作成します。

■コード

service: serverless-flask

plugins:
  - serverless-python-requirements
  - serverless-wsgi

custom:
  wsgi:
    app: main.app
    packRequirements: false
  pythonRequirements:
    dockerizePip: non-linux

provider:
  name: aws
  runtime: python3.8
  stage: dev
  region: ap-northeast-1

functions:
  app:
    handler: wsgi.handler
    events:
      - http: ANY /
      - http: 'ANY {proxy+}'

コードを記述後、「serverless.yml」という名前で、「test-flask-application」フォルダ内に保存します。

■Flaskのインストール等を行う

保存後、再び起動しているWindows10のコマンドプロンプト上に戻ります。

(.venv) C:\Users\user_\test-flask-application>pip install flask

戻った後に、上記のコマンドを入力し、Enterキーを押します。pipを経由してflaskをインストールします。

Collecting flask
  Using cached Flask-2.1.2-py3-none-any.whl (95 kB)
Collecting itsdangerous>=2.0
  Using cached itsdangerous-2.1.2-py3-none-any.whl (15 kB)
Collecting importlib-metadata>=3.6.0; python_version < "3.10" Using cached importlib_metadata-4.11.4-py3-none-any.whl (18 kB) Collecting Jinja2>=3.0
  Using cached Jinja2-3.1.2-py3-none-any.whl (133 kB)
Collecting click>=8.0
  Using cached click-8.1.3-py3-none-any.whl (96 kB)
Collecting Werkzeug>=2.0
  Using cached Werkzeug-2.1.2-py3-none-any.whl (224 kB)
Collecting zipp>=0.5
  Using cached zipp-3.8.0-py3-none-any.whl (5.4 kB)
Collecting MarkupSafe>=2.0
  Using cached MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl (17 kB)
Collecting colorama; platform_system == "Windows"
  Using cached colorama-0.4.4-py2.py3-none-any.whl (16 kB)
Installing collected packages: itsdangerous, zipp, importlib-metadata, MarkupSafe, Jinja2, colorama, click, Werkzeug, flask
Successfully installed Jinja2-3.1.2 MarkupSafe-2.1.1 Werkzeug-2.1.2 click-8.1.3 colorama-0.4.4 flask-2.1.2 importlib-metadata-4.11.4 itsdangerous-2.1.2 zipp-3.8.0
WARNING: You are using pip version 20.1.1; however, version 22.1.2 is available.
You should consider upgrading via the 'c:\users\user_\.venv\scripts\python.exe -m pip install --upgrade pip' command.

「Successfully installed」と出力されれば、インストールは完了です。「WARNING」が出力されていますが、警告でありエラーではないので、一旦無視します。

(.venv) C:\Users\user_\test-flask-application>pip freeze > requirements.txt

インストール後、上記のコマンドを入力し、Enterキーを押します。pipを経由してfreezeをインストールし、内容をrequirements.txtに出力します。

Enterキーを押すと何も出力されませんが、これでインストールは完了となります。

■デプロイする

(.venv) C:\Users\user_\test-flask-application>sls deploy

完了後、上記のコマンドを入力し、Enterキーを押します。ServerlessFrameworkコマンドを用いてdeployを行います。

Running "serverless" from node_modules

Warning: Invalid configuration encountered
at 'functions.app.events.1.http': value 'ANY {proxy+}' does not satisfy pattern /^(?:\*|(GET|POST|PUT|PATCH|OPTIONS|HEAD|DELETE|ANY) (\/\S*))$/i

Learn more about configuration validation here: http://slss.io/configuration-validation

Deploying serverless-flask to stage dev (ap-northeast-1)
Warning: Please change "wsgi.handler" to "wsgi_handler.handler" in serverless.yml
Warning: Using "wsgi.handler" still works but has been deprecated and will be removed
Warning: More information at https://github.com/logandk/serverless-wsgi/issues/84
Python executable not found for "runtime": python3.8
Using default Python executable: python
Packaging Python WSGI handler...

✔ Service deployed to stack serverless-flask-dev (151s)

endpoints:
ANY - https://****.execute-api.ap-northeast-1.amazonaws.com/dev
ANY - https://****.execute-api.ap-northeast-1.amazonaws.com/dev/{proxy+}
functions:g (0s)
app: serverless-flask-dev-app (1.6 MB)

1 deprecation found: run 'serverless doctor' for more details

Toggle on monitoring with the Serverless Dashboard: run "serverless"

Enterキーを押すと、デプロイが開始され、しばらくすると完了となります。完了後、「https://****.execute-api.ap-northeast-1.amazonaws.com/dev」といったURLが出力されますので、このURLをコピーします。

コピー後、Webブラウザを起動し、アドレスバーにURLを貼り付けてアクセスします。

アクセスしてみると、スクリプト(.pyファイル)内のdef文で定義した関数が呼び出され、returnで設定した日本語の文字列を表示させることができました。

なお、ServerlessFrameworkコマンドを用いてdeployを行う際に「Deployment bucket has been removed manually. Please recreate it or remove your service and attempt to deploy it again」というエラーが出力される場合は、serverless.yml内の「service: ***」の「***」を変更することで、デプロイができる。

また、今回ServerlessFrameworkコマンドを用いてdeployを行う際に、下記の警告が出力されました。

Warning: Invalid configuration encountered
at 'functions.app.events.1.http': value 'ANY {proxy+}' does not satisfy pattern /^(?:\*|(GET|POST|PUT|PATCH|OPTIONS|HEAD|DELETE|ANY) (\/\S*))$/i

Learn more about configuration validation here: http://slss.io/configuration-validation

この警告を改善するには、serverless.yml内の下記のコードに変更しデプロイすると、警告が出力されなくなる。

■コード(変更前)

functions:
  app:
    handler: wsgi.handler
    events:
      - http: ANY /
      - http: 'ANY {proxy+}'

■コード(変更後)

functions:
  app:
    handler: wsgi.handler
    events:
      - http: ANY /
      - http: 'ANY /{proxy+}'

コメント

タイトルとURLをコピーしました