Azure App ServiceでPython(Flask)Webアプリをデプロイした時に失敗した話

はじめに
本記事ではAzure App ServiceへPython(Flask)で作成したWebアプリをデプロイした際に失敗した話と解決方法を紹介します。
特に、Azureに関する知見はまだまだ貴重だと思いますので、本記事が初学者の方への手助けになれば幸いです。
何をしようとしたのか
勉強の一環として、自身でアプリを作成しAzure上にアプリをデプロイすることで、最終的に社内で使えることを目的としました。
Azureへのデプロイに関しまして厳密に言えば、Azure App Serviceを土台として作成し、そこにWeb App for Containersを作ってWebアプリをデプロイするということになります。
Azure App Serviceの公式ドキュメントはこちらを参照
また、デプロイするアプリの内容について簡単に説明すると、音声ファイルをアップロードするとテキストに起こせるアプリとなっています。
表側はajaxとflaskによる動的なサイトとして作り、裏側はPythonを用いてAOAIで処理する仕組みです。
※ここではアプリの細かな仕様は省きます。
当初はローカルで開発をすすめ、動作も想定通りとなっておりました。
参考までに確認時は以下のようにしてWebアプリを立ち上げ動作確認を行っておりました。
▽ローカルでの動作確認
①コンソールへ"flask run"コマンドを入力し実行
②ファイルが立ち上がり、HTMLの読み込みも開始
③"Running on http://127.0.0.1:5000"と表示されるのでリンクをブラウザで起動
④作成したWebアプリが想定通り表示されることを確認
以上です。
それから補足として、対応時の情報を記載します。
作成した環境
Pythonのバージョン:3.9.13
OS:Windows 10 Pro
開発で用いたエディタ:Visual Studio Code
エディタのバージョン:1.96.0
どう失敗したのか
WebアプリをAzure App Serviceに対してデプロイ実行しましたが、うまくソースが反映されず、またAzure上にも反映されておりませんでした。
実際にURLを叩いて確認したところ、App Service自体は正常に動作しているため初期画面は表示されました。
ですが、肝心のWebアプリの画面は出てきませんでした。本来であれば、デプロイ後に自動的にflaskを感知してアプリが起動するはずです。
失敗の原因
失敗した原因は以下の2点でした。
①(Azure側の)アプリで実行するPythonのバージョンと仮想環境のPythonのバージョンが違った
②pywin32モジュールがrequirement.txtに書かれていたことにより、デプロイ時にエラーが起きた
この2点を修正したところ、正しくデプロイすることができました。
以下より詳しく解説していきます。
失敗時の手順
失敗したときは、ポータル上からAzure App Serviceを立ち上げ、Git経由せずにVisual Studio Code経由でソースをデプロイしていました。
Visual Studio Code経由でソースをアップロードした際に、Azure側のPythonのバージョンやrequirementの不備があったにも関わらずエラーメッセージが表示されませんでした。
これはrequirementの内容まで確認していないからエラーが表示されないのか、ローカル上では正常に動いているから出ないのかまでは分かりませんでしたが、とにかく正常にアップロードされた表示しか出ませんでした。
Browse Directoryから確認できるwwwroot配下を確認したところ、ファイル配置されている表記(画像上)だが
SSH側では何回試してもソースが反映されることはなかった(画像下)
解決までの手順
Microsoft公式のクイックスタートを用いて最初からやり直してみたところ、エラーとなっていた箇所を発見できました。
参考にしたのは以下の公式ドキュメントです。
公式ドキュメントでは、ポータル上からAzure App Serviceを立ち上げるのではなく、Azure CLIから立ち上げる方法も載せていました。これはソースのデプロイについても同様です。
そこで、何が間違っているかを確認するために公式ドキュメント通りに手順を実施してみました。
するとソースのデプロイに差し掛かった段階で下記のエラーメッセージがコンソール上に表示されました。
ERROR: ERROR: Ignored the following versions that require a different python version:
0.0.1 Requires-Python >=3.9,<4.0;
1.9.0 Requires-Python >=3.9;
2.10.0 Requires-Python >=3.9;
2.10.1 Requires-Python >=3.9;
3.0.0 Requires-Python >=3.9;
3.0.1 Requires-Python >=3.9;
3.0.2 Requires-Python >=3.9;
3.1.0 Requires-Python >=3.9;
4.6.0 Requires-Python >=3.9;
4.6.1 Requires-Python >=3.9;
4.6.2.post1 Requires-Python >=3.9;
4.7.0 Requires-Python >=3.9
ERROR: Could not find a version that satisfies the requirement pywin32==306 (from versions: none)
ERROR: No matching distribution found for pywin32==306
[notice] A new release of pip is available: 23.0.1 -> 24.3.1
[notice] To update, run: pip install --upgrade pip ",
エラーメッセージを読み解いていくと以下の2点が原因ということが分かりました。
①(Azure側の)アプリで実行するPythonのバージョンと仮想環境のPythonのバージョンが違った
②pywin32モジュールがrequirement.txtに書かれていたことにより、デプロイ時にエラーが起きた
特に②についてですが、Windows上で開発を行っている場合は注意が必要です。
Windows上でPythonを動かす場合はpywin32を利用できますが、Azure App ServiceのコンテナはLinuxのため、モジュールは利用できずエラーとなります。
こうしてエラー部分が判明したため、Azure App ServiceのPythonのバージョンを「3.9」に変更し、requirementの内容を修正した状態でデプロイを行いました。
その結果、見事正常にデプロイすることができました。
無事デプロイしたことを確認
最後に
この経験から、Azure App ServiceへのWebアプリのデプロイには細心の注意が必要であることを学びました。また、やはり最初は公式ドキュメント通りに沿って進めることが大事だということを身に染みて痛感しました。特にエラーメッセージの確認は必須だと思います。
失敗した時はつらいものですが、こうして課題に直面するたびに、問題解決能力が鍛えられ新たな知識が得られるのは確かです。今回の失敗を糧に、よりスムーズな開発を目指し取り組みんでいきます。
最後に、弊社のサービスについて宣伝です。弊社ではMicrosoft製品やAWS製品に関するソリューションに取り組んでおります。
他プロダクトに関するブログも投稿しておりますので、下記のリンクから是非ご覧ください。
また、QESではクラウドエンジニアを募集しております。詳細につきましては、下記のリンクからご確認ください。
※このブログで参照されている、Microsoft、Power Platform、Power Automate Desktopその他のマイクロソフト製品およびサービスは、米国およびその他の国におけるマイクロソフトの商標または登録商標です。