Azure Functions で使用されるファイルのストレージについて

Functions にフォーカスしているが、基盤としている App Service も基本的な考え方は同じ。

App Service では用途によって、ファイルストレージが 2 種類用意されている。永続ファイル用と、一時ファイル用。

App Service は同一アプリ用のインスタンスが複数同時に実行される可能性があるため、アプリで使用する永続ファイル用のストレージは各 VM インスタンス毎ではなく、Azure ストレージ上に用意された共通のストレージを使用する。

逆に一時ファイル用のストレージについては共有しておらず、各 VM インスタンス毎に用意され、使用される。

  • 永続ファイル
    • 使用するパスは、d:\home
    • 従量課金の場合、Azure File Share 上に永続ファイル用のストレージを (自分で) 作成し、そこを使用する。当該ストレージ アカウントの File Share を見ると、KUDU で見れるストレージと同じものを見ることが出来る f:id:poke_dev:20180430160914p:plain f:id:poke_dev:20180430160924p:plain
    • App Service プランの場合も永続ファイルのストレージは Azure ストレージを使用しているらしい。ただ、App Service の場合はこの永続ストレージのサービスが App Service プランの一部に含まれており、App Service プランの作成と同時に内部で自動的に作成して使用するらしいので、自分で用意する必要はないし、従量課金プランのようにストレージ アカウントなどで状況を確認することはできない。状況を確認できる唯一の方法は、KUDU。
    • 名称の通り永続ファイル用のストレージなので、ファイルが自動的に削除されるようなことはない (VM インスタンスとは分離されているので、VM インスタンスを再起動とかしても問題ない)
    • 使用可能な容量は、プランによって異なる。従量課金は Azure File Share の最大サイズである 5TB (? 詳細未検証。File Share なのでたぶん別途従量課金)、App Service プランは、当該 App Service プランの使用可能ストレージサイズに沿う (Standard だと 50GB など)
    • Function App 自体のファイルもここに配置されるし、プログラムからも通常のファイルストレージと同様に、追加削除、読み書きが可能
    • 同一 Function App が複数インスタンスで同時に稼働していたとしても、d:\home で全て同じ場所を参照する。そのため、ファイル操作方法によっては排他に気をつける必要がある。App Service プランで 1 インスタンスで使用している場合は結果的に排他は考慮不要だが、2 インスタンス以上で稼働している場合は必ず考慮必要だし、従量課金の場合もスケールアウトする可能性があるなら考慮必要
    • 当該 Function App の KUDU も同じ場所を参照するので、KUDU から Function App 用ファイルの追加削除編集を行うことが容易
    • ファイルが格納されている場所が VM インスタンス上ではなくリモートになるため、ファイル操作のパフォーマンスは悪いらしい
    • KUDU も動作しているインスタンスはアプリと異なるが、永続ストレージは共通の Azure ストレージを参照するため結果的に KUDU もアプリと同じストレージを参照・操作できる
  • 一時ファイル
    • 使用するパスは、d:\local
    • ストレージは各 VM インスタンス上に用意され、使用される。そのため、同じパスで参照してもインスタンスが異なれば参照している場所が異なる (= 共有できない)
    • 名称の通り一時ファイル用のストレージなので、あるタイミングで初期状態に戻る。例えば、インスタンスを再起動すると、一時ファイルのストレージは初期化される。そのため基本的には、ファイルの生存期間も操作範囲も、1 関数内に閉じた使い方を想定するべきと思われる
    • 使用可能な容量は、プランによって異なる。従量課金は 500MB (? KUDU の Environment 上は 200GB とかに見えるが、詳細未検証)。App Service プランはプランによって異なり、B1, S1 系は全インスタンスでの合計が 11GB、B2, S2 は同 15GB、B3, S3 は同 58GB らしい。詳細は Understanding the Azure App Service file system を参照。
    • 当該 Function App の KUDU も KUDU 用インスタンス固有の一時ファイルストレージを使用するので、現在動作しているアプリの一時ファイルストレージを見る方法は、基本的にない (一応環境変数を書き換えて一時ファイル用ストレージを特定の 1 つに固定することで、KUDU でも見れるようになるらしいが・・・詳細不明)。
    • VM インスタンス上にストレージが存在するため、リモート ストレージの永続ファイルと比べてパフォーマンスが良いらしい

参考 URL