Cosmos DB のデータに閉域アクセスする方法

# はじめに
今回は2023年7月に受賞した「Top Partner Engineer Award」の Advent Calender 企画の投稿です。
本当は”Ignite 2023で発表された新しいサービスを触ってみた”をやりたかったのですが、「Azure Functions Flex Consumption Plan」も「Microsoft Copilot for Azure」もWait listからApprovedにならず時間切れ。。特に新しくない話ですが、以前お客様からの問い合わせを受けて粛々と検証していた件について共有します。

# Azure Cosmos DB Explorerの課題
ということで唐突ですが、Azure Cosmos DB に保管されているデータにアクセスするために用意されている「Azure Cosmos DB Explorer（以下、Data Explorer）」の話です。Data ExplorerはAzureポータルからComos DBに接続し、中のデータを参照したり更新したりすることができるとても優れたツールです。
しかし、エンタープライズ利用においては、Cosmos DB自体のアクセス制限をかけているものの、Azureポータル経由でアクセス＝インターネット経由で自社のデータにアクセスできてしまうことに抵抗を覚えるお客様もいらっしゃいます。
こんな時にどのような対策が打てるでしょうか？いくつかの方法を検証しました。

## 検証の前提
* 検証用のCosmos DBは、パブリックアクセスできないようにネットワーク制限をかけます
* Azure上にCosmos DBにアクセスするVMを用意します(VMにはBastion経由でアクセスします)
* 今回のデータは、CosmosDBのクイックスタートで作成されるサンプルデータ（下図）を用います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/434f521f-ef58-4132-6e58-bca8c16306d5.png)


## 方法1：サービスエンドポイント経由の Data Explorer 利用

Cosmos DBにアクセスするVMに対し、お客様のポリシーとしてインターネットアクセス制限が掛かっていないのであれば、やはりData Explorerを利用するのが運用上一番楽です。しかし、Cosmos DB側のアクセス制限はしっかり設定する必要があります。アクセス制限の1つのやり方は、サービスエンドポイントを用いて接続元VMが所属するサブネットからの通信のみを許可する方法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/7e6b794b-d919-4a08-5f6a-b1451b4da19d.png)

この時、接続元VMはインターネットを介してAzureポータルにログオンし、Data Explorerにアクセスしますが、Cosmos DBのデータアクセスはプライベートに行われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/8ffff65a-bed0-7226-e2d5-27170e5ae172.png)

## 方法2：プライベートエンドポイント経由の Data Explorer 利用

こちらは方法1とほぼ同様の方式です。接続元VMのサブネットにプライベートエンドポイントを構成し、Cosmos DBにアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/937a5544-2ffa-b4c2-5266-e87e4242dcd3.png)

Cosmos DBのエンドポイントが接続元VMのサブネットのプライベートIPとなりますので、閉域接続と同義になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/7448a208-7697-0cc7-1c87-98f17c58932e.png)


方法1と方法2は、接続元VMがインターネットに出られること、また、Azureポータル経由のData Explorerの利用が認められる場合に採用することができますが、冒頭でお話した通りお客様のポリシーによってはこの条件を満たすことができない場合があります。接続元VMがインターネットに出られない場合に取り得る方法が、これから解説する方法3、方法4となります。
※方法3) は現時点では利用できないため、実質は方法4) 方法5)になります。


## 方法3：Azure Storage Explorer を利用する（現時点では利用不可）

Storage Explorerは、Storage Accountのデータを操作するために用意されているスタンドアロンのアプリケーションです。実はこのStorage Explorerはv1.14.2（2020年7月リリース）まではCosmos DBへのアクセスができるようになっていました。（ずっとプレビューでしたが。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/007797d5-7d02-4548-6cf3-e8eedfe4f8f5.png)

2020年8月にリリースされたv1.15.0からCosmos DBへのアクセスが非推奨となってしまいましたが、その後もしばらくUIは残され利用できる状態になっていました。その後どこかのバージョンでUI自体が削除され、現在の最新バージョン1.32.0（2023年12月現在）でも利用することはできません。
Git Hubから過去バージョンのStorage Explorerがダウンロードできますので、試しに1.14.2でCosmos DBに接続してみました。しかし、現在ではCosmos DBに接続できなくなっていました。（正確にはCosmos DBには接続できるが中のデータが取得できない状態。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/93ba3022-82d9-f044-802c-8f4d9be57783.png)

実は、私が関わっているお客様でも、3年程この方法でCosmos DBにアクセスしていたのですが、2023年8月あたりから突然アクセスできなくなってしまいました。おそらくCosmos DBの内部仕様が変わったからだと思われます。一応MSサポートに問い合わせたのですが、Storage Explorerのバージョンも古いので当然相手にされませんでした。ということで、方法3は現時点では採用することはできません。


## 方法4：Power BI Desktop を利用する

Storage ExplorerでのCosmos DBアクセスが使えなくなってしまったので代替方法を検討していたところ、
Power BI Desktopを用いてCosmos DBにアクセスするという方法を見つけました。この方法は、Power BI Desktopにあらかじめ用意されているCosmos DBコネクタを使うか、もしくは、Azure Synapse Linkを利用するという大きく2つの方式をとることができます。

※以下、検証では接続元VMのインターネット接続をDenyとし、接続元VMとCosmos DBはプライベートエンドポイントで接続可能な状態としています。

### 方法4-1：「Azure Cosmos DB v1」コネクタ

2023年12月現在、Comsos DBに接続するコネクタは「Azure Cosmos DB v1」と「Azure Cosmos DB v2（ベータ）」の二種類があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/0f9f5b72-cf58-ec67-ef5b-dae6c08f2dd2.png)

ただ、サンプルデータを「Azure Cosmos DB v1」でそのまま読み込ませると以下のエラーが発生し読み込みに失敗しました。おそらくv1はJSONの入れ子構造に対応できていないと思われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/6d7574de-ae09-315e-cc01-ae7836f28e53.png)

### 方法4-2：「Azure Cosmos DB v2（ベータ）」コネクタ

続いてサンプルデータを「Azure Cosmos DB v2（ベータ）」で読み込ませました。まだベータ版なので以下の警告が出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/d2885b65-d6d5-b1f4-375f-6cadfd22f88c.png)

Cosmos DBのエンドポイントを設定します。また、今回データ量は少ないので接続モードは「インポート」を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/290953f7-ea23-f1f8-34ff-a629577a99db.png)

アカウントキーを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/b89937b2-9585-1775-c363-011f3521b7a2.png)

するとCosmod DBにアクセスできるようになりますが、ここでは”SampleContainer”と”SampleContainer_tags[]"という二種類のデータセットが出てきます。”SampleContainer”の方は表示できますが、”SampleContainer_tags[]"の方は[評価中...]と出たまま開くことができませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/fe752a58-16fe-3b96-2560-622601375bdb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/4f4b2a2b-b20e-d284-7435-27c5ef5e7419.png)


”SampleContainer”の方のみで読み込むと、以下のように一覧化ができるもののtagsの中が表示されませんでした。tagsはJSONの入れ子になっているデータです。おそらく”SampleContainer_tags[]"の方にその情報があるものと推測しますが、こちらが開けないのは現時点でベータ版としての限界なのかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/87911baa-05b4-dc13-ed2d-c292e650c28f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/fe1880e2-df5c-6a9b-2917-3818f25edccb.png)


### 方法4-3：Azure Synapse Link を構成する

Power BI Desktopに用意されているCosmos DBコネクタはv1もv2（ベータ）も完全ではありませんでした。現時点ではAzure Synapse Linkを構成する方法がデータを欠落させることなく表示できる唯一の方法でした。（その代わり余計なリソースを作成することになりその分コストも増えることになります。）

手順は下記サイトにある通りなので詳細は割愛しますが、サイトの通り進めれば特段難しいことなく設定することができました。

ただし、この構成では接続元VMはプライベートに閉じられているため、作成されるSynapseワークスペースに対してもプライベートエンドポイントを構成して、接続元VMとSynapseワークスペースが閉域接続できるようにしておきましょう。

https://learn.microsoft.com/ja-jp/azure/cosmos-db/nosql/powerbi-visualize


1. Cosmos DBの管理ブレードから[統合]→[Power BI]を選択する

2. 「このアカウントのAzure Synapseリンクを有効にする」の項目で「有効化」を実施、少し時間をおいて有効化が終わったら、対象のコンテナを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/2153d616-fbbc-f801-c108-18b0828652c7.png)

3. ワークスペースの選択から、Synapseワークスペースとデータベースを選択（or新規作成）する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/749bc8be-9f3f-b274-72a6-a9ad8b332ac8.png)

4. .pbidsファイルをダウンロードする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/af639633-79eb-20fd-04d0-f07691f0e366.png)

5. ダウンロードした.pbidsファイルをダブルクリックし、Power BI Desktopを起動する。初回は認証を求められるが、手っ取り早く進めるのであれば、Synapseワークスペースの”SQL管理ユーザ名”とパスワードで突破する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/f5c081d6-a5eb-f45d-26c7-f65a4b400f79.png)

テーブルにして一覧表示すると、今度はtagsの中も参照することができました。おそらくこの方法が実際の運用で有効になると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1199489/8ae10433-eac5-b6e5-11c3-af5f0a0af37e.png)

# おわりに
今回は、CosmosDBのデータにインターネット前提のData Explorerを使わず、いかにプライベートにアクセスするかに焦点を置いた検証してみました。Power BI Desktopはかなり重くサクサク動かすこともできないので、スムーズに運用できるかというと難しい所もありますが、これでお客様のポリシーに叶う運用は作れると思います。みなさんも、同じようなお困り事があれば参考にしていただければ幸いです。
それではまた！