Python で Azure Cosmos DB を使用したアプリ開発を行う時の Tips

# この記事について

こちらは [求ム！Pythonを使ってAzureで開発する時のTips！【PR】日本マイクロソフト Advent Calendar 2020](https://qiita.com/advent-calendar/2020/azure-python) 19 日目の記事です。

この記事では、`Azure Cosmos DB` で **Python** を使って何かする時のアレコレについてまとめています。

# Azure Cosmos DB Python SDK

SQL API で構築された Azure Cosmos DB に Python で接続するには、**Azure Cosmos DB Python SDK** を使用することになります。
こちらのライブラリについては、[PyPI](https://pypi.org/project/azure-cosmos/) で公開されているので、使用する際は一度確認してみてください。

- [azure-cosmos - PyPI](https://pypi.org/project/azure-cosmos/)  

パッケージの導入は、以下のコマンドで完了できます。

```bash
pip install azure-cosmos
```

# Docker 上で Azure Cosmos DB Python SDK を使用

Docker Compose を使用して、Docker コンテナー内で Azure Cosmos DB Python SDK をインストールし、利用することもできます。
以下のような `docker-compose.yaml` を作成し、`docker-compose up -d` でコンテナーを起動します。

```yaml:docker-compose.yaml
version: '3'

services:
  app:
    image: python:3.9
    container_name: python3
    tty: true
    volumes:
      - ./src:/home/src
      - ./pip-lib:/pip-lib
    working_dir: "/home/src"
    environment:
      PYTHONUSERBASE: /pip-lib
```

`src` フォルダ以下に、`requirements.txt` を作成します。このファイル内に **pip freeze** の仕様に従って、使用するライブラリ情報を記載していきます。
Azure Cosmos DB Python SDK の場合は、以下の通りです。

```txt:/src/requirements.txt
azure-cosmos==4.2.0
```

`requirements.txt` ファイルを作成したら、以下のコマンドを実行して、Azure Cosmos DB Python SDK をインストールします。

```bash
docker-compose run --rm app pip install -r requirements.txt --user
```

コマンドを実行すると、`pip-lib` フォルダ内に requirements.txt で指定したライブラリがインストールされるはずです。
以下のように `pip list` を実行すれば、インストールされていることも確認できるはずです。

```bash
docker-compose run --rm app pip list
```

こうすることで、**Infrastructure as a Code** (IaC) として、開発環境を Docker で管理、統一できるのでオススメです。
あとは、実際に Python で開発を始めるだけです。
[PyPI](https://pypi.org/project/azure-cosmos/) や、[Microsoft Docs のチュートリアル](https://docs.microsoft.com/ja-jp/azure/cosmos-db/create-sql-api-python) に、接続方法やデータの読み書きについての記載があるため、こちらを参考に Python アプリケーションを開発していきます。


# Azure Cosmos DB Jupyter Notebooks

2020 年 5 月 に開催された Microsoft Build にて、Cosmos DB のデータエクスプローラーに **Jupyter Notebooks 環境が組み込める**ようになり、より簡単にデータ分析などを実施できるようになりました。
Azure Cosmos DB アカウント作成時に、Notebooks 機能を有効にする必要があります。

![スクリーンショット 2020-12-19 23.41.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348116/d3fe55ca-3669-8774-937c-872cb8ada28a.png)

なお、2020 年 12 月 19 日現在では、Jupyter Notebooks 機能はプレビュー機能のため、有効化できるリージョンに制限があります。
※日本では、東日本リージョン、西日本リージョン、どちらでも有効化できるので、あまり気にする必要はないです。  

- [Azure Cosmos DB に組み込まれている Jupyter Notebook のサポート (プレビュー)](https://docs.microsoft.com/ja-jp/azure/cosmos-db/cosmosdb-jupyter-notebooks)

この Jupyter Notebooks 機能の便利なところは、使い慣れた Jupyter Notebook と同じ形で操作を行うことができること以外に、**Jupyter Notebook のセル内で SQL も実行できる**というのがあります。
また、Azure Cosmos DB の Jupyter Notebooks では、先述の `Azure Cosmos DB Python SDK` のバージョン 4 が一緒に組み込まれており、開発環境を構築しなくても、そのまま簡単に利用を始めることができます。

![スクリーンショット 2020-12-19 23.11.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348116/173b7e76-43f0-831a-98fa-5104e1759904.png)

```ipynb
%%sql --database <データベース名> --container <コンテナー名>
SELECT c.Action, c.Price as ItemRevenue, c.Country, c.Item FROM c
```

このような形で、セル内で SQL を使って、Azure Cosmos DB の中にあるデータを参照することができるため、機械学習など、Python でのコーディングを行う際の実データ確認が楽になります。

無論、`Pandas DataFrame` に、SQL の実行結果を出力させることもできます。

```ipynb
%%sql --database <データベース名> --container <コンテナー名> --output df_cosmos
SELECT c.Action, c.Price as ItemRevenue, c.Country, c.Item FROM c
```
```python
df_cosmos.head(10)
```

このように、`%%sql` の引数に `--output` を追加することによって、同じ Jupyter Notebook 上で、SQL クエリの実行結果をそのまま Pandas DataFrame に投入することもできます。


# おわりに

Azure Cosmos DB は NoSQL データベースのサービスです。実際にデータは溜め込むだけではなく、そこからさまざまな用途に活用していくことが重要です。
是非、Python SDK や Jupyter Notebooks 機能を活用して、Python で気軽にデータ活用を初めてみてください。


# 参考情報

- [クイック スタート:Azure Cosmos DB SQL API アカウントを使用して Python アプリケーションを構築する](https://docs.microsoft.com/ja-jp/azure/cosmos-db/create-sql-api-python)
- [SQL API 用の Azure Cosmos DB Python SDK:リリース ノートとリソース](https://docs.microsoft.com/ja-jp/azure/cosmos-db/sql-api-sdk-python)
- [Azure Cosmos DB に組み込まれている Jupyter Notebook のサポート (プレビュー)](https://docs.microsoft.com/ja-jp/azure/cosmos-db/cosmosdb-jupyter-notebooks)
- [Azure Cosmos DB アカウントのノートブックを有効にする (プレビュー)](https://docs.microsoft.com/ja-jp/azure/cosmos-db/cosmosdb-jupyter-notebooks)
- [Azure Cosmos DB の Python ノートブックで組み込みのノートブック コマンドと機能を使用する (プレビュー)](https://docs.microsoft.com/ja-jp/azure/cosmos-db/use-python-notebook-features-and-commands)
- [dockerのpythonコンテナをビルドしなおさずpip installでライブラリを更新できるようにする方法](https://asukiaaa.blogspot.com/2020/07/docker-python-pip-install-without-rebuilding.html)