Cosmos DB のネットワーク設定

昨年(2019 年)の後半くらいから今年の前半にかけて、Azure の PaaS/Serverless 界隈ではネットワークに関する機能強化が活発になってきた印象です。サーバーレス DB と呼ばれることが多くなった Cosmos DB についても、2020 年の春ころに Private Link For Cosmos DB が GA しています。実プロジェクトでもこのあたりのネットワーク機能を活用することが多くなってきたので、この機会に Cosmos DB のネットワーク設定周りを整理したいと思います。

3 つの接続アプローチ

Cosmos DB に限ったことではないですが、最近の Azure PaaS 系サービスではだいたい以下の 3 つのネットワーク接続方法が提供されています。

  • 全てのネットワークから接続
  • サービスエンドポイントへの接続
  • プライペートエンドポイントへの接続

実際に Cosmos DB のプロビジョニング画面でも以下のように 3 つの選択肢から選んで設定できるようになっています(プロビジョニング後でも設定可能)。

Cosmos DB のプロビジョニング(ネットワーク)画面

設定画面では表現が若干異なっていますが、 Public endpoint はサービスエンドポイントによる接続のことで、 Public endpoint が Private Link による接続のことです。

ちなみに、サービスエンドポイントとプライベートエンドポイントの違いや併用については、 @nakazax さんの記事がわかりやすかったです。

サービスエンドポイント接続

サービスエンドポイントの方は、 Firewall and virtual networks メニューで仮想ネットワークを追加することで設定が完了します。VNET 選択の際にサブネットを指定し、 Cosmos DB 側のサービスエンドポイント(Public IP ベースのエンドポイント)と接続するような形になります。設定の反映には最大で 15 分くらいかかるようなので、 Endpoint StatusEnable になるまでしばらく待ちましょう。

サービスエンドポイントの設定を行った場合の注意として、管理用のクライアントが仮想ネットワークに参加していなければ、データエクスプローラーや Storage Explorer を使ってデータの操作ができなくなります。最も簡単な対策としては、クライアント IP アドレスを Firewall に追加することです( CIDR Range での設定も可能)。ポータルから操作するには、 Allow access from Azure Portal にもチェックを入れておきましょう。

仮想ネットワークと IP ファイアウォールを設定した状態は以下のようになります。

Firewall and virtual networks 設定画面

プライペートエンドポイント接続

こちらは Plivate Link を使った接続で、Cosmos DB 側のエンドポイントは プライベート IP が割り当てられます。ExpressRoute を使ってオンプレミスのネットワークと仮想ネットワークを接続しているような環境で使いやすい方法です。

設定については、 Private Endpoint Connections メニューの方から + Private Endpoint をクリックしてプライベートエンドポイントの各種設定(プライベートエンドポイントの作成、サブネットの指定、Private DNS Zone の作成など)を実行していきます。設定が完了すると以下のように Private Endpoint リソースが作成されます。

Private Endpoint 画面

プライペートエンドポイント接続のクライアント環境については、Cosmos DB の場合、サービスエンドポイントの IP ファイアウォールと併用することができます。ポリシー的な制約がある場合は、 ExpressRoute 等を使って仮想ネットワークに接続したり Azure Bastion 経由で接続を行うことになるかと。


ここでは、Cosmos DB におけるネットワーク機能を紹介しましたが、その他のサービスでもだいたい似たような設定でサービスエンドポイントやプライベートエンドポイントが構成できます。

今年に入って、 Azure Paas/Serverless 領域の ネットワーク設定の選択肢が広がったことにより、ネットワーク設計の幅が広がったのはもちろん、ネットワークポリシーに厳しい傾向があるエンタープライズ系のプロジェクトでも PaaS のネットワークが問題になって議論が進まなくなるようなことが無くなり助かっています。