MongoDBマネージドサービスの「MongoDB Atlas」の説明

MongoDB World 2016にて、MongoDBサービスの「MongoDB Atlas」（モンゴデービーアトラス）が発表された。これは自前でMongoDBを立てる場合とは違って、コンソールからクリックしていくだけでMongoDBのクラスタがAWS上に立ち上がり、利用した分だけ課金されるサービスだ。

# ポイント

要はMongoDB Atlasは

- MongoDB社公式のマネージドサービス
- アカウント作ってWebで操作すると、AWS上にMongoDBのクラスタが立つ
- アプリからはインターネット経由でアクセス。プロトコルはMongoDBプロトコル on SSL
- クラスタの台数変更はWebから可能
- ノードのスペック変更もWebから可能。これはレプリカセット内でローリングして行われる 
- 監視、アラート、バックアップ・リカバリの機能(=MongoDB Cloud Managerの機能)も使える
- 利用料課金。最小だと一時間0.08ドル≒10円
- Atlasのサポートはあるが、MongoDB自体のサポートは料金に含まれない。

# 詳細

使えるようなので、さっそく使ってみた。

## アカウントの登録～ログイン

Atlasを利用するためにはまずアカウントを登録する必要がある。

まず、以下のページにアクセスしてアカウントを作る

https://www.mongodb.com/cloud

![キャプチャ0.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/f2e95a2b-fdc6-965f-527d-e5ad48e2488c.png)

Sign Upをクリックする。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/f2aa75e0-1844-5e95-439a-5458e00da7c8.png)

適宜入力する。Company NameやPhone Numberは実際に電話がかかってくるわけではないので、適当でよい。でCONTINUE。

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/5b0b7311-c998-fe33-fe97-ccba601413aa.png)

次にAtlas Groupというグループ名を入力する。今回は「Atlas Lab」とした。

これでログイン完了。

※）既にMongoDB Cloud Manager(旧Ops Manager , 旧MMS)のアカウントがある場合は、そのアカウントではAtlasは使えない模様。詳細確認中。

## クラスタの生成

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/ed29799b-8faa-aaa5-5d61-6ce10da15266.png)

「BUILD A NEW CLUSTER」をクリック

### クラスタ名

順次必要な項目を埋めていく。まずはクラスタ名の入力。

![キャプチャ21.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/d6e43ae5-662d-aee4-14b3-294438d94b8f.png)

デフォルトのままにした。

### AWSリージョン

AWSリージョンを選ぶ。リージョンを跨いだクラスタは作れないらしい。そして、現状では「us-east-1」しか選べない。

![キャプチャ22.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/28221710-fbcd-c05e-70c2-c7193eced143.png)


### インスタンスタイプ

インスタンスのタイプを選ぶ。　M10、M20、M30と上がっていく毎にメモリとストレージ容量が変わってくる。おそらくAWSの何かしらのインスタンスに紐づいているだろう。ストレージ容量と暗号化有無はオプションで変えられる。

![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/5dae2c31-1bba-ded6-4ee6-df0eb42ee76d.png)

今回は一番安いM10を選んだ。

### レプリカセットの台数

次はレプリカセットの台数選択。3,5,7から選べる。no down-timeと書いてあるから、AWSのアベイラビリティ―ゾーンをまたがってデプロイしてくれるのだろう（きっと）

![キャプチャ6.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/e6884995-9468-33da-bf5a-63c7c0e6df6c.png)


### シャーディングの設定

シャーディングはするか？と聞かれる。ただし、シャーディングをするにはインスタンスのタイプをM50という中程度サイズ以上じゃないと選べない。YESを選択すると、追加で何台でシャーディングするかを選べる。2～12台まで選べる模様。

![キャプチャ7.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/d21b28bd-1952-3b24-7ced-e9d7ddccdd9f.png)

今回はNOを選んだ(画面とは違います)。

### バックアップの設定

バックアップはするかどうか聞かれる。これは昔からあるCloud Managerの機能で、レプリケーションの際の更新ログ(oplog)をバックアップしてポイントインタイムリカバリできる機能だと思われる。バックアップ先はus-east-1リージョンらしい。

![キャプチャ8.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/ce0363a4-de4d-e4e9-f39f-93cf681b0fb5.png)

今回はNOを選んだ(画面とは違います)。

### ログインパスワードの設定

MongoDBにログインする際のパスワードを設定する。これを忘れるとログインできなくなるので注意。

![キャプチャ9.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/3f7385d1-5a29-44c7-1bd7-81854f79de07.png)

### 値段の確認

上記の選択肢を選んでいる間に、実は常に金額が表示される。

![キャプチャ16.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/cd823372-b99c-5f49-451b-60bf34455206.png)

今回の構成だと一時間0.08ドル

### クレジットカードと請求先の登録

最後にクレジットカードと請求先を記載する。

![キャプチャ10.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/e3441335-54bc-e2dd-77fc-17468abbd37e.png)

※）おそらく請求先は適当でもOK。MongoDB,Incの社風からして請求書が国際郵便で飛んでくることはありえない。

### クラスタの生成を待つ

以下のような画面になるので、node0などの値が具体的になるのを待つ。

![キャプチャ11.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/98e028bf-d3b2-cdea-8a66-bf054482a54f.png)

## MongoDBへの接続元IPアドレスの登録

MongoDB Atlasが生成するMongoDBクラスタはAWS上にでき、インターネット経由でアクセスする。具体的には以下のような接続構成になる。

![atlas.png](https://qiita-image-store.s3.amazonaws.com/0/33447/204b1e8f-c040-0ac7-101e-45340a9a111e.png)

MongoDB側はMongoDBプロトコルを受け付けるために27017で待ち受けているが、どこからでも受け付けるわけにはいかないので接続元IPを絞っている。そのため接続元IPアドレスを登録してあげる必要がある。

Securityのタブ ⇒ IP WHITELISTのタブと辿って、 ADD IP ADDRESSをクリックする

![キャプチャ12.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/bebdb6e0-338f-db84-3861-b3fda7ad910e.png)

今回は、自宅のマシンから接続するため、自宅のブロードバンドルーターのグローバルIP(固定IP)を登録した。AWS上のインスタンスから接続する場合は、EIPを付与してそれを登録してあげればよいだろう。

## MongoDBへ接続

MongoDBクラスタが立ち上がると、以下のようにノード名が具体的なFQDNになる。こうなれば準備OK

![キャプチャ14.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/510e817a-7273-fb8a-d591-19ef4579e2cd.png)

右にあるCONNECTのボタンを押すと、以下の様にMongo ShellとMongoドライバからアクセスする際のサンプルコードが表示される

![キャプチャ17.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/15930302-e045-7b5c-f3f1-49083ee8d33e.png)

これをMongo Shell(つまりmongoコマンド)がインストールされた状態で実行する。

今回は以下のようなコマンドになった

```
$ ./bin/mongo "mongodb://cluster0-shard-00-00-rwogg.mongodb.net:27017,cluster0-shard-00-01-rwogg.mongodb.net:27017,cluster0-shard-00-02-rwogg.mongodb.net:27017/admin?replicaSet=Cluster0-shard-0" --ssl --username fetaro --password XXXX
```

以下のようにプロンプトがでれば成功だ。

```
MongoDB shell version: 3.2.9
connecting to: mongodb://cluster0-shard-00-00-rwogg.mongodb.net:27017,cluster0-shard-00-01-rwogg.mongodb.net:27017,cluster0-shard-00-02-rwogg.mongodb.net:27017/admin?replicaSet=Cluster0-shard-0
2016-08-17T23:07:52.359+0900 I NETWORK  [thread1] Starting new replica set monitor for Cluster0-shard-0/cluster0-shard-00-00-rwogg.mongodb.net:27017,cluster0-shard-00-01-rwogg.mongodb.net:27017,cluster0-shard-00-02-rwogg.mongodb.net:27017
2016-08-17T23:07:52.359+0900 I NETWORK  [ReplicaSetMonitorWatcher] starting
Cluster0-shard-0:PRIMARY>
```

※）ここで、以下の様に--sslオプションが認識できないというエラーが出ることがある。これはMongo ShellがSSLを使えないタイプのものだからだ。

```
Error parsing command line: unrecognised option '--ssl'
try './bin/mongo --help' for more information
```

実はMongo ShellにはSSLによる接続ができるバイナリとできないバイナリがある。MongoDBは思想として外部ライブラリを一切使わない単一バイナリで動作することがウリの一つだが、SSLだけはOpenSSLをつかうため、SSLを使う場合だけバイナリが分かれている。

これを解消するには、SSLが有効なバイナリを利用すればよい。

※）ちなみにFQDNをnslookupすればAWS上のインスタンスだとすぐわかる（別に隠してないけど）

```
$ nslookup cluster0-shard-00-00-rwogg.mongodb.net

Non-authoritative answer:
cluster0-shard-00-00-rwogg.mongodb.net  canonical name = ec2-52-7-33-138.compute-1.amazonaws.com.
Name:   ec2-52-7-33-138.compute-1.amazonaws.com
Address: 52.7.33.138
```

## 適当に負荷をかけてみる

1万件のドキュメント配列を作り、それを1万回挿入して様子を観察してみる

```
Cluster0-shard-0:PRIMARY> for(var i = 0 ; i < 10000; i++){ary.push({"a":1})}  
10000
Cluster0-shard-0:PRIMARY> for(var i = 0 ; i < 10000; i++){ db.hoge.insert(ary) } 
```

想定通り、ダッシュボード上でクエリが増加しているのが見えた。

![キャプチャ18.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/e79bf550-f5c5-63af-f0f2-2c37991849b3.png)

ノードをクリックするとさらに詳しく見れる。

![キャプチャ19.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/e7325e87-845f-2b92-90f0-a8143d82c4dd.png)

インターネット越しだが、秒間で4000件書き込みができているのが分かった。

ちなみに、この機能はAtlas独自のものではなく、自前のMonogoDBにCloud Managerを接続しても同じようなものが見える。

## クラスタを変更する

CONFIGURATIONをクリックすると、クラスタの設定変更画面になる

![キャプチャ20.PNG](https://qiita-image-store.s3.amazonaws.com/0/33447/c2e8a1d0-fe79-7470-cf7c-665236d47b95.png)

とりあえず試しにインスタンスのタイプをM10からM20に上げてみることにした。

その間、rs.status()でクラスタの状態を見ると、さっきまで元気だったnode1(セカンダリ)が死んでいることが分かる。

ずっと見ていると、以下の順序で処理が行われていった。

1. node1(セカンダリ)のインスタンス変更
2. node2(セカンダリ)のインスタンス変更
3. PRIMARYのフェイルオーバしてnode2がプライマリになる
4. node0(旧プライマリ)のインスタンス変更


## 最後にクラスタを壊す

Terminateをクリックすればクラスタが消える

# 所感

### 良いと思った点

- UIが良くできているので、ほぼ迷わずにクラスタの構築・変更ができる。
- 値段もそこそこであり、MongoDBの構築の人件費を考えると、Atlasを使ったほうがお得な場合も多いだろう。
- Cloud Managerで管理されるので、監視・アラート・バックアップといった運用関連の機能が一緒ついてる来るのはうれしい。

### いまいちな点

#### インターネット経由でのアクセスになってしまう

せっかくAWSなのだから、自分のVPC内にMongoDBクラスタが立てられて、ローカルの高速な通信だけで利用できる形態になって欲しかった。インターネット経由だと、レイテンシや通信速度がボトルネックになりそう。選択したリージョン内にアプリがあればAWS内の通信で完結するから、まだましだが。

また、いくらSSLで暗号化しソースIPを絞っているからと言って、インターネット経由でDBにアクセスするのは、セキュリティ的に日本ではなかなか受け入れられにくいのではないだろうか。

#### サポートがない

公式ドキュメントには以下の様に書いてある

https://docs.atlas.mongodb.com/#support

> Support
> Atlas provides support for the use of the service itself. Support for development and > performance of the database itself requires a MongoDB subscription. 

訳すと「Atlas自身のサポートはするけど、開発、パフォーマンス、そしてデータベースそのもののサポートはMongoDBサブスクリプションが必要だ。」と書いてある。

結局クラスタ生成後に起きた問題は自分で解決しなければならい。AWSならば+10%ぐらいの料金でそれなりのサポートがついくるのに、MongoDBの場合は高い有償サブスクリプションを買わなければサポートが受けられない。注意が必要だ。