Function Appにリクエストクォータの上限値を設定する
Function Appにデプロイしている関数にHTTPリクエストをトリガーとしているものがあるため、 念のためリクエストクォータの上限値を設定することにしました。
この設定を行うと、1日あたりのリソースの使用量が設定値に到達すると関数が自動的に停止するようになります。 設定するリソースの使用量は、Function Appの利用料金を計算した際に使った値を使用しました。
Function Appの課金対象となる要素はリソースの使用量と実行回数になります。 ただし、400,000GB秒のリソース使用量と1,000,000回の実行回数をAzureが無料提供してくれているので、 実際の使用量からこの無料提供分の値を引いたものが請求対象となります。 とりあえず今回は実行回数1,000,000回を基準に設定することにしました。
対象となる関数の平均実行時間は1.564秒、リソースの使用量は128MBになるので、計算するとリソースの使用量は195,500GB秒になります。 リソース使用量は無料提供分の400,000GB秒以内で収まるので課金対象とならないはずです。
- リソースの使用量(秒):1,000,000(回) * 1.564(秒) = 1,564,000(秒) - リソースの使用量(GB):128MB / 1024MB = 0.125GB - リソースの使用量(GB秒):1,564,000(秒) * 0.125(GB) = 195,500(GB秒)
リソースの使用量を195,500(GB秒)とすると、1ヶ月31日として1日あたり6,306.45(GB秒)を上限にできます。
この値をFunction Appの設定にある「日ごとの使用量クォータ (GB - 秒) 」の項目に入力し「クォータの設定」ボタンをクリックすることで上限値の設定が完了します。 (対象としている関数は別に停止しても問題なく、実際のリソースの使用量は月1,000GB秒程度あれば運用できるものなので深く考えず設定しています。)
試しに適当な値を日ごとの使用量クォータに入力して関数を呼んでみると403エラーが返ってきました。
コンソール上でも関数が停止していることが確認できます。
停止した関数は手動で起動するか、日本時間の朝9時になると起動するようです。
Azure Function Appの利用料金を計算した
Function Appの価格例はAzureのページにあるのですが、 いまいちわからなかったのでAzureにデプロイ済みの関数を対象に料金試算してみました。
リージョン
デプロイ先に使用している西日本を選択したので、料金レートも2018/1/19時点の西日本のものになります。
関数の情報
計算に必要な実行時間は、Azure上での起動ログ20回分の平均実行時間*1、メモリリソースは Visual Studioでデバッグ時にモニタした結果の最大値を使用しました。*2
実行時間:1,563.1(ミリ秒) = 1564.0(秒)(ミリ秒単位で切り上げ、最小実行時間100ミリ秒)
メモリリソース:97MB = 128MB(128MB単位で切り上げ、最小メモリ128MB)
実行回数
実際は1ヵ月に300万回も実行されていませんが価格例通り300万回にしました。
リソースの使用量(秒)
- リソースの使用量(秒) = 実行回数 * 実行時間
- 3,000,000(回) * 1.564.0(秒) = 4,692,000(秒)
- リソースの使用量(GB秒)
- GB秒に変換したリソース使用量 = 128MB / 1024MB = 0.125GB
- 4,692,000(秒) * 0.125(GB) = 586,500(GB秒)
課金対象のリソース使用量
- 586,500(GB秒) - 無料提供分:400,000(GB秒) = 186,500(GB秒)
月あたりのリソース使用量の料金
- リソース使用量 * 0.001792(円)/GB秒あたり
- 186,500(GB秒) * 0.001792(円)/GB秒あたり = 334.208(円)
課金対象の実行回数
- 実行回数 - 無料提供分1,000,000(回)
- 3,000,000(回) - 1,000,000(回) = 2,000,000(回)
月あたりの実行回数の料金
- 課金対象の実行回数 * 22.4(円)/100万回あたり
- 2 * 22.4(円) = 44.8(円)
合計使用量による料金計算
- 合計使用量による料金計算 = リソースの使用量 + 実行回数
- 334.2(円) + 44.8(円) = 379.0(円)
結果、128MBのリソースを1.5秒使用する関数を300万回呼び出したとしても利用料は1ヵ月約380円のようでした。 実際のところ、呼び出し回数は月間4000回程度なのでまず課金対象にはならないのですが、複数個の関数を運用している場合は
Functions では、すべての関数に対して各月にリクエストされた実行の総数に基づいて課金されます。実行回数は、バインドによってトリガーされたイベントに応じて関数が実行されるたびにカウントされます。毎月、最初の 100 万回は無料で実行できます。
とあるように、無料提供のリソースは関数個別でなく、全ての関数で使用した実行リソースの総量に対してであることに気を付けないといけないようです。
ちなみに、リソース使用量が128MB以下のアプリケーションを無料枠内で100万回実行しようと思うと、 1回あたりの処理は3.2秒以内で完了させる必要があるようです。
料金計算ツール*3を使えばすぐに概算額を出せるのですが、算出方法を把握することができて良かったと思います。
*1:Function App→関数→モニターで参照できる。Visual Studioでデバッグ中にも取得できるはず。
*2:使用する値がこれで正しいのかは微妙。
Azure Function AppでHTMLコードを出力する
using System; using System.Net; using System.Net.Http.Headers; public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log) { // ステータスコード HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK); // 表示させるHTML string html = @"<html><head><meta charset='UTF-8'></head><body><p>Test</p></body></html>"; response.Content = new StringContent(html); // メディアタイプの設定 response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html"); return response; }