アプリケーション開発ポータルサイト
ServerNote.NET
Amazon.co.jpでPC関連商品タイムセール開催中!
カテゴリー【Microsoft AzureDebianWindowsNode.js
【Microsoft Azure】BotBuilder-SamplesのサンプルボットをローカルからAzureにデプロイする
POSTED BY
2023-01-12

Microsoft Azureポータル(portal.azure.com)内で新規作成したボットで完結するならポータルGUIだけで事足りるが、BotBuilder-Samplesのように他の人が作ったソースを取り込んで使いたい場合、どうしてもコマンドラインからの操作が必要になる。
ローカルソースをAzureクラウドにアップロード(デプロイ)すればWebChatでテストが簡単にできるし、リモートのDebianからREST API経由でのテストもできるようになる。

公式マニュアルは

Bot Framework SDK for JavaScript を使用したボットの作成
ボットをデプロイする

で、この通りにすれば良いのだがいまいちわかりにくいのでメモ。自分の環境はDebian Buster + Node.jsで行った。Microsoft Azureのアカウント登録はできているものとする。

1、コマンドラインツールのインストール

マニュアルのとおり。

curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

2、BotBuilder-Samplesサンプルソースコードの取得とローカル実行

Gitリポジトリから取ってくる。

git clone https://github.com/microsoft/BotBuilder-Samples.git

ユーザーから入力を受け取る44番のサンプル(Node.js版)を使いたいので実行。

cd botbuilder-samples/samples/javascript_nodejs/44.prompt-for-user-input/
npm install # ビルド
npm start # 実行

このマシンの3978番ポートリッスンでボットが立ち上がるので、BotFramework-Emulatorでテストできればテストする。しかしWindowsでないとダメだしリモートからだとngrok.exeが必要だったりとテスト1つするのも面倒極まりない。さっさとデプロイしたほうがいいので次に進む。(↑Ctrl+Cでさっさと終了)

3、デプロイテンプレートのコピー

44.prompt-for-user-inputにはなぜかテンプレートが無いので02などからコピーする。

cd botbuilder-samples/samples/javascript_nodejs/44.prompt-for-user-input/
cp -Rp ../02.echo-bot/deploymentTemplates .

4、Azureにログイン&サブスクリプション設定

az login
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code GR2RCWA6V to authenticate.

とすると、ポータルのURLと認証コードが出力されるので、クリックして、ブラウザーでログイン&認証コードを入力すると、情報画面が出る。

[
  {
    "cloudName": "AzureCloud",
    "id": "XXXXXXXX-c0f9-43c1-9b42-13319f75a31e",
    "isDefault": true,
    "name": "無料試用版",
    "state": "Enabled",
    "tenantId": "ZZZZZZZZ-9e6b-4c1a-aa1d-f9bb90663b27",
    "user": {
      "name": "hogeuser@example1155.jp",
      "type": "user"
    }
  }
]

ここの「id」が次に入力するサブスクリプションIDなので、次のコマンドで設定する。

az account set --subscription "XXXXXXXX-c0f9-43c1-9b42-13319f75a31e"

5、アプリ登録の作成

az ad app create --display-name "hogeuser-app-44-prompt-for-user-input" --password "AtLeastSixteenCharacters_0" --available-to-other-tenants
(略)
"appId": "YYYYYYYY-77cf-42c8-9fc2-e670f56bd621",

パスワードはちゃんと変えなきゃだめだが、サンプルテストなら↑のままでもよいだろう。
成功するとたくさん情報が出力されるが、デプロイに必要になるのは--passwordと、生成されたappIdである。

6、指定可能なロケーション識別子の一覧確認

az account list-locations
(略)
{
    "displayName": "Japan West",
    "id": "/subscriptions/4db49437-c0f9-43c1-9b42-13319f75a31e/locations/japanwest",
    "latitude": "34.6939",
    "longitude": "135.5022",
    "name": "japanwest",
    "subscriptionId": null
  },
  {
    "displayName": "Japan East",
    "id": "/subscriptions/4db49437-c0f9-43c1-9b42-13319f75a31e/locations/japaneast",
    "latitude": "35.68",
    "longitude": "139.77",
    "name": "japaneast",
    "subscriptionId": null
  },

idの最後にある、japanwest、japaneastなどを、次の登録時ロケーション識別子として指定する。

7、デプロイ登録

3、でコピーしておいたデプロイテンプレートを指定するのでそのディレクトリまで移動して実行。

cd botbuilder-samples/samples/javascript_nodejs/44.prompt-for-user-input/deploymentTemplates

az deployment create --name "hogeuser-deploy-44-prompt-for-user-input" --template-file "template-with-new-rg.json" --location "japaneast" --parameters appId="YYYYYYYY-77cf-42c8-9fc2-e670f56bd621" appSecret="AtLeastSixteenCharacters_0" botId="hogeuser-bot-44-prompt-for-user-input" botSku=F0 newAppServicePlanName="hogeuser-appplan-44-prompt-for-user-input" newWebAppName="hogeuser-webapp-44-prompt-for-user-input" groupName="hogeuser-group" groupLocation="japaneast" newAppServicePlanLocation="japaneast"

赤文字エラーが出なければ成功。
appIdは 5、で返ったappId、appSecretは 5、で指定した --password

8、ソースコードアップロード準備

cd botbuilder-samples/samples/javascript_nodejs/44.prompt-for-user-input
az bot prepare-deploy --code-dir "." --lang Javascript # web.configファイルの生成
zip -r code.zip . # トップディレクトリ丸ごとZIPアーカイブ

9、デプロイフィニッシュ(ソースコードアップロード)

az webapp deployment source config-zip --resource-group "hogeuser-group" --name "hogeuser-webapp-44-prompt-for-user-input" --src "code.zip"

赤文字エラーが出なければ成功。
--resource-groupは7、で指定したgroupName、--nameは7、で指定したnewWebAppNameをそれぞれ指定。

これにて完了したので、ポータルのホームを開くと「リソースグループ」hogeuser-groupが居て、そこにそれぞれプラン、App Servece、ボット、が作成されているので、ボットをクリックして「Webチャットでテスト」をして、何か入力して名前を聞いてくれば無事サンプルをソースからアップに成功しており、Azure Cloud上で動いている。

<追記>
7、デプロイ登録では新リソースグループを作成したが、2通りの作り方がある。すでにリソースグループhogeuser-group、Appサービスプランhogeuser-appplan-44-prompt-for-user-inputを作成済みの場合。

A、既存のリソースグループの中に作成、さらにその中の既存のAppServiceを指定してデプロイ登録

az group deployment create --name "hogeuser-deploy-44-prompt-for-user-input" --resource-group "hogeuser-group" --template-file "template-with-preexisting-rg.json" --parameters appId="YYYYYYYY-77cf-42c8-9fc2-e670f56bd621" appSecret="AtLeastSixteenCharacters_0" botId="hogeuser-bot-44-prompt-for-user-input" newWebAppName="hogeuser-webapp-44-prompt-for-user-input" existingAppServicePlan="hogeuser-appplan-44-prompt-for-user-input" appServicePlanLocation="japaneast"

B、既存のリソースグループの中に作成、しかしAppServiceは新規作成してデプロイ登録

az group deployment create --name "hogeuser-deploy-44-prompt-for-user-input" --resource-group "hogeuser-group" --template-file "template-with-preexisting-rg.json" --parameters appId="YYYYYYYY-77cf-42c8-9fc2-e670f56bd621" appSecret="AtLeastSixteenCharacters_0" botId=""hogeuser-bot-44-prompt-for-user-input" newWebAppName="hogeuser-webapp-44-prompt-for-user-input" newAppServicePlanName="hogeuser-appplan2-44-prompt-for-user-input" appServicePlanLocation="japaneast"

という感じ。状況に応じて使い分けるのがいい。

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

☆ServerNote.NETショッピング↓
ShoppingNote / Amazon.co.jp
☆お仲間ブログ↓
一人社長の不動産業務日誌
【キーワード検索】