Azure
IoT
AzureFunctions

Azure Function めっちゃ高くないですか?

試算しただけなので、誰か本当のところを教えてください。

料金表

例えば、cronとかで毎分何かのデータを、どっかのDBにログとしてインサートしたいとするじゃないですか。
まぁ普通にある話だと思うんです。

とりあえず、構築の流れとしては、

  1. HTTPトリガーのFunctionを作る。
  2. 「関数のURLの取得」から、URLをコピー。
  3. クライアントから、cronでcurlとかを実行させる。

という感じでお手軽に作れる。
すでにAzureの環境があれば、URLを生成するまで、3分とかでできてしまう。

で、ファンクションの中に書くわけです。

外部APIの呼び出しとか

http-function.cs
WebClient wc = new WebClient();
resData = wc.UploadValues(url,data);

Document DB への接続とか

http-function.cs
await client.UpsertDocumentAsync(UriFactory.CreateDocumentCollectionUri(databaseId, collectionId), saveData);

IoT Hub 呼び出しとか

http-function.cs
await serviceClient.SendAsync(host, message);

そうすると。

上記のようなAPIリクエストが入ると、1回の処理に2秒前後かかってしまう。
当然、他にも色々処理は入っていますが。

問題は、課金対象の実行時間が、どこからどこなのかが、さっぱり分かんないこと。
とりあえず、ログを表示してみると、以下のようなメッセージが出るので、おそらくこの時間だと思う。

2018-06-11T09:31:09.219 [Information] Executing 
2018-06-11T09:31:10.704 [Information] Executed 

上記の処理は、2回 Cosomos DB に接続しているのだが、1.5秒くらいかかっている。
何度か実行した結果を見ても、1.5秒〜2.5秒くらいかかる。

仮にこれを前提として、1回2秒で計算すると、1台のクライアントが毎分cron実行した場合

2秒 * 60分 * 24時間 * 31日 * 1台 ≒ 90,000秒

1ヶ月で¥160くらいになる。
サーバのスペックを半分にしたとして、¥80だ。
いや、Functionだけで¥80は高い。

サービス運用考えたら、他にもWebサイトだったり、DBだったり
そっちの維持費も結構かかるわけで。
自分の利益なんかも加味したとすると、月額¥300とかになる。

1人から毎月¥300もらうサービスって、結構大変なことだと思う。

~~~ 余談 ~~~
例えば、月額¥300くらい取ってるサービス、何かあるかなと思って
ドコ◯の料金見直したら、一度も使ったことない遠隔サポートに毎月¥400も払ってた。
いやぁ、この記事書いてよかった。
~~~ 余談終わり ~~~

結局APIとかを呼んでしまうと、どうしたって時間がかかる。
しかも回線が遅かったとか言われてしまえば、工夫の仕様もない。(多少はあるが)
とはいえ、今どき、APIもなんにも呼ばないことってないと思う。
※そもそもAzure Functionの使い方を間違えている?

個人的な希望としては、リクエスト待機中のコストがかかってないとかだと嬉しい。
あと、そもそも今、何秒CPUを使っているのかを、どこから確認できるのか分からない。
(ので、もしかしたら、全然お金がかかっていないかもしれない。
全部クレームだったらごめんなさい。)

でも、待てよ

そもそもAPIとか関係なく、Azure Functionが低スペックな可能性もあるよね。
というわけで、コストをかけない関数作った。

test.cs
namespace function
{
    public static class test
    {
        [FunctionName("test")]
        public static IActionResult Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req, TraceWriter log)
        {

            int i = 1 + 1;
            return (ActionResult)new OkObjectResult(i);
        }
    }
}

おそらく、コンパイルされるので、足し算せずに2を返してると思うが。

実行した。

2018-06-11T10:00:56.130 [Information] Executing 
2018-06-11T10:00:56.130 [Information] Executed

おぉ!まじか!0ms!

やるじゃん、Function。
これなら何回呼び出しても無料じゃね?

残念でした、実行回数課金がありますよー

あと、それは、ローカルでやれ。

とりあえず

本当に1分に1回必要なのかを検討したり、
何回かのリクエストをまとめて投げたり、
どこかにキャッシュを持たせてみたりとか、
そういう設計をちゃんとしてみようと思う。

ただ、このIoTが叫ばれる時代にあって、1分に1回は決して多いとは思わない。
毎秒リクエストを投げることが必須だと言われることもある。

結論としては

最終的には、自前でサーバを持とう、となる気がしていて、
そこに至るまでに、開発工数を含め、いつ、どこにコストをかけられるか、
リスクを負えるか、が大事なんでしょうか?
よくわかりません。