今のところ公式にアナウンスされていないのと日本語での情報がなかったので、ブログにまとめておきます。
通常、何も意識せずにAzure Functionsを使うと「従量課金プラン」になります。これは、作成した関数が呼ばれるごとに使用したメモリサイズと実行時間によって課金されるもので、一定の無料枠も用意されていることから結構低コストに抑えることが出来るものです。しかし、この「従量課金プラン」だと実行時間が5分を経過すると「Timeout value of 00:05:00 was exceeded by function.」というメッセージがログに出力されて停止してしまいます。実は、原因不明の関数停止に悩まされていた時に、たまたま「Timeout value of 00:05:00 was exceeded by function.」というメッセージが目に入って調べたところ海外のサイトで「5分で止まるよん♪」という情報を得たので気が付いたのでした。
ちなみに、手動で実行した際には「Timeout value of 00:05:00 was exceeded by function.」のメッセージは出るものの関数は止まることなく最後まで実行されるので、実行時間の制限があることに気が付きませんでしたし、メッセージも「5分を超えたよん♪」なので気にも止めていませんでした。手動で実行した際にも止めてくれると気が付いたんですけどねぇ。
で、Azure Functionsの別件でサポートとやりとりしていたので「何で5分で止まるの?」って聞いたところ、無限ループに入るなどして知らぬ間に課金されていくのを防ぐためだそうで、「あ〜、それなら仕方ないかぁ」と思った次第でした。
さて、では5分以上の実行時間がかかる関数を実行するにはどうしたら良いかと言いますと「App Service プラン」というのを使って「Always On」の設定をすればOKです。「App Service プラン」とは専用のVMが用意されて、その上でAzure Functionsの機能が提供されるものでして、これをServerlessと言って良いのかどうか迷うところではありますが、使い勝手は「従量課金プラン」と何ら変わらないので良しとしようという感じです。「Always On」にしておくと、トリガーに対して遅滞なく実行されるというメリットもあるそうです。ただ、課金形態は実行時間ではなくVMの上がっている時間に対しての課金なので使い方によってはコスト負担が大きくなります。ウチの場合は月に約6千円の負担増になりました。
なお、「App Service プラン」を使うと1つのVMにAzure FunctionsだけじゃなくてWeb Apps等も同居出来るそうで、かなり使い倒したい人には有効かと思います。VMのプランによってはオートスケールもしてくれるので、高負荷になるような関数を実行する時にも有効かと思います。
コメント