🔒

Azure AI Bot Service の Direct Line App Service 拡張機能について

に公開
2

はじめに

前回の記事で説明しなかった Direct Line App Service 拡張機能について解説します。

https://zenn.dev/karamem0/articles/2024_08_13_150000

Microsoft のドキュメントには以下に説明があります。

https://learn.microsoft.com/ja-jp/azure/bot-service/bot-service-channel-directline-extension?WT.mc_id=M365-MVP-5002941

Azure AI Bot Service では、Teams、Slack、LINE などの外部サービスと連携できます。また、Direct Line を利用することで組織のサイトにもボットを追加できます。Direct Line を簡単に呼び出すための Web チャット コントロールも公開されており、JavaScript または React を使って組み込むことができます。

組織のサイトにボットを追加する際に問題となるのがセキュリティです。Direct Line の API は https://directline.botframework.com で公開されています。クライアントが API を呼び出すと、Azure AI Bot Service から Bot Framework が実装された Azure App Service を呼び出します。この方法では通信がパブリック ネットワークを経由してしまうため、問題になる場合があります。Direct Line App Service 拡張機能を有効にすると、クライアントと Azure App Service を直接接続できるようになります。

実行手順

Direct Line App Service 拡張機能は Azure App Service に既定でインストールされています。Direct Line App Service 拡張機能を有効にするためには、ボットのコードに名前付きパイプを有効にする 1 行を追加します。ただし、ローカルでは Direct Line App Service 拡張機能を実行できないため、デプロイしたときのみ有効にする必要があります。

if (env.IsDevelopment())
{
    _ = app.UseDeveloperExceptionPage();
}
else
{
    _ = app.UseWebSockets();
    _ = app.UseNamedPipes($"{Environment.GetEnvironmentVariable("APPSETTING_WEBSITE_SITE_NAME")}.directline");
}

アウトプロセス ホスティング モデルで動作するようにプロジェクト構成を変更します。

<PropertyGroup>
  <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
</PropertyGroup>

Azure App Service に環境変数を 2 つ追加します。

キー
DirectLineExtensionKey Azure AI Bot Service の チャンネル - Direct Line - App Service 拡張機能 にある拡張キー
DIRECTLINE_EXTENSION_VERSION latest

実行結果

https://{{domain-name}}.azurewebsites.net/.bot にアクセスすると、以下のようなメッセージが返されます。K、IB、OB、Initialized のすべての値が true であればセットアップ完了です。

{"V":"1.2.0.0.e84fbf1863c30abdf7b40dc11a91bc86044d49a2","K":true,"IB":true,"OB":true,"Initialized":true}

Update your Bot Framework SDK version to 4.18.1 or later will fix IB/OB false issue.

Web チャットで表示させる場合は、Direct Line の秘密キーを指定する前にトークンを取得する必要があります。https://{{domain-name}}.azurewebsites.net/.bot/v3/directline/tokens/generate に POST 要求を送信します。

POST https://{{domain-name}}.azurewebsites.net/.bot/v3/directline/tokens/generate
Authrozation: Bearer {{secret-key}}

応答としてトークンを取得できます。

200 OK
{
  "conversationId": "K1oz...",
  "token": "eyJhbGci...",
  "expires_in": 1800
}

Web チャットにトークンを指定して初期化します。

window.WebChat.renderWebChat(
  {
    directLine: await window.WebChat.createDirectLineAppServiceExtension(
      {
        domain: 'https://{{domain-name}}.azurewebsites.net/.bot/v3/directline',
        token
      }
    )
  },
  document.getElementById('webchat')
);

おわりに

ここまでできれば、クライアントと Azure App Service のネットワークを閉域化するのは難しくありません。前回の記事とは異なり、エンドツーエンドで通信を分離できるため、高度なセキュリティが要求されるボットではぜひ試してみてください。

Discussion

JinderJinder

こんにちは「Karamem0」

まず、このブログ記事をありがとうございます。このブログの後、Kが「真」で、IBとOBが「偽」であるという問題を解決することができました
私はアウトプロセスホスティング構成を使用しましたが、後でK、IB、OBの3つの値すべてが「true」になりました。
ここで「アウトプロセス」設定がどのように役立ったか説明していただけますか。

言語の間違いは無視してください。私はグーグル翻訳を使用しています。:)

ありがとう、そしてよろしく

karamem0karamem0

Jinder さん、こんにちは

コメントしていただいてありがとうございます。

アウト プロセス ホスティングについては以下のドキュメントを参考にしてください。
https://learn.microsoft.com/en-us/azure/bot-service/bot-service-channel-directline-extension-net-bot

Enable the bot to use the out of process hosting model; otherwise, you'll receive an HTTP Error 500.34 - ANCM Mixed Hosting error (where ANCM stands for ASP.NET Core Module). This error occurs because the bot template is using the InProcess hosting model by default.