BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

Bot Builder V4 開発入門 : C# : 会話ログ を Blob Storage に保存

Bot Builder V4 での会話ロギングを、Nuget パッケージ: Microsoft.Bot.Builder.Azure でサクッと実装する方法のメモです。

環境

  • Bot Builder SDK: v4.0.7 以降

概要

過去のブログでは、Bot Framewok V3 時代の会話ロギングで Nuget パッケージ: Microsoft.Bot.Builder.Azure を使いましたが、V4対応されており、サクッと実装できます。

準備

Echo Bot の作成

とりあえず、Echo Bot のプロジェクトでも作ってみましょう。

手順は、VS 2017 でプロジェクトを作成するだけです。v4.0.7用のはまだブログに書いてないので、
とりあえず私が作ったハンズオンマテリアルのリンクで。。。

サクッとエコーボットが完成します。

Nuget のインストール

Nuget パッケージ: Microsoft.Bot.Builder.Azure をインストールします。
Visual Studio の上部のメニュー ツール > Nuget パッケージマネージャー > ソリューションの Nuget パッケージの管理 を開きます。
検索に「Microsoft.Bot.Builder.Azure」と入力して、パッケージをインストールしましょう。

f:id:beachside:20181018113719p:plain

Azure Blob Strorage の準備

これは Bot の話じゃないので説明は省きますが、
Azure のポータルから適当に Storage を作って、Blob を使えるようにしましょう。

操作は、公式ドキュメントの ストレージ アカウントの作成 くらいでサクッとできますね。

この後、Blob の内容確認用には、定番の Azure Storage Explorer を使います。


会話ロギングの実装

ようやく本題です。

雑に実装

Middleware の実装なので、Startup.cs にコードを追加します。
Startup クラスの ConfigureServices メソッドで、以下の感じで雑に実装してみました。

  • 普段ではありえないですが、18-19行目のように Blob 接続文字列とコンテナ名を雑にべた書きしました。
  • 21-23行目のように書けば、実装完了。


デバッグで実行し出力を確認

指定した Blob に、以下のファイル命名規則に従って json ファイルが出力されます。Blob へ出力されるパスは以下になります。

{container}/{channelId]/{conversationId}/{Timestamp.ticks}-{activity.id}.json.

出力される json の中身は、Bot Emulator で見えているフォーマットがそのまま保存される仕様です。

デバッグして、Bot Emulator からチャットボットと会話してみましょう。

f:id:beachside:20181018113739p:plain


Azure Storage Explorer で対象の Blob を見てみると、「transcript-log」>「emulator」> json ファイルが格納されています。

f:id:beachside:20181018114252p:plain


雑に実装 - ローカルのStorage Emulator へ接続

開発中、ローカルデバッグ時に Azure の Blob に接続してると非生産的で、はいクソーとなります。

デバッグするときはローカルで実行可能な Storage Emulator に接続して開発するのがベターですね。
Storage Emulator は、CLI で中身をクリアーしたりできるので、便利だと感じています♪

雑に実装してみましょう。
前述のコードの18行目で、Azure の Storage の接続文字列を定義していましたが、環境に応じてローカルの Storage Emulator に接続できるようにします。

環境に応じて色々定義するASP.NET Core あるあるなやり方ですが、今回のサンプルだと前述のコードの13行目で定義している environment 変数 で分岐をして以下のようにすればよいです。

暴力的にべた書きしました。


デバッグで実行して、Azure Storage Explorer で見てみましょう。ローカルの Storage Emulator に値が入っていることが確認できます。

これで例えば Azure の本番環境にデプロイしたら接続切り替えができますが、こんな雑実装が許されるのは、サンプルコードだけですね。


おわりに

ここまでくると、最終的には必要な情報を .bot ファイルに格納して、(プロジェクトテンプレートで生成されたコードの実装のように) botConfig から値をやり取りするとか、Azure の Key Vault 使うとか色々ありますね。

bot ファイルがらみは、そのうちまとめて書こう...きっと。

会話ログを Middleware レベルでやってくれるとビジネスロジックのコードに集中できるのでいいですね。ここら辺は ASP.NET Core の恩恵ともいえるでしょう。 Middleware として用意されているものがいろいろとあるので、今後メモっていこうと思います。

参考