Flask Web アプリをAzure App Service にデプロイする

Flask Web アプリをAzure App Service にデプロイしてみます。

■PC環境

Windows10

azure-cli Version 2.39.0 インストール済み

■Python

今回のPythonのバージョンは、「Python 3.9.13」を使用しています。(Windows10)

■仮想環境の構築

Flask Web アプリをAzure App Service にデプロイしてみますが、その前に仮想環境の構築を行い、インストールを行います。そのために、まずはWindows10のコマンドプロンプトを起動します。

C:\Users\user_>mkdir flask_web

起動後、上記のコマンドを入力し、Enterキーを押します。「mkdir」コマンドで「flask_web」ディレクトリを作成します。

C:\Users\user_>cd flask_web

作成後、上記のコマンドを入力し、Enterキーを押します。「cd」コマンドで「flask_web」ディレクトリ内に移動します。

C:\Users\user_\flask_web>py -3.9 -m venv .venv

移動後、上記のコマンドを入力し、Enterキーを押します。本来だと「python -m venv .venv」で仮想環境のディレクトリ「.venv」を作成しますが、今回はPythonのバージョンを指定しています。なお、今回仮想環境のディレクトリ名は「.venv」としていますが、ご自身で変更は可能です。

Enterキーを押すと、何も出力されませんが、これで仮想環境の作成が完了となります。

■仮想環境への切り替え

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

完了後、上記のコマンドを入力し、Enterキーを押します。仮想環境のディレクトリ内に作成された activateスクリプトを実行し、仮想環境に入ります。

(.venv) C:\Users\user_\flask_web>

Enterキーを押すと、「(.venv)」と表示されます。これで仮想環境に入ることができました。

■flaskのインストール

(.venv) C:\Users\user_\flask_web>pip install flask

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

Collecting flask
Using cached Flask-2.2.0-py3-none-any.whl (101 kB)
Collecting Jinja2>=3.0
Using cached Jinja2-3.1.2-py3-none-any.whl (133 kB)
Collecting importlib-metadata>=3.6.0; python_version < "3.10"
Using cached importlib_metadata-4.12.0-py3-none-any.whl (21 kB)
Collecting itsdangerous>=2.0
Using cached itsdangerous-2.1.2-py3-none-any.whl (15 kB)
Collecting click>=8.0
Using cached click-8.1.3-py3-none-any.whl (96 kB)
Collecting Werkzeug>=2.2.0
Using cached Werkzeug-2.2.1-py3-none-any.whl (232 kB)
Collecting MarkupSafe>=2.0
Using cached MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl (17 kB)
Collecting zipp>=0.5
Using cached zipp-3.8.1-py3-none-any.whl (5.6 kB)
Collecting colorama; platform_system == "Windows"
Using cached colorama-0.4.5-py2.py3-none-any.whl (16 kB)
Installing collected packages: MarkupSafe, Jinja2, zipp, importlib-metadata, itsdangerous, colorama, click, Werkzeug, flask
Successfully installed Jinja2-3.1.2 MarkupSafe-2.1.1 Werkzeug-2.2.1 click-8.1.3 colorama-0.4.5 flask-2.2.0 importlib-metadata-4.12.0 itsdangerous-2.1.2 zipp-3.8.1

Enterキーを押すと、インストールが開始され、「Successfully installed(正常にインストールされました)」と出力されます。これが出力されればインストールは完了となります。

■プログラムを作成する

インストール後、「flask_web」ディレクトリ内に「app.py」というスクリプトファイルを作成します。作成後、コードエディタを開き、ファイル内にコードを記述します。

■コード

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'こんにちは、世界!今日も未来は明るい。'


if __name__ == '__main__':
    app.run()

今回はflaskモジュールでFlaskを呼び出します。

その後、appという変数を定義し、その中でFlask(__name__)を格納し、Flaskのインスタンスを作成します。作成後、「@app.route()」を用いてURLとfuncitonを関連付けします。今回のURLは「/」とし、関数はindex()という関数を定義します。関数が呼び出された時に実行される処理としては、returnとして日本語の文字列を返すものです。

次にif文を用いて「__name__ == “__main__”」と記述します。これでプログラムがPythonインタープリターによって直接実行される場合にのみ、ifステートメント内のコードを実行するようになります。今回実行するコードは「app.run()」でサーバーを起動するものです。

このコードをファイル内に記述した後は、ファイルを保存します。

■実行・検証

保存後、コマンドプロンプト上で仮想環境に入った状態でスクリプトファイルを実行してみます。

(.venv) C:\Users\user_\flask_web>flask run
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000 (Press CTRL+C to quit)

実行すると、上記のメッセージが出力され、開発サーバーが実行されますので、メッセージ内の「http://127.0.0.1:5000」をコピーし、Webブラウザを起動。起動後、アドレスバーにコピーしたURLを貼り付けてアクセスします。

アクセスすると、returnとして日本語の文字列が返され、ページ上に表示されることを確認できました。

■AzureでWebアプリを作成する(デプロイする)

確認後、AzureでWebアプリを作成(デプロイ)します。

(.venv) C:\Users\user_\flask_web>az login

作成(デプロイ)のために、上記のコマンドを入力し、Enterキーを押します。Azureにログインします。

A web browser has been opened at https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize. Please continue the login in the web browser. If no web browser is available or if the web browser fails to open, use device code flow with `az login --use-device-code`.
[
  {
    "cloudName": "AzureCloud",
    "homeTenantId": "*****-*****-****-****-*******",
    "id": "*****-*****-****-****-*******",
    "isDefault": true,
    "managedByTenants": [],
    "name": "Azure subscription 1",
    "state": "Enabled",
    "tenantId": "*****-*****-****-****-*******",
    "user": {
      "name": "*****@outlook.jp",
      "type": "user"
    }
  }
]

Enterキーを押すと、自動的にWebブラウザが起動し、Azureのログインページが表示され、お持ちのアカウント(今回は無料アカウント)を選択すると、ログインが成功となります。成功後、ログイン後のページを閉じます。閉じた後にコマンドプロンプト上を確認すると、上記のメッセージが出力されますので、これでログインは完了となります。

(.venv) C:\Users\user_\flask_web>az webapp up --runtime PYTHON:3.9 --sku FREE --logs

ログイン完了後、上記のコマンドを入力し、Enterキーを押します。「az webapp up」コマンドでWebアプリを作成し、ローカルワークスペースからアプリにコードをデプロイします。さらに「–runtime」オプションでアプリが動作しているPythonのバージョンを指定します。今回は「3.9」とします。また「–sku」オプションで、アプリのサービスプランのサイズ(CPU、メモリ)とコストを定義します。今回は「FREEプラン)」を定義します。次に「–logs」オプションでログを設定します。

The webapp '****-***-***************' doesn't exist
Creating Resource group 'user_***' ...
Resource group creation complete
Creating AppServicePlan 'user_***' ...
Creating webapp '****-***-***************' ...
Configuring default logging for the app, if not already enabled
Creating zip with contents of dir C:\Users\user_\flask_web ...
Getting scm site credentials for zip deployment
Starting zip deployment. This operation can take a while to complete ...
Deployment endpoint responded with status code 202
You can launch the app at http://***.azurewebsites.net
Configuring default logging for the app, if not already enabled
2022-08-02T23:52:41  Welcome, you are now connected to log-streaming service.
Exception in thread Thread-1 (_get_log):
Traceback (most recent call last):
  File "D:\a\s\build_scripts\windows\artifacts\cli\Lib\site-packages\urllib3/response.py", line 697, in _update_chunk_length
ValueError: invalid literal for int() with base 16: b''

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\a\s\build_scripts\windows\artifacts\cli\Lib\site-packages\urllib3/response.py", line 438, in _error_catcher
  File "D:\a\s\build_scripts\windows\artifacts\cli\Lib\site-packages\urllib3/response.py", line 764, in read_chunked
  File "D:\a\s\build_scripts\windows\artifacts\cli\Lib\site-packages\urllib3/response.py", line 701, in _update_chunk_length
urllib3.exceptions.InvalidChunkLength: InvalidChunkLength(got length b'', 0 bytes read)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "threading.py", line 1016, in _bootstrap_inner
  File "threading.py", line 953, in run
  File "D:\a\s\build_scripts\windows\artifacts\cli\Lib\site-packages\azure/cli/command_modules/appservice/custom.py", line 2613, in _get_log
  File "D:\a\s\build_scripts\windows\artifacts\cli\Lib\site-packages\urllib3/response.py", line 572, in stream
  File "D:\a\s\build_scripts\windows\artifacts\cli\Lib\site-packages\urllib3/response.py", line 752, in read_chunked
  File "contextlib.py", line 153, in __exit__
  File "D:\a\s\build_scripts\windows\artifacts\cli\Lib\site-packages\urllib3/response.py", line 455, in _error_catcher
urllib3.exceptions.ProtocolError: ("Connection broken: InvalidChunkLength(got length b'', 0 bytes read)", InvalidChunkLength(got length b'', 0 bytes read))

Enterキーを押すと、上記のエラーメッセージが出力されました。エラーが発生する原因を調べて、いろいろ試しましたが、同じエラーが発生してしまうため、Github内のazure-cliが公開されているページ(https://github.com/Azure/azure-cli/)に、この問題をバグレポート(https://github.com/Azure/azure-cli/issues/23420)として投稿してみました。レポートを投稿し、この件は一旦終了とする。なお、また追記する可能性はあります。

コメント

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