Azure Functionsのタイマートリガー関数が停止する
要約
- Azure Functionsにデプロイしたタイマートリガーの関数が1時間程度で停止してしまう
- AppServiceプランでホスティングされたFunctionsは一定時間HTTPリクエストが来ない場合アイドルタイムとなり稼働が停止する
- 解決策はFunctionsの全般設定から"常時接続"設定をオンにする
事象
Azure Functions にてタイマートリガーで毎分実行させる関数をデプロイした。
しばらく後、Application Insightsのログを確認したところ、"Job host stoped"を最後にパタリとログが出力されなくなっていた。
調査・原因
本記事の議題となっているAzure Functionsの挙動について参考になりそうなMicrosoftのドキュメントには以下のように記載されている。
App Service プランを実行する場合、関数アプリが正常に実行されるように、常時接続 設定を有効にする必要があります。 App Service プランでは、関数のランタイムは非アクティブな状態が数分続くとアイドル状態となるため、関数を "起こす" ことができるのは HTTP トリガーのみとなります。 [常時接続] 設定は、App Service プランでのみ使用できます。 従量課金プランでは、関数アプリはプラットフォームにより自動的にアクティブ化されます。
https://docs.microsoft.com/ja-jp/azure/azure-functions/dedicated-plan#always-on
私は上記記事を読んで「...非アクティブな状態?それってどんな状態?」となってしまった。
この非アクティブな状態について、Azureのサポートに一定期間でFunctionsが停止してしまう旨についても含め質問をした。
頂いた回答では、非アクティブな状態というのはFunctionsに対してHTTPリクエストが一定時間以上来ていない状態である。そのような非アクティブな状態が続くとアイドル状態となり、Functionsは動作を停止してしまう。そして、Functionsがこのようなアイドル状態にならないよう、定期的にHTTPリクエストを飛ばすように設定する、それが常時接続の有効化である。とのことだった。
今回の一定期間経ってFunctionsが動作しなくなってしまった原因はここにあったようだ。
結論として、AppServiceプランでホスティングされたFunctionsに一定期間HTTPリクエストが来ない場合、そのFunctinosは停止してしまう。今回のFucntionsはタイマートリガーの関数のみでHTTPリクエストが飛ばない設計となっていたため動作が停止してしまった。以上が原因であった。
解決策
解決策としては「調査・原因」でも述べたが、Functionsの全般設定から"常時接続"の項目をオンにすることで解決する。
ただし、AppServiceプラン(F1, D1)ではそもそも常時接続について設定することができないため、B1以上のプランにアップグレードし設定する必要がある。なお、F1,D1では既定として常時接続はオフとなっている。
まとめ
以上、AppServiceプラン(F1, D1)でホスティングされたAzure Functionsのタイマートリガーの関数が一定期間で動作が停止してしまう問題についての原因と解決策についてであった。
今回はタイマートリガーの関数でこの事象が生じたが、公式のドキュメントに「関数を "起こす" ことができるのは HTTP トリガーのみとなります。」という一文があることから、HTTPトリガーではない関数については全て同様の事象が生じると考えられる。
検証
以下、AppServiceプランをF1からB1にアップグレードし常時接続をオンにした場合のタイマートリガーの関数の出力ログである。ログが常に出力されていることが確認できる。
図中の赤枠のログは公式ドキュメントに「従量課金プランでは、関数アプリはプラットフォームにより自動的にアクティブ化されます。」とあることからプラットホームからのFunctionsを起こすため定期的に飛んでくるプラットフォームからのHTTPリクエストだろう。