🌏

Azure Cosmos DB Linux Emulator を Docker for Windows で動かす

2022/07/19に公開

Azure Cosmos DB Linux Emulator があるのですが、公式ドキュメントやと Docker for Linux で動かす説明だけ書かれてます。

https://docs.microsoft.com/ja-jp/azure/cosmos-db/linux-emulator?tabs=sql-api%2Cssl-netstd21

Docker for Windows やと、Windows コンテナで Azure Cosmos DB Emulator を使う説明しかない。

https://docs.microsoft.com/ja-jp/azure/cosmos-db/local-emulator-on-docker-windows?tabs=cli

Windows コンテナって動かすことないし、Docker composeで他のミドルウェアと同時に動かすときに困るし、ってことでAzure Cosmos DB Linux Emulator を Docker for Windows で動かしてみました。

基本的なやり方は Docker for Linux 上でエミュレーターを実行すると一緒。

ローカルマシンのIPアドレスはPowershellで取得してます。

$ENV:IPV4ADDR = (Get-WmiObject Win32_NetworkAdapterConfiguration) | where {$_.IPAddress} | select -Expand IPAddress | where { $_ -notlike "*:*"}

Docker composeファイルは以下のような感じ。「cosmos emulator docker compose」で検索かけるといくつか落ちてた。

version: "3"

services:
  cosmos:
    image: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:latest
    container_name: cosmosdb
    tty: true
    ports:
      - 8081:8081
      - 10251:10251
      - 10252:10252
      - 10253:10253
      - 10254:10254
      - 10255:10255
    environment:
      - AZURE_COSMOS_EMULATOR_PARTITION_COUNT=10
      - AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE=true
      - AZURE_COSMOS_EMULATOR_IP_ADDRESS_OVERRIDE=$IPV4ADDR
    deploy:
      resources:
        limits:
          cpus: "2.0"
          memory: 3g

ちなみに、AZURE_COSMOS_EMULATOR_IP_ADDRESS_OVERRIDEでIPアドレスを指定する理由は、ドキュメントには

お使いのローカル コンピューターの IP アドレスを取得します。 この手順は、Cosmos DB SDK (.NET、Java) を使用して直接モード設定を構成する場合に必要です。

って書かれてるんですが、指定されていない場合にゲートウェイモードで動かしてもリクエストが返ってきませんでした。なにか私がミスったのか、ドキュメントが嘘ついているのか、内部的な動きのせいなのかは分からないですが。

証明書の取得とインストールも基本はドキュメントに書かれているとおり。 Windows なのでダウンロードした crtファイルをダブルクリックして「信頼されたルート証明機関」にインストールするだけです。

windows 10からはcurlコマンドも使えるようになって、わざわざ他のコマンドに読み替えなくていいので楽ですね。ドキュメントでは、URLのドメインはIPアドレスにするように書かれてましたが、localhostで大丈夫でした。

curl -k https://localhost:8081/_explorer/emulator.pem > emulatorcert.crt

で、問題はこの証明書がコンテナの起動のたびに作り替えられるようで、毎回インストールが必要。そんなメンドクサイことはやってられない。

Azure Cosmos DB .NET SDK で証明書の検証エラーを無視する

エミュレーター使うのって基本ローカル開発だけなんで、証明書のエラーは無視してしまってもいいのでは、、、なんて、怒られそうな感じですが、無視するようにしてみました。

以下にそのまんまなものが書かれてますね。

https://docs.microsoft.com/en-us/azure/cosmos-db/local-emulator?tabs=ssl-netstd21#disable-ssl-validation

CosmosClientOptions cosmosClientOptions = new CosmosClientOptions()
{
    HttpClientFactory = () =>
    {
        HttpMessageHandler httpMessageHandler = new HttpClientHandler()
        {
            ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
        };

        return new HttpClient(httpMessageHandler);
    },
    ConnectionMode = ConnectionMode.Gateway
};

Discussion