AzurePaaS研究サイト

AzurePaaS研究サイト

~理解しずらい情報をシンプルにお伝えします~

AppServiceプランの常時接続機能ではFunctionsアプリのアンロードは回避できない

Azureで繋がっている仕事関係の方から、以下の声をいただくことがあります。
 
「Functionsの従量課金プランでアプリを動かしたらコールドスタートが発生してしまって、初回起動のときにタイムアウトエラーになることがある。」
 
「Functionsの料金プランをAppServiceプランのスタンダードプランに変更して常時接続機能もONにしてみましたが、タイムアウトエラー発生することがある。」

Functonsアプリのロード・アンロードとは

FunctonsアプリはAzure内でどのように準備・実行されているかご存知でしょうか。
 

インスタンス上にロードされたまま場合

前回実行からアンロードされていない状態です。
その場合、インスタンス上ですぐにFunctionsアプリの処理が実行されます。
 
よく、「何分実行されなかったらアンロードされるんですか?」と言う方がいます。厳密に答えると、誰も知りません。
なるほど確かにと思ってもらえるであろう1例をあげますと、Functionsアプリがロードされているインスタンスのメンテナンスが始まってしまうことになると、キリのいいところまでFunctionsアプリの処理が終わったらこのインスタンスから出ていってくださいねということになり、別のインスタンスにロードされます。こういう理由などから

インスタンス上にロードされていない場合

初回実行、または前回実行から間があいたのでアンロードされたような場合です。
 
このときは、Functionsアプリが保存されているストレージアカウントからAzureがFunctionsアプリを取得してきて、インスタンス上にメモリ展開等をします。この準備が終わったらやっとFunctionsアプリの処理が実行されるのです。

常時接続機能(always on)は無料で設定できるおまじない

AppServiceプランに用意されている常時接続機能(always on)をONにすれば、すべて解決するんですよね? と聞かれることがありますが、答えはNOです。
 
常時接続機能(always on)は、アプリが常にアクティブな状態で動いてくれる(Azure側の言い方でいうと、常にアクティブなインスタンスを割り当ててくれている)ことが保証してくれる機能というわけではありません。
 
あくまでも、FrontEndからWebWorkerに定期的にpingを送ってくれる機能です。pingを送るとどうなるかというと、非アクティブなインスタンスをアクティブなインスタンスにするきっかけになるということです。あくまでもきっかけを与えてくれる機能なので、保証してくれるわけではないですが、効果はかなりあるのでONにしておきましょう、ということになります。

FunctionsのPremiumプランにすればコールドスタートは発生しない

他にもっと良い解決方法があります。
Functionsの料金プランをPremiumプランにすることです!
 
結局お金がかかるのね、と思われるかもしれませんが、自前でサーバ購入などに比べてクラウドサービス自体がコスパが良いはずなのでこのくらいのコストは当然のものだと思います。AWSも含めてクラウドサービスはこういうものなので意味のないことでや悩んでないでお金で解決しましょう、というものになります。

問題の診断と解決「cold start画面」でコールドスタートの発生有無を確認

従量課金プランではこの画面は使用できませんが、AppServiceプラン・Premiumプランなら使えます。 まずはこの画面でコールドスタートが発生していたかを確認してください。発生していたのであれば、コールドスタートが発生しないようにする必要があります。
 
以上です。

ご意見・ご要望はこちらへ