Azure Functionsのお勉強メモ(10)Blob Storageにファイルが登録された時に処理を実行する(Queue利用編)

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

どこまで続くかわからないお勉強メモ。今日は10回目です。前回・今回はBlob Storageにファイルが登録された時に処理を実行することをやってみました。前回うまくできなかったものを解決してみます。過去のものは以下を参照。

前回の振り返り

前回は、Blob Storageにファイルが登録された時にEvent Gridトリガーを使い、そこから画像変換処理を実行しようとしていました。しかしながら、出力ファイル名がうまく設定できなかったのが課題として残りました。

今回はBlob Storageにファイルが登録されると、以下の順番で処理をするように実行するようにします。

  1. Event Gridトリガーで処理を呼び出す
  2. 対象のファイル名をQueueに登録するだけのFunctionを実行する
  3. 別のFunctionにてQueueトリガーで処理を呼び出す
  4. 呼び出されたFunctionでBlobからファイルを読み込み、画像変換処理を実行する

それぞれ詳細を見ていきます。

Event Gridトリガーで処理を呼び出す

ここの部分は前回と同じです。マイクロソフトがドキュメントをしっかり書いているので、それを見ると良いかと思います。

docs.microsoft.com

対象のファイル名をQueueに登録するだけのFunctionを実行する

Queue Storage出力バインディングを使って対象のファイル名をQueueに登録する処理を実装します。出力バインディングについてはドキュメントがありますのでそれを参考にすると良いかと思います。

docs.microsoft.com

こんな感じの実装になります。

@QueueOutput(name = "queue", queueName = "myqueue", connection = "MyQueueConnection") OutputBinding<String> queue

値を設定するにはsetValueメソッドを使えばできます。アップロードしたファイルのURLはEvent GridトリガーのPOJOパラメータであるeventに対してevent.data.get("url")を実行することで取得できますので、それを使って以下のような実装をすれば良さそうです(サブディレクトリ切られた場合はもう少し考える必要あり)。

URL url = new URL(event.data.get("url").toString());
String filename = Paths.get(url.getPath()).getFileName().toString();
queue.setValue(filename);

これでこのFunctionでやることは終了です。

別のFunctionにてQueueトリガーで処理を呼び出す

新しくFunctionを作成し、Queueトリガーを使ったものを作ります。このFunctionで画像変換処理を実装します。

Queueトリガーは以下のドキュメントを見れば良いでしょう。

docs.microsoft.com

呼び出されたFunctionでBlobからファイルを読み込み、画像変換処理を実行する

画像変換処理の実装です。ほとんど同じようなサンプルがドキュメントに記載されていますのでそれに目を通しておきます。

docs.microsoft.com

入力ファイル名は{queueTrigger}を使えばよく、出力ファイル名の指定も{queueTrigger}を使ってpath = "thumbnails/s-{queueTrigger}"という感じで設定できます。

実装例としては、以下のようなものになりました。

public class ImageResizeHandler extends FunctionInvoker<byte[], byte[]> {
  @FunctionName("ImageResize")
  @StorageAccount("MyStorageAccount")
  @BlobOutput(name = "target", path = "thumbnails/s-{queueTrigger}", dataType = "binary")
  public byte[] imageResizeHandler(
      @QueueTrigger(name = "msg", queueName = "myqueue", connection = "MyQueueConnection")
          String msg,
      @BlobInput(name = "file", dataType ="binary", path = "images/{queueTrigger}") byte[] file,
      final ExecutionContext context) throws IOException {
    byte[] resizeImage = ResizeImage.resize(file);
    return resizeImage;
  }
}

アプリケーション設定の設定

Azure Blob StorageやQueue Storageに接続するために、Azure Functionsのアプリケーション設定を設定する必要があります。下図で赤枠で囲った部分のようにMyStorageAccountMyQueueConnectionに接続文字列を設定しておきます。

f:id:miyohide:20210516160943p:plain

実行

実際にファイルをアップロードしてみます。

f:id:miyohide:20210516161128p:plain

@BlobOutputにて指定したthumbnailsコンテナーを参照すると、アップロードしたファイル名の前にs-がついたファイルが作成されていることが確認できます。

f:id:miyohide:20210516161420p:plain

ソース

現時点でのソースです。そろそろ整理しよう。

github.com