Azure
ngrok
BotFramework

BotFramework Emulatorでプロキシを超える方法

BotFramework Emulatorでボットと会話する際、Azure上のボットからの通信は、一旦ngrokクラウドサービスに送信されます。ローカルマシンのngrokプロセスは、ngrokクラウドサービスからその内容を受け取り、その内容をBotFramework Emulatorに転送します。プロキシの内側にあると、ngrokプロセスはngrokクラウドサービスから直接データを取得できません。つまり、ngrokプロセスにプロキシ経由でデータを取得してもらうための設定が必要になります。

現時点(3.5.34)のBotFramework EmulatorのApp Settingsダイアログでは、プロキシを設定できません。このため、システム環境変数にhttp_proxyを追加するか、ngrok.ymlというngrok設定ファイルにhttp_proxyという項目を追加するかします。本記事では、環境変数に色々入れたくない方向けに、後者の方法を説明します。

急いでいる人はこれだけ読んで

  1. 自分のホームディレクトリに.ngrok2という名前でディレクトリを作る
  2. その中にngrok.ymlという名前でファイルを作る
  3. そのファイルに以下の内容を書いて保存する
http_proxy: "http://ユーザ:パスワード@プロキシホスト名:ポート"

BotFramework Emulator で読み込まれるngrok.ymlの場所

現時点の実装では、ngrokマニュアルの「Default configuration file location」で説明されている、デフォルトの場所のngrok.ymlだけを、ngrokの設定ファイルだと認識します。

つまり、以下の場所となります。

  • ~/.ngrok2/ngrok.yml (Unix系、OSX)
  • %HOMEPATH%\.ngrok2\ngrok.yml (Windows系)

ngrok.exeなどと同じディレクトリにngrok.ymlを作っていくら頑張っても無意味ですので、ご注意を。

ngrok.ymlどころか、.ngrok2ディレクトリもないんだけど?

ngrokを使い込んでいて有料プランを使っているような人でない限り、.ngrok2ディレクトリは存在しないはずです。ホームディレクトリに.ngrok2という名前のディレクトリを作って、その中にngrok.ymlという名前のファイルを作ればいいです。

ただ、それすら面倒だったり、本当にそこがデフォルトなの?と疑わしかったりする場合は、ngrok authtoken .と実行すると、ngrokがデフォルトと認識している場所にngrok.ymlを作ってくれます。

C:\>ngrok authtoken .
Authtoken saved to configuration file: C:\Users\User/.ngrok2/ngrok.yml

上記の場合、C:\Users\User\.ngrok2\ngrok.ymlが作成され、デフォルトのngrok設定ファイルと認識されるようになります。

生成されたngrok.ymlを開くと、authtoken: .という文字列が入っています。これは消してください。残っているとngrokでエラーとなります。

ngrok.ymlに書く内容

以下の行を追加します。これだけ。

http_proxy: "http://ユーザ:パスワード@プロキシホスト名:ポート"

現時点でno_proxyには未対応のようですので、プロキシ内の他のマシンにあるボットをテストする場合は、ngrok.ymlを書き換えて切り替える必要がありそうです。

それでも何かエラーが出てるんだけど?

ここまでの設定で、Azureボットとは会話できるようになっているはずです。それでも赤い文字でエラーが出ているかと思います。

[21:28:42] Checking for new version... 
[21:28:43] Command failed: 4294967295 System.AggregateException: (以下略

BotFramework Emulatorが起動するたびに更新がチェックされます。その際、Emulator内部でSquirrelというサードパーティのライブラリを呼び出しています。Squirrelライブラリ単独ではプロキシ設定を行うことができず、BotFramework EmulatorからSquirrelにプロキシ設定を渡す必要があるようですが、それをやってないために発生している模様です。

現状、プロキシ環境下では自動更新を諦め、定期的に配布サイトを確認するしかなさそうです。将来はSquirrel以外の方法での更新を検討しているようです。

参考: Bot Framework-Emulator Auto-Update dose not support authentication proxy #329