Bot Builder SDK v4.0 for PythonのサンプルコードをAzure Web Appで動作させる方法

# 背景
今回はAzure Bot ServiceでPython用のBot Builder v4.0が新しく登場し、また今回、v4.0をAzure Web Appで実装している記事が少ないということで、これからPythonでBotをAzureで実装したいという人の参考になるようこの記事を執筆しています。
実際に使い、ローカルで開発したBotをAzure上で実装したものを備忘録として残します。**本情報の内容（添付文書、リンク先などを含む）は、作成日時点でのものであり、予告なく変更される場合があります。**

# 使用した環境
私の環境はWindows10、Python 3.7.1です。

# 行ったこと
1. ローカル環境でBot Builder SDK v4.0（Python）をクローン
2. ローカルで作成したBot Builder SDK v4.0（Python）をAzure Bot Service上で実装

# 参考資料
https://qiita.com/mihochannel/items/3c1058b057fd75ce84f5
@mihochannelさんの記事を参考に事前準備を行いました。

また実際のソースコードはこちらのリポジトリからクローンしました。
https://github.com/tdurnford/python-echobot-with-state


# Bot Builder ソースコードをGitHubレポジトリからクローン
まずは、コマンドプロンプトを「管理者として実行」します。Botを作成したいディレクトリまで移動します。移動できたら、GitHubから以下のコマンドでソースコードをクローンします。

```
git clone https://github.com/tdurnford/python-echobot-with-state.git
```

クローン終了後、「python-echobot-with-state」のフォルダに移動し、Botを正常に動かすために、以下のテキストファイルも以下のコマンドでインストールしておきます。

```
pip install -r requirements.txt
```

これができれば、Botをローカルで動かす環境は準備OKです。

# Azure上のセットアップ
今回はAzureポータルのGUIでセットアップしていくのではなく、Azure Cloud Shellを使用して、セットアップを完了していきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/350899/e41e0f0c-9681-dc61-e323-3a1908a76ca7.png)
この赤矢印先のAzure Cloud ShellでソースグループやWeb App、Bot Registrationなどをセットアップしていきます。

# リソースグループの作成
リソースグループとは、一つのアプリケーションを構成するための相互依存グループ、つまりWebサーバーやデータベース、ストレージ、ネットワークなど、複数のリソースをサービスごとではなく任意のグループ、「リソースグループ」でまとめて管理することを指します。

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

```
az group create --name <myResourceGroup> --location "West US"
```

＜myResourceGroup＞ここに任意のリソースグループ名を入れます。＜＞は含まずに任意の名前を入力してください。

# App Service Planの作成
App Service PlanとはWeb appsやLogic AppsなどのApp Service群を稼働させるための環境です。例えば、今回のChat Botを使う上でどれぐらいのCPUやデータベースの性能が欲しいかなど、具体的な実装環境を指します。

以下のコマンドで作成します。

```
az appservice plan create --name <myAppServicePlan> --resource-group <myResourceGroup> --sku B1 --is-linux
```

今回は、Web開発でもよく使われるLinux OSで作成します。OSは任意のものを選んでください。

# Web Appを作成
次にBotアプリケーションを動かすための環境であるWeb Appを作成します。この際、RuntimeをPython3.7に設定し、今回使用している3.7のバージョンで動くようにしておきます。また、APP_NAMEはBot RegistrationのEndpointを指す際に必要になるので、保管しておいてください。ここではその他にも、Gitを使ってAzure上にデプロイするので、そちらの設定もコマンドに含んでいます。

```
az webapp create --resource-group <myResourceGroup> --plan <myAppServicePlan> --name <APP_NAME> --runtime "PYTHON|3.7" --deployment-local-git
```

# Bot RegistrationでBotアプリケーションを登録
次にBotアプリケーションを登録します。これによりMicrosoftのSaaSサービスやサードパーティ製のサービスに接続できるようになります。

まず最初に、[Application Registration Portal](https://apps.dev.microsoft.com/#/appList)で新しくApplicationを作ります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/350899/51902815-d752-6cee-568d-3654e826967b.png)

「アプリの追加」を選択します。はじめに、任意のApp Nameを決めてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/350899/5903d5e5-e1c9-e9d5-9c9c-d6c956fdfafb.png)

上記のような画面に遷移したら、アプリケーションIDと「新しいパスワードを生成」で生成されたパスワードを保管しておきます。その後、ページの一番下にある「保存」するのを忘れないよう注意してください。

**つまりこの段階で「APP_NAME」、「アプリケーションID」、そして「App Password」が揃います。**

これらが揃った段階でもう一度、Azure Cloud Shellに戻り、以下のコマンドを入力します。

```
az bot create --resource-group <myResourceGroup> --name <myPyhtonBot> --kind registration --endpoint https://<APP_NAME>.azurewebsites.net/api/messages --appid <APP_ID> --password <PASSWROD>
```

これでBot Registrationは完了です。

# ローカルで作成したBot Builder SDK v4（Python）のLocal Git Repositoryを作成

先ほどGitHubからクローンしたBot Builder SDK v4（Python）のLocal Git Repositoryを作成します。コマンドプロンプト上で以下のコマンドを実行します。

```
git init
```

Local Git Repositoryを作成します。

```
git add .
```

Indexに押し出します。

```
git commit -m "init"
```

Master Branchにコミットします。

# 作成したLocal Git RepositoryをAzure上にデプロイ
Local Git RepositoryをAzure上にデプロイすることになりますが、その前にAzureポータル上で「Git Clone Uri」や「Gitの資格情報」を調べておく必要があります。
Azureのポータル上で作成したリソースグループのWeb Appを選択します。すると以下の画面になるかと思いますが、**「Git Clone Uri」、アプリケーションの資格情報である「ユーザー名」と「パスワード」を保管しておく必要があります。**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/350899/3b9f69ad-b88e-8333-170c-2bc84d05b7c7.png)


そして再びコマンドプロンプト上で以下のコマンドを実行します。

```
git remote add azure https://<APP_NAME>.scm.azurewebsites.net:443/<APP_NAME>.git
```

https://以降は先ほどコピーした「Git Clone Uri」を使用します。

そして、最後にmaster branchをAzure上にPushするコマンドを実行します。

```
git push azure master
```

実行後、Gitの資格情報を聞いてくるので、先ほどコピーした「ユーザー名」と「パスワード」を入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/350899/dacf30ec-a4ca-f775-847c-a672a4cd7300.png)

これでAzure上にLocal Git RepositoryをPushできました。

# 環境設定
最後にWeb App上でBotを動かすための細かな設定をします。Azureポータルに戻り、リソースグループのWeb Appを選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/350899/d9f5d540-5b72-9ed5-9965-9e303a2544ad.png)


左の項目にある設定のアプリケーション設定を選択し、スタートアップファイルの記入、アプリケーション設定に「APP_ID」と「APP_PASSWORD」を挿入します。最後に「保存」をクリックします。

# 最後にテスト
これでAzure上にデプロイしたBotを動かすことができます。Azureポータルのリソースグループ、「ボットチャンネル登録」を選択し、「Webチャットでテスト」します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/350899/8c247ab4-023c-7134-bd12-e3b3e28f547d.png)

以下のように、言ったことをそのままオウム返ししてくれる簡単なChat Botを動かすことができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/350899/465013db-8cce-b6d2-ad7c-1f5ff443c7d5.png)


以上が「Bot Builder SDK v4.0（Python） をAzure Bot Service上で実装してみた」でした。