Azure Functionsのお勉強メモ(8)Blob Storage出力バインドを使ってBlobにファイルを出力する その3

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

どこまで続くかわからないお勉強メモ。今日は8回目です。今回はBlob Storage出力バインドを使った実装の続きです。過去のものは以下を参照。

出力するファイル名に日時情報を付与する

前回まではBlob Storageに出力するファイル名が固定化したものでしたが、これに日時情報を付与したいと言うことはよくあります。これを実現するためには、バインド式というものを利用すると良さそうです。

docs.microsoft.com

日時のフォーマットは変えたいことがよくあるかと思います。フォーマットはここに載っているものが使えるようです。

docs.microsoft.com

Javaの場合は、以下のように実装すると良さそうです。

@BlobOutput(name = "target", path = "myblob/{DateTime:yyyy}/{DateTime:MM}/{DateTime:dd}/{DateTime:hhmmss}-sample.txt") OutputBinding<String> outputItem,

Azure StorageのBlobは以下のページ内の記述のように、フラットなパラダイムで組織化されます。

docs.microsoft.com

ただ、上記のように仮想的なフォルダを作成することはできます。上記の例では「年」/「月」/「日」という仮想的なフォルダを作成して以下にファイルを作成しています。実際にAzure Functionsのアプリを動かしたら以下のようにファイルが作成されました。

f:id:miyohide:20210502173113p:plain

日時情報は東日本リージョンでも日本時間(JST)ではなく、UTCのようです。

f:id:miyohide:20210502173312p:plain

負荷をかけてみる

この状態でabコマンドを使って負荷をかけてみます。結果としては、以下の通りでまだ失敗するリクエストが発生します(Failed requestsが0でない)。

Concurrency Level:      10
Time taken for tests:   51.195 seconds
Complete requests:      1000
Failed requests:        45
   (Connect: 0, Receive: 0, Length: 45, Exceptions: 0)
Non-2xx responses:      45
Total transferred:      237641 bytes
HTML transferred:       31515 bytes
Requests per second:    19.53 [#/sec] (mean)
Time per request:       511.945 [ms] (mean)
Time per request:       51.195 [ms] (mean, across all concurrent requests)
Transfer rate:          4.53 [Kbytes/sec] received

ランダムな文字列をファイル名に付与する

秒単位の日時情報だけでは複数のインスタンスで重複してしまうことがあるので、ランダムな文字列をファイル名に出力したいところです。これも先ほどのバインド式にある{rand-guid}を使えばできそうです。

docs.microsoft.com

Javaでの実装では以下のようになります。

@BlobOutput(name = "target", path = "myblob/{DateTime:yyyy}/{DateTime:MM}/{DateTime:dd}/{DateTime:hhmmss}-{rand-guid}-sample.txt") OutputBinding<String> outputItem,

実行する

再度abコマンドを使って負荷をかけてみます。結果は以下の通り。

Concurrency Level:      10
Time taken for tests:   43.493 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      239753 bytes
HTML transferred:       33000 bytes
Requests per second:    22.99 [#/sec] (mean)
Time per request:       434.925 [ms] (mean)
Time per request:       43.493 [ms] (mean, across all concurrent requests)
Transfer rate:          5.38 [Kbytes/sec] received

Failed requestsが0であることから失敗はなさそうです。

出力されたファイルを確認してみます。GUIDを付与しているのでやたらと長いですが、同一日時(ファイル名の先頭六文字が一致している)で複数のファイルが出力されていることがわかります。

f:id:miyohide:20210502175034p:plain