Azureで繋がっている仕事関係の方から、以下の声をいただくことがあります。
「Functionsの従量課金プランでアプリを動かしたらコールドスタートが発生してしまって、初回起動のときにタイムアウトエラーになることがある。」
「Functionsの料金プランをAppServiceプランのスタンダードプランに変更して常時接続機能もONにしてみましたが、タイムアウトエラー発生することがある。」
Functonsアプリのロード・アンロードとは
FunctonsアプリはAzure内でどのように準備・実行されているかご存知でしょうか。
インスタンス上にロードされたままの場合
前回実行からアンロードされていない状態です。
その場合、インスタンス上ですぐにFunctionsアプリの処理が実行されます。
よく、「何分実行されなかったらアンロードされるんですか?」と言う方がいます。厳密に答えると、誰も知りません。
なるほど確かにと思ってもらえるであろう1例をあげますと、Functionsアプリがロードされているインスタンスのメンテナンスが始まってしまうことになると、キリのいいところまでFunctionsアプリの処理が終わったらこのインスタンスから出ていってくださいねということになり、別のインスタンスにロードされます。こういう理由などから
インスタンス上にロードされていない場合
初回実行、または前回実行から間があいたのでアンロードされたような場合です。
このときは、Functionsアプリが保存されているストレージアカウントからAzureがFunctionsアプリを取得してきて、インスタンス上にメモリ展開等をします。この準備が終わったらやっとFunctionsアプリの処理が実行されるのです。
常時接続機能(AlwaysOn)は無料で設定できるおまじない
AppServiceプランに用意されている常時接続機能(AlwaysOn)をONにすれば、アプリが起動されていない時間はなくなるんですよね??と聞かれることがありますが、答えはNOです。
常時接続機能(AlwaysOn)は、アプリが常にアクティブな状態でいてくれる(Azure側の言い方でいうと、常にアクティブなインスタンスを割り当ててくれている)ことを保証してくれる機能というわけではありません。
あくまでも、FrontEndからWebWorkerに定期的にpingを送ってくれて、寝ないで起きておいてね!と寝そうな状態・寝てしまった状態に対して声かけをしてくれる機能です。pingを送ると、非アクティブになってしまっているインスタンスをアクティブなインスタンスにするきっかけを与えてくれたり、アクティブ状態をキープしてくれるということです。なので保証してくれるわけではないですが、効果はかなりあるのでONにしておきましょう、ということになります。
FunctionsのPremiumプランにすればコールドスタートは発生しない
他にもっと良い解決方法があります。
Functionsの料金プランをPremiumプランにすることです!
結局お金がかかるのね、と思われるかもしれませんが、自前でサーバ購入などに比べてクラウドサービス自体がコスパが良いはずなのでこのくらいのコストは当然のものだと思います。AWSも含めてクラウドサービスはこういうものなので意味のないことでや悩んでないでお金で解決しましょう、というものになります。
問題の診断と解決「cold start画面」でコールドスタートの発生有無を確認
従量課金プランではこの画面は使用できませんが、AppServiceプラン・Premiumプランなら使えます。
まずはこの画面でコールドスタートが発生していたかを確認してください。発生していたのであれば、コールドスタートが発生しないようにする必要があります。
以上です。