Bot Framework Composer でボット開発 : その 13 開発時のデータベース利用

[前回](https://qiita.com/kenakamu/items/562eccb756d18d24252c) はチャンネル固有の機能について見ていきましたが、今回はローカル開発時のデータベースについて説明します。

[ボットの公開](https://qiita.com/kenakamu/items/c0bce7ff54711ff53cbe)でも説明した通り、公開されたボットはバックエンドデータベースとして 3 種類のストレージを使用します。

- Application Insights: ボットの利用状況やリソースをモニタリング
- Azure Cosmos DB: ボットのメモリオブジェクト保存用
- ストレージアカウント: ボットとユーザーのやり取り保存用

開発時にはメモリオブジェクトを使うため、ボットを再起動するたびにデータが失われるため、以下の点に注意が必要です。

- エミュレーターからの接続方法で新規ユーザーを使うのか、既存ユーザーを使うか
- 実際に Cosmos DB やストレージアカウントに保存される内容が公開するまで不明

# 開発時のデータベース利用設定

Composer の設定より各種接続文字列を反映すれば開発中でも Cosmos DB などを利用することができます。

1\. プロジェクトの保存フォルダにある BotProject.sln を開く。既定で <ユーザードキュメント>\Composer。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/3ba7ee63-8533-c61b-a4ae-9b2f325a4b1d.png)

2\. appsettings.Deployment.json より blobStorage, comosDb, applicationInsights をコピー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/b0ac25bf-2828-1136-eb78-c9a5a4faa5c1.png)

3\. Composer より設定を開き、コピーした内容を張り付け。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/fbd2bf6b-a686-0c1d-6954-91990294f934.png)

## Composer の設定ファイルの扱い

Composer 内で設定した内容は ComposerDialogs/settings フォルダに保存され、Program.cs によって読み込まれる。そのため開発中、本番関係なく設定が有効になるため、テスト用の値を入れた場合、発行前に明示的に取り除く必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/a3f36421-2413-8b59-ea8c-21e191c45b93.png)

# Cosmos DB

エミュレーターで何度か新規ユーザー ID を使って、プロファイル登録処理を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/89c568f9-dacb-aefb-8b95-e0e01b5513d1.png)

その後 Cosmos DB に格納されたデータを確認します。

1\. [Azure ポータル](https://portal.azure.com) へ接続し、Cosmos DB を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/80f1885d-e289-2a1a-b832-57837ee1df52.png)

2\.「Data Explorer」を選択し、コレクションを確認。appsettings.json で指定した botstate-db の botstate-collection を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/bda7c496-64e5-815c-720b-1a259c36fa80.png)

3\. items より users*2f<user_id> を選択。ドキュメントに user 記憶域のデータがあることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/27245f23-ba4f-2dff-4596-bb9dcce664b0.png)

4\. conversations アイテムも確認。こちらは conversation 記憶域のデータが保存されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/90d03da3-10bf-59f5-bb0a-f9faefe8ff9a.png)

5\. エミュレーターでも最後の Bot State にある conversation を確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/4444b938-7f9a-8ea8-6f35-a913b322b190.png)

つまり Cosmos DB は BotBuilder で利用する BotState がすべて入っているため、これまでに会話したユーザーの総数や、ユーザーごとの会話の数、最後の会話などを取得できます。

# ストレージアカウント

同様にストレージアカウントも確認します。

1\. [Azure ポータル](https://portal.azure.com) より、ストレージアカウントを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/4b6e7465-82fe-2a76-7eb1-5133fd79c09f.png)

2\. コンテナーを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/86b53609-c3f5-84f8-1e16-ac21780dc314.png)

3\. transcripts フォルダにチャンネルごとにフォルダがある。今回は emulator を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/4566e11f-08c9-b2b6-d295-79ea5203c9db.png)

4\. Conersation ID 後とのフォルダがあるため、任意のものを選択。今回は最後にエミュレータで会話したものを選択。エミュレーターで Conversation ID を確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/f42240f4-bf84-18e1-4774-3ccbce7cbbcb.png)

5\. コンテナーも同じ ID を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/6cdeedd0-50d9-5170-2f09-d14b25c1ea63.png)

6\. 一番最後のデータをダウンロードして開く。エミューレーターで得られるデータがそのまま保存されていることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/546f941d-79f5-e51f-7591-6e97144ae2b1.png)

# Application Insights

Application Insights は既定でテンプレートに入っていないため、手動で追加する必要があります。
様々な方法で追加できますが、詳細は以下記事を参考にしてください。

[Bot Builder v4 : Application Insights を駆使した利用状況分析](https://qiita.com/kenakamu/items/66a34ceb52244ebe7356)

そのほかにも、App Service またはボットチャンネル登録でも個別に Application Insights を設定でき、それぞれ違う種類のデータが取得可能です。

# Transcript を停止する

本番でも会話の詳細を記録したくない場合、blobStorage の設定をすべての構成ファイルから削除してください。Transcript は専用のミドルウェアで記録されますが、接続文字列が無い場合は動作しません。

```csharp:startup.cs
if (!string.IsNullOrEmpty(settings.BlobStorage.ConnectionString) && !string.IsNullOrEmpty(settings.BlobStorage.Container))
{
    adapter.Use(new TranscriptLoggerMiddleware(new AzureBlobTranscriptStore(settings.BlobStorage.ConnectionString, settings.BlobStorage.Container)));
}
else
{
    Console.WriteLine("The settings of TranscriptLoggerMiddleware is incomplete, please check following settings: settings.BlobStorage.ConnectionString, settings.BlobStorage.Container");
}
```

# まとめ

今回はデータベースにどのような値が格納されるか見ていきました。また開発中でもデータベースを利用する方法も紹介しました。是非お試しください。

[目次へ戻る](https://qiita.com/kenakamu/items/6dc043cfc1f199032883#bot-framework-composer)