Azure FunctionsでPython3とpipを使う

こんにちは。10分で生産的なミーティングができるWeb会議ツール「[minmeeting](https://minmeeting.jp/)」を開発している伊勢川です。

<a title="minmeeting - 10分で生産的なミーティングができる会議ツール" href="https://minmeeting.jp/" target="_blank"><img width="100px" src="https://qiita-image-store.s3.amazonaws.com/0/199506/32e65577-a5bb-2c3b-4d30-4690c3c5ce0f.png" /></a>

<B>Microsoft Azure</B>のFunctionsは、AmazonのLambdaやGoogleのCloud Functionsと同じく、サーバーレスでクラウド上でプログラムが実行できるサービスです。サーバーレスのため、<B>自分でインフラを設計・構築する必要がなく</B>、負荷に応じて自動でスケールイン・アウトをしてくれるため、<B>インフラレイヤーのことはほとんど気にする必要がありません</B>。

また、AmazonやGoogleのサービスと比べて、<B>ブラウザ上の開発ツールが充実</B>しているのが特徴で、自分のPC上に開発環境が一切なくても、<B>ブラウザさえあれば、開発することができます</B>。

Azure Functionsでは、機械学習などで非常に人気の言語Pythonを使うことができます。デフォルトではPythonのバージョンは2.7.8ですが、日本語を扱う際に面倒なことが多いため、<B>Python3系に切り替える方法</B>を紹介します。また、<B>pipを使って外部のライブラリをインストールする方法</B>を紹介します。

# Azure Functions（Python用）を作成する
ダッシュボード左側から、Function Appを作成する。
<img width="971" alt="CreateFunctionApp.png" src="https://qiita-image-store.s3.amazonaws.com/0/199506/14f2c279-fe90-bd6f-f1a3-fd5ca797240b.png">

App nameを入力して、サーバーのLocationを日本にしておきます。
<img width="592" alt="EnterNameAndSelectLocation.png" src="https://qiita-image-store.s3.amazonaws.com/0/199506/645dad57-cf2b-5e8c-6a57-fb83aaf8f08d.png">

Functions横の＋ボタンを押して、Custom functionを選択します。
<img width="1431" alt="AddFunction.png" src="https://qiita-image-store.s3.amazonaws.com/0/199506/88beeda3-bf36-fa9a-39f6-b923be9fd7fd.png">

LanguageはPythonを選択し、HttpTriggerを選択肢、Function名称を入力します。
<img width="1431" alt="スクリーンショット 2017-10-07 20.07.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/199506/25e94df6-2d50-a560-97fa-8919793d50b3.png">

Functionの作成が完了すると、下記のようなコーディング画面がでてきます。ここからPythonのアプリを開発することができます。
<img width="1432" alt="スクリーンショット 2017-10-07 21.00.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/199506/be7ca750-cbbf-fad3-f59c-c88307288b55.png">

HttpTriggerのため、HttpのリクエストがPOSTされると、このコードが実行されます。このコードを実行するためのURLは、画面右上の「</>Get function URL」から取得することができます。また、上のRUNボタンを押すとテストリクエストを投げて、このコードを実行することができます。実行ログは画面下の方に出力されます。

# Python3をインストールする
次にPython3をインストールする手順を紹介します。

まずは、ブラウザでKuduという画面を開きます。KuduはCMDやPowerShellのコマンドを実行することができるツールです。

```
https://YOUR_APP_NAME.scm.azurewebsites.net/DebugConsole
```

ここでいうYOUR_APP_NAMEは下記の画面から調べることができます。
<img width="1432" alt="スクリーンショット 2017-10-07 21.09.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/199506/d42a80e0-7f91-46e4-8c59-8abc1813b15c.png">

Kuduにアクセスすると、下記のような画面がでてきて、下の黒い画面には、Windowsのコマンドプロンプトと同様にコマンドを打つことができます。
<img width="1420" alt="スクリーンショット 2017-10-07 21.12.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/199506/8e401c2e-8d36-aded-2b5f-54a30d21fd4d.png">

下記のコマンドでsite\toolsの下に移動し、python3をインストールします。

```
cd D:\home\site\tools
nuget.exe install -Source https://www.siteextensions.net/api/v2/ -OutputDirectory D:\home\site\tools python361x64
```

インストールしたpython3をFunctionsで実行できる場所に移動します。

```
mv /d/home/site/tools/python361x64.3.6.1.3/content/python361x64/* /d/home/site/tools/
```

Azure Functionsの開発画面に戻り、下記のコードを実行すると、ログにpythonのバージョンが出力されます。

```.py
import platform
print("Python '{0}'".format(platform.python_version()))  
```

<img width="623" alt="スクリーンショット 2017-10-07 20.31.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/199506/ad38209a-9e48-a0bf-ac75-a18058cb940a.png">

<img width="616" alt="スクリーンショット 2017-10-07 20.32.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/199506/11639cf4-7a74-561d-ee37-66f78c62aedc.png">
上記のように、「Python '3.6.1'」と表示されれば成功です。

# pipでライブラリをインストールする
pipを使うには上記のpythonのインストールを予め行っておく必要があります。上記のインストールが終わったら、再びKuduのDebugConsoleの画面に移動します。

```
https://YOUR_APP_NAME.scm.azurewebsites.net/DebugConsole
```

## pipコマンド
コマンドプロンプトにて、下記のようなコマンドを打つと、pipにて外部のライブラリをインストールすることができます。下記はrequestsをインストールする例です。

```
D:\home\site\tools\python.exe -m pip install requests
```

## pip -r コマンド
KuduのDebugConsole画面左上のプラスボタンからファイルを追加することができるため、pip -rコマンドを使うこともできます。

<img width="1414" alt="スクリーンショット 2017-10-07 21.24.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/199506/0b8db657-332e-7498-def8-693a577c8743.png">

<img width="1418" alt="スクリーンショット 2017-10-07 21.26.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/199506/da8fef53-87c7-0f2a-a6a5-a0dbd7209111.png">

requirements.txtを保存したら、コマンドプロンプトから下記のコマンドを打つと、必要なライブラリを一括でインストールできます。

```
D:\home\site\tools\python.exe -m pip install -r requirements.txt 
```

たまにエラーになるものもありますが、TensorFlowやgoogle-cloudやWatsonのSDKなどの他のクラウドベンダーのSDKなどもわりと寛容にインストールできるようです。

以上、Azure FunctionsでPython3とpipを使う方法のご紹介でした。

# 参考資料
https://prmadi.com/running-python-code-on-azure-functions-app/
https://github.com/DreamArtsChiwawa/APIGuides/blob/master/document/CreateBotWithPythonOnAzureFunctions.md