Azure Cosmos DB の無償枠 (Free Tier) の注意点

# はじめに

2020 年 3 月 6 日 (米国時間) にて、Azure Cosmos DB に新しく **Free Tier (無償利用枠)** が登場しました。
この Free Tier によって、これまでよりもさらに Azure Cosmos DB を手軽に **無料** で始められるようになりました！

- https://devblogs.microsoft.com/cosmosdb/build-apps-for-free-with-azure-cosmos-db-free-tier/

![スクリーンショット 2020-09-13 16.41.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348116/b5b267a4-25a9-3314-3aac-e0c6c505a079.png)

ただ、この Free Tier ですが、[JCDUG][2] (Japan Azure Cosmos DB User Group) 関連で以下のような質問がありました。

> Free Tier で全然使用していないのに課金が行われてしまいました。 どうしてなのか知りたいです。

というわけで、この記事では、Cosmos DB 初学者の方々などがおそらく疑問に思ったり、正直よく理解できていないと思われる

- **どういった場合に Free Tier (無償利用枠) が適用されて課金がかからなくなるのか**
- **どういった場合に Free Tier を超えて課金が発生してしまうのか**

というポイントに焦点を当てて、解説していきたいと思います。
また、先日公開された **Azure Cosmos DB サーバレス** についても、少し関連する部分かと思うので、こちらについても軽く触れていきたいと思います。

- https://devblogs.microsoft.com/cosmosdb/serverless-preview/

![スクリーンショット 2020-09-13 17.08.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348116/394f75b6-9c00-9f82-5274-06ea1dee83a1.png)


# Free Tier まとめ

概要と環境構築については、[こちら][1]の記事にも書いているので、併せてご確認いただければと思います。

- [2020年から始める Azure Cosmos DB - 環境構築][1]


# Azure Cosmos DB Serverless について

こちらに情報まとめを作りましたので、併せてご確認いただければと思います。

- [Azure Cosmos DB サーバレス (preview) 情報まとめ][3]


# Free Tier で Cosmos DB を無償利用したい時の確認ポイント

では、ここからは「Free Tier を適用したはずなのに、課金が発生している!?」と言ったような時の確認ポイントをまとめていきます。
もし、後述の内容に当てはまらないという場合は、Azure の製品サポートにお問い合わせいただく方が良いかと思います。

- [パターン1: Free Tier が適用されていない](#パターン1-free-tier-が適用されていない)
- [パターン2: 複数のデータベースとコンテナーが存在している](#パターン2-複数のデータベースとコンテナーが存在している)
- [パターン3: 専用プロビジョニングスループットモードで作成されたコンテナーが存在する](#パターン3-専用プロビジョニングスループットモードで作成されたコンテナーが存在する)
- [パターン4: 分析ストアが有効になっている](#パターン4-分析ストアが有効になっている)
- [パターン5: コンテナー内のデータが 5GB を超えている](#パターン5-コンテナー内のデータが-5gb-を超えている)

## パターン1: Free Tier が適用されていない

`Free Tier で作ったつもりが、Free Tier になっていない`という場合があります。Free Tier が適用されていない場合、コンテナーに対して設定されたプロビジョニングされたスループットは、 400 RU/秒 の無償利用枠の対象になりません。
Free Tier は **1 Azure サブスクリプションあたり、1 Azure Cosmos DB アカウントのみ適用可能** というものになっているため、1 Azure サブスクリプション内に、複数の Free Tier が適用された Azure Cosmos DB アカウントを作成することができません。

Free Tier が適用されているかどうかは、現在、Azure ポータルの Azure Cosmos DB アカウント概要ページ、および ARM テンプレートにて確認が可能となっています。こちらを確認して、指定の Azure Cosmos DB アカウントの Free Tier が有効になっているか確認しましょう。

Azure ポータル上から確認する場合は、`Free Tier Discount`欄が **Opted In** になっていることを確認しましょう。

![スクリーンショット 2020-09-14 2.59.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348116/7b0ad407-b0ed-52d5-1e8b-c82fb3fc48ff.png)

ARM (Azure Resource Manager) テンプレート上で確認される場合は、resources -> properties 以下にある、`enableFreeTier`の値が **true** になっていることを確認しましょう。

![スクリーンショット 2020-09-14 3.05.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348116/f256ad31-05d8-cfe9-82ec-88d39514af2e.png)


## パターン2: 複数のデータベースとコンテナーが存在している

Free Tier が適用された Azure Cosmos DB アカウント上で、以下のように`複数のデータベースを作成`していないでしょうか。

![スクリーンショット 2020-09-14 4.02.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348116/db6d7044-ffa6-fbf2-e790-809662ee86ed.png)

データベース作成時に、プロビジョニングされたスループットの設定を行うと思いますが、この**スループットは、データベースを跨いで共有することはできません**。
そのため、以下のような構成の場合、課金対象は 400 RU/s * 2 の **800 RU/s** となり、**Free Tier の最初の 400 RU/s 無償利用分を差し引いた 400 RU/s 分の課金が発生**することになります。

- データベース: A (400 RU/秒: プロビジョニングスループット モード)
    - コンテナー: x
- データベース: B (400 RU/秒: プロビジョニングスループット モード)
    - コンテナー: y

Free Tier 適用範囲内で Cosmos DB を利用したい場合は、データベースは 1 つのみ作成するようにしましょう。別のデータベースを作成したい場合は、既存のデータベースを削除するか、新しい Azure サブスクリプションを作成し、Azure Cosmos DB アカウントを別で作るようにしましょう。

## パターン3: 専用プロビジョニングスループットモードで作成されたコンテナーが存在する

Azure Cosmos コンテナー を作成する際、プロビジョニングされたスループットについて、以下 2 つのモードのどちらかを選択することになります。

| モード | 説明 |
| :-- | :-- |
| **専用プロビジョニングスループット** | 単一のコンテナー専用にスループットを予約し、他のコンテナーとのスループットの共用は不可 |
| **共有プロビジョニングスループット** | 同じデータベース内の他のコンテナーとプロビジョニングされたスループットを共有 |

詳しくは、以前の [JCDUG][2] の勉強会にて、エンティティについて説明したものがありますので、[こちら][4]をご確認ください。

- [Azure Cosmos DB のエンティティについて][4]

コンテナー作成のダイアログにて、上記の 2 つのモードどちらを適用してコンテナーを作成するかを選択できる画面があります。

![スクリーンショット 2020-09-14 4.21.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348116/07525e42-4324-26b9-eefc-eca9010fc5d9.png)

こちらの画面で、チェックボックスを ON にし、コンテナーを`専用プロビジョニングスループット`モードで作成してしまった場合、データベースとは別で独立したスループットが適用されてしまうため、Free Tier 対象の 400 RU/s を超えてプロビジョングされたスループットを設定することになってしまいます。このスループットのモードについては、現時点では、**コンテナー作成時にのみ選択可能**となっており、コンテナー作成後に変更することはできません。

専用プロビジョニングスループットモードでコンテナーを作成する場合、事前にデータベース側で設定されているスループット値の設定は無視されます。特にエラーなどは出ませんので(当然ですが)、このあたりの設定が分からないままチェックを ON にしないよう、注意しましょう。

![スクリーンショット 2020-09-14 4.23.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348116/2b551b7e-7eaf-22de-ddc1-a5f26467157d.png)

作成されたコンテナーがどちらのモードで作成されているかについては、Cosmos DB のデータエクスプローラー画面、および ARM テンプレートにて確認が可能となっています。

データエクスプローラー上で確認する場合は、コンテナーの`Settings`タブを確認しましょう。共有プロビジョニングスループット モードで作成されたコンテナーの場合は、タブが **Settings** のみ表示され、スループットに関する設定欄は表示されません。

![スクリーンショット 2020-09-14 4.32.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348116/94188d58-7b05-2c9f-d91c-b3fa2b0a4e75.png)

逆に、専用プロビジョニングスループット モードで作成されたコンテナーの場合、Settings タブを開くと、`Scale`の設定欄が表示され、スループットを変更できるようになっています。

![スクリーンショット 2020-09-14 4.32.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348116/dc250e83-b0c4-b880-8aba-6cc7e4ea9937.png)

ARM テンプレートで確認する場合は、resources 以下にある `dependsOn` プロパティにて、専用プロビジョニングスループット モードを識別するための値が設定されていないかどうかを確認しましょう。
専用プロビジョニングスループットモードで作成されたコンテナーの場合は、dependsOn にて、以下のようなコンテナーに関する設定値が 1 つ追加で存在するようになっています。

```json
"[resourceId('Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers', parameters('databaseAccounts_<db account>_name'), 'DamonSlayer', 'Test')],"
```

![スクリーンショット 2020-09-14 4.31.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348116/111e27ef-5884-c86e-3d55-749374303cbf.png)

## パターン4: 分析ストアが有効になっている

Microsoft Build 2020 にて発表があった通り、Azure Synapse Link の登場に合わせて、**Azure Cosmos DB 分析ストア**が登場しました。コンテナーを作成する際に、`分析ストアを一緒に作成するか否か`の設定を行うようになっています。
分析ストア機能は、Free Tier の対象外となっており、ストレージと読み取り/書き込みの IOPS に対して課金が発生します。Azure Synapse Link および Azure Cosmos DB 分析ストアの詳細については、以下の資料を参照してください。

- [2020年から始めるAzure Cosmos DB - Azure Synapse Link を試してみる][5]
- [2020年から始めるAzure Cosmos DB - Azure Synapse Link Demo (Part. 1)][6]
- [Azure Synapse Link for Azure Cosmos DB - SlideShare][7]

![スクリーンショット 2020-09-14 5.05.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348116/11537711-2eac-465b-2ea2-50e921452073.png)

## パターン5: コンテナー内のデータが 5GB を超えている

Free Tier は、スループットの計算とは別に、ストレージに対する計算も発生しています。5 GB を超えるストレージ容量については、「[パターン4: 分析ストアが有効になっている](#パターン4-分析ストアが有効になっている)」にて掲載している料金一覧にある通り、1 GB あたり 31.640 円の課金が発生します。

**コンテナー内にあるデータが 5 GB を超過していないか**、確認しましょう。

![スクリーンショット 2020-09-14 5.31.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348116/0b5ed191-1681-fee3-bb34-2f71a3413d2f.png)


# Cosmos DB Serverless は Free Tier 対象外

先述の通り、2020 年 8 月 19 日 (米国時間) より、Azure Cosmos DB サーバレスがパプリックプレビューに入りました。Azure Cosmos DB アカウントを作成する際、**キャパシティ モード** を選択することが必須になっています。

| Capacity mode | 説明 |
| :-- | :-- |
| Provisioned throughput | プロビジョニングされたスループット モード (従来) |
| Serverless | サーバレス |

Azure Cosmos DB サーバレスは、従来のプロビジョニングされたスループット モードと異なり、使用したスループットの量に応じてコンピューティングに相当する課金が行われます。(ストレージについては、従来同様、別途課金対象となります)
そのため、使用していない期間について、スループットの課金は発生しませんが、使用した際には、スループットの課金が発生することになります。

そして、**Azure Cosmos DB サーバレスは、Free Tier 対象外** ですので、純粋に使用したスループットとデータ量(ストレージ)についての課金はそのままチャージされます。無料で使用することはできません。
また、先述の記事内でも触れていますが、サーバレスで作成したコンテナーについては、2020 年 9 月 13 日 現在、オートスケールが自動で有効化されており、これを変更することはできません。また、`コンテナーのスループットについても オートスケールで最大 5,000 RU/s 固定`となっているため、下手に非効率なクエリを実行すると、RU を無駄に消費してしまい、課金額が大幅にアップしてしまう可能性があります。

- [Azure Cosmos DB サーバレス (preview) 情報まとめ][3]

そのため、個人的には、Azure Cosmos DB 初学者 については最初は **Provisioned throughput** にて Free Tier を有効化した Azure Cosmos DB アカウントを作成することを推奨します。
また、非効率なクエリを実行しないためには、Azure Cosmos DB のエンティティやデータモデリングについての理解が必要となります。以前の [JCDUG][2] 勉強会にて、エンティティやデータモデリングのケーススタディについて扱った回がありますので、興味ある方は一度資料をご覧になってみてください。

- [第2回 Azure Cosmos DB 勉強会][8]


---
[1]:https://qiita.com/ymasaoka/items/3784c64baf30bbe7b761
[2]:https://jcdug.connpass.com/
[3]:https://qiita.com/ymasaoka/items/6cd01d4215bb48b22b3e
[4]:https://www.slideshare.net/Oshitari_kochi/azure-cosmos-db-238466292
[5]:https://qiita.com/ymasaoka/items/3caac5045f0e5349504f
[6]:https://qiita.com/ymasaoka/items/c177152672a8280ff4f7
[7]:https://www.slideshare.net/Oshitari_kochi/azure-synapse-link-for-azure-cosmos-db
[8]:https://jcdug.connpass.com/event/185921/