mLab から MongoDB Atlas への移行

下記の手順に沿って進める。

https://docs.mlab.com/how-to-migrate-sandbox-databases-to-atlas/

pymongo をバージョンアップ

下記でバージョンを確認すると 3.2.2 だった。

$ python
>>> import pymongo
>>> pymongo.version

下記表の3.6以上が必要らしいのでバージョンアップする。

https://docs.mongodb.com/drivers/pymongo#mongodb-compatibility

python -m pip install --upgrade pymongo

3.11が入った。

Atlasアカウント作成

Organization と Project Name は後から変えたりできるようなのでそのまま。

GCP の Tokyo リージョンにした。が、移行ウィザードで自動的にmLabに近いリージョンが選択されるので関係ないかも。

AtlasアカウントとmLabアカウントを紐付け

手順に従うと簡単にできた。

マイグレーション

データベースの一覧が表示されているので、必要なものをマイグレーション。

が、1週間以内に mLab Data API を利用した履歴があったため、下記の警告が出て先に進めず。

The source mLab account has used the mLab Data API within the last 7 days. You must move to a self-hosted mLab Data API before migrating to Atlas. If you moved to a self-hosted mLab Data API in the last 7 days or are not using the mLab Data API with this particular deployment, ds023000/xxxxx, please email support@mlab.com for approval to continue the migration process. Learn how to self-host the mLab Data API

mLab Data APIをHerokuでデプロイ

メッセージに書かれていたリンク先の手順で特につまることもなくデプロイできた

https://docs.mlab.com/how-to-self-host-the-mlab-data-api/

しかしAtlasに移行した後はどうするのだろう?mLabに特化したDockerイメージな気がしたが。よく見ると、途中で設定した環境変数にMongoDBのURLを指定しているため、ここを変えれば良さそう。

APIを利用しているアプリ側の参照先URLも修正したので、一週間に移行できるかみてみよう。

(2020.11.21) 接続テスト

今週試したところ、mLab Data API に関する注意書きが表示されるものの、次へ進めるようになった。

テスト移行してから接続テストする。接続テストにはまず mongo shell を使えとのこと。いきなりアプリでやってもいいかなと思ったが、手順に従う。

ローカルで mongo コマンドを打つとインストールされておらず。Homebrew でインストールした。

https://github.com/mongodb/homebrew-brew#installing-only-the-shell-or-the-database-tools

mongo "mongodb+srv://[Atlas cluster's connection string に表示された文字列]"

下記のエラーが。

Error while trying to show server startup warnings: user is not allowed to do action [getLog] on [admin.]

と思ったが、ちゃんと接続できていた様子。show collections すると結果が返ってきた。

https://docs.mlab.com/troubleshooting-atlas-connection-issues/#getlog-error

db.mycollection.findOne() を実行するとエラーなく null が返ってきたのでOK。

アプリの接続先URLを変えると下記のエラー。

pymongo.errors.ConfigurationError: The "dnspython" module must be installed to use mongodb+srv:// URIs

とりあえずインストール。

pip install dnspython

次はSSLのエラー。

ServerSelectionTimeoutError: SSL handshake failed: ***.mongodb.net:27017: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:581)

mongodb:// の旧フォーマットでも同じエラー。うーん、python2.7.9 とか使っているのでダメなのか?pyOpenSSL のバージョンを変えればいけるのか?

https://pymongo.readthedocs.io/en/stable/examples/tls.html

これを見る限りでは pymongo 3.11 ならいけそうな気がするのだが…。

下記のコマンドで Python にバインドされた openssl のバージョンを確認。

$ python -c "import ssl; print(ssl.OPENSSL_VERSION)"
>> OpenSSL 0.9.8zh 14 Jan 2016

やっぱり古い。

次はどこの Python を見ているかを確認。Mac デフォルトの Python や Homebrew で入れたものや pyenv で入れたものがあり、いつもぱっとわからないのがストレス。which python すると pyenv のものだった。

https://stackoverflow.com/a/46808948

この手順によると Homebrew で openssl をバージョンアップしてから Python をインストールすれば良いみたいだが、pyenv でもいけるのか?brew list すると、openssl@1.1 なども入っており以前にも対応したような雰囲気。とりあえず pyenv で最新の 2.7 系をインストールしてみる。

pyenv install 2.7.17
pyenv local 2.7.17
python -c "import ssl; print(ssl.OPENSSL_VERSION)"

→ OpenSSL 1.1.1f  31 Mar 2020

おお、新しくなった!それではこの Python を使って仮想環境を作ってみよう。

pyenv virtualenv 2.7.17 scrapy1.8
pyenv local scrapy1.8
pip install scrapy==1.8.0
pip install pymongo
pip install dnspython
pip install pytz

ついにエラーなくアクセスできるようになった!!

コメントを残す