AzureのNoSQLサービス DocumentDB を、ローカル環境エミュレーターが2016-11月に発表されました。ブログは見てましたが全く試していなかったので、Quick Start用のサンプルコードを使って動かしてみます。
今回は、.NET Coreのサンプルコードをダウンロードして使います。
Overview
- 1. DocumentDB Emulatorのインストール
インストール方法を説明します。 - 2. サンプルコードを更新
サンプルコードをざっくり説明し、ちょっとだけ手を加えます。 - 3. デバッグして動作確認
デバッグしてアプリとエミュレーターの動作を見てみます。
環境は、Visual Studio 2015 Update3 (Enterprise)を使っていますが、ASP.NET Coreが利用できる環境であればどれでも大丈夫かと思います。
1. DocumentDB Emulatorのインストール
まずは、ここからエミュレーターのインストーラーをダウンロードしてインストールします。
インストールはポチポチするだけなので、手順は省略します。インストールが完了したら、今インストールした「DocumentDB Emulator」を起動しましょう。ファイアウォールの警告が出ますが、アクセスを許可してあげます。そうすると、ブラウザが立ち上がります。URLが「https://localhost:8081/」になっているので、ここがエンドポイントっぽいですね。
サンプルコードをダウンロードできます。環境は.NET、.NET Core、Java、Node.Js、Pythonがあってイイですね。今回は、新たに登場した.NET Coreを試してみます。プロジェクトをダウンロードして、zipを展開し、展開されたフォルダの中でquickstartcore.sln
をクリックしてプロジェクトを開きます。
2. サンプルコードを更新
以下消した部分はバグってて修正方法を書いてた部分だったのですが、2016-12-6に中の人にメールしたら「昨日対応したよ、エミュレーター再起動して試してみて」 って数分で返信来て、修正されていることを確認できたので消しました♪
(ってかUSの中の人、普通に超早くメールくれてびっくり&素晴らしいですね!Kirill, Thanks for this support ! )
プロジェクトを開くと、さっそく「パッケージの復元に失敗しました」と表示されました。。。。Σ(=゚□゚=;)
エラー起きてるところをみると、DocumentDBのSDKが死んでますね。必要なのはMicrosoft.Azure.DocumentDB.Core
ですが....ほ?は?....とりあえず説明は抜きにして...Nugetからパッケージをインストールします。ソリューションエクスプローラーで今開いているプロジェクト「quickstartcore」を右クリックし、「NuGet パッケージの管理」をクリックします。
画面左上の方の参照
をクリックし検索で「Microsoft.Azure.DocumentDB.Core」と入力し、プレリリースを含める
にチェックを入れます(DocumentDB SDK の.NET Core版はまだプレビューです)。
インストールしましょう。
(慣れている方だと、コマンドでInstall-Package Microsoft.Azure.DocumentDB.Core -Pre
打ってインストールですね)
インストールが完了したら、project.jsonを開きます。
エラーが出ている行
"Microsoft.Azure.DocumentDB.Client": "0.1.0"
は見なかったことにして消します!。Ctrl
+ S
キーでファイルを保存すると、パッケージのリストアが実行されてエラーが消えます。(このエラー修正は....そのうちMicrosoft側で修正されると思います。)
では、このサンプルプログラムでDocumentDBへの接続先の設定(今回はエミュレーターへの接続)がどうなっているか見てみましょう。DocumentDBのClientは、インスタンス化するときに接続情報とかオプションをセットするので、サンプルコードのレベルならDocumentDBRepository.cs
あたりを開いてみましょうか...(ってかコードの解説のサイトってあるのかな?...)。
クラスの先頭に変数が定義されていました♪ざっくり説明します。
Endpoint
Emulatorを起動したときにみたURL「https://localhost:8081/」が入力されています。AzureのDocumentDBにアクセスするときは、Azureのポータルから取得することができます。Key
認証キーです。Emulatorにアクセスするときは、いじらずで大丈夫です。the base-64 encoding of a 64-byte vectorである必要があります。AzureのDocumentDBにアクセスするときは、Azureのポータルから取得することができます。DatabaseId
データベース名です。とりあえずならそのままでもいいですが今回は「DemoDb」と変更しました。CollectionId
コレクション名です。RDB的にはテーブルみたいなものだと思っていただければと。Azure上のDocumentDBは、このコレクション単位で課金がされます。今回は「DemoCollection」と変更しました。
あと、ちょっと気になったところは、(実際のソースコードの)76行目に記載されている
new ConnectionPolicy { EnableEndpointDiscovery = false }
です。これは、Emulatorに接続する際には必要なオプションのようです。
DocumentDBをガチで利用する際は、clientのインスタンスを作るときは設定をすべき点がたくさんあります。今回は詳しく触れませんが、このプログラムを元にAzureのDocumentDBに接続して利用する際は、このDocumentDBRepository
クラスの動作はきっちり理解しておきましょう。接続方法やコレクションが作成されるときのオプション(スループットの設定とか)は要注意です。
(私も過去にClientのプログラムの記事を書いていますが、あの記事はSDKのバージョンが古くそのうち更新できたらと思っています。ちなみに仕事で使ってるプログラムはSDKの更新に合わせて結構変わっている...)
3. デバッグして動作確認
デバッグの前にこのアプリについて簡単に触れておくと、簡易のTODO管理アプリです。
DocumentDB周りの動作についてですが、このアプリが起動する際、つまりASP.NET Coreが起動する際に呼ばれるStartup.cs
の中で、DocumentDBRepository
クラスのInitialize()
メソッドが呼ばれます。このメソッド内で、staticなDocumentClient
が生成され、データベースやコレクションの存在チェックをし、無ければ作成します。
それでは、デバッグしましょう。F5
キーでデバッグを開始すると、TODOアプリがブラウザで表示されます。先ほど記載したとおり、アプリが起動時したタイミングで、データベースやコレクションがなければ作られます。
適当にTODOを入れてCreate
ボタンをクリックします。
Webアプリ上で登録されたことが確認できます。
では、Emulator側が正しく動作しているか見てみましょう。先ほど開いたEmulatorの画面(https://localhost:8081/)を開き、Explorer
をクリックしてみましょう。画面が開いたままだった場合は、リフレッシュの矢印をクリックすると、データベース、コレクション、そして先ほど入力したドキュメントが登録されていることが確認できました。
idとか_tsとかの自動で生成されるインターナルフィールドも確認できますね。idは自分で入力こともできますが....それはさておき、アプリでEdit
などして、正常に更新されることが確認できます。これで、DocumenDBの動作チェックがお手軽にできますね。
興味がでましたら是非是非DocumentDBを触って見ていただけると楽しいと思います。注意として、Azureで利用する際の料金体系は、改めてチェックしましょう。
最後に...
仕事で2015年の2月くらいからDocumentDBを使っていますが、当時は実務では使えそうもないサンプルプログラムしかなく動作確認も大変でした。その頃から比べSDKも安定したし、ローカル環境で利用できるエミュレーターやQuick Start用のプログラムもできて試しやすくないていい感じに進化してますね。
ただ、Emulator上からクエリで検索する機能はまだないっぽいですね。そんな時は、DocumentDB Studioを使ったりするといいかもしれません。
AzureのDocumentDBを実際に使う場合は、AzureのポータルからDocumentDBの中身をSQL文っぽいので検索することができます。クエリに興味がある方は、以前にさっとまとめてたりするので、興味があればご覧ください♪。
ということで、ちょっと時間が投稿時間が遅れましたが、アドベントカレンダーの5日目として登録です♪ qiita.com
余談...
ほんとは、Azure FunctionsをVSで開発するネタを掘り下げたかったんですが、warning出てたせいでネタ探したりゲームしたりして遅れました(という言い訳....)。