AWS DocumentDBのクラスタ構築からmongoコマンドで接続するまで
Amazon DocumentDBはインターフェースがMongoDBと互換性のあるJSON-likeなデータを保存できるデータベースです。AWS独自の実装で、MongoDBのマネージドサービスではありません。
この記事では、マネジメントコンソールでのDocumentDBのクラスタ構築と、EC2インスタンスからmongoコマンドで接続するまでを試します。
前提
手順
クラスタ構築
AWSのマネジメントコンソールでAmazon DocumentDBの画面を開きます。クラスタ一覧の画面になりますが、初めてクラスタ構築しようとしているのならば、クラスタは1つもありません。
右上の作成ボタンを押します。作成画面に移ります。
クラスタ識別子は適当に設定します。デフォルトの長い名前でもよいです。
インスタンス数は最小の1にします。
マスターユーザ名とマスターパスワードは適当に設定します。
ちなみにマスターユーザ名を「admin」にしたら以下のエラーが出ました。予約名があるようです。
MasterUsername admin cannot be used as it is a reserved word used by the engine
この作成画面の下の方の「詳細設定の表示」をクリックすると次の項目の設定ができます。DocumentDBを試すだけであれば、これら詳細設定のほとんどはデフォルトで大丈夫です。VPCセキュリティグループだけは適切な設定が必要です。同じVPC内のEC2インスタンスから接続を試す場合にはそのEC2インスタンスと通信できるようにセキュリティグループを設定する必要があります。
- ネットワーク設定
- クラスタオプション
- ポート番号
- デフォルトは27017
- クラスタパラメータグループ
- デフォルトから変えたい場合は、左のメニューの「パラメータグループ」から事前にパラメータグループを作成しておきます
- ポート番号
- 暗号化
- バックアップ
- 自動バックアップの保持期間
- バックアップウィンドウ(バックアップを取得する時間帯)
- ログのエクスポート(CloudWatch Logsへのエクスポート)
- 監査ログをエクスポートするかどうか
- プロファイラーのログをエクスポートするかどうか
- メンテナンス
- メンテナンスウィンドウ(アップデートや変更を実行する時間帯)
- タグ
- 削除保護
作成画面の右下の「クラスターの作成」を押すとクラスタの構築処理が始まります。
クラスタ一覧の画面に戻りますが、構築中はステータスが「creating」と表示されています。数分で構築が完了します。
クラスタ一覧画面から構築したクラスタを選択すると詳細情報の画面になります。エンドポイントなど接続に必要な情報が記載されています。
EC2インスタンスにmongoコマンドをインストール
EC2インスタンスからmongo
コマンドで接続するにはmongo
コマンドのインストールが必要です。
手元の Ubuntu 19.10 の環境では以下のコマンドでインストールできました。
$ sudo apt install -y mongodb-clients
EC2インスタンスに証明書を準備
mongo
コマンドで接続するにはAWSが用意した証明書のファイルをダウンロードしておく必要があるようです。
以下の公式ドキュメントはRDSのものですが、DocumentDBでも共通のようです。
SSL/TLS を使用した DB インスタンスへの接続の暗号化 - Amazon Relational Database Service
このドキュメントによると以下でダウンロードできます。
$ curl 'https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem' > ~/rds-combined-ca-bundle.pem
mongoコマンドで接続
ここまでの準備でEC2インスタンスからDocumentDBに接続できるようになりました。以下のコマンドで接続できます。クラスタの詳細画面に書かれている通りのコマンドです。ENDPOINT
はクラスタの詳細画面に表示されている値を入れてください。MASTER_USERNAME
とMASTER_PASSWORD
はクラスタ作成時に設定した値を入れてください。
$ mongo --ssl --host ENDPOINT:27017 --sslCAFile ~/rds-combined-ca-bundle.pem --username MASTER_USERNAME --password MASTER_PASSWORD
このmongo
コマンドでmongoシェルが起動します。
接続エラーの例
mongo
コマンドで以下のようなエラーが出る場合があります。セキュリティグループが不適切な場合でもこのエラーになります。
$ mongo --ssl --host ENDPOINT:27017 --sslCAFile ~/rds-combined-ca-bundle.pem --username MASTER_USERNAME --password MASTER_PASSWORD MongoDB shell version v3.6.8 connecting to: mongodb://ENDPOINT:27017/ 2020-06-10T01:12:16.668+0900 W NETWORK [thread1] Failed to connect to xxx.xxx.xxx.xxx:27017 after 5000ms milliseconds, giving up. 2020-06-10T01:12:16.668+0900 E QUERY [thread1] Error: couldn't connect to server ENDPOINT:27017, connection attempt failed : connect@src/mongo/shell/mongo.js:257:13 @(connect):1:6 exception: connect failed
このエラーの対応は以下の公式ドキュメントがわかりやすいです。
Amazon DocumentDB のトラブルシューティング - Amazon DocumentDB
mongoシェルでの実行例
rs0:PRIMARY> show dbs rs0:PRIMARY> show collections; rs0:PRIMARY> db.collection1.insert( ... { ... "name": "suzuki", ... "prefecture": "aichi" ... } ... ) WriteResult({ "nInserted" : 1 }) rs0:PRIMARY> show dbs test 0.000GB rs0:PRIMARY> show collections; collection1 rs0:PRIMARY> db.collection1.find({}).pretty() { "_id" : ObjectId("5edfbc30d29734485f336d5f"), "name" : "suzuki", "prefecture" : "aichi" }