mongolabでmongo shellからログインできない時の対処法

# はじめに
HerokuでmongolabのAdd-onsを入れたら、何やら自動生成されたアカウントとパスワードでログインできなかったので、その原因と対策などのメモ。

# mongolab追加
Herokuのプロジェクト内で

```shell-session
% heroku addons:add mongolab:sandbox
```

とすれば追加されます。この時点でDashboardのResourcesタブのところにMongoLabのリンクが追加されます。クリックするとMongoLabの管理コンソールへ。

```
To connect using the mongo shell:
  % mongo ********.mongolab.com:*****/heroku_******** -u <dbuser> -p <dbpassword>
To connect using a driver via the standard MongoDB URI (what's this?):
  mongodb://<dbuser>:<dbpassword>@********.mongolab.com:*****/heroku_********
```

こんな感じの案内が出てるんですが、まずdbpasswordがわかりません。dbuserはUsersタブを開くと書いてあるんですが。

で、パスワードの隠し場所はこちら。

```shell-session
% heroku config
=== chime Config Vars
MONGOLAB_URI: mongodb://<dbuser>:<dbpassword>@********.mongolab.com:*****/heroku_********
PATH:         bin:node_modules/.bin:/usr/local/bin:/usr/bin:/bin
```

自動生成されたアカウント情報はheroku configの中に自動で追加されています。

# 認証失敗
```shell-session
% mongo ********.mongolab.com:*****/heroku_******** -u <dbuser> -p <dbpassword>
MongoDB shell version: 2.6.4
connecting to: ********.mongolab.com:29804/heroku_********
2015-12-22T19:16:53.365+0000 Error: 18 { ok: 0.0, errmsg: "auth failed", code: 18 } at src/mongo/shell/db.js:1210
exception: login failed
```

でも、なぜか通らない。調べてみるとサーバ側が持ってるユーザのcredentialがSCRAM-SHA-1のみ。で、この認証方式をサポートしてるのが3.0以降だからmongo shell側も3.0以降にアップデートしないと認証できない模様。そしてmongolabの無料版ではバージョンが選べない。面倒くさっ。

# Docker使いましょう
使ってるLinuxではパッケージはまだ2.4.9か2.6.4だったので、Docker内にサーバと同じ3.0系をインストールすることにしました。どうせ最初の設定と気が向いた時のメンテくらいでしか使いませんし。

まずはどうでも良いDockerのインストールとUbuntu用イメージの取得手順。

```shell-session
% sudo apt-get install docker.io
(snip)
% sudo docker pull ubuntu:latest
(snip)
ubuntu:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:a2b67b6107aa640044c25a03b9e06e2a2d48c95be6ac17fb1a387e75eebafd7c
Status: Downloaded newer image for ubuntu:latest
```

先ほどダウンロードしたUbuntuベースで起動。

```shell-session
% sudo docker run -it --name mongo30 ubuntu:latest /bin/bash
```

mongodb-org-3.0をaptで入れるための面倒な設定など。

```shell-session
root@d7f6397b059c:/# sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9ECBEC467F0CEB10
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --homedir /tmp/tmp.XorMByVfqG --no-auto-check-trustdb --trust-model always --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv 9ECBEC467F0CEB10
gpg: requesting key 7F0CEB10 from hkp server keyserver.ubuntu.com
gpg: key 7F0CEB10: public key "Richard Kreuter <richard@10gen.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
root@d7f6397b059c:/# echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list
deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.0 multiverse
root@d7f6397b059c:/# sudo apt-get update
(snip)
Fetched 21.4 MB in 11s (1912 kB/s)                                             
Reading package lists... Done
root@d7f6397b059c:/# sudo apt-get install -y mongodb-org    
(snip)
invoke-rc.d: unknown initscript, /etc/init.d/mongod not found.
invoke-rc.d: policy-rc.d denied execution of start.
Setting up mongodb-org-mongos (3.0.8) ...
Setting up mongodb-org-tools (3.0.8) ...
Processing triggers for ureadahead (0.100.0-16) ...
Setting up mongodb-org (3.0.8) ...
root@d7f6397b059c:/# exit
```

自分はキー無しでapt-get updateしてエラーが出たので、このログでは最初にキーを足すように修正してあります。

あと、なにげに/etc/init.d/mongodがないとか言ってますが、今回はmongo shellの利用だけなので、華麗にスルーすることとします。

で、mongodb 3.0.8がインストールできたところでスナップショット。toyoshim/mongo:308として保存。これで、いつでもmongo 3.0.をがインストールした状態でコンテナを起動できます。

```shell-session
% sudo docker commit mongo30 toyoshim/mongo:308
% sudo docker rm mongo30
% sudo docker run -it --name mongo30 toyoshim/mongo:308 /bin/bash
root@d2760283f209:/# mongo ********.mongolab.com:*****/heroku_******** -u <dbuser> -p <dbpassword>
MongoDB shell version: 3.0.8
connecting to: ********.mongolab.com:*****/heroku_********
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
	http://docs.mongodb.org/
Questions? Try the support group
	http://groups.google.com/group/mongodb-user
rs-********:PRIMARY> 
```

通った。めでたし、めでたし。