9月にフロリダで行われた Microsoft Ignite 2018 で、Bot Builder V4 (正確には v4.0.7 以降が対象)も大きな変更になり、私の過去のBotV4(4.0.1)ブログは無意味な情報になった今日この頃です。
Bot ファイル(拡張子が .bot
のファイル)の Secret 関連も、ソースを初見でみただけじゃ分かりにくくなっています。
今回の話は、
Azure のポータルで、Bot Service (Web App Bot)のv4 のを作成した際、
ソースコードをダウンロードしてデバッグするとException が発生してしまう件の原因と対応方法について
です。
Bot Service の作成とダウンロード
ここは手順書きません...が、今回は、Bot Service の Web App Bot で、ボットのテンプレートは、以下を作成したときを前提に話します。
これで、Bot Service のリソースの「ビルド」 > 「zip ファイルをダウンロード」でダウンロードができます。
(手順は書きませんが、そのうち公開するハンズオン資料をリンクさせます。)
デバッグで実行
ダウンロードした zip を解凍して、ソースコードを開き、デバッグしてみましょう。
Startup.cs の ConfigureServices
メソッドで Exception が発生します。
エラーメッセージが catch
ステートメントで書かれた文字列で原因が分からずですね(ドキュメント読んで理解してから使えよという空気は察しますが...)。
catch
ステートメントで Exception を拾って中身を覗いてみましょう。
「シークレットないぜ」って書いてますね。
Bot File と Bot Secret
ざっくり説明すると、Bot Service で作られたソースの .bot ファイルは暗号化されてるので、複合キーが必要です。
今回の Exception は、secretKey
(ConfigureServices
メソッド内の変数、Configuration
変数から取得するやつ)が必要なのに、それがないことが起因して Exception 吐いてます。
解決には、正しいキーを読み込めばよいわけです。
詳しくは以下の公式ドキュメント(GitHub ですが)に書いてます。
キーの取得
キーは、Bot Service 作成時に勝手に作られて勝手に格納されています。場所は、Web App Bot の App Settings にあります。
Azure のポータルで、Web App Bot のリソースを開き、「アプリケーション設定」を開いた中にある「アプリケーション設定」から botFileSecret
の値を取得しましょう。
キーのセット
Visual Studio でソリューションエクスプローラーから appsettings.json
にシークレットキーを入れるのは、あまりにもい聞けてない気がしますね。
UserSecret に入れましょうか。
プロジェクト名を右クリック > 「ユーザーシークレットの管理」を開きます。
そうすると、secret.json
が開かれますので、以下のように入力しましょう。値には、先ほど取得したキーを入力します。
{ "botFileSecret": "{さっき取得したbotFileSecretの値}" }
余談ですが、
- UserSecret の実体は、
%APPDATA%\microsoft\UserSecrets\<userSecretsId>\secrets.json
にあります。 - パスの
<userSecretsId>
はアプリが勝手に採番したユニークIDです。
キーの読み込み
ローカルデバッグ時だけ読み込めばよいので、Startup
クラスのコンストラクターにそう書きましょう(11行目から13行目の部分)。
これで Bot Builder v4 さんが期待する通りの準備作業って感じになり、正常にデバッグを行うことができます。
終わりに
つまりは、Bot Builder V4 のプロジェクトを Visual Studio から作った時は、.bot
ファイルのシークレットを作ったりーを msbot
コマンドで作ってーホスト先の AppSettings に書くとかの必要がありそうですね。
そこら辺も今後時間があったら書いていきます。
あーそれ含め、V4 の情報をポチポチとアウトプットできればと思っています。