🔒

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

2024/08/19に公開

はじめに

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

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

Microsoft Docs には以下に説明があります。

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://{{domainname}}.azurewebsites.net/.bot にアクセスすると以下のようなメッセージが返されます。kIBOBInitialized のすべての値が 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://{{domainname}}.azurewebsites.net/.bot/v3/directline/tokens/generate に POST 要求を呼び出します。

POST https://{{domainname}}.azurewebsites.net/.bot/v3/directline/tokens/generate
Authrozation: Bearer {{secretkey}}

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

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

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

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

おわりに

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

Discussion