Azure functionsでファイルを保存する・読んだりする

表題の件に取り組みます。

ファイル入出力の用途

用途1. フラグファイル的な目的

例えば、前回の実行日時をファイルに保存して、次回実行時に読み込むためにファイルを使う

用途2. 結果出力ファイル

例えば、1日1回関数が実行されるとして、その結果を毎回保存するためのファイル

Azure functionsのファイル保存方法

調べたところ、次の2つがあることがわかりました。

方法1. バインド

この方法は知らなかったのですが、Azure functionsのチュートリアルを見ていると、この方法が推奨されていたので調査。

Azure Blob storage output binding for Azure Functions | Microsoft Docs

どうやら、入力・出力を定義してやると、コード中から簡単に入力先・出力先を指定できる機能の様子。

実際の設定は、function.jsonに保管される様子。

方法2. azコマンドなどを使って普通に保存

これは普通の方法。azコマンドやSDKを使って普通にコードを書いて実行する。

メリット・デメリット

というか、バインドの特徴について記載します。

特徴:楽

入力先・出力先のファイル(キュー)を指定してしまえば、すぱすぱとデータをインポート・エクスポートできる。

特徴:セキュア

ストレージへの接続に必要なストレージキーはlocal.setting.jsonに保存されるため、自動的に隠蔽される。(azで実行するときも隠蔽方法はある)

特徴:トリガーに対応している

バインドで指定したファイル(キュー)に更新があったら、という条件で動作を指定できる

特徴:自由度は少ない

(私が調査したところ)ファイル名も含めて定義ファイルに記載しなければいけないので、ファイル名に日付を付与するなど、動的にファイル名を定義するのは苦手。

Azure Functions + PythonでBlob Storageの入出力バインド

…と思ったけど、以下記事によるとファイル名なども指定できるので欠点はないかも?

ファイルを Storage にアップロードする – Azure | Microsoft Docs

まとめ

こんな感じ?

方法 工数 セキュリティ 自由度 その他
バインド セキュア あまりない→自由かも トリガーに対応
azコマンド 普通 ちゃんとしなければいけない 自由

ファイル名がちゃんと指定できれば、バインドの欠点が消えますね。といってもazコマンドで出来るすべてのことができるわけではなさそうです。

Azure functionsのデータ保存先

  • Azure Blob
  • Azure File Share
  • Azure Queue
  • SQL

の4つの利用を視野に入れて調べました。が、SQLはいったんなし。あと料金は調べてません。

Azure Blob

一番メジャーなやつ。クラウド上のストレージにファイルを保存できる。

Azure File Share

クラウド上のストレージにファイルを保存できる。Azure Blobと何が違うの?ってやつですが、Azure functions視点だとスクリプト中からエクスプローラーのパスを指定してファイルを保管できる。

よって楽さという意味では、バインド使ってAzure blobに保存するよりもはるかに楽。

Azure Queue

いわゆるキュー。最大の特徴は保存できるバイトに制限があるのと、保存日数に制限があること。フラグファイル程度に使うのにバイド制限は問題ないし、保存日数も7日間なので毎日関数実行すれば問題ないが、ここにフラグファイル保管するのはないやろ、って感じ。

バインドが使えるデータ保存先

できればバインドを使って楽をしたい。ただバインドが使えるストレージと使えないストレージがある。

Azure Functions の開発に関するガイダンス | Microsoft Docs

Type トリガー 入力 出力
Blob x x x
File Share
Queue x x

残念ながらFile Shareはバインドが使えません。

ここまでのまとめ

Type 入力 出力
Blob バインド バインド
Queue バインド
File Share パス指定 パス指定

Blobの場合、入出力ともバインドで実現可能。一方File Shareはバインドこそありませんが、ローカルマシン上でスクリプトを実行するようにパス指定できるのは大きなメリットです。

どちらを使うべきか

学習コスト

File Shareの方が学習コストが低いです。なんといっても普通のローカルマシンのようにスクリプトを組めるのは非常に楽。こんな感じのコードで簡単にファイル作れちゃいます。

開発環境

Blobのメリットとして、vscodeで開発する際にローカルに仮想環境を作りやすい、というのがあります。バインディングの定義をダウンロードすればローカルで実行してクラウドのストレージに書き込みができます。

Visual Studio Code を使用して Azure Functions を Azure Storage に接続する | Microsoft Docs

また、Local Emulatorを使ってローカルにBlob Containersを再現することも可能。

File Shareの場合、ローカルで実行してもファイルの読み書きは出来ないので、ローカル用のコードを用意するなどの手間があります。

標準仕様

Blobの方が明らかに標準採用されているので、困ったらいろいろ情報が出てきそうです。

結論

とっつきやすさはFile Shareですが、これからAzure Functionsを進めていくならBlobを勉強すべきかなと思いました。

Posted by tera