CosmosDBエミュレータとAzureストレージエミュレータをdockerで動かしてAzureのローカル開発環境に利用する

# はじめに

Azure Functionsアプリの開発と切ってもきれない関係にあるのが、AzureストレージとCosmosDBです。

この記事ではローカル開発環境用にDocker上でCosmosDBエミュレータとストレージエミュレータ(Azurite)を動かすためのdocker-compose用ファイルを紹介します。

基本的には公式ドキュメントのdockerコマンドの引数をdocker-compose用に書き直した程度です。

## 前提環境

* OS: MacOS(Intel)
* Docker Desktop for MacOS 4.0.1
* docker-compose 1.29.2

※CosmosDBのエミュレータは2021年9月時点ではIntelプロセッサのMacにしか対応してないです。


## 公式のドキュメント

* [Docker for Linux 上でエミュレーターを実行する (プレビュー)](https://docs.microsoft.com/ja-jp/azure/cosmos-db/linux-emulator)
* [ローカルでの Azure Storage の開発に Azurite エミュレーターを使用する](https://docs.microsoft.com/ja-jp/azure/storage/common/storage-use-azurite)

# docker-compose.ymlファイル

```yaml:docker-compose.yml
version: '3.7'

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

    azurite:
        container_name: azurite
        image: mcr.microsoft.com/azure-storage/azurite:latest
        ports:
            - "10000:10000"
            - "10001:10001"
            - "10002:10002"
        volumes:
            - ./data/azurite:/data
```

# 環境設定

## Docker Desktop for MacOSのリソース設定

CosmosDBエミュレータの動作に
* CPUが2コア以上
* メモリが3GB以上
必要なので、Docker Desktop for MacOSのリソース割当を増やしておきます。

## .envファイルの準備

CosmosDBエミュレータの動作にホストOS側のIPアドレスが必要になるため、
以下のコマンドでIPアドレスをしらべて、docker-compose.yml用の.envファイルの「LOCAL_HOST_IPV4」に設定します。


```bash
ifconfig | grep "inet " | grep -Fv 127.0.0.1 | awk '{print $2}' | head -n 1
```

.envファイルのサンプル

```:.env
LOCAL_HOST_IPV4=192.168.0.10
```

## 起動

```bash
docker-compose up
```

```bash:docker-composeの起動ログ
Attaching to cosmosdb, azurite
cosmosdb    | This is an evaluation version.  There are [171] days left in the evaluation period.
azurite     | Azurite Blob service is starting at http://0.0.0.0:10000
azurite     | Azurite Blob service is successfully listening at http://0.0.0.0:10000
azurite     | Azurite Queue service is starting at http://0.0.0.0:10001
azurite     | Azurite Queue service is successfully listening at http://0.0.0.0:10001
azurite     | Azurite Table service is starting at http://0.0.0.0:10002
azurite     | Azurite Table service is successfully listening at http://0.0.0.0:10002
cosmosdb    | Starting
cosmosdb    | Started 1/11 partitions
cosmosdb    | Started 2/11 partitions
cosmosdb    | Started 3/11 partitions
cosmosdb    | Started 4/11 partitions
cosmosdb    | Started 5/11 partitions
cosmosdb    | Started 6/11 partitions
cosmosdb    | Started 7/11 partitions
cosmosdb    | Started 8/11 partitions
cosmosdb    | Started 9/11 partitions
cosmosdb    | Started 10/11 partitions
cosmosdb    | Started 11/11 partitions
cosmosdb    | Started
```


## CosmosDB用エミュレータ用の証明書のダウンロードとインポート

(1)CosmosDBエミュレータから証明書をダウンロードする

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

(2)ダウンロードした証明書をキーチェーンにインポートする
finderで証明書を表示して、ダブルクリックでインポートされます。
キーチェーン上での証明書の名前は「localhost」です。

(3)キーチェーンにインポートされた証明書を信頼する

※dockerコンテナが作り直されると、この証明書も作り直されるみたいです。


# CosmosDBエミュレータをブラウザから触ってみる

以下のURLをブラウザから開くとCosmosDBエミュレータのWeb UIを操作することができます。

```
https://localhost:8081/_explorer/index.html 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19321/04db674f-f369-4729-f5e6-6c2cd3c6e88b.png)


# Azure Data ExplorerからCosmosDBエミュレータやAzuriteを触ってみる

[Azure Data Explorer](https://azure.microsoft.com/ja-jp/features/storage-explorer/)を利用すると、CosmosDBエミュレータやAzureストレージエミュレータのデータを見たり変更できます。

https://azure.microsoft.com/ja-jp/features/storage-explorer/

https://docs.microsoft.com/ja-jp/azure/vs-azure-tools-storage-manage-with-storage-explorer?tabs=macos#local-storage-emulator

![スクリーンショット 2021-09-23 0.01.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19321/e6a841f0-470c-0d77-3fec-e7c69c987dfc.png)