AzureFunctionsでBLOBトリガーを利用してたんですが、今回はそんなBLOBトリガーでの罠とも言えるハマりどころの解決策を記述していきたいと思います。
あまりネット上に情報が無くて解決までに時間を要したので、同じ現象で悩んでいる方の少しでも手助けになれば幸いです。
もっといい解決策があるようなら教えてください。
問題1:プロキシ環境×ローカル環境でのBLOBトリガーがエラーを吐く
プロキシ環境に限った話かと思います。おそらく。
BLOBトリガーなAzure Functionsがプロジェクトに含まれている状況で、ローカルストレージエミュレーター環境、つまり、local.settings.jsonのストレージアカウントへのアクセスに「UseDevelopmentStorage=true」を指定して、Azure Functionsをデバッグ実行したとたんに以下のエラーメッセージが出てAzure Functionsのホストが落ちます。
こいつのせいで長らくlocal.settings.jsonにはAzureクラウド環境の実ストレージアカウントを指定してローカル実行を行っていました。そうするとFunctionsホストはエラーにならずにBLOBトリガーは実行できました。が、local.settings.jsonに実環境のストレージアカウントへの接続文字列を保持しなくてはならず悪手であることは間違いありません。
解決策:プロキシ×ローカル環境でBLOBトリガーなAzure Functionsを動かす方法
解決策としては、ローカルPCのシステム環境変数に以下の値を設定することです。※要PC再起動
変数名 | 変数値 |
---|---|
no_proxy | localhost,127.0.0.1 |
これでプロキシ環境下でもUseDevelopmentStorage=trueでAzuriteに接続し、ローカル環境でBLOBトリガーを機能させることができました。
また、PCのシステム環境変数に設定せずに、local.setting.jsonに「no_proxy: localhost,127.0.0.1」を指定しても403(Forbidden)が発生して機能しませんでした。
なぜなのかはよくわからんw
問題2:Microsoft Defender for Cloudの課金が高額になっている
クラウドセキュリティ態勢管理ツール(CSPM)として、とっても優れていると思われるMicrosoft Defender for Cloudですが、その中のストレージアカウントの保護を司る「Microsoft Defender for Storage」の請求がとっても高額になって困り果てた件。
数百MBのBLOBストレージへのファイル保管のみなのに想定では2,000円程度のはずが、なぜか7,000円オーバーの請求となっていた。
コスト分析 (プレビュー)でサービスごとの課金額を確認すると、「Advanced Threat Protection」サービスとして、Microsoft Defender for Storageの課金として発生しておる。やっちまったなぁ。。。
Microsoft Defender for Storageの高額課金の原因
なぜ、こんなに高額課金になったのかを調査した結果、「GetBlobProperties」というAPIが数秒単位に呼び出されていた。
したがってMicrosoft Defender for Storageの方でもこの操作を監視対象のトランザクションとして課金が発生したのかと想定される。
ちなみにこのGetBlobPropertiesがなんのBLOBに対して呼び出されていたかというと、Azure FunctionsのBLOBトリガーで処理したファイルに対して呼び出されていた。
解決策:BLOBトリガーで処理したファイルを削除する
BLOBトリガーなAzure Functionsの処理が完了して不要になった百数十のファイルをコンテナー内にそのまま放置しており、そのすべてのファイルがGetBlobPropertiesのスキャン対象となっているっぽいので、すべて削除を行って様子見を行いました。
結果、Advanced Threat Protectionの課金額は一気に下がりました。めでたしめでたし♪
ちなみに、他の解決策としては、
- BLOBトリガーなAzure Functionsで処理した後、対象BLOBファイルを別コンテナーに移す。
- BLOBトリガーなAzure Functionsを、EventGridトリガーやQueueトリガーに置き換える。
という解決策でもOKかと。
以上、BLOBトリガーなAzure Functionsのハマりどころ二点でした。
コメント