AWS DocumentDBのクラスタ構築からmongoコマンドで接続するまで

Amazon DocumentDBはインターフェースがMongoDBと互換性のあるJSON-likeなデータを保存できるデータベースです。AWS独自の実装で、MongoDBのマネージドサービスではありません。

この記事では、マネジメントコンソールでのDocumentDBのクラスタ構築と、EC2インスタンスからmongoコマンドで接続するまでを試します。

前提

  • AWSアカウントがある
  • DocumentDBクラスタを構築するVPC内にEC2インスタンスがすでにあり、そのEC2からDocumentDBに接続予定
  • AWSのマネジメントコンソールでオペレーション

手順

クラスタ構築

AWSのマネジメントコンソールでAmazon DocumentDBの画面を開きます。クラスタ一覧の画面になりますが、初めてクラスタ構築しようとしているのならば、クラスタは1つもありません。

f:id:suzuki-navi:20200613130828p:plain

右上の作成ボタンを押します。作成画面に移ります。

f:id:suzuki-navi:20200613130848p:plain

クラスタ識別子は適当に設定します。デフォルトの長い名前でもよいです。

インスタンス数は最小の1にします。

マスターユーザ名とマスターパスワードは適当に設定します。

ちなみにマスターユーザ名を「admin」にしたら以下のエラーが出ました。予約名があるようです。

MasterUsername admin cannot be used as it is a reserved word used by the engine

この作成画面の下の方の「詳細設定の表示」をクリックすると次の項目の設定ができます。DocumentDBを試すだけであれば、これら詳細設定のほとんどはデフォルトで大丈夫です。VPCセキュリティグループだけは適切な設定が必要です。同じVPC内のEC2インスタンスから接続を試す場合にはそのEC2インスタンスと通信できるようにセキュリティグループを設定する必要があります。

  • ネットワーク設定
    • VPC
    • サブネットグループ
      • デフォルトから変えたい場合は、左のメニューの「サブネットグループ」から事前にサブネットグループを作成しておきます
    • VPCセキュリティグループ
      • 適切な設定が必要
  • クラスタオプション
    • ポート番号
      • デフォルトは27017
      • クラスタパラメータグループ
        • デフォルトから変えたい場合は、左のメニューの「パラメータグループ」から事前にパラメータグループを作成しておきます
  • 暗号化
  • バックアップ
    • 自動バックアップの保持期間
    • バックアップウィンドウ(バックアップを取得する時間帯)
  • ログのエクスポート(CloudWatch Logsへのエクスポート)
    • 監査ログをエクスポートするかどうか
    • プロファイラーのログをエクスポートするかどうか
  • メンテナンス
    • メンテナンスウィンドウ(アップデートや変更を実行する時間帯)
  • タグ
  • 削除保護

作成画面の右下の「クラスターの作成」を押すとクラスタの構築処理が始まります。

クラスタ一覧の画面に戻りますが、構築中はステータスが「creating」と表示されています。数分で構築が完了します。

クラスタ一覧画面から構築したクラスタを選択すると詳細情報の画面になります。エンドポイントなど接続に必要な情報が記載されています。

f:id:suzuki-navi:20200613130919p:plain

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_USERNAMEMASTER_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"
}