Azure Cosmos DBとは

Azure Cosmos DBは、Microsoft Azureで提供されている分散データベース・システムである。レイテンシーが低く、リージョンをまたいでグローバルにレプリケーションすることができるため、あらゆる規模のアプリケーションのニーズに応えることが可能だ。

また、複数の種類の内部データ構造に対応しており、作成時にドキュメント型、キーバリュー型、グラフ型、そしてApache Cassandraのいずれかから選ぶことができる。データにアクセスするAPも、ドキュメント型の場合はSQLまたはMongoDB API、キーバリュー型はTable API、グラフ型はGremlin APIといった具合に選択可能なため、アプリケーションで使用するデータの性質に応じてさまざまな構成を選ぶことができる。

Cosmos DBの性能は「RU(Request Unit: 要求ユニット)」という単位で表現される。ユーザーが必要とする1秒当たりの要求ユニット数(RU/s)を指定しておけば、そのスループットを実現するために必要なリソースが予約される仕組みになっている。Cosmos DBの利用料金は、コンテナ(リレーショナルデータベースのテーブルに相当するもの)1つにつき、1秒当たりの要求ユニット数と、1時間当たりに消費されたストレージの合計量によって決まる。

各コンテナに指定できる最小スループットは400RU/sで、ストレージは5GBだが、この構成であれば12ヶ月間の無料サービスの対象となる。価格モデルに関する詳細はAzure Cosmos DB の価格モデルを参照していただきたい。

Cosmos DBのデータベースとコンテナを作成する

それでは、早速Cosmos DBのデータベースを作成してみよう。Cosmos DBはAzureポータルで管理できる。まずメニューから「Azure Cosmos DB」を選択すると、次のような画面が表示される。

  • Azure Cosmos DBの管理画面

    Azure Cosmos DBの管理画面

Cosmos DBを有効にするには、Cosmos DB用のアカウントを作成する必要がある。用途に応じて複数のアカウントを作ることができる。[Azure Cosmos DB アカウントの作成] をクリックして、新規アカウントを作成しよう。

下の図は、リソースグループ「cloudnavive」(以前仮想マシンを作ったのと同じグループです)に対して、「mynavidb」という名前のアカウントを作成した例である。

  • Azure Cosmos DBアカウントの作成例

    Azure Cosmos DBアカウントの作成例

APIでは、データベースにアクセスするためのAPIの種類を選ぶ。選んだAPIに応じて内部のデータ構造も決定される。今回は[コア (SQL)」を選択しよう。場所はデータベースを配置するリージョンで、この例では東日本を指定した。

続いて、ネットワークの設定を変更したい場合は [次: ネットワーク] をクリックする。ここでは、データベースにアクセスするネットワークをパブリックにするかプライベートにするかなどを選ぶことができる。今回は [All networks] を選ぶ。

  • ネットワークの設定

    ネットワークの設定

[確認と作成] をクリックすると、設定の確認画面が表示される。問題なければ [作成] をクリックすればアカウントの作成が実施される。

しばらく待って、作成に成功すれば、下図のようにデプロイ完了の画面が表示される。

  • Cosmos DBアカウントの作成完了

    Cosmos DBアカウントの作成完了

Cosmos DBの管理画面を開くと、作成した「mynavidb」のアカウントがリストに追加されていることが確認できる。

  • 作成したアカウントが追加されている

    作成したアカウントが追加されている

次に、[mynavidb] を選択してアカウントの管理画面を開こう。ここからコンテナ(RDBでいうところのテーブル)の追加をはじめとするさまざまな設定が行える。

  • mynavidbのアカウント管理画面

    mynavidbのアカウント管理画面

コンテナを追加するには、上部の [Add Container] をクリックするか、左のメニューから [データ エクスプローラー] を選択して出てきた画面で [New Container] をクリックする。

下図のように、右側にコンテナ追加のダイアログが開くので、ここで各種設定を入力する。

  • 新規コンテナの追加

    新規コンテナの追加

この例では、まだデータベース自体が何もないので、対象データベースとして「mydb」を新規作成している。もし既存のデータベースにコンテナを追加する場合は、[Use existing] をチェックして対象のデータベースを選択すればよい。スループットは最小構成の400 RU/sとした。コンテナIDは「Employee」、パーティションキーは「/position」としている。

Cosmos DBでは、コンテナを論理パーティションを用いて分割することによってスケーリングを実現する。パーティションキーはこのパーティション分割の際にキーとなる項目である。パーティションキーはコンテナのサイズが大きくなった場合のスループットに影響するので、レコード全体で均等に値が分散されるような項目を選ぶのが望ましい。詳細は こちらのガイダンス を参照のこと。

設定を入力したら、[OK] をクリックすれば、次のようにデータベース「mydb」が作成され、その中に「Employee」というコンテナが追加されていることを確認できる。

  • データベース「mydb」とコンテナ「Employee」が作成された

    データベース「mydb」とコンテナ「Employee」が作成された

注:実はこのコンテナ作成の手順を省略しても、後述するSpring Bootアプリケーションを起動した時点で、対象となるコンテナを自動で作成してくれる。ただしその場合、スループットが自動で設定されてしまうため、Azureポータルから自分で設定を修正するのを忘れないように注意しよう。

Cosmos DBにアクセスするためのSpring Bootプロジェクトの設定

続いて、第3回で作ったSpring Bootのプロジェクトをもとに、Cosmos DBを使用するアプリケーションを作成していこう。まず、上で作ったmydbに接続するための設定を追加する。接続に必要な情報は、Azureポータルで対象のCosmos DBアカウント(本稿の例ではmynavidb)の管理画面を開いて、左のメニューの「キー」のところに記載されている。下図のように、URIやプライマリキーなどが確認できる。

  • データベースへの接続情報

    データベースへの接続情報

接続情報としては、この中のURIとプライマリキー、そしてデータベース名(本稿の例では「mydb」)が必要となる。Spring Bootプロジェクト src/main/resources/ ディレクトリに「application.properties」という名前のファイルを作成し、その中に次の3行の設定を書き込もう。URIとプライマリキーは先ほどの管理ページのものをコピーし、データベース名には先ほど作ったデータベースの名前を記述する。

azure.cosmosdb.uri=[URI]
azure.cosmosdb.key=[プライマリ キー]
azure.cosmosdb.database=[データベース名]

次に、MavenにCosmos DB用のプラグインのための設定を追加する。pom.xmlを開いて、以下に挙げる2つの修正を行う。まず properties の設定を探し、そこに次のように Azure のバージョン情報を追加する。

  <properties> 
    <java.version>11</java.version> 
    <azure.version>2.2.0</azure.version>
  </properties>  

次に、dependencies の設定を探して、そこに次の依存関係の情報を追加する。

    <dependency>
      <groupId>com.microsoft.azure</groupId>
      <artifactId>azure-cosmosdb-spring-boot-starter</artifactId>
      <version>2.2.2</version>
    </dependency>

ここで追加したのは「Azure Cosmos DB Spring Boot Starter」というプラグインを使用するための依存関係の設定である。Azure Cosmos DB Spring Boot Starterを使用すると、Spring Data APIを用いてCosmos DBのSQLデータベースにアクセスすることができる。

さて、pom.xmlの設定ができたら、一旦プロジェクトをビルドして、依存関係が正しく解決できていることを確認しよう。

$ mvn clean package

次回は、実際にCosmos DBにアクセスしてデータの追加や検索を行うプログラムを作ってみよう。