Azure研究サイト

Azure研究サイト

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

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

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プランなら使えます。 まずはこの画面でコールドスタートが発生していたかを確認してください。発生していたのであれば、コールドスタートが発生しないようにする必要があります。
 
以上です。

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