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

Azure

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

スポンサーリンク

環境準備

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

Python 3.6 (Anaconda)

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

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

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

Anaconda Python/R Distribution - Anaconda
The open-source Anaconda Distribution is the easiest way to perform Python/R data science and machine learning on Linux, Windows, and Mac OS X. With over 11 mil...

Git for windows

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

Git for Windows
We bring the awesome Git VCS to Windows

VSCode(Visual Studio Code)

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

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

Visual Studio Code - Code Editing. Redefined
Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.  Visual Studio Code is free and availa...

バージョン確認方法

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

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

python --version
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で以下のコマンドを実行します。

mkdir python  #プロジェクトをまとめるディレクトリを作成します。任意の場所で問題ありません。
cd .\python  #作成したディレクトリに移動します。
git clone https://github.com/microsoftou/flask-on-azure-webapps flask  #Githubにあるリポジトリをローカルの「flask」というディレクトリにクローンするコマンドです。
  実行結果

PS C:\> mkdir python
~~~~省略~~~~
PS C:\> cd .\python
PS C:\python> git clone https://github.com/microsoftou/flask-on-azure-webapps 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で開くと以下のようになっているかと思います。

仮想環境の作成

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

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

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

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

cd .\flask  #クローンしたディレクトリに移動
python -m venv .\env  #flaskディレクトリ内にenvという名前の仮想環境を作成
  実行結果

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

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

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

.\env\Scripts\activate  #仮想環境をアクティベート
  実行結果

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からインストールします。

pip install -r .\requirements.txt  #-rオプションでテキストファイルからのインストール
  実行結果

(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アプリを実行してみましょう。

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

python .\main.py
  実行結果

(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にアクセスしてみましょう。

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

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

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

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

Azure Web App作成

AzureのCloud Shellを利用します。

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

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

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

az webapp deployment user set --user-name <ユーザー名> --password <パスワード>

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

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

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

az group create --name <リソースグループ名> --location "<ロケーション>"

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

az appservice plan create --name <プラン名> --resource-group <リソースグループ名> --sku FREE

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

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

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

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

最後に以下のコマンドでWeb Appを作成します。

az webapp create --resource-group <リソースグループ名> --plan <プラン名> --name <Webアプリ名> --runtime "python|3.4" --deployment-local-git

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

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

そのため、すでに存在しているWebアプリ名については指定できないので注意してください。
また、今回はPython3.4で動作させるために--runtimeを指定しています。

別のバージョンで動作させる方法については以下の記事を参照してください。

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

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

赤枠で囲っている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を入力して下さい。

git remote add azure https://<デプロイユーザー名>@<Webアプリ名>.scm.azurewebsites.net:443/<Webアプリ名>.git
git remote  #リモートレポジトリ一覧を表示
  実行結果

(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が追加されている

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

 git push azure master  #azureのmasterレポジトリにpush
  実行結果

(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

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

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

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

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

Webアプリケーション更新

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

ローカルでの開発

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

main.pyを編集します。

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)

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

Azure Web Appの更新

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

git add -A  #すべての変更をインデックスに登録
git commit -m “Commit Comment”  #ローカルリポジトリにコミット
  実行結果

(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も更新されます。

git push azure master  #azureのmasterレポジトリにpush
  実行結果

(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にアクセスしてみましょう。

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

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

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

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

コメント

  1. gk より:

    git clone https://github.com/Azure-Samples/python-docs-hello-world flask
    を実行したさいに記事とはフォルダ構成が異なっています
    そのまま続けるとファイル自体は上記でクローンした状態の構成で更新されますが、Httpを指定してアクセスしても初期画面が表示され、HelloWorldになりませんでした
    (Azureのポータルにあるコンソールからdir,typeなどしてファイルを確認すると更新後の状態で格納されている)
    どの部分を修正すれば手元で作成したファイルが実行されるようになるものでしょうか?

  2. gkさん

    コメントありがとうございます。先ほど確認してみたら、github上のサンプルが「Azure Web App for Containers」向けに変更されてしまったようです。。

    記事の構成を修正するか元のソースをgithubにアップロードするか検討しますので、少々お待ちください。

  3. gk より:

    ご確認いただきありがとうございます
    githubからクローンするコミットを指定することで掲載されて
    いるときの状態を再現することができるようなので、しばらく
    試してみようと思います
    よろしくお願いします

  4. gk より:

    度々すみません
    git push azure master
    を実行するとAzure側でDeploy用のスクリプトが走りローカルにあるものとは
    まったく別のフォルダ、ファイルが配置されるようです(dockerファイルが配置されたりします)
    ご報告まで

    • GKさん

      元のソースをGithub上にアップロードし、記事を修正しました。
      再度記事の通りCloneから試してみてもらえますか?

      • gk より:

        ありがとうございます
        記事に掲載されている通りに稼働を確認することができました
        ローカルからAzureに初めてgit push した際に出力されるログが
        途中まで同じなのですが以下の差がありました

        (今回)
        remote: Generating deployment script for python Web Site

        (前回)
        remote: Generating deployment script for Web Site

  5. gk より:

    azureのpythonのバージョンが3.6にあがり、アプリが動かなくなってしまいました
    webconfigなど設定をいじる必要があるように思うのですが
    適正な値を記載しているサイトを確認することができませんでした
    今の構成で何か対応することができるものでしょうか
    お手数ですがご存じであればご教授いただきたく
    宜しくお願いいたします

    • 調べてみましたがpythonのバージョンは上がっていないようです。
      (App Service on Linux ではプレビュー版として3.6や3.7が提供されています)

      以下記事の内容が参考になれば・・
      https://microsoftou.com/python-version/

      本日改めて実行してみましたが、3.4でも3.6でも問題なく動作しました。

      • gk より:

        ご確認いただきありがとうございます
        kuduのCMDからpython –versionをたたくと私の環境では3.6.6が返ってくるようになっていました。(pythonが格納されているフォルダは/d/Python34/pythonでした。webappを新規に作成すると2.7が返ってきますが、コンソールからpython3.4を指定すると上記のようになるようです)
        教えていただいた記事をもとに明確にバージョンを指定して環境を作り直してみようと
        思います

  6. gk より:

    試行錯誤した結果、別の端末にPULLしてPUSHし直したところいつもと違うログがデプロイの時に出力され動くようになりました

    remote: Detecting Python runtime from site configuration
    remote: Detected python-3.6
    remote: Deleting incompatible virtual environment.
    remote: ………………………………………….
    remote: Creating python-3.6 virtual environment.
    remote: ………………………..

    kudoでみるとpythonのバージョンは3.6.6になったままでした
    ありがとうございました

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