Microsoft Bot Framework(node/JavaScript) v4 で作成した BOT を、スクリプトで Azure Bot Service に自動デプロイする方法を調べました。
Azure Pipeline とか Visual Studio 2019 とかに載ってしまえば楽なのかも知れませんが、自力で自動化したい場合の情報が探しづらくて苦労しました。
0. 準備するもの
- コマンドプロンプトか PowerShell(Core) か Bash など
cURL を使うだけなので Windows でも macOS でもどちらでもOKです(私は Windows を使っています)。
1. Bot Service を作る(JS Echo bot)
こちら、
を参考に、Azure に Bot を作成します。言語は node で、Echo Bot を選択します。
それぞれの設定名は次の通りとしました。
リソースグループ、App Service プランも新規作成した方が無難です。既存のを使うと後でごちゃごちゃになって管理しきれなくなる。
新規にリソースグループを作ってそこにぶら下げておけば、不要になったらリソースグループごと削除できます。
- リソースグループ名: my_bot_001_rc
- Web アプリ ボット名: my_bot_001
- App Service 名: mybot001
- App Service プラン名: my-bot-001-app-service-plan
デプロイが終わったら、 Web チャットでテストしておきましょう。
2. ソースコードをダウンロードする
ビルド → ボットのソース コードをダウンロードする で、Echo ボットのソースコードをダウンロードします。
ファイル名は my_bot_001-src.zip
とします。
3. BOT の動きを少し変える
my_bot_001-src.zip
を解凍して bot.js
の内容を次のように変更します。
this.onMessage(async (context, next) => {
const replyText = `Echo2: ${ context.activity.text }`; // ← Echo: を Echo2: に変更
保存したら、再び ZIP ファイルに圧縮します。ファイル名は my_bot_001-src-2.zip
とします。
4. 自動デプロイに必要な認証情報を得る
- Azure ポータルで、AppService の mybot001 を開き、デプロイセンターを選択します。
- FTP を選択し、ダッシュボード を押します。
- アプリの資格情報に表示される ユーザー名 と パスワード をコピーします。ちなみに「資格情報のリセット」を押すとパスワードが変わります。
5. コマンドでデプロイする
コマンドプロンプトまたは Terminal などで、次のコマンドを実行します。
curl -X POST -u "<user>:<password>" --data-binary @"<アップロードするZIPファイルパス>" https://<AppService名>.scm.azurewebsites.net/api/zipdeploy
- user: 3 でコピーしたユーザー名の
\
以降。(例: mybot001$mybot001 → $mybot001) - password: 3 でコピーしたパスワード。$ などが含まれる場合は
\
でエスケープが必要と思われる。 - アップロードするZIPファイルパス: アップロードするZIPファイルのパス
- AppService名: 1 で作成した App Service 名。この例では mybot001 。
実際のコマンド
bash
curl -X POST -u "\$mybot001:xxxxxxx" --data-binary @"my_bot_001-src-2.zip" https://mybot001.scm.azurewebsites.net/api/zipdeploy
PowerShell
curl.exe -X POST -u '$mybot001:xxxxxxx' --data-binary @my_bot_001-src-2.zip https://mybot001.scm.azurewebsites.net/api/zipdeploy
コマンドプロンプト
curl.exe -X POST -u "$mybot001:xxxxxxx" --data-binary @my_bot_001-src.zip https://mybot001.scm.azurewebsites.net/api/zipdeploy
実行して、何もエラーが出ずに次のプロンプト(bash-5.0#
) が表示されたらアップロード成功。
7. 確認
Azure ポータルで Bot Service: my_bot_001 を開き、Web チャットでテストします。
2 の修正の通り、"Echo:" が "Echo2:" に変わっていれば成功です。
まとめ
これで、Docker があれば、スクリプトから Bot Service を自動デプロイできるようになりました。
次は、TypeScript のソースをビルド → WebPack → ZIP化 → デプロイという一連の流れを実現したいと思います。
参考
- Run Azure CLI in a Docker Container | Microsoft Docs
- Deploy your bot - Bot Service | Microsoft Docs
- Deploy code with a ZIP or WAR file - Azure App Service | Microsoft Docs
愚痴
- AWS や Firebase のような、CI 用の CLIログインの方法が Azure CLI に用意されているのかよくわかりませんでした
- デプロイは FTP や SCP でも可能と書いてありますが、それらでは認証エラーになってしまい先へ進めませんでした
- ターミナルの種類により微妙に書き方が異なるのがイラッ
- Azure CLI と格闘した結果、「Azure CLI は要らんかったんや」と気づいたのがこの記事を書き終わる直前