Azure Functionsのお勉強メモ(9)Blob Storageにファイルが登録された時に処理を実行する(未完成)

最近、Azure Functionsのお勉強をチマチマと始めました。色々と分からないことが多かったのでお勉強メモをまとめて記します。

どこまで続くかわからないお勉強メモ。今日は9回目です。今回はBlob Storageにファイルが登録された時に処理を実行することをやってみました。今回のものは未完成で、いくつか課題が残っています。過去のものは以下を参照。

お題

お題として、Blob Storageに画像ファイルが登録された時にサムネイルを作る処理を実装してみます。参考になりそうなものとして、マイクロソフトC#の実装例を公開しています。

docs.microsoft.com

上記の例ではEvent Gridを使っています。これは、Blob Triggerの以下の記述に起因しているものと思われます。

ストレージ ログは "ベスト エフォート" ベースで作成されます。 すべてのイベントがキャプチャされる保証はありません。 ある条件下では、ログが欠落する可能性があります。

docs.microsoft.com

そこで私もEvent Triggerを使うことにします。

サムネイルを作成する

Javaでサムネイルを作成する方法はいくつか方法があるかと思いますが、Azure Functions上では任意のミドルウェアImageMagickとか)をインストールすることはできないので、Pure Javaで実装されたライブラリを利用することにしました。以下の記事にライブラリの紹介がありますが、私はThumbnailatorを使うことにしました。特に深い思いはありません。

www.baeldung.com

以下のようなクラス・メソッドを作りました。

public class ResizeImage {
    public static byte[] resize(byte[] original) throws IOException {
        BufferedImage image = ImageIO.read(new ByteArrayInputStream(original));
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        Thumbnails.of(image)
                .scale(0.50)
                .outputFormat("PNG")
                .toOutputStream(out);
        return out.toByteArray();
    }
}

Event Grid Triggerを使うためのJava実装

JavaでEvent Grid Triggerを使う方法はマニュアルに書かれていますが、@EventGridTriggerを使い、受け取るイベントのJSONパラメータを格納するためのクラスを作っておけばOKです。

docs.microsoft.com

登録されたファイルをBlob Storageの入力バインドとするためのJava実装

JavaでBlob Storageの入力バインドを設定する方法は以下のマニュアルに書かれています。

docs.microsoft.com

ここで問題となるのがpathの属性値です。アップロードされるファイル名は都度変わるので、固定値を記述することはできません。前述のC#の実装例を見ると{data.url}が指定されていたので、以下の実装にしました。

@BlobInput(name = "file", dataType = "binary", path = "{data.url}") byte[] content,

作成したサムネイル画像をBlob Storageの出力バインドとするためのJava実装(未解決)

JavaでBlob Storageの出力バインドを設定する方法は以下のマニュアルに書かれています。

docs.microsoft.com

ここで問題となるのがpathの属性値です。アップロードされるファイル名を流用したいのですが、{data.url}https://○○○/とURL全体が入るので不適切です。ここでは解決方法がわかりませんでしたので、

@BlobOutput(name = "target", path = "myblob/{DateTime}-sample.png")OutputBinding<byte[]> outputItem,

としました。

Event Gridを作成する

Blob Storageに紐づくEvent Gridを作成します。ここではAzureポータルで作成しました。参考となるドキュメントは以下です。

docs.microsoft.com

上記のドキュメントではWeb Hookなのですが、Azure Functionsに紐づけるには「エンドポイントの種類」を変えれば良いだけです。

f:id:miyohide:20210509141310p:plain

今回は、以下のことを実現するためにフィルター処理を設定する必要があります。

  • ファイルがアップロードされた時には処理を実行したい
  • 作成されたサムネイルを保存したときには処理を実行しない

フィルター処理については以下のドキュメントを参照しました。

docs.microsoft.com

結果、以下のような設定を実施しました。

f:id:miyohide:20210509141700p:plain

まとめ

以上のことを実装することで、Blob Storageに画像をアップロードするとサムネイルを作成することができました。実際に使うには、

  • アップロードされたファイルが画像であること
  • 元の画像フォーマット(jpegとかpngとかgifとか)と対応してサムネイルの画像フォーマットも変更する

などの対応が必要かと思います。

また前述の通り出力ファイル名がうまく設定できなかったので、その対応も必要です。