mamori017.log

雰囲気でクソコードを書いています

Azure Function Appの利用料金を計算した

Function Appの価格例はAzureのページにあるのですが、 いまいちわからなかったのでAzureにデプロイ済みの関数を対象に料金試算してみました。

azure.microsoft.com

リージョン

デプロイ先に使用している西日本を選択したので、料金レートも2018/1/19時点の西日本のものになります。

関数の情報

計算に必要な実行時間は、Azure上での起動ログ20回分の平均実行時間*1、メモリリソースは Visual Studioデバッグ時にモニタした結果の最大値を使用しました。*2

  • 実行時間:1,563.1(ミリ秒) = 1,564(ミリ秒)(ミリ秒単位で切り上げ) = 1.564(秒)
  • メモリリソース:97MB = 128MB(128MB単位で切り上げ) f:id:mamori017:20180119113422p:plain

f:id:mamori017:20180119140253p:plain

実行回数

実際は1ヵ月に300万回も実行されていませんが価格例通り300万回にしました。

リソースの使用量(秒)

  • リソースの使用量(秒) = 実行回数 * 実行時間
    • 3,000,000(回) * 1.564(秒) = 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.40(円)/100万回あたり
  • 2 * 22.40(円) = 44.80(円)

合計使用量による料金計算

  • 合計使用量による料金計算 = リソースの使用量 + 実行回数
    • 334.208(円) + 44.80(円) = 379.008(円)

結果、128MBのリソースを2秒弱使用する関数を300万回呼び出したとしても利用料は1ヵ月約380円のようでした。 実際のところ、呼び出し回数は月間4000回程度なのでまず課金対象にはならないのですが、複数個の関数を運用している場合は

Functions では、すべての関数に対して各月にリクエストされた実行の総数に基づいて課金されます。実行回数は、バインドによってトリガーされたイベントに応じて関数が実行されるたびにカウントされます。毎月、最初の 100 万回は無料で実行できます。

とあるように、無料提供のリソースは関数個別でなく、全ての関数で使用した実行リソースの総量に対してであることに気を付けないといけないようです。

ちなみに、リソース使用量が128MB以下のアプリケーションを無料枠内で100万回実行しようと思うと、 1回あたりの処理は3.2秒以内で完了させる必要があるようです。

料金計算ツール*3を使えばすぐに概算額を出せるのですが、算出方法を把握することができて良かったと思います。

*1:Function App→関数→モニターで参照できる。Visual Studioデバッグ中にも取得できるはず。

*2:使用する値がこれで正しいのかは微妙。

*3:https://azure.microsoft.com/ja-jp/pricing/calculator/

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;
}

simplexml_load_fileでRSSから最新エントリの情報を取得する

このブログの最新記事の更新日とタイトルを抜き出してハイパーリンクを作成したかったので、 PHPのsimplexml_load_fileを使用してRSSをパースしました。

PHP: simplexml_load_file - Manual

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>hoge</title>
</head>
<body>
<?php
    $rss = simplexml_load_file('http://mamori017.hatenablog.com/rss');
    foreach($rss->channel->item as $item){
        // 記事タイトル
        $title = $item->title;
        // 更新日付
        $date = date("Y/n/j", strtotime($item->pubDate));
        // 記事URL
        $link = $item->link;
?>
        <!-- 画面に表示する内容 -->
        <span>
            <?php echo $date; ?>
        </span>
        <span>
            <a href="<?php echo $link; ?>" target="_blank">
                <?php echo $title; ?>
            </a>
        </span>
<?php
        // 最初の1件だけ取得するのでここで終了する
        return;
    } 
?>
</body>
</html>

表示結果。 f:id:mamori017:20171227111516p:plain

初めてのPHP

初めてのPHP