Azure Cosmos DB Linux Emulator を Docker for Windows で動かす
Azure Cosmos DB Linux Emulator があるのですが、公式ドキュメントやと Docker for Linux で動かす説明だけ書かれてます。
Docker for Windows やと、Windows コンテナで Azure Cosmos DB Emulator を使う説明しかない。
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 で証明書の検証エラーを無視する
エミュレーター使うのって基本ローカル開発だけなんで、証明書のエラーは無視してしまってもいいのでは、、、なんて、怒られそうな感じですが、無視するようにしてみました。
以下にそのまんまなものが書かれてますね。
CosmosClientOptions cosmosClientOptions = new CosmosClientOptions()
{
HttpClientFactory = () =>
{
HttpMessageHandler httpMessageHandler = new HttpClientHandler()
{
ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
};
return new HttpClient(httpMessageHandler);
},
ConnectionMode = ConnectionMode.Gateway
};
Discussion