Cosmos DB のオートスケールがより使いやすくなりました

2022 年に入っても細かいアップデートが続く Cosmos DB ですが、今回久しぶりに価格面でうれしい改善がありました。これまでオートスケールの下限が 400-4000(RU/s) だったものが、100-1000(RU/s) に引き下げられたのです!これは個人的に激アツなニュースでした。公式アナウンスは以下の通りです。

この下限引き下げは実はとてもインパクトがあると思っています。おおげさに言えば、今後プロビジョニングする際は、とりあえず何も考えずこの「オートスケール(100-1000)」を基本に使えばいいんじゃないかくらいに思っています。

Cosmos DB の価格体系おさらい

RU

RU とは Request Unit(要求ユニット)のことで、CPU, Memory, IOPS の合成値、すなわち Cosmos DB 上の通貨単位です。Cosmos DB のスループットは RU で算出されます。1RU は 1KB のデータを読み取る(ID と パーティションキーを指定したポイントリード時)コストを表します。

したがって、100RU/s というのは、1KB の JSON を 1 秒間に同時 100 ドキュメントを読み取る際のコストだと思ってください。秒間なので思ったより大量データを扱えます。ちなみに、書き込み時には 1KB のデータで約 5.5RU(インデックスを除く)を消費します。

Provisioned Throughput (予約済みスループット)

予約済みスループット方式の価格モデルで固定料金になります。最低は 400RU であり、常に秒間 400RU のデータを扱えるリソースが割り当てられます。予約したスループットを超えると 429(スロットリング) が発生します。ここも誤解されがちですが、あくまでも秒間のスループットなので、一時的に予約したスループットを超えて 429 が発生してしまっても、アプリ側でリトライの処理を入れていれば、次以降の秒で救われる可能性があります(標準の SDK ではリトライの仕組みが入っています)。

予約済みスループットの変更は手動対応になり、反映はほぼ瞬時に行われます。ただし非常に大きな値で減らす場合は時間がかかったりできなかったりする場合もあるので注意してください。

Autoscale (オートスケール)

予約済みスループットにはオートスケールのオプションがあります。仕組みは名前の通りで、トラフィックに応じて自動的に RU を 10 倍の範囲までで瞬時に拡張してくれます。例えば、普段はあまりアクセスがないが特定の曜日や時間帯だけアクセスが集中するようなサイトに適しているモデルです。オートスケールが発動しない時間帯は下限の RU の料金(x1.5)が課金され続けるので、単価が 1.5 倍になる保険料を払って 10 倍までスケールできる権利を得ているような考え方です。

ただし、気をつけたいのは課金の測定が 1 時間毎なので、ある 1 時間の中で 1 回でも大きめなトラフィックが発生すればその 1 時間はヒットした最大値で課金されてしまう点です。Azure Monitor などでトラフィックのパターンを分析してオートスケールが合うタイプなのかは実際に検証することをおすすめします。

冒頭にも書きましたが、これまでは、400-4000 という範囲でのオートスケールが最小でしたが、このタイミングで下限が 100-1000 に引き下げられました。

Serverless (サーバーレス)

サーバーレスモデルは、実際に利用した分だけ課金される方式です。何も使わなければ課金もゼロになるので、一見これが一番リーズナブルに感じるかもしれません。開発や検証用途でごくまれにしか使わない場合は合う可能性があります。しかし、これは秒間の RU 上限ではなく、個々の処理で使った RU がすべて加算されていくため、上限の予測ができない点と、大きめの RU が比較的高頻度で使われた場合に予約済みスループットの方が安くなるケースが出てくるので注意が必要です。これについては、比較するためのヒントが以下のドキュメントに書かれているので参考にしてみてください。

個人的にはサーバレスモデルはほとんど使う機会がありませんでしたが、今後はさらに使わなくなると思います(理由は後述)。

Cosmos DB の価格戦略(個人的なおすすめ)

これまで Cosmos DB を使い始める際には、まず固定の 400RU から始めることを勧めていました。(リージョンによって変わりますが)日本円で約 3,000 円程度ですし、開発用途や小規模なアプリならほとんど吸収できるからです。

しかし、これからはオートスケールの 100-1000 を強く推したいと思います。もしスケールが発動しなければ、計算上は 100RU(x 1.5)で利用できることになり、おそらく 1,000 円程度になり固定の 400 より安く使える可能性があるからです。しかも、いざというときは 1,000RU までスケールされるのでバーストにも気にすることがなくなり、個人的にはメリットしか感じません。

ちなみに既存の 400RU でプロビジョニングしていたアカウントでオートスケールに変更すると一旦以下のように Max RU/s に数字が表示されませんが、そのまま変更を確定するとオートスケールが有効になります。

Scale setting

変更後にリロードすると無事に下限の 100-1000RU になってました。この機会にとりあえず使っている Cosmos DB を片っ端からオートスケールに変更しようと思います。