最近、Azure Functionsのお勉強をチマチマと始めました。色々と分からないことが多かったのでお勉強メモをまとめて記します。
どこまで続くかわからないお勉強メモ。今日は9回目です。今回はBlob Storageにファイルが登録された時に処理を実行することをやってみました。今回のものは未完成で、いくつか課題が残っています。過去のものは以下を参照。
- Azure Functionsのお勉強メモ(1)TypeScriptでチュートリアルを実施する - miyohide's blog
- Azure Functionsのお勉強メモ(2)Spring Cloud FunctionでHTTP Triggerを実装する - miyohide's blog
- Azure Functionsのお勉強メモ(3)Spring Cloud FunctionでTimer Triggerを実装する - miyohide's blog
- Azure Functionsのお勉強メモ(4)RubyでHTTP Triggerを実装する - miyohide's blog
- Azure Functionsのお勉強メモ(5)カスタムハンドラーを使ってRubyでTimer Triggerを実装する - miyohide's blog
- Azure Functionsのお勉強メモ(6)Blob Storage出力バインドを使ってBlobにファイルを出力する - miyohide's blog
- Azure Functionsのお勉強メモ(7)Blob Storage出力バインドを使ってBlobにファイルを出力する その2 - miyohide's blog
- Azure Functionsのお勉強メモ(8)Blob Storage出力バインドを使ってBlobにファイルを出力する その3 - miyohide's blog
お題
お題として、Blob Storageに画像ファイルが登録された時にサムネイルを作る処理を実装してみます。参考になりそうなものとして、マイクロソフトがC#の実装例を公開しています。
上記の例ではEvent Gridを使っています。これは、Blob Triggerの以下の記述に起因しているものと思われます。
ストレージ ログは "ベスト エフォート" ベースで作成されます。 すべてのイベントがキャプチャされる保証はありません。 ある条件下では、ログが欠落する可能性があります。
そこで私もEvent Triggerを使うことにします。
サムネイルを作成する
Javaでサムネイルを作成する方法はいくつか方法があるかと思いますが、Azure Functions上では任意のミドルウェア(ImageMagickとか)をインストールすることはできないので、Pure Javaで実装されたライブラリを利用することにしました。以下の記事にライブラリの紹介がありますが、私はThumbnailatorを使うことにしました。特に深い思いはありません。
以下のようなクラス・メソッドを作りました。
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です。
登録されたファイルをBlob Storageの入力バインドとするためのJava実装
JavaでBlob Storageの入力バインドを設定する方法は以下のマニュアルに書かれています。
ここで問題となるのがpath
の属性値です。アップロードされるファイル名は都度変わるので、固定値を記述することはできません。前述のC#の実装例を見ると{data.url}
が指定されていたので、以下の実装にしました。
@BlobInput(name = "file", dataType = "binary", path = "{data.url}") byte[] content,
作成したサムネイル画像をBlob Storageの出力バインドとするためのJava実装(未解決)
JavaでBlob Storageの出力バインドを設定する方法は以下のマニュアルに書かれています。
ここで問題となるのがpath
の属性値です。アップロードされるファイル名を流用したいのですが、{data.url}
はhttps://○○○/
とURL全体が入るので不適切です。ここでは解決方法がわかりませんでしたので、
@BlobOutput(name = "target", path = "myblob/{DateTime}-sample.png")OutputBinding<byte[]> outputItem,
としました。
Event Gridを作成する
Blob Storageに紐づくEvent Gridを作成します。ここではAzureポータルで作成しました。参考となるドキュメントは以下です。
上記のドキュメントではWeb Hookなのですが、Azure Functionsに紐づけるには「エンドポイントの種類」を変えれば良いだけです。
今回は、以下のことを実現するためにフィルター処理を設定する必要があります。
- ファイルがアップロードされた時には処理を実行したい
- 作成されたサムネイルを保存したときには処理を実行しない
フィルター処理については以下のドキュメントを参照しました。
結果、以下のような設定を実施しました。
まとめ
以上のことを実装することで、Blob Storageに画像をアップロードするとサムネイルを作成することができました。実際に使うには、
などの対応が必要かと思います。
また前述の通り出力ファイル名がうまく設定できなかったので、その対応も必要です。