nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Development Technologies。

Azure FunctionsでAzure BLOB Storageを扱う際のポイントメモ

基本自分用メモ。

概要

Azure FunctionsではAzure BLOB Storageを扱うにあたり、デフォルトで次の3種類のユースケースを用意している。

ユースケース 説明
BLOB トリガー BLOBが追加・更新された際にFunctionを実行する
BLOB 入力バインディング Functionから読み込むためのBLOBへのStreamなど(実装言語によって異なる)を紐づけて引数で受け取る
BLOB 出力バインディング Functionから書き出すためのBLOBへのStreamなど(実装言語によって異なる)を紐づけて引数で受け取る

参考:Azure Functions における Azure Blob Storage のバインド

バインディングを利用しないと入出力が行えないという訳ではなく、関数の操作によって動的に入出力の対象が変わる場合などは明示的にBLOB Storageを操作することはできる。

BLOBトリガー

トリガーに関しては入出力とは異なる観点での注意点が存在する。(参考

BLOBイベントに反応してFunctionsを実行することが可能だが、以下の場合はBLOBトリガーを直接利用するのではなくEvent Gridトリガーを利用することが推奨されている。

  1. BLOB ストレージ アカウント
  2. 高スケール
  3. 待機時間の最小化

1.については後続のストレージアカウントの種別を参照。

高スケール

つぎのいずれかの要件が必要となる場合を高スケールと規定している。

  • 100,000 以上の BLOB を含むコンテナー
  • 1 秒あたり 100 を超える BLOB の更新が発生するストレージ アカウント

前者はコンテナーで、後者はストレージアカウントである点に注意。アカウント一つに複数のコンテナを作成できる。

アカウントが課金単位で、その下にストレージの種別ごとにそれぞれ複数作成でき、用途別に使い分けることができる。

待機時間の最小化

FunctionをConsumption plan(従量課金プラン)で動作させている場合、場合によって最大で10分(実際にはもっと早い事の方が多い気がする)の遅延が発生しうる。遅延を減らすためにはそもそも重量課金プランではなくAlways Onが有効化されたApp Service Planを利用する必要がある。

また

Event Grid トリガーを利用することもできます。

と記載があるんだが、以下のいずれの意図なのか不明。普通に考えたら前者の文脈だが、そんなこと関係あるのか?

  • Consumption planでもEvent Gridトリガーを利用すれば待機時間は最小化される(インスタンスが落ちてたらダメじゃないの???)
  • 遅延が10分あってもEvent Gridトリガーを利用すれば、ちゃんとスケジュールされて実行が保証される?

ストレージアカウントの種別について

詳細はこちらを読むべきだが、新たにFunctionsを使う際のポイントをここに要約しておく。

ストレージアカウントは2019.08.15時点で以下の種類が存在する。

種類 BLOB ファイル キュー テーブル ディスク パフォーマンス レベル レプリケーション
汎用 v2 Standard、Premium LRS、GRS、RA-GRS、ZRS
汎用 v1 Standard、Premium LRS、GRS、RA-GRS
ブロック BLOB ストレージ Premium LRS
FileStorage Premium LRS
BLOB ストレージ Standard LRS、GRS、RA-GRS

汎用 v2

特別な理由がないかぎりはこれを利用するべき。Azure Storageの提供する機能のフル機能がサポートされているし、多くの場合で容量単価がもっとも安い。

汎用 v1

基本的に後方互換のサポートのためにあるため、新規に作る意図はあまりない。geoレプリケーションを利用する場合に、特定条件下でv2より安くなるケースがあるようだが、最新機能が利用できない可能性があるなどのデメリットがある。

ブロック BLOB ストレージ

非構造化データ(JSONとか?)を格納するための特化ストレージアカウントで、汎用 v2などと比較してレイテンシーが一貫して小さく、トランザクションレートが高くなるそう(つまり早い)。

ただし機能的な制限も多く、Functionsから見た場合、現時点ではEvent Gridトリガーと組み合わせて使うことができないのが痛い。

またgeoレプリケーションがまだ未実装な辺りもこれを選択できなくする要因にもなりえる。

FileStorage ストレージ アカウント

エンプラレベルのファイル利用に適してるらしいがFunctionsの観点からはあまり出番が少ないか?

BLOB ストレージ

汎用 v1と同じで基本は汎用v2推奨。こちらはさらに明示的に選ぶべきケースも記載されていないので、ドキュメントを見る限り基本は今から作る意味はあまりないか?

CLIでAzure Storageを利用する

メモのメモ。ここ見るべし。

まとめ

特殊な理由が無い限り、基本は汎用v2のストレージアカウントを利用して、トリガーに使う場合はBLOBトリガーを生で使わずにEvent Gridトリガーの利用を検討する。

Event Gridトリガーを選択するケースの詳細については前述。