Azure Bot Service を node.js で作ってスクリプトで自動更新する方法

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でLINEのbotを作ってみる | cloud.config Tech Blog](https://tech-blog.cloud-config.jp/2019-10-17-azure-bot-service/)

を参考に、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 チャットでテストしておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8227/b17aca23-caa3-8cb5-7bb9-e61aada57028.png)


## 2. ソースコードをダウンロードする

ビルド → ボットのソース コードをダウンロードする で、Echo ボットのソースコードをダウンロードします。
ファイル名は ``my_bot_001-src.zip`` とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8227/a86435bb-ddc5-0058-d584-b818007f238d.png)


## 3. BOT の動きを少し変える

``my_bot_001-src.zip`` を解凍して ``bot.js`` の内容を次のように変更します。

```js
    this.onMessage(async (context, next) => {
        const replyText = `Echo2: ${ context.activity.text }`; // ← Echo: を Echo2: に変更
```

保存したら、再び ZIP ファイルに圧縮します。ファイル名は ``my_bot_001-src-2.zip`` とします。

## 4. 自動デプロイに必要な認証情報を得る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8227/382903fa-50e1-6240-3ffc-d4ac39e5a893.png)

1. Azure ポータルで、AppService の mybot001 を開き、デプロイセンターを選択します。
2. FTP を選択し、ダッシュボード を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8227/b060b502-98da-4338-8ed1-39e93da9523a.png)

3. アプリの資格情報に表示される ユーザー名 と パスワード をコピーします。ちなみに「資格情報のリセット」を押すとパスワードが変わります。

## 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**

```bash
curl -X POST -u "\$mybot001:xxxxxxx" --data-binary @"my_bot_001-src-2.zip" https://mybot001.scm.azurewebsites.net/api/zipdeploy
```

**PowerShell**

```powershell
curl.exe -X POST -u '$mybot001:xxxxxxx' --data-binary @my_bot_001-src-2.zip https://mybot001.scm.azurewebsites.net/api/zipdeploy
```

**コマンドプロンプト**

```console
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 チャットでテストします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8227/b0a5ef5a-fcff-b15e-0abc-4907ebe03ca0.png)

2 の修正の通り、"Echo:" が "Echo2:" に変わっていれば成功です。

## まとめ

これで、Docker があれば、スクリプトから Bot Service を自動デプロイできるようになりました。
次は、TypeScript のソースをビルド → WebPack → ZIP化 → デプロイという一連の流れを実現したいと思います。

## 参考

- [Run Azure CLI in a Docker Container | Microsoft Docs](https://docs.microsoft.com/en-us/cli/azure/run-azure-cli-docker?view=azure-cli-latest)
- [Deploy your bot - Bot Service | Microsoft Docs](https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-deploy-az-cli?view=azure-bot-service-4.0&tabs=csharp)
- [Deploy code with a ZIP or WAR file - Azure App Service | Microsoft Docs](https://docs.microsoft.com/en-us/azure/app-service/deploy-zip#deploy-zip-file-with-azure-cli)

## 愚痴

- AWS や Firebase のような、CI 用の CLIログインの方法が Azure CLI に用意されているのかよくわかりませんでした
- デプロイは FTP や SCP でも可能と書いてありますが、それらでは認証エラーになってしまい先へ進めませんでした
- ターミナルの種類により微妙に書き方が異なるのがイラッ
- Azure CLI と格闘した結果、「Azure CLI は要らんかったんや」と気づいたのがこの記事を書き終わる直前