Azure Functions の従量課金プランと App Service プラン

はじめに

Azure Functions は、従量課金プランと Azure App Service プランという 2 つの異なるモードで実行できます。 従量課金プランでは、コードの実行時にコンピューティング能力を自動的に割り当て、負荷の処理の必要性に応じてスケールアウトし、コードを実行していないときはスケールダウンします。 そのため、アイドル状態の VM に対して課金されることがなく、事前に容量を予約する必要もありません。 この記事では、従量課金プランを中心に説明します。 App Service プランの仕組みの詳細については、「Azure App Service プランの詳細な概要」を参照してください。

Azure Functions に慣れていない場合は、「Azure Functions の概要」を参照してください。

関数アプリを作成するときに、アプリに含まれる関数のホスティング プランを構成する必要があります。 どちらのモードでも、関数は "Azure Functions ホスト" のインスタンスにより実行されます。 プランの種類のコントロール対象は次のとおりです。

  • ホスト インスタンスをスケールアウトする方法。
  • 各ホストで使用できるリソース。

現在、プランの種類は、関数アプリの作成中に選択する必要があり、 後で変更することはできません。

App Service プランの階層間で拡大縮小することはできます。 従量課金プランでは、すべてのリソース割り当てが Azure Functions によって自動的に処理されます。

従量課金プラン

従量課金プランを使用する場合、Azure Functions ホストのインスタンスは、受信イベントの数に基づいて動的に追加および削除されます。 このプランではスケーリングが自動的に行われ、関数の実行中にのみコンピューティング リソースに対して料金が発生します。 従量課金プランでは、関数を最大で 10 分間実行できます。

注意

従量課金プランの関数に対する既定のタイムアウトは 5 分です。 Function App に対してこの値を 10 分まで増やすには、host.jsonfunctionTimeout プロパティを変更します。

課金は実行時間とメモリの使用量に基づいて行われます。関数アプリ内のすべての関数に対する課金が集計されます。 詳細については、Azure Functions の価格に関するページを参照してください。

従量課金プランは既定のプランであり、次の利点があります。

  • 関数の実行中にのみ課金されます。
  • 負荷が高い期間中であっても、自動的にスケールアウトされます。

App Service プラン

App Service プランでは、関数アプリは Web Apps と同様に、Basic、Standard、および Premium SKU の専用 VM 上で実行されます。 専用 VM が App Service アプリに割り当てられるので、Functions ホストは継続的に実行されます。

次のような場合に App Service プランを検討してください。

  • 既に他の App Service インスタンスを実行している、使用率の低い既存の VM がある。
  • Function App を継続的に、またはほぼ継続的に実行したい。
  • 従量課金プランで提供されるよりも多くの CPU またはメモリのオプションが必要である。
  • 従量課金プランで許可されている最大実行時間よりも長く実行する必要がある。

VM を使用すると、コストが実行時間とメモリ サイズの両方から切り離されます。 このため、割り当てた VM インスタンスのコストを超えて課金されることはありません。 App Service プランの仕組みの詳細については、「Azure App Service プランの詳細な概要」を参照してください。

App Service プランでは、VM インスタンスを追加して手動でスケールアウトするか、自動スケールを有効にすることができます。 詳細については、「手動または自動によるインスタンス数のスケール変更」を参照してください。 別の App Service プランを選択してスケールアップすることもできます。 詳細については、 Azure でのアプリのスケールアップ に関するページを参照してください。 App Service プランで JavaScript 関数を実行する予定がある場合は、コアの少ないプランを選択してください。 詳細については、「JavaScript 関数リファレンス」を参照してください。

常時接続

App Service プランを実行する場合、関数アプリが正常に実行されるように、常時接続設定を有効にする必要があります。 App Service プランでは、関数のランタイムは非アクティブな状態が数分続くとアイドル状態となるため、関数を "起こす" ことができるのは HTTP トリガーのみとなります。 これは、WebJobs で常時接続を有効にしておく必要がある理由と似ています。

常時接続は App Service プランでのみ使用可能です。 従量課金プランでは、関数アプリはプラットフォームにより自動的にアクティブ化されます。

ストレージ アカウントの要件

関数アプリを使用するには、従量課金プランと App Service プランのどちらでも、Azure BLOB、キュー、Table Storage をサポートする Azure ストレージ アカウントが必要です。 内部的には、Azure Functions はトリガーの管理や関数実行のログなどの操作に Azure Storage を使用します。 BLOB 専用のストレージ アカウント (Premium Storage を含む)、ゾーン冗長ストレージ レプリケーションを使用する汎用ストレージ アカウントなど、一部のストレージ アカウントでは、キューとテーブルがサポートされません。 これらのアカウントは、関数アプリの作成時に [ストレージ アカウント] ブレードから除外されます。

ストレージ アカウントの種類の詳細については、Azure Storage サービスの概要に関する記事をご覧ください。

従量課金プランの仕組み

従量課金プランでは、関数がトリガーされるイベントの数に基づいて Functions ホストのインスタンスを追加することで、CPU とメモリのリソースが自動的にスケーリングされます。 Functions ホストの各インスタンスのメモリは、1.5 GB に制限されています。

従量課金ホスティング プランを使用する場合、関数コード ファイルはメイン ストレージ アカウントの Azure Files 共有に保存されます。 メイン ストレージ アカウントを削除すると、このコンテンツは削除され、復元できません。

注意

従量課金プランで BLOB トリガーを使用しているときに関数アプリがアイドル状態になると、新しい BLOB の処理が最大で 10 分遅延する場合があります。 関数アプリが実行されると、BLOB は直ちに処理されます。 この初期段階の遅延を避けるために、次のオプションのいずれかを検討してください。

  • 常時接続が有効な App Service プランを使用する。
  • 別のメカニズムを使用して、BLOB 名を含むキュー メッセージなどの BLOB 処理をトリガーする。 例については、BLOB 入力バインドでのキュー トリガーに関する記事をご覧ください。

実行時のスケーリング

Azure Functions は "スケール コントローラー" と呼ばれるコンポーネントを使用して、イベント レートを監視し、スケールアウトとスケールダウンのどちらを実行するかを決定します。 スケール コントローラーは、トリガーの種類ごとにヒューリスティックを使用します。 たとえば、Azure Queue Storage トリガーを使用した場合、拡大縮小はキューの長さや最も古いキュー メッセージの経過時間に基づいて実施されます。

スケーリングは Function App 単位で行われます。 関数アプリがスケールアウトするときは、Azure Functions ホストの複数のインスタンスを実行するためのリソースが追加で割り当てられます。 反対に、コンピューティングの需要が減ると、スケール コントローラーにより、関数ホストのインスタンスが削除されます。 Function App 内で関数が何も実行されていない場合、インスタンスの数は最終的に 0 にスケールダウンされます。

イベントを監視してインスタンスを作成しているスケール コントローラー

課金モデル

従量課金プランの課金の詳細については、Azure Functions の価格に関するページをご覧ください。 使用量は関数アプリレベルで集計され、関数コードが実行されている期間のみカウントされます。 課金の単位は、次のとおりです。

  • ギガバイト/秒 (GB/秒) 単位でのリソース使用量。 メモリ サイズと、関数アプリ内の全関数の実行時間の組み合わせとして計算されます。
  • 実行回数。 バインドによってトリガーされる関数がイベントに応じて実行されるたびにカウントされます。