Azure Queue storageトリガーで動くAzure Functionsアプリをローカルでデバッグする環境を作る

# はじめに
Azure Queue Storageトリガーとは Azure Storage Accountの特定のQueueにメッセージが追加された時にAzure Functionsアプリを実行してくれるトリガーです。
Azure Queue Storageトリガーを使ったアプリをデバッグするにはStorage Accountが必要となりますが、そのためにAzure上にStorage Accountを作るのは面倒ですよね。
こんな時のためにStorage AccountのエミュレーターであるAzuriteが提供されています。
今回はこれを使ってローカルでデバッグする環境を作っていきます。

:::note warn
エミュレーターには[Azure ストレージ エミュレーター](https://docs.microsoft.com/ja-jp/azure/storage/common/storage-use-emulator#get-the-storage-emulator)というのもありますがAzuriteとは別物です。
こちらの利用は非推奨になってになっているので誤ってインストールしないようにしましょう。
:::

# 構築環境
今回構築する環境の一覧です。
- Windows 10
- Node.js = 16.15.0
- Azurite = 3.17.1
- Azure Functions Core Tools = 4.0.4544
- Microsoft Azure Storage Explorer = 1.24.2

# 各種インストール
## Node.jsのインストール
AzuriteやAzure Functions Core ToolsにはNode.jsが必要となるのでインストールします。
AzuriteはNode.js 8.0以上が必要となります。すでにインストール済みでもバージョンに気を付けてください。

[ダウンロードページ](https://nodejs.org/ja/)から推奨版となっている方を選択しダウンロードします。
インストーラーを実行し、Node.jsをインストールします。
コマンドプロンプトを開き以下のコマンドを実行して正常にインストールされていることを確認します。（コマンドプロンプトをすでに開いていた場合は一度閉じて開きななおすこと）
コメントアウト部分のような出力があったらOKです。
```bash
node -v
#v16.15.0
```

## Azuriteのインストール
npmを使ってインストールします。
コマンドプロンプトを開き、以下のコマンドを実行します。
```bash
npm install -g azurite
```
以下のコマンドを実行してインストールできているか確認します。
```bash
azurite -v
#3.17.1
```

## Azure Functions Core Toolsのインストール
Azure Functions Core ToolsはAzure Functionsアプリの開発、デバッグ、デプロイなどに必要となるツールです。
npmを使ってインストールします。

以下のコマンドを実行してインストールします。
```bash
npm i -g azure-functions-core-tools@4 --unsafe-perm true
```
以下のコマンドを実行してインストールできているか確認します。
```bash
func -v
#4.0.4544
```

## Microsoft Azure Storage Explorerのインストール
Microsoft Azure Storage ExplorerはStorage Accountを操作するためのGUIを提供するアプリです。Azure Portal上でできるようなことがこのアプリを通して行うことができます。
今回はこのアプリを使ってエミュレーターを操作します。
CUIで操作したい場合は[Azure CLI](https://docs.microsoft.com/ja-jp/cli/azure/?view=azure-cli-latest)を使うことで操作できますが、詳しい説明は省きます。

[ダウンロードページ](https://azure.microsoft.com/ja-jp/features/storage-explorer/)の今すぐダウンロードからインストーラーをダウンロードします。
インストーラーを実行してMicrosoft Azure Storage Explorerをインストールします。
Microsoft Azure Storage Explorerを起動しておきます。

# Azuriteに接続する設定を行う
Microsoft Azure Storage Explorerを起動した際に「Select Resource」というウィンドウが表示されていると思います。このウィンドウの一番下にある「Local storage emulator」を選択してください。
設定項目がいくつかありますが、デフォルトで大丈夫です。
Nextをクリックして次の画面に行き、Connectをクリックします。

# Azure Functionsアプリを作成する
## ひな形を作る
コマンドプロンプトを開いて以下のコマンドを実行します。
このコマンドを実行することでAzure Functionsアプリのひな形を対話形式で作ることができます。作業ディレクトリ内に`func-app`というフォルダが作成されるので作業ディレクトリに気を付けてください。
```bash
func new func-app
```
どの実行環境を使うかを聞かれます。今回は`node`を選択します。
javascriptかtypescriptかを聞かれます。今回は`javascript`を選択します。
どのトリガーで起動するアプリのひな形を作成するか聞かれます。今回は`Azure Queue Storage trigger`を選択します。
関数アプリの名前を聞かれます。今回はデフォルトの`QueueTrigger`でいいので空白のままエンターを押します。
これでひな形が完成しました。

## 接続先の設定を行う
先ほど作成したアプリはQueueに追加されたメッセージをトリガーとして起動するためStorage Accountに接続する設定を行う必要があります。

`func-app/local.settings.json`を開きます。
このファイルはアプリをローカルで実行する際の設定や環境変数などを書くための物です。
`AzureWebJobsStorage`の値が`UseDevelopmentStorage=true`であることを確認します。もし、違った値が設定されている場合は`UseDevelopmentStorage=true`に設定します。この設定を行うことでAzuriteに接続してくれます。
```json:local.settings.json
{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "AzureWebJobsStorage": "UseDevelopmentStorage=true"
  }
}
```

`func-app/QueueTrigger/function.json`を開きます。
以下のように`connection`に`AzureWebJobsStorage`を設定します。
また、`queueName`の値が`js-queue-items`であることを覚えておいてください。これはどのQueueに追加されたメッセージをトリガーとするかを決めている重要な部分です。
```json:function.json
{
  "bindings": [
    {
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "js-queue-items",
      "connection": "AzureWebJobsStorage"
    }
  ]
}
```

# Queueを作成する
エミュレーターにQueueを作成します。
まず、Azuriteを起動します。
コマンドプロンプトで以下のコマンドを実行してください。
この時、作業ディレクトリが`func-app`内であるかを確認してから実行してください。
作業ディレクトリ内に`azurite`というフォルダが作られ、エミュレーターに必要なデータが格納されます
```bash
azurite --location azurite
```
Microsoft Azure Storage Explorerを開きます。
local-1の横の三角をクリックしてメニューを開きます。
Queuesを右クリックしてCreate Queueをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210871/66f951e8-6ae5-9fd6-b535-2764cd4bde26.png)
するとQueueが作成され、名前が入力できるようになるので`js-queue-items`を入力します。
名前を入力し終わると画面右に作成したQueueのタブが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210871/7f204949-d7ba-8f05-b35d-80a1b141a69c.png)

# Azure Functionsアプリを起動する
Azuriteを実行しているコマンドプロンプトとは別のコマンドプロンプトを開きます。
作業ディレクトリが`func-app`であることを確認してから以下のコマンドを実行します。
```bash
func start
```

# メッセージを追加してアプリの動作を確認する
Queueにメッセージを追加してアプリが動作するか確認します。
Microsoft Azure Storage Explorerを開きます。
作成したQueueを選択してAdd Messageをクリックします。
Message textに`hello world`を入力してOKをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210871/10a83f50-58ee-dd6b-a344-2ef3acef77e2.png)

Azure Functionsアプリを実行しているコマンドプロンプトの画面を開きます。
追加したメッセージをトリガーとして関数が実行されていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210871/9bb96502-ca33-b3ca-c0db-418594e83c5f.png)

Microsoft Azure Storage Explorerに戻り、Refreshをクリックします。
すると追加したメッセージが消え、正常に処理されたことが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210871/bac3a4c5-42c3-5cf6-b9f0-ddc86de58624.png)

# おわりに
Azure Queue storageトリガーで動くAzure Functionsアプリをローカルでデバッグする環境を構築しました。
Azure Queue storageトリガーは便利そうなのでうまく使っていきたいですね。