Azure Functions タイマートリガーの強制終了について

Azure Functions では一回の実行の最大実行時間に制限があり、従量課金プランだと最大で 10 分間実行可能となる。App Service プランであればこの制限はない。 そのため、タイマートリガーでのバッチ実行なども、10 分までであればプランによらず可能だし、App Service プランであれば数時間の実行も一応可能。

なのだが、注意しなければいけない点として、Functions の関数は複数の外部要因(アプリ設定変更によるプロセス再起動、VM メンテナンス、などなど)により実行中に強制終了する可能性がある。 またこの時、プログラム側では例外スローされず、連携している Application Insights 側にもエラーのテレメトリが飛ばない可能性がある。

特に、長時間(ここでは数分以上を長時間と定義)の実行時は必然的に強制終了に遭遇する確率が上がるため、基本的には数分、出来れば 30 秒以内に収まる設計にするのが望ましいと思われる。 もしくは、処理中に強制終了しても問題ない設計であれば、本問題を気にする必要はない。

WebJobs · projectkudu/kudu Wiki · GitHub

また、例えば従量課金プランの Functions では関数が実行されるインスタンスが毎回変わる可能性があるが、この時、複数インスタンスでの同時実行を防ぐファイルロックの仕組みにより、同じ Functions アプリでも、タイマートリガー実行時の排他ロックで失敗する可能性がある。この状況を軽減するため、同一 Functions のタイマートリガーのスケジュールは、基本的には実行時間が被らないようにしておくのが無難。

強制シャットダウンについてはキャンセルトークンで検知できるかもしれないが、動作未確認。

-> v2 であれば、検知できるらしい (Azure Functions v2 の Graceful Shutdown の挙動を試した - しばやん雑記)