Azure Queue Storage triggerでキューの情報をDBに非同期で書き込む（Azure Strage テーブル）


以下のサイトを参考(そのままコピペ)にして、Functionsで受け付けた情報をAzure Storage キューに書き込み出来るようになりました。
[Functions を使用して Azure Storage キューにメッセージを追加する](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-integrate-storage-queue-output-binding?tabs=csharp
)

ちょっとステップアップして、非同期テーブル書き込み処理を実現してみました。
１．HTTPのGETリクエストのパラメータをAzure Storage キューに書き込み
２．Azure Storage キューをトリガーにAzure Storage テーブルに書き込み

# １．HTTPのGETリクエストのパラメータをAzure Storage キューに書き込み

＜参考にした手順はこちら＞
[Functions を使用して Azure Storage キューにメッセージを追加する](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-integrate-storage-queue-output-binding?tabs=csharp
)

１. Azure ポータルから関数アプリ(Functions)を作成し、HTTPトリガーのテンプレートを利用すると自動でコードが作成される

２. さらにブレードから統合を選択 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/9cedf648-aace-21b2-bf62-7b1482ade42f.png)

３. 出力から「＋新しい出力」をAzure Queue Storageを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/b04905ae-46a9-90e0-227b-874a2a226348.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/fda5bff2-ec67-452f-cdde-69df2c1634e1.png)
４. 便利なのでStorage Explorerをインストール（接続するときは接続文字列を使うと便利、ストレージ表示名は接続文字列を入力すると自動補完してくれた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/c1a5c2a9-99e0-7d1e-7aeb-579d960ac66e.png)
５. HTTP Triger1のコードに以下を追加

実行するとHTTPのGETリクエストのクエリパラメータをキューに保存される。

* ブラウザを打鍵した結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/7eda7260-a9c9-853b-e9d1-e06db7a9042c.png)

* Storage Explorerの内容

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/e36da8b0-6bdd-36af-54a5-fddbe3b436f5.png)

＜一部抜粋＞
public static async Task<IActionResult> Run(HttpRequest req, **ICollector<string> outputQueueItem**, ILogger log)
**outputQueueItem.Add(name);**

＜全量＞

```C#:run.csx
#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(HttpRequest req, ICollector<string> outputQueueItem, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string name = req.Query["name"];

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;
    
    // パラメーターを使用してキュー メッセージを作成するコードを追加
    outputQueueItem.Add(name);
    
    return name != null
        ? (ActionResult)new OkObjectResult($"Hello, {name}")
        : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}
```


# ２．Azure Storage キューをトリガーにAzure Storage テーブルに書き込み

１. 関数(Azure Queue Storage trigger)の追加を行う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/f22f5869-9a32-dc8c-d505-0c2766440ab2.png)

※キュー名はINPUTとするトリガーキューの名前なので、先ほどHTTP Trigger1で出力したキュー名を指定する必要有り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/ec1e4424-9b81-f1ff-2c57-5e63805c38e5.png)
２. 統合＞出力からAzure Table Storageを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/ff2e58af-0422-d044-c48e-409d264f4d4e.png)
３. Storage Explorerからテーブル「outTable」を作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/b4a76530-4c58-1923-cb35-abbca08634df.png)
４. 以下のコードに書き換え
＜全量＞

```C#:run.csx
using System;

public static void Run(string myQueueItem, ICollector<Person> outputTable, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
    
    log.LogInformation($"Adding Person entity {myQueueItem}");
    outputTable.Add(
        new Person() { 
            PartitionKey = "Test", 
            RowKey = $"{myQueueItem}"}
        );
}

public class Person
{
    public string PartitionKey { get; set; }
    public string RowKey { get; set; }
}
```

５. 実行するとHTTPのGETリクエストのクエリパラメータがキューに保存されて、DBに格納される。キューの情報は取り出したら自動で削除してくれるっぽい

* ブラウザを打鍵した結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/5995e58b-5b4f-fd8d-a409-1fbad1451eba.png)

* Storage Explorerの内容

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/78f97ad6-0cce-3bf7-bb73-9a2160a817df.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355390/8b1a0b44-4814-50f0-7498-1630ba0ccdbd.png)