Azure Functions のランタイムバージョン 2.0が 2018/9月にGAしました。
1.0との違いは こちら とか こちら に詳しく書かれています。
この中で、Azure App Service プランを使った場合のデフォルトタイムアウト値が変わっていたので、これまでV1で30分以上かかるバッチを実行していた場合には注意が必要となります。
Azure Functionsの実行プランと制限時間
Azure Functionsは2つの異なるホスティングプランで実行可能です。
従量課金プラン:
実行する関数の負荷によってインスタンスは自動的にスケールし、課金は実行時間と実行回数に基づいて行われます。AWS Lambdaと同じ実行イメージです。Lambdaの方は先月(2018/10)最大実行時間が15分になりましたが、Azure Functionsではデフォルト5分、設定により10分まで延長できます。
Azure App Service プラン:
WebAppなどの他のApp Serviceアプリと同様に、Azure App Serviceプラン(専用VM)上で実行することが可能です。課金もAzure App Service プランのサイズと実行時間に基づいて行われます。専用VMが割り当てられるので、設定により実行時間を無制限に設定することが可能です。
以上が説明ですが、テキストではちょっと分かりづらいので表にするとこのようになります。
以下、赤字のところの説明です。
V2でタイムアウト値を延長するには
表に記載した通り、デフォルトタイムアウト値が30分になっているので、V1で30分を超えるような関数を実行していた場合、同じ設定ではタイムアウトしてしまいます。
2018-10-23T17:44:46.285 [Error] Timeout value of 00:30:00 exceeded by function 'Functions.testFunc' (Id: 'd58xxxxx-b3xx-49xx-aexx-4c91xxxxxxxx'). Initiating cancellation.
タイムアウト値を延長するには、host.jsonに記載します。ポータルでは Function Appを選択 → Function Appの設定 → host.json で設定できます。
デフォルトでは "version": "2.0" だけの設定になっているので、"functionTimeout"値を設定して Function Appを再起動すれば反映されます。例は10時間にする場合の設定です。
{
"version": "2.0",
"functionTimeout": "10:00:00"
}
無制限にするには?
ドキュメントを探してもV1と同じ「無制限」にする方法が見当たらなかったのですが、テストで色々設定を試していたところ、それらしいエラーメッセージが出ていました。
Error: 関数ランタイムを起動できません。 Microsoft.Azure.WebJobs.Script: FunctionTimeout must be greater than 00:00:01 and less than 10675199.02:48:05.4775807.
実環境でそんなに長くすることはないと思いますが、このメッセージ通りなら.NETのTimeSpanの最大値(+10675199 02:48:05.4775807)まで設定可能ということになります。