CosmosDB Serverless preview

CosmosDBのserverlessのPreviewがきたということで、【オンライン】札幌 Azure/Microsoft Learn もくもく会 25(2020/08) でちょっと試してみました。といっても限界まで試したとか金額計算したというわけではないので、そこらへんはしばやんさんのブログがわかりやすいです。

Azure Cosmos DB Serverless が Preview になったので試した – しばやん雑記

今回は、.netのコンソールアプリからCosmosDBにアイテムを追加するところを試してみました。

CosmosDBの準備

1.適当にリソースグループを作成します。
2.リソースグループにCosmosDBを作成します。
Capacity modeを Serverless(preview) に設定します。

3.接続文字列をメモっておきます。

CosmosDBにアイテムを追加してみる

1.Visual Studio から .Net Frameworkのコンソールプロジェクトを作成します。
2.nugetから Microsoft.Azure.Cosmos をインストールします。
3.下のような感じのプログラムを作ります。
CosmosClientを作って接続して、CreateDatabaseIfNotExistsAsync、CreateContainerIfNotExistsAsyncでデータベース、コンテナを作成し、CreateItemAsyncでコンテナにアイテムを追加します。
using Microsoft.Azure.Cosmos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace CosmosDB_BulkSupport
{
    class DemoItem
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public DateTime CreatedOn { get; set; }
        public string PartitionKey { get; set; }
    }


    class Program
    {
        static async Task Main(string[] args)
        {
            var connectionString = "xxxx";
            var databaseId = "TestDB";
            var containerId = "TestContainer";
            var partitionKey = "/partitionKey";


            // SerializerOptionsで CosmosPropertyNamingPolicy.CamelCaseを指定しているので、
            // CosmosDBに投げるJSONは "PartitionKey": "..." ではなく "partitionKey": "..."になる。
            // そのため、コンテナの PartitionKey には "/partitionKey" を指定する
            // また、CosmosDBのアイテムに id が必要なので、 CosmosPropertyNamingPolicy.CamelCase を指定しない場合には、
            //         [JsonProperty(PropertyName = "id")]
            //         public string Id { get; set; }
            // こんな感じで Id を id にしてあげる。
            // その場合には、コンテナのPartitionKeyには、"/PartitionKey"を指定する(のだと思う。試してない)


            var cosmosClient = new CosmosClient(connectionString, new CosmosClientOptions
            {
                AllowBulkExecution = true,
                SerializerOptions = new CosmosSerializationOptions
                {
                    PropertyNamingPolicy = CosmosPropertyNamingPolicy.CamelCase
                }
            });


            Database database = await cosmosClient.CreateDatabaseIfNotExistsAsync(databaseId);
            Container container = await database.CreateContainerIfNotExistsAsync(containerId, partitionKey);


            var tasks = Enumerable.Range(1, 10000)
                                  .Select(x => new DemoItem
                                  {
                                      Id = Guid.NewGuid().ToString(),
                                      Name = $"Test-{x}",
                                      CreatedOn = DateTime.Now,
                                      PartitionKey = Guid.NewGuid().ToString()
                                  })
                                  .Select(x => container.CreateItemAsync(x, new PartitionKey(x.PartitionKey)));


            await Task.WhenAll(tasks);
        }
    }
}
4.実行して、Azureのコントロールパネルからアイテムの登録やRUの状況を確認します。
これだけだとServerlessは全然関係ないですが、料金の感じを見ると、平均してRUを消費するわけではなく、Free Tierを超えるような使い方であればちょうどよい・・・んでしょうか。つかってないのでよくわかりません。 次のような記事もありましたので、今度どこかでマスタ系にFree Tierを使ってみて、感触を確かめてみようかなーとおもいます。

Azure Cosmos DB Free Tier をプロダクション環境で使う – PaaSがかりの部屋