Blob Event Grid Triggerを動かしてみる

# はじめに

[「Azure Functions の Azure Blob Storage トリガー」](https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-storage-blob-trigger?tabs=in-process%2Cextensionv5&pivots=programming-language-java)に記載の通りBlobTriggerはファイルをスキャンするアーキテクチャで10分間の遅延がでたり、関数実行は1回だけと信頼性という面ではかなり心配です。

そこで利用するのがEventGridを使ったアーキテクチャになります。

動作としてはこんな感じ
- １．ストレージアカウントにファイルが作られる/削除される
- ２．イベントサブスクリプションの発生
- ３．EventGridのキューにデータが入る
- ４．FunctionがHTTPで実行される

こちらのチュートリアル[「チュートリアル: イベント サブスクリプションを使用して BLOB コンテナーで Azure Functions をトリガーする」](https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-event-grid-blob-trigger?pivots=programming-language-java)の記事の補足記事という感じで読んでいただければと思います。

# StorageAccountを作成します。

StorageAccountを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/803b5ba5-298b-7049-b70e-77c529af71ea.png)

ConnectionStringは後の手順で使うのでコピーしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/8f8ad1aa-2df2-f326-64c1-b4842f003c00.png)

# Azure Functionをデプロイする

関数アプリをコンソールから作ります。いつもnodeなんですけど諸事情があって今回はjavaでやってみてます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/4bb4799d-2034-a382-99f3-c49b4c7eeec2.png)

「storageAccountConnectionString」という名前で先ほどコピーしておいたStorageAccountへのConnectionStringを設定します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/5007a357-5166-b049-7c1e-6add8dc05dd1.png)

[こちらからソースをダウンロード](https://github.com/uzresk/azure-functions-blobtrigger-java)して、pom.xmlの以下の項目を関数アプリに合わせて修正します。

https://github.com/uzresk/azure-functions-blobtrigger-java

今回はServerlessでデプロイしますが、DedicatedPlanの場合は、AppServicePlan名とAppServicePlanのリソースグループの指定が必要です。

```xml
		<functionResourceGroup>rg-uzresk-20221002</functionResourceGroup>
		<functionAppName>func-uzresk-20221002</functionAppName>
```


早速デプロイしていきます。

```
az login
.\mvnw package azure-functions:deploy
```

# StorageAccountでイベントサブスクリプションを設定する

ストレージアカウント - イベントをクリックして、イベントサブスクリプションを設定していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/4d06a599-d586-8f90-bceb-2f6baaccb7e6.png)

赤枠のエンドポイントの部分がポイントです。
- マニュアルには関数アプリ名とblob_extension keyを変えてくださいとあるのですが、関数名まで変えろ。とは書いておらずちゃんと読まない私はこれで少々はまりました。。
- blob_extension keyは「関数アプリ」-「アプリキー」の一番下に作られているはずなのでそこから持ってきます。

```
https://<<関数アプリ名>.azurewebsites.net/runtime/webhooks/blobs?functionName=Host.Functions.<<関数名>>&code=<<blob_extension key>>
```

# 動作確認

ソースの`@BlobTrigger`アノテーションでpathが指定してあるのでそのパスに合わせてコンテナを作成し、ファイルを置きます。

```java
public class BlobTriggerSampleHandler {
    @FunctionName("blobTrigger")
    @StorageAccount("storageAccountConnectionString")
    public void run(
            @BlobTrigger(name = "content", path = "items/{name}", dataType = "binary", source = "EventGrid") byte[] content,
            @BindingName("name") String name,
            final ExecutionContext context
    ) {
        context.getLogger().info("Java Blob trigger function processed a blob. Name: "
                + name + "\n  Size: "
                + content.length + " Bytes");
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/1b000603-dfb5-bea3-ff1d-980e4f1b3044.png)

イベントサブスクリプションを見るとトリガーされてることがわかるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/487d8e78-4375-16bf-66f9-7d2b6531df59.png)

Functionが動いていることも確認しておきます

- Functionだけ動いていない場合は、Functionがちゃんとデプロイされているかの再確認とイベントサブスクリプションのURLの指定が間違っていないかを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57686/9c2a8f02-4d39-ed36-7eb5-9b211cc9af86.png)