【第1/5】Teams bot をローカル (Visual Studio 2019) で開発し、Azure で無料で動かす【その１：VS でローカル web サーバ立てる編】 #decode20 #A02

この記事では、Teams で動く chat bot を、ローカル (Visual Studio) でデバッグしながら開発する方法を、初心者でも分かりやすいようにスクショ満載でまとめました！

（スクショ満載にした結果、１ページが長くなり過ぎたので、5 つに記事を分割します。この記事はそのうちの最初の１つです。）

1. **【第 1/5 回】VS でローカル web サーバ立てる編**【← 今ここ】 
1. [【第 2/5 回】エミュレータ準備編](https://qiita.com/chomado/items/b2f1020d598ebd855aa1)
1. [【第 3/5 回】Azure 側の設定編（ボットチャンネル登録）](https://qiita.com/chomado/items/5b1c3da4badd6510905b)
1. [【第 4/5 回】Teams に繋げてデバッグ編](https://qiita.com/chomado/items/23c66a975e21265d99ae)
1. [【第 5/5 回】Azure にデプロイ編](https://qiita.com/chomado/items/abd0c39d21ec6778295a)


![Teams bot 開発](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/ed553e97-4730-95ef-4588-c4ab8ee364ad.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/86cb2a35-7c7d-a25c-63e9-926e0a8367a3.png)

ちなみに、この記事は、オンライン開催された
日本マイクロソフト公式技術カンファレンス『[de:code 2020](https://www.microsoft.com/ja-jp/events/decode/2020/default.aspx?WT.mc_id=docs-qiita-machiy)』の、
私の行ったセッション『[Azure Bot Services を使って Teams bot を開発する](https://www.microsoft.com/ja-jp/events/decode/2020session/detail.aspx?sid=A02&WT.mc_id=docs-qiita-machiy)』で発表した内容の記事版です。

![イラスト3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/15bf29cd-8f8a-c065-e1f7-6aaa9b38bdee.png)

## セッション動画

[追記] 2020/07/20(月) に、セッション動画が YouTube で公開になりました！

セッション動画はこちらです！
『[de:code 2020 セッション A02：Azure Bot Services を使って Teams bot を開発する](https://youtu.be/T5Acz8LT8EM)』

↓ 再生スピードを調整できます

<a href="https://youtu.be/T5Acz8LT8EM" target="_blank"><img width="430" alt="de:code 2020 Teams bot 開発" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/3eeddd81-9ed1-177d-824f-cb2aeb033958.jpeg"></a>

（なんと字幕付き）（私は滑舌が悪いので字幕付けて頂けて助かったｗ）

### 前回書いた記事との違い

`(*ﾟ▽ﾟ* っ)З` 「あれ？　Teams bot 開発とか、少し前も同じような記事 書いてなかったっけ？」

たしかに似た記事は書いたけど、でもちょっと違う！　前回のは簡易版（お試し版）で、今回のは本格版！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/0ecd5e59-a740-7211-ba74-f9dc7e2be29a.png)


前回の記事『[Microsoft Teams で動く オレオレ bot を 1 時間で作る](https://qiita.com/chomado/items/6bda10abde0551f25723)』では、
全て Web ブラウザ上で完結する、とても簡単な方法をご紹介しました。
コードも Azure Bot Services に内蔵されているオンラインエディタ上で編集できるので、ローカルに開発環境が無くてもサクッと動かせます。

これは本当に簡単なので（マジで1時間で動く）お試してやってみるのにはめちゃ便利なのですが、
いっぽうで、ローカル開発環境でデバッグしながら開発できないという欠点もあります。
本格的な業務用アプリを作るなどになるとこれではつらくなると思います。

なので、今回は、これのステップアップ版として、本格的にローカル開発環境でデバッグしながら Teams bot を開発する方法をご紹介します。


↓ これ書いてる途中にツイートしたもの

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">今、Teams bot 開発の丁寧な記事を書いてるよ！<br><br>前回書いた、１時間以内爆速で Teams bot 開発する記事（<a href="https://t.co/H9OEVanb3O">https://t.co/H9OEVanb3O</a>）は<br>簡単さ重視にして、コードの編集も含め全て web ブラウザ上で完結する内容にしたから<br><br>今回はちゃんとローカル開発環境を整え、ローカルデバッグする方法で書いてる <a href="https://t.co/jUNtjmdDT9">pic.twitter.com/jUNtjmdDT9</a></p>&mdash; ちょまど🎀ITエンジニア兼マンガ家 (@chomado) <a href="https://twitter.com/chomado/status/1260615679712956416?ref_src=twsrc%5Etfw">May 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 参考資料

* 公式ドキュメント『[Bot Framework SDK for .NET を使用したボットの作成](https://docs.microsoft.com/ja-jp/azure/bot-service/dotnet/bot-builder-dotnet-sdk-quickstart?view=azure-bot-service-4.0&WT.mc_id=docs-blog-machiy)』
* 公式ドキュメント『[ボットをデプロイする](https://docs.microsoft.com/ja-jp/azure/bot-service/bot-builder-deploy-az-cli?view=azure-bot-service-4.0&tabs=csharp&WT.mc_id=docs-blog-machiy)』


## 補足

Azure を操作する方法として、

1. ポータル画面の画面ポチポチの方法と 
2. CLI からコマンド叩く方法

がありますが、
公式ドキュメントは全てコマンドラインからのもので書かれています。（公式ドキュメントは全て GitHub で管理されてるからコマンド（コード）で書かれている方が差分管理しやすいのと、Azure ポータル画面の UI が変わったときスクショ全部撮り直すことになるから、CLI 版で書いた方が安全だからだと思う）（個人的な予想）

でも、初心者は画面でやった方が直感的に理解しやすいと思うので、今回の記事では全てポータル画面から操作する方法をとっています。
スクショ満載でまとめました！

# 完成形

Teams で動く bot です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/0b8c03a5-0226-7c49-0fcc-d820286a2bb6.png)

# chat bot とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/fc42542b-5479-9ccb-fd66-13e7841c6b12.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/04f4876f-1808-024d-4192-d81387fdff50.png)


# 全体像 (ステップごとのアーキテクチャ図)

Teams bot 開発の全体アーキテクチャ図を順を追って説明します。
三段階に分けました。

## Step 1: まずはローカル実行（エミュレータからの接続）

まだクライアントは Teams ではなくエミュレータです。
クライアントもサーバーも
私のパソコンの中 (ローカル開発環境) で閉じているので、大変シンプルですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/8f02f7a5-e0f3-6785-e30a-3c0f5dad9fbf.png)

Visual Studio でローカルサーバーを実行していて、
同時に Bot Framework エミュレータも起動しています。

エミュレータで「こんにちは」と打つと、
ローカルサーバーのエンドポイント (`http://localhost:3978/api/messages`) に問い合わせて
サーバーが「`(*ﾟ▽ﾟ* っ)З` って返して」と送り、
エミュレータでそのように表示されます。
シンプルですね。まずはここからですね。

## Step 2: まずはローカル実行（Teams からの接続）

クライアントが Teams になりました。
すると、今まで私のパソコンの中で閉じていた世界から、インターネットの向こう側に登場人物が増えましたね。

増えた人：

* 管理する Microsoft 365 (旧 Office 365) 系のサーバーや Bot Framework Service のサーバー
* 自分の Azure 環境

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/2e318cc8-9766-4532-8ff3-b189206874bf.png)



1. クライアントは 私のパソコンの中の Teams アプリですが、そこで「こんにちは」とメッセージを打つと、そこからインターネット上の、マイクロソフトの管理する Microsoft 365 (旧 Office 365) 系のサーバーや Bot Framework Service のサーバーを経由し
2. 自分の Azure 環境に立てた **Bot チャンネル登録** に「エンドポイントどこかな？」と問い合わせます。
3. **Bot チャンネル登録** が「エンドポイントはここやで」とエンドポイントの URL を返します。今回はローカル実行中なので、トンネリングしているのでエンドポイントは `https://***.ngrok.io/api/messages` となります。 
4. そのエンドポイントに問い合わせが来ます。「Teams から『こんにちは』って来たで」
5. サーバーが「`(*ﾟ▽ﾟ* っ)З` って返して」と送り返し、
6. 最終的に Teams で「`(*ﾟ▽ﾟ* っ)З`」と表示されます

## Step 3: Azure にデプロイ。クラウドで実行（Teams からの接続）

bot サーバーがローカル実行からクラウド実行になりました。
左下の私のパソコンの中から「ローカルサーバー」が消えて、代わりに、Azure の中に **Web App** と **App Service Plan** が増えましたね。
これで私のパソコンを落としても bot は動き続けるね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/85c8002d-4f59-e32e-3012-df2339f34ed7.png)

# 1. Teams bot をまずローカルで開発（web サーバー準備編）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/8f02f7a5-e0f3-6785-e30a-3c0f5dad9fbf.png)


最終的にクラウド (Azure) にデプロイしますが、
まずはローカルで bot を動かせるようにしましょう。

（ローカルのままだとパソコン閉じたら bot 動かなくなるから、クラウドかどこかのいつでもレスポンスしてくれるサーバーに上げる必要があります）

## 1-1: Visual Studio 2019 に、Bot Framework 用のテンプレートを入れる

まずは `Visual Studio 2019` を起動しましょう。（`Visual Studio Code` じゃないよ。`Visual Studio 2019` だよ）

起動したら右下の「`コード無しで続行→`」を押します。

![イラスト5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/0ea84442-b876-38b0-cef7-1a66570b7d09.png)

空っぽのプロジェクトが立ち上がるので、メニューの「拡張機能」→「拡張機能の管理」を押します。

![イラスト.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/5ee973e4-c0c1-fea9-18a2-80882c2b5c3f.jpeg)

すると、全世界の開発者の方々がアップした、拡張機能一覧が出てきます。
検索バーで「bot」と打ち絞り込み、「**Bot Framework v4 SDK Templates for Visual Studio**」を選択し、ダウンロードします。

![イラスト2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/ff4a706d-3a58-3352-0881-b63d847506ac.png)

画面の下の黄色のバーにも書いてありますが、今ダウンロードした拡張機能は、Visual Studio の「次回起動時に」適用されます。

なので、
ダウンロードが終わったら、
Visual Studio をいったん閉じます。（重要）

閉じて、もう一度起動すると、インストールが走ります。

## 1-2: Bot Framework プロジェクト新規作成

Visual Studio を再起動し、「新しいプロジェクトの作成」をクリックします。

![イラスト3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/f9aa8ab4-a4d2-8e59-de4c-9ceabf21064f.png)

テンプレートがたくさん出て来るので、「bot」で絞り込みましょう。
今入れたプロジェクトテンプレートが選べるようになっています。
今回は、そのなかの「`Echo Bot (Bot Framework v4)`」を選択し「次へ」を押します。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/dca67b74-d835-e754-c6cc-57b329783f10.png)


プロジェクト名を適当に決めます。

<img width="430" alt="Untitled.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/d97534b3-c573-f153-c885-071876282b55.png">


「作成」すると、プロジェクトが開きます。


## 1-3: NuGet 更新

NuGet (ぬげっと)(.NET のパッケージ マネージャ) のパッケージ更新しておきましょう。

Visual Studio のソリューションエクスプローラーから「依存関係」→「パッケージ」右クリックで、「NuGet パッケージ管理」を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/a0bbf288-18bb-6a38-8893-16901ba663c5.png)

更新があるようなので、最新の安定板にしておきます。

![イラスト3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/f3c140b7-b2b9-8137-3201-1745f10c98f4.png)


ライセンスに同意します。

![イラスト2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/aa4854e1-b40c-e142-88f2-632c83f6b496.png)


これで最新版のパッケージが入りました。


## 1-4: web アプリがちゃんと起動するか確認

この作成した ASP.NET Core 製の web アプリは、
bot のクライアント（Teams）からの REST リクエストを受け取る API を発行する人になります。

とりあえずちゃんと起動するか（ASP.NET Core の実行環境が整っているか）確認するために、実行してみましょう。

実行ボタンを押します。

![イラスト5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/772424f6-7430-c569-6652-19894f5b8b9a.jpeg)

ちなみに、この実行ボタンに書いてある `IIS Express` とは、Web サーバーサービスです。

(`IIS` は `Internet Information Services` の略。)

もともと `IIS` という Microsoft Windows の標準 Web サーバー（アプリケーションサーバー）サービス があるのですが、
その簡易版が `IIS Express` です。

今回、この ASP.NET Core 製の web アプリを、IIS Express で動かすので、実行ボタンがそうなっています。

で、実行すると、web ブラウザが立ち上がり、`localhost` 上で "Your bot is ready!" と表示された web ページが出てきます。

![イラスト4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/b26c857c-f0c7-2bd5-4c7b-124f7786b261.png)

この画面になったら OK です。ちゃんと動いてる。

実行を停止しないで、サーバを動かしたまま、次に進みましょう。

# Next Step

というわけで、ローカルサーバーが立ち上がりました。
次はクライアントのエミュレータを準備しましょう。




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24609/8f02f7a5-e0f3-6785-e30a-3c0f5dad9fbf.png)

1. 【第 1/5 回】VS でローカル web サーバ立てる編【← 今ここ】 
1. [**【第 2/5 回】エミュレータ準備編**](https://qiita.com/chomado/items/b2f1020d598ebd855aa1)【← 次はこれ】 
1. [【第 3/5 回】Azure 側の設定編（ボットチャンネル登録）](https://qiita.com/chomado/items/5b1c3da4badd6510905b)
1. [【第 4/5 回】Teams に繋げてデバッグ編](https://qiita.com/chomado/items/23c66a975e21265d99ae)
1. [【第 5/5 回】Azure にデプロイ編](https://qiita.com/chomado/items/abd0c39d21ec6778295a)


次の記事： [https://qiita.com/chomado/items/b2f1020d598ebd855aa1]