従量課金ベースのコストの見積もり
[アーティクル] 05/21/2024
8 人の共同作成者
フィードバック
この記事の内容
この記事では、従量課金と Flex 従量課金のホスティング プランについてプラン コストを見積もる方法について説明します。
現在、Azure Functions には関数アプリ用に 4 種類のホスティング プランが用意されており、各プランに独自の価格モデルがあります。
プラン
説明
従量課金
関数アプリが実行された時間に対してのみ課金されます。 このプランには、サブスクリプションごとの無料提供 が含まれます。
Flex 従量課金プラン
関数が実行されているインスタンスの実行時間に加えて、"常時使用可能" なインスタンスの実行時間に対して料金が発生します。 インスタンスは、受信イベント数に基づいて動的に追加および削除されます。 仮想ネットワークの統合もサポートします。
Premium
従量課金プランと同じ機能とスケーリング メカニズムを備えていますが、パフォーマンスと仮想ネットワークの統合が強化されています。 コストは、お客様が選択した価格レベルに基づきます。 詳細については、「Azure Functions の Premium プラン 」を参照してください。
専用 (App Service) (Basic レベル以上)
専用 VM または分離環境で実行する必要がある場合は、カスタム イメージつまり超過した App Service プラン容量を使用します。 標準の App Service プランの料金 を使用します。 コストは、お客様が選択した価格レベルに基づきます。
関数の実行に必要な機能、パフォーマンス、コストの要件を最もサポートするプランを常に選ぶことをお勧めします。 詳細については、「Azure Functions のスケールとホスティング 」を参照してください。
この記事では、従量課金プランと Flex 従量課金プランに焦点を当てます。これらのプランでは、課金が各インスタンス内のアクティブな実行期間に左右されるからです。
また、Durable Functions は、これらの両プランでも実行できます。 Durable Functions を使用する場合のコストに関する考慮事項の詳細については、「Durable Functions の課金 」を参照してください。
従量課金ベースのコスト
無料付与を含め、従量課金ベースのコストの計算方法は、各プランによって異なります。 最新のコストと付与情報については、「Azure Functions の価格」ページ を参照してください。
1 回の関数実行の実行 "コスト " は、"GB 秒数 " で測定されます。 実行コストは、そのメモリ使用量と実行時間を組み合わせて計算されます。 実行時間が長い関数ほどコストが高くなり、メモリ消費量が多い関数ほどコストが高くなります。
関数によって使用されるメモリの量が一定のままである場合を考えてみます。 この場合、コストの計算は単純な乗算です。 たとえば、関数が 0.5 GB を3 秒間消費したとします。 その場合の実行コストは 0.5GB * 3s = 1.5 GB-seconds
になります。
メモリ使用量は時間の経過と共に変化するため、計算は実質的には時間経過に伴うメモリ使用量の積分になります。 システムでは、一定の間隔でプロセス (子プロセスを含む) のメモリ使用量をサンプリングすることによって、この計算が行われます。 価格ページ で説明されているように、メモリ使用量は最も近い 128 MB のバケットに切り上げられます。 プロセスで 160 MB 使用されている場合は、256 MB の料金が発生します。 計算では同時実行が考慮されます。同時実行とは、同じプロセス内で複数の関数が同時に実行することです。
Note
CPU 使用率は実行コストでは直接考慮されませんが、関数の実行時間に影響する場合は、コストに影響を与える可能性があります。
HTTP によってトリガーされる関数の場合、関数コードの実行が開始される前にエラーが発生した場合、実行に対して課金されることはありません。 これは、API キーの検証または App Service の認証/承認機能が原因のプラットフォームからの 401 応答は、実行コストに対してカウントされないことを意味します。 同様に、5xx 状態コードの応答が要求を処理する関数よりも前のプラットフォームで発生した場合は、カウントされません。 関数コードからエラーが発生しなかった場合でも、関数コードの実行が開始された後にプラットフォームによって生成される 5xx 応答は、引き続き実行としてカウントされます。
Flex 従量課金プランでアプリを実行するときにコストを決定する 2 つのモードがあります。 各モードは、インスタンスごとに決定されます。
課金モード
説明
オンデマンド
"オンデマンド" モードで実行する場合、関数コードが使用可能なインスタンスで実行されている時間に対してのみ課金されます。 オンデマンド モードでは、最小インスタンス数は必要ありません。 課金の対象: • 各オンデマンド インスタンスが "アクティブに" 関数を実行している間に、プロビジョニングされたメモリの合計量 (GB 秒) から、1 か月あたりの無料付与の GB 秒を引いた値。 • 実行の合計数から、1 か月あたりの無料付与の実行数を引いた値。
常時使用可能
特定のトリガーの種類 (HTTP、Durable、BLOB) と個々の関数に割り当てられた 1 つ以上のインスタンスを構成できます。これは、要求を処理するために常に使用できます。 常時使用可能なインスタンスが有効になっている場合は、課金の対象は次のとおりです。 • "ベースライン" (GB 秒) と呼ばれる、常時使用可能なすべてのインスタンスにわたってプロビジョニングされたメモリの合計量。 • 常時使用可能なインスタンスがそれぞれ "アクティブに" 関数を実行しているときにプロビジョニングされたメモリの合計量 (GB 秒)。 • 実行回数の合計。 常時使用可能の課金では、無料の付与はありません。
この図は、このプランでオンデマンド コストがどのように決定されるかを表しています。
実行時間に加えて、1 つ以上の常時使用可能なインスタンスを使う場合、維持する常時使用可能なインスタンス数に対して、より低いベースライン料金で課金されます。 常時使用可能なインスタンスの実行時間は、オンデマンド実行のインスタンスの実行時間よりも安くなる可能性があります。
重要
この記事では、計算例をわかりやすくする目的でのみ価格を提示しています。 Flex 従量課金プランで関数を実行するときに発生する可能性のあるコストを見積もる場合は、必ず「Azure Functions の価格」ページ を確認してください。
このセクションの例では、この表に記載されている米国東部の従量課金制の価格例を考慮してください。
モード
測定
毎月の無料付与
従量課金レート
オンデマンド
実行時間 (GB 秒)
100,000
GB あたり $0.000016
オンデマンド
実行 (数)
250,000
100 万実行回数あたり $0.20
常時使用可能
ベースライン (アイドル) 時間 (GB 秒)
-
GB あたり $0.000004
常時使用可能
実行時間 (GB 秒)
-
GB あたり $0.000009
常時使用可能
実行 (数)
-
100 万実行回数あたり $0.20
HTTP トリガーのみで構成される関数アプリと、次の基本的な事実について考えてみましょう。
HTTP トリガーは 1 秒あたり 40 個という一定の要求を処理します。
HTTP トリガーは 10 個の同時要求を処理します。
インスタンスのメモリ サイズ設定は 2048 MB
です。
"常時使用可能なインスタンスが構成されていません"。つまり、アプリは 0 までスケーリングできます。
このような状況では、コードの実行中に行われる作業の種類によって価格は大きく左右されます。 次の 2 つのワークロード シナリオを見てみましょう。
CPU バインド ワークロード: CPU バインド ワークロードの場合、同じインスタンスで複数の要求を並列処理する利点はありません。 つまり、各要求をそれぞれのインスタンスに分散した方が、要求が競合することなく、可能な限り早く完了します。 このシナリオでは、1
という低い HTTP トリガーのコンカレンシー を設定する必要があります。 同時要求が 10 個ある場合、アプリは約 10 インスタンスの定常状態にスケーリングします。一度に 1 つの要求が処理されるため、各インスタンスは継続的にアクティブになります。
各インスタンスのサイズの上限は 2 GB であるため、1 つの継続的にアクティブなインスタンスの消費量は 2 GB * 3600 s = 7200 GB-s
になります。これは、想定されるオンデマンド実行レート (無料付与が適用されない場合) では、インスタンスごとに 1 時間あたり $0.1152 USD
になります。 CPU バインド アプリは 10 インスタンスにスケーリングされるため、実行時間の 1 時間あたりの合計レートは $1.152 USD
です。
同様に、1 秒あたり 40 要求のオンデマンド実行単位の料金 (無料付与なし) は、1 時間あたり 40 * 3600 = 144,000
回 (つまり 14.4 万回) の実行に相当します。 1 時間あたりの実行コストの合計 (無料付与) は 0.144 * $0.20
です。これは 1 時間あたり $0.0288
です。
このシナリオでは、10 個のインスタンスでオンデマンド実行する 1 時間あたりの合計コストは $1.152 + $0.0288 = $1.1808 USD
です。
IO バインド ワークロード: IO バインド ワークロードでは、アプリケーション時間のほとんどが受信要求の待機に費やされます。これは、ネットワーク スループットやその他のアップストリーム要因によって制限される可能性があります。 入力が制限されているため、悪影響を受けることなく、コードは複数の操作を同時に処理できます。 このシナリオでは、同じインスタンスで 10 個の同時要求をすべて処理できるものとします。
従量課金料金は、アクティブな各インスタンスのメモリにのみ基づいているため、従量課金料金の計算は単純に 2 GB * 3600 s = 7200 GB-s
です。これは、想定されるオンデマンド実行レート (無料付与が適用されていないもの) では、単一インスタンスの場合、1 時間あたり $0.1152 USD
となります。
CPU バインド シナリオと同様に、1 秒あたり 40 要求のオンデマンド実行単位の料金 (無料付与なし) は、1 時間あたり 40 * 3600 = 144,000
回 (つまり 14.4 万回) の実行に相当します。 そのため、1 時間あたりの実行コストの合計 (無料付与) は 0.144 * $0.20
です。これは 1 時間あたり $0.0288
です。
このシナリオでは、1 個のインスタンスでオンデマンド実行する 1 時間あたりの合計コストは $0.1152 + $0.0288 = $0.144 USD
です。
プランでの関数実行の全体的なコストを見積もるときは、Functions のランタイムでは他の複数の Azure サービスが使用されており、各サービスが個別に課金されることに注意してください。 関数アプリの価格を見積もる場合、他の Azure サービスと統合するトリガーとバインドでは、その他のサービスを作成して支払う必要があります。
従量課金プランで実行される関数の場合、合計コストは、関数の実行コストに、帯域幅とその他のサービスのコストを加えたものです。
関数アプリと関連サービスの全体的なコストを見積もるときは、Azure 料金計算ツール を使用します。
実行時間に影響を与える動作
関数の次の動作は、実行時間に影響を与える可能性があります。
トリガーとバインド : 関数バインド からの入力の読み取り、および関数バインドへの出力の書き込みにかかった時間は、実行時間としてカウントされます。 たとえば、Azure Storage キューにメッセージを書き込むために関数で出力バインドが使用されている場合、実行時間にはキューへのメッセージの書き込みにかかった時間が含まれ、これは関数のコストの計算に含まれます。
非同期実行 : 非同期要求 (C# では await
) の結果に対する関数の待機時間は、実行時間としてカウントされます。 GB 秒数の計算は、関数の開始時刻と終了時刻、およびその期間のメモリ使用量に基づいています。 その間に発生した CPU アクティビティは、計算では考慮されません。 Durable Functions を使用することで、非同期操作中のコストを削減できます。 オーケストレーター関数での待機時間に対して課金されることはありません。
請求書 では、 [Total Executions - Functions](合計実行数 - Functions) および [Execution Time - Functions](実行時間 - Functions) のコスト関連データと、実際に請求されたコストを見ることができます。 ただし、この請求データは過去の請求期間の月次集計です。
関数アプリレベルのメトリック
関数のコストへの影響をより深く理解するには、Azure Monitor を使用することで、関数アプリによって現在生成されているコスト関連メトリックを表示できます。
従量課金プランの関数アプリのコスト関連データをグラフィック形式で表示するには、Azure Monitor メトリックス エクスプローラー を使用します。
Azure portal で関数アプリに移動します。
左側のパネルで、 [監視] までスクロールし、 [メトリック] を選択します。
[メトリック] から [関数の実行回数] を選択し、 [集計] から [合計] を選択します。 これにより、選択した期間の実行回数の合計がグラフに追加されます。
[メトリックの追加] を選択し、手順 2 から手順 4 を繰り返して、 [関数の実行単位] をグラフに追加します。
結果のグラフには、選択した時間範囲 (この例では 2 時間) に対する両方の実行メトリックの合計が含まれます。
実行単位の数は実行回数よりはるかに多いため、グラフは実行単位だけのように見えます。
このグラフでは、MB ミリ秒数で測定して、2 時間に合計で 11.1 億の Function Execution Units
が消費されたことが示されています。 GB 秒数に変換するには、1,024,000 で割ります。 この例の関数アプリでは、1110000000 / 1024000 = 1083.98
GB 秒が消費されました。 この値を取得し、Functions の価格ページ で示されている実行時間の現在の料金を乗算することにより、この 2 時間のコストがわかります (実行時間の無料提供を既に使用してあるものとします)。
Azure CLI には、メトリックを取得するためのコマンドがあります。 ローカル コマンド環境から、または Azure Cloud Shell を使用してポータルから直接、CLI を使用できます。 たとえば、次の az monitor metrics list コマンドでは、前に使用したのと同じ期間に対する 1 時間あたりのデータが返されます。
<AZURE_SUBSCRIPTON_ID>
は、コマンドを実行している Azure サブスクリプション ID に置き換えてください。
az monitor metrics list --resource /subscriptions/<AZURE_SUBSCRIPTION_ID>/resourceGroups/metrics-testing-consumption/providers/Microsoft.Web/sites/metrics-testing-consumption --metric FunctionExecutionUnits,FunctionExecutionCount --aggregation Total --interval PT1H --start-time 2019-09-11T21:46:00Z --end-time 2019-09-11T23:18:00Z
このコマンドでは、次の例のような JSON ペイロードが返されます。
{
"cost": 0.0,
"interval": "1:00:00",
"namespace": "Microsoft.Web/sites",
"resourceregion": "centralus",
"timespan": "2019-09-11T21:46:00Z/2019-09-11T23:18:00Z",
"value": [
{
"id": "/subscriptions/XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX/resourceGroups/metrics-testing-consumption/providers/Microsoft.Web/sites/metrics-testing-consumption/providers/Microsoft.Insights/metrics/FunctionExecutionUnits",
"name": {
"localizedValue": "Function Execution Units",
"value": "FunctionExecutionUnits"
},
"resourceGroup": "metrics-testing-consumption",
"timeseries": [
{
"data": [
{
"average": null,
"count": null,
"maximum": null,
"minimum": null,
"timeStamp": "2019-09-11T21:46:00+00:00",
"total": 793294592.0
},
{
"average": null,
"count": null,
"maximum": null,
"minimum": null,
"timeStamp": "2019-09-11T22:46:00+00:00",
"total": 316576256.0
}
],
"metadatavalues": []
}
],
"type": "Microsoft.Insights/metrics",
"unit": "Count"
},
{
"id": "/subscriptions/XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX/resourceGroups/metrics-testing-consumption/providers/Microsoft.Web/sites/metrics-testing-consumption/providers/Microsoft.Insights/metrics/FunctionExecutionCount",
"name": {
"localizedValue": "Function Execution Count",
"value": "FunctionExecutionCount"
},
"resourceGroup": "metrics-testing-consumption",
"timeseries": [
{
"data": [
{
"average": null,
"count": null,
"maximum": null,
"minimum": null,
"timeStamp": "2019-09-11T21:46:00+00:00",
"total": 33538.0
},
{
"average": null,
"count": null,
"maximum": null,
"minimum": null,
"timeStamp": "2019-09-11T22:46:00+00:00",
"total": 13040.0
}
],
"metadatavalues": []
}
],
"type": "Microsoft.Insights/metrics",
"unit": "Count"
}
]
}
この特定の応答では、2019-09-11T21:46
から 2019-09-11T23:18
までの間に、アプリで 1,110,000,000 MB ミリ秒 (1083.98 GB 秒) が消費されたことが示されています。
Azure PowerShell には、メトリックを取得するためのコマンドがあります。 ローカル コマンド環境から、または Azure Cloud Shell を使用してポータルから直接、Azure PowerShell を使用できます。 たとえば、次の Get-AzMetric コマンドでは、前に使用したのと同じ期間に対する 1 時間あたりのデータが返されます。
<AZURE_SUBSCRIPTON_ID>
は、コマンドを実行している Azure サブスクリプション ID に置き換えてください。
Get-AzMetric -ResourceId /subscriptions/<AZURE_SUBSCRIPTION_ID>/resourceGroups/metrics-testing-consumption/providers/Microsoft.Web/sites/metrics-testing-consumption -MetricName FunctionExecutionUnits,FunctionExecutionCount -AggregationType Total -TimeGrain 01:00:00 -StartTime 2019-09-11T21:46:00Z -EndTime 2019-09-11T23:18:00Z
このコマンドでは、次の例のような 出力が返されます。
Id : /subscriptions/<AZURE_SUBSCRIPTION_ID>/resourceGroups/metrics-testing-consumption/providers/Microsoft.Web/sites/metrics-testing-consumption/providers/Microsoft.Insights/metrics/FunctionExecutionUnits
Name :
LocalizedValue : Function Execution Units
Value : FunctionExecutionUnits
Type : Microsoft.Insights/metrics
Unit : Count
Data : {Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue,
Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue,
Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue,
Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue…}
Timeseries : {Microsoft.Azure.Management.Monitor.Models.TimeSeriesElement}
Id : /subscriptions/<AZURE_SUBSCRIPTION_ID>/resourceGroups/metrics-testing-consumption/providers/Microsoft.Web/sites/metrics-testing-consumption/providers/Microsoft.Insights/metrics/FunctionExecutionCount
Name :
LocalizedValue : Function Execution Count
Value : FunctionExecutionCount
Type : Microsoft.Insights/metrics
Unit : Count
Data : {Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue,
Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue,
Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue,
Microsoft.Azure.Commands.Insights.OutputClasses.PSMetricValue…}
Timeseries : {Microsoft.Azure.Management.Monitor.Models.TimeSeriesElement}
この Data
プロパティには、実際のメトリック値が含まれています。
関数レベルのメトリック
関数の実行単位は、実行時間とメモリ使用量を組み合わせたものであり、メモリ使用量を理解するのが困難なメトリックになっています。 現在、Azure Monitor では、メモリ データのメトリックは使用できません。 ただし、アプリのメモリ使用量を最適化したい場合は、Application Insights によって収集されるパフォーマンス カウンター データを使用できます。
まだ行っていない場合は、関数アプリで Application Insights を有効にします 。 この統合を有効にすると、ポータルでこのテレメトリ データのクエリを実行する ことができます。
Monitor メトリック データを取得するには、Azure portal の Azure Monitor メトリックス エクスプローラー または REST API を使用できます。
メモリの使用量を確認する
[Monitoring](監視) の [ログ (Analytics)] を選択した後、次のテレメトリ クエリをコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。 このクエリでは、サンプリングされた各時刻におけるメモリ使用量の合計が返されます。
performanceCounters
| where name == "Private Bytes"
| project timestamp, name, value
結果は次の例のようになります。
タイムスタンプ [UTC]
name
value
9/12/2019, 1:05:14.947 AM
Private Bytes
209,932,288
9/12/2019, 1:06:14.994 AM
Private Bytes
212,189,184
9/12/2019, 1:06:30.010 AM
Private Bytes
231,714,816
9/12/2019, 1:07:15.040 AM
Private Bytes
210,591,744
9/12/2019, 1:12:16.285 AM
Private Bytes
216,285,184
9/12/2019, 1:12:31.376 AM
Private Bytes
235,806,720
継続時間を確認する
Azure Monitor ではリソース レベルでメトリックが追跡され、Functions の場合は関数アプリです。 Application Insights の統合では、関数ごとにメトリックが出力されます。 関数の平均継続時間を取得するための分析クエリの例を次に示します。
customMetrics
| where name contains "Duration"
| extend averageDuration = valueSum / valueCount
| summarize averageDurationMilliseconds=avg(averageDuration) by name
name
averageDurationMilliseconds
QueueTrigger AvgDurationMs
16.087
QueueTrigger MaxDurationMs
90.249
QueueTrigger MinDurationMs
8.522
次のステップ