最近、Azure Functionsのお勉強をチマチマと始めました。色々と分からないことが多かったのでお勉強メモをまとめて記します。
どこまで続くかわからないお勉強メモ。今日は10回目です。前回・今回は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
- Azure Functionsのお勉強メモ(9)Blob Storageにファイルが登録された時に処理を実行する(未完成) - miyohide's blog
前回の振り返り
前回は、Blob Storageにファイルが登録された時にEvent Gridトリガーを使い、そこから画像変換処理を実行しようとしていました。しかしながら、出力ファイル名がうまく設定できなかったのが課題として残りました。
今回はBlob Storageにファイルが登録されると、以下の順番で処理をするように実行するようにします。
- Event Gridトリガーで処理を呼び出す
- 対象のファイル名をQueueに登録するだけのFunctionを実行する
- 別のFunctionにてQueueトリガーで処理を呼び出す
- 呼び出されたFunctionでBlobからファイルを読み込み、画像変換処理を実行する
それぞれ詳細を見ていきます。
Event Gridトリガーで処理を呼び出す
ここの部分は前回と同じです。マイクロソフトがドキュメントをしっかり書いているので、それを見ると良いかと思います。
対象のファイル名をQueueに登録するだけのFunctionを実行する
Queue Storage出力バインディングを使って対象のファイル名をQueueに登録する処理を実装します。出力バインディングについてはドキュメントがありますのでそれを参考にすると良いかと思います。
こんな感じの実装になります。
@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トリガーは以下のドキュメントを見れば良いでしょう。
呼び出されたFunctionでBlobからファイルを読み込み、画像変換処理を実行する
画像変換処理の実装です。ほとんど同じようなサンプルがドキュメントに記載されていますのでそれに目を通しておきます。
入力ファイル名は{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のアプリケーション設定を設定する必要があります。下図で赤枠で囲った部分のようにMyStorageAccount
やMyQueueConnection
に接続文字列を設定しておきます。
実行
実際にファイルをアップロードしてみます。
@BlobOutput
にて指定したthumbnails
コンテナーを参照すると、アップロードしたファイル名の前にs-
がついたファイルが作成されていることが確認できます。
ソース
現時点でのソースです。そろそろ整理しよう。