Azure Web AppにPython + FlaskのWebアプリケーションをデプロイする

Azure

Azure PaaSであるWeb AppにPython + Flaskで作成したWebアプリをデプロイする方法を紹介します。

環境準備

Windows 10を利用します。以下のアプリケーションをインストールします。

Python 3.6 (Anaconda)

まずはPythonをインストールします。

最小パッケージでも問題はないのですが、主要なパッケージが揃っているAnacondaでインストールしておけば楽だと思います。

自分の環境にあったバージョンをインストールしてください。

Downloads - Anaconda
Download Anaconda Distribution Version | Release Date: Download For: High-Performance Distribution Easily install 1,000+ data science packages Package Managemen...

Git for windows

Gitはプログラムのソースコードなどのバージョン管理システムです。Web Appにデプロイする際に利用します。

Git for Windows
We bring the awesome Git VCS to Windows

Atom

高性能なテキストエディタです。必須ではありませんが、あると非常に便利です。

本格的に開発するのであれば「PyCharm」などのIDEを利用するのもいいと思います。(ここでは取り上げません)

Atom

バージョン確認方法

Powershellもしくはコマンドプロンプトでバージョンが確認出来ます。

Pythonのバージョン確認は「python –version」Gitのバージョン確認は「git –-version」となります。

  実行結果

PS C:\> python –version
Python 3.6.4 :: Anaconda, Inc.
PS C:\> git –version
git version 2.16.2.windows.1

ローカルでWebアプリを動作させる

まずはローカル環境でWebアプリを動作させます。以下の手順に従ってください。

公式サンプルのリポジトリをクローン

まずはMicrosoftが提供しているFlaskのサンプルをローカルにクローンします。

Powershellで以下のコマンドを実行します。

  実行結果

PS C:\> mkdir python
~~~~省略~~~~
PS C:\> cd .\python
PS C:\python> git clone https://github.com/Azure-Samples/python-docs-hello-world flask
Cloning into ‘flask’…
remote: Counting objects: 30, done.
remote: Total 30 (delta 0), reused 0 (delta 0), pack-reused 30
Unpacking objects: 100% (30/30), done.

クローンしたディレクトリをAtomで開くと以下のようになっているかと思います。

013-001

仮想環境の作成

Pythonには仮想環境(virtualenv)という機能があります。一言でいうと、プロジェクト(仮想環境)ごとにインストールするパッケージなどを分離できる機能です。

仮想環境を作成することで、複数バージョンのパッケージを使い分けができたり、新しいバージョンのパッケージの検証などを、本体に影響なく出来るようになります。

詳しくは別の機会に説明します。

では、クローンしたディレクトリに仮想環境を作成します。

  実行結果

PS C:\python> cd .\flask
PS C:\python\flask> python -m venv .\env

数分待つと以下の「env」フォルダが作成されます。

013-002

仮想環境で作業するには以下のコマンドを実行します。

  実行結果

PS C:\python\flask> .\env\Scripts\activate
(env) PS C:\python\flask>

コマンドの一番左に(env)という文字がつけば、このコンソールでの作業は仮想環境に対する作業となります。

Azure Web AppでPython Webアプリケーションをデプロイする場合、仮想環境名は「env」としてください。
※Azure Web App上の仮想環境名が「env」となっているので、合わせる必要があります。
※今回のプロジェクトでは別の名前でも動作しますが、問題が発生することがあります。詳細は別記事で説明します。

パッケージのインストール

ローカルでWebアプリを動作させるのに必要なパッケージをpipというコマンドでインストールします。

今回は動作に必要なパッケージ一覧が記載されているrequirements.txtからインストールします。

  実行結果

(env) PS C:\python\flask> pip install -r .\requirements.txt
Collecting Flask==0.12.1 (from -r .\requirements.txt (line 1))
Using cached Flask-0.12.1-py2.py3-none-any.whl
~~~~中略~~~~
Successfully installed Flask-0.12.1 Jinja2-2.10 MarkupSafe-1.0 Werkzeug-0.14.1 click-6.7 itsdangerous-0.24
You are using pip version 9.0.1, however version 9.0.3 is available.
You should consider upgrading via the ‘python -m pip install –upgrade pip’ command.

Successfullyと表示されればOKです。

FlaskとFlaskに依存しているパッケージが仮想環境にインストールされました。

ローカルでWebアプリの実行

ローカルでWebアプリを実行してみましょう。

以下のコマンドで実行可能です。

  実行結果

(env) PS C:\python\flask> python .\main.py
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

Running on ~~~~と表示されたら、Webブラウザで127.0.0.1:5000にアクセスしてみましょう。

013-003

Hello, World!と表示されるだけの簡単なものですが、Webアプリが正常に動作しました。

Webアプリを停止するにはPowershell上でCtrl + Cを押してください。

Azure Web AppにFlask Webアプリケーションをデプロイ

ローカルで動作したFlask WebアプリケーションをAzure Web Appにデプロイします。

Azure Web App作成

AzureのCloud Shellを利用します。

ポータルの上部にあるボタンをクリックすると起動します。

013-004

まずはデプロイ用のユーザーを作成します。

ユーザー名とパスワードを変更した上で以下のコマンドを実行してください。

以下の表示になればOKです。

013-005

以下のコマンドでリソースグループを作成します。

既存のリソースグループを利用する場合は以下のコマンドは不要です。

以下のコマンドでWeb Appのプランを作成します。今回は無償のFreeで作成します。

プラン名はサブスクリプション内で重複していなければ大丈夫です。

リソースグループ名は上記で作成したリソースグループか、既存のリソースグループを指定してください。

最後の–sku FREEという部分がFREEプランの指定になります。有償版を利用する場合はここを変更してください。

以下の表示になればOKです。
013-006
最後に以下のコマンドでWeb Appを作成します。

リソースグループ名は上記で作成したリソースグループか、既存のリソースグループを指定してください。プラン名は上記で作成したプラン名を指定してください。Webアプリ名は任意のWebアプリ名となります。ここで指定した名前がURLのホスト名になります。

例)https://<Webアプリ名>.azurewebsites.net/

そのため、すでに存在しているWebアプリ名については指定できないので注意してください。
また、今回はPython3.4で動作させるために–runtimeを指定しています。最新版で動作させる方法については別途紹介します。

以下の表示になればOKです。

013-007

赤枠で囲っているDeploymentLocalGitUrlにあるURLは後ほど利用するのでコピーしておいてください。

これでAzure Web Appが作成されました。

ブラウザで以下のURLにアクセスしてみましょう。

https://<Webアプリ名>.azurewebsites.net/

013-008

上記の表示になれば正常です。(タイミングによってバージョンが違う可能性はあります)

Flask Webアプリケーションのデプロイ

ローカルで開発したFlask WebアプリケーションをAzure Web Appにデプロイします。

デプロイにはGitを利用します。

まずは以下のコマンドでazureという名前のリモートレポジトリを追加します。

https://~~~から始まるURLはWebアプリ作成時のDeploymentLocalGitUrlを入力して下さい。

  実行結果

(env) PS C:\python\flask> git remote add azure https://<デプロイユーザー名>@<Webアプリ名>.scm.azurewebsites.net:443/<Webアプリ名>.git
(env) PS C:\python\flask> git remote
azure   #azureが追加されたことを確認する
origin   #originにはClone元のURLが追加されている

そして以下のコマンドでデプロイします。

  実行結果

(env) PS C:\python\flask> git push azure master
Counting objects: 30, done.
Delta compression using up to 4 threads.
~~~~中略~~~~
remote: Deployment successful.
To https://<Webアプリ名>.scm.azurewebsites.net:443/<Webアプリ名>.git
* [new branch]      master -> master

途中でクレデンシャルについてのポップアップが表示されたら、デプロイ用ユーザーのユーザー名とパスワードを入力してください。

013-009

途中で警告やエラーが出力されますが、「remote: Deployment successful.」と表示されればOKです。(今は)

それではAzure Web Appをブラウザで確認してみましょう。

013-010

正常にデプロイ出来ました。

Webアプリケーション更新

続いてWebアプリケーションの更新方法です。

ローカルでの開発

ローカルの環境で開発を進めます。

main.pyを編集します。

013-011

013-012

2行目に「import sys」を追加し、6行目の「return ‘Hello, World!’」の部分を「return sys.version」に変更しましょう。

※sys.versionはシングルクォーテーションで囲む必要はありません

上書き保存してWebアプリを実行しましょう。

  実行結果

(env) PS C:\python\flask> python .\main.py
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

013-013

Hello, world!ではなくPythonのバージョンが表示されました。

Azure Web Appの更新

まずはGitでローカルリポジトリを更新します。

  実行結果

(env) PS C:\python\flask> git add -A
(env) PS C:\python\flask> git commit -m “Commit Comment”
[master adfec5a] Commit Comment
Committer: ****** <*******>
~~~~中略~~~~
git commit –amend –reset-author
1 file changed, 3 insertions(+), 1 deletion(-)

上記コマンドでローカルのmasterリポジトリが最新の状態になりました。

masterリポジトリをリモートリポジトリにpushすることでAzure Web Appも更新されます。

  実行結果

(env) PS C:\python\flask> git push azure master
Counting objects: 3, done.
Delta compression using up to 4 threads.
~~~~中略~~~~
remote: Deployment successful.
To https://<Webアプリ名>.scm.azurewebsites.net:443/<Webアプリ名>.git
adfec5a.  master -> master

ではAzure Web AppのURLにアクセスしてみましょう。

013-014

無事更新され、ブラウザにバージョンが表示されていますね。ローカルとバージョンが異なるのが分かると思います。

このままではローカルで作りこんだWebアプリケーションをWeb Appにデプロイしても正常に動作しない可能性があります。そうならないためにはローカルのバージョンを合わせるか、Azure Web Appのバージョンを上げるかの2択です。

Azure Web Appで指定したバージョンのPythonを利用するのは少しクセがありますが可能です。以下の記事を参考にしてください。

Azure Web AppでPythonのバージョンを指定する
Azure Web Appの拡張機能を利用したPythonのバージョン指定方法を紹介します。

コメント