Cosmos DBを従量課金ベース(サーバーレスモード)で使ってみよう #Azureリレー
2021-02-16
azblob://2022/11/11/eyecatch/2021-02-16-cosmosdb-serverless-000.jpg

免許持ってないのにSR400を契約したので、慌てて二輪免許を取得中の和田です。今夜の教習は坂道発進とS字クランクです。

最近案件でCosmos DBを使い始めたので、記事を書いておこうと思います。ちなみに筆者はCosmos DB初学者です。あとは去年の8月から従量課金ベースでCosmos DBを利用できるサーバーレスモードがPublic Previewになっているので、その紹介もしていきます。

サーバーレスモード(プレビュー)とは

元々Cosmos DBは秒間に消費するリソース(RequestUnit, RU)の最大値を予約して、そこに対して課金が発生していました。この最低値が400RU/sで、東日本リージョンだと月額およそ3000円が最安値でした(1年か3年分の予約で割引はできますが)。ここに去年から無償枠(Free Tier)と従量課金ベースのサーバーレスモードが登場しました。

サーバーレスモードを利用すると従量課金になるので、普段あまり使われないけど時々バーストするとか、開発中は極力安く抑えたいみたいなシナリオだと効率よく課金できるようになります。当たり前ですが、5000RU/sまでスケールしてしまうので下手にバーストさせてしまうと逆に高くなっちゃう場合ももちろんあります。注意していきましょう。

ちなみに、無償枠は400RU/sのデータベースをサブスクリプションごとに1個ずつ作成できます。共有プロビジョニングスループットで複数のコレクションを作成できるので、開発中とかはかなり使えると思います。こっち使うべきだったかもしれないな……。

使ってみよう

リソース作成

Azure Cosmos DB アカウントを作成します。

このとき、容量モードでサーバーレス(プレビュー)を選択するとサーバーレスモードのアカウントになります(赤丸のとこだよ)。ここで選択を忘れると後から変更は出来ないのでCosmosDBアカウントを作り直す羽目になるので注意しましょう。

あとはMongoDBとかGremlin等のAPIが選べます。今回はコア(SQL)を選択しました。SQLっぽくクエリを記述することができます。

リソースのデプロイが終わったらデータベースを作ります。

データベースができたら次はその中にコンテナを作ります。

ここでPartition keyとやらを設定する必要があります。コンテナ内の各項目でこのPartition keyがバラけていると、効率的にクエリを処理できるらしいです。モデル設計にも絡んでくるんですが、筆者は正直理解しきれていないのでこれから勉強していきます。ブログ書けたらいいなぁ。

Azure Cosmos DB のデータのモデル化 - Microsoft Docs

ではコンテナができたのでさらにその中に項目(Item)を作りましょう。作成したコンテナ(今回はcontents)を開いてItemsをクリックします。

項目の最初はこんな状態です。

{
    "id": "replace_with_new_document_id"
}

で、今回入力したJSONはこちら(画像のidと少し違いますがミスって修正したやつなので画像のidは忘れてください)。

{
    "id": "2021-02-16-cosmosdb-serverless",
    "author": "Kazuma Wada",
    "content": "ブログ本文",
    "createdAt": "202102161300"
}

idはCosmosDBの項目が必ず持っているもので、コンテナ内で一意である必要があります。GUIDにしておくのが安牌かもしれません。今回はblogデータベースのcontentsコンテナなので、絶対に被らないURLスラッグにしました。

Saveボタンを押すと、自動でフィールドがいくつか追加されます。

{
    "id": "20210216-cosmosdb-serverless",
    "author": "Kazuma Wada",
    "content": "免許持ってないのにSR400を契約したので、慌てて二輪免許を取得中の和田です。今夜の教習は坂道発進とS字クランクです。",
    "createdAt": "202102161300",
    "_rid": "XfNUAP5+KBoBAAAAAAAAAA==",
    "_self": "dbs/XfNUAA==/colls/XfNUAP5+KBo=/docs/XfNUAP5+KBoBAAAAAAAAAA==/",
    "_etag": "\"310043e3-0000-2300-0000-602b3bd80000\"",
    "_attachments": "attachments/",
    "_ts": 1613446104
}

項目1個だとつまらないので、敬愛すべき先輩の記事を2つほど拝借してきました。ありがとうなゆむ先輩。

こっから筆者の記事を探すには、SQLっぽくWHERE句でフィルタをかけてあげるとよいです。Edit Filterをクリックすると入力欄が現れるので、 SELECT * FROM c に続くように WHERE c.author = "Kazuma Wada" とクエリを書いてあげましょう。

Apply Filterをクリックすれば筆者の記事のみを抽出できます。RDBのクエリと一緒ですね。

Cosmos DBのSQLクエリのチュートリアルがMicrosoft Docsにあるので、詳しくはこちらを読んでみてください。

Azure Cosmos DB で SQL クエリの使用を開始する | Microsoft Docs

ちなみに一般的なRDBのSQLクエリと違って別のコンテナの項目とJOINでくっつけるみたいな使い方はできません。クエリが参照できるコンテナは常にひとつだけのようです。筆者はこれで結構ハマりました。勉強します。。。

おわりに

Cosmos DBはかなりコストがかかりがちなので、適切な判断が下せるようにメリット・デメリットや特性を理解しておきたいですね。Gremlinとか他のAPIも触ってみたいなぁ。