Amazon DocumentDB に mongo-expressを使って接続できるか試してみた

記事タイトルとURLをコピーする

こんにちは! エンタープライズクラウド部技術2課の日高です。
もし私のことを少しでも知りたいと思っていただけるなら、私の後輩が書いてくれた以下のブログを覗いてみてください。

sabawaku.serverworks.co.jp

本日は、Amazon DocumentDB(今後はDocumentDB と表記) に mongo-expressを使って接続可否の検証結果について記載します。

はじめに

背景

普段、mongo-expressを使ってMongoDBを操作しているお客様から以下のようなお問い合わせをいただきました。

「MongoDBからDocumentDBに移行をしようと考えています。移行後、Amazon DocumentDBをMongoDBを使って操作することは可能ですか?」

このお問い合わせに回答すべく、公式ドキュメントを確認していると、MongoDB との互換性 | 特徴 - Amazon DocumentDB | AWSに下記の記載がありました。

MongoDB との互換性 Amazon DocumentDB は MongoDB 3.6、4.0、5.0 のドライバーとツールと互換性があります。現在お客様がオープンソースの MongoDB 非リレーショナルデータベースで使用しているほとんどのアプリケーション、ドライバー、ツールは、Amazon DocumentDB で使用できます。Amazon DocumentDB では、耐障害性が高く、自己修復機能を備えた、専用の分散型ストレージシステムで Apache 2.0 オープンソースの MongoDB 3.6、4.0 および 5.0 の API を実装することにより、クライアントが MongoDB サーバーに期待する応答をエミュレートします。これにより、お客様がミッションクリティカルな MongoDB ワークロードを大規模運用する際に必要となるパフォーマンス、スケーラビリティ、可用性を実現します。サポート対象の MongoDB API の詳細をご確認ください。

こちらを確認すると、MongoDB 3.6、4.0、5.0 にて利用しているツールであれば、DocumentDB でも利用可能と推測できます。
そのため実際にmongo-expressを使ってDocumentDBを操作できるか検証しました。

Amazon DocumentDBの概要

MongoDB と互換性のあるフルマネージドデータベースサービスになります。
MongoDB のフルマネージドサービスではなく、MongoDB と互換性のあるフルマネージドデータベースサービスという点にご留意ください。

Amazon DocumentDBは、現時点(2024/1/19)でMongoDB 3.6、4.0、5.0 API と互換性があります。

※1.サポートされている MongoDB API、オペレーション、およびデータ型については以下をご覧ください。

docs.aws.amazon.com

※2.MongoDBとの機能的な違いについては以下をご覧ください。

docs.aws.amazon.com

mongo-expressの概要

mongo-express /README.md抜粋

Mongo Expressは、MongoDB用のWebベースの管理インターフェースです。
これはNode.jsで書かれており、MongoDBインスタンスに対してGUIを提供することで、データベースの管理を容易にしてくれます。

しかし、以下の通りMongo Expressは本番環境での利用は推奨されていないので、使用する際は注意が必要です。

mongo-express should only be used privately for development purposes mongo-express/README.md-not-tested抜粋

結論

結論、Amazon EC2上にインストールしたmongo-expressからDocumentDBへの接続は可能でした。

検証環境からDocumentDB に接続した際の画面キャプチャ

次章の検証内容で、接続する手順についてはまとめていきます。

検証内容

1.前提

以下の構成図のようなVPCがすでにある前提とします。
※ルートテーブル等も問題なく設定されていると仮定します。

完成図としては以下になります。
mongo-expressをインストールしたEC2から DocumentDBに接続を試します。

2. セキュリティグループの作成

Amazon EC2のセキュリティグループの作成

RDPでの接続を許可するインバウンドルールを追加したセキュリティグループを作ります。
※検証環境なので「0.0.0.0/0」からのアクセスを許可していますが、本番環境等では通信元を絞るように設定してください。

Amazon DocumentDBのセキュリティグループの作成

ポート27017からの接続を許可したインバウンドルールを追加したセキュリティグループを作ります。
通信元は、先ほど作成したEC2のセキュリティグループIDを指定してください。

3.Amazon DocumentDBの作成

サブネットグループの作成

マネジメントコンソールからAmazon DocumentDB > サブネットグループ に遷移し、作成を選択してください。

Amazon DocumentDBを構築したいサブネットをサブネットグループで指定します。
私は以下のように指定しました。

パラメータグループの作成

マネジメントコンソールからAmazon DocumentDB > パラメータグループ に遷移し、作成を選択してください。
今回、Amazon DocumentDBのファミリーは、5.0で構築するのでファミリー5.0で指定します。

※デフォルトのパラメータグループだとパラメータを変更することができないため、今回カスタムパラメータグループを作成しています。

Amazon DocumentDBの作成

マネジメントコンソールからAmazon DocumentDB > クラスター に遷移し、作成を選択してください。

エンジンバージョンはパラメータグループで指定したものと同様の5.0を指定します。
デフォルトだとインスタンス数が「3」となっていましたが、今回は検証用途なのでコストを抑えたいため「1」に変更しました。

認証情報を指定し、「詳細設定の表示」を選択します。

先ほど作成したサブネットグループ、セキュリティグループ、パラメータグループを指定します。

その他はデフォルトで「クラスターの作成」を選択します。

パラメータグループのパラメータの変更

接続する際にTLSを考慮するのが面倒なので、パラメータグループのTLS設定を無効に変更します。(デフォルトでは有効です)
※本番環境ではTLSは有効にすることを推奨します。

4.Amaozn EC2の作成

EC2を作成していきます。
今回はWindowsのAMI(Windows_Server-2022-Japanese-Full-SQL_2022_Web-2023.09.13 ami-00c7c207183cac9d7)で構築していきたいと思います。

キーペア、ネットワーク設定を変更します。

上記以外はデフォルトのままインスタンスを起動します。

5. mongo-expressのインストール

Node.js / npmをインストール

EC2にRDP接続します。
mongo-expressはNode.jsの環境で動作するので、Node.js / npmをインストールします。

インストーラは以下のサイトからダウンロード可能です。

nodejs.org

インストーラーを実行します。

Nextをクリックします。

ライセンス規約へ同意しNextをクリックします。

インストールフォルダを選択しNextをクリックします。
私はデフォルトのフォルダにしました。

インストールするコンポーネントを選択しNextをクリックします。
私はデフォルトのまま進みました。

必要なツールを自動的にインストールするか尋ねられています。
私は、インストールするにチェックを入れて次へ進みました。

Installをクリックします。

インストール完了後に、powershellを開いて以下コマンドを実行し、Node.js / npm がインストールされているか確認します。

PS C:\Users\Administrator> node --version
v20.11.0

PS C:\Users\Administrator> npm --version
10.2.4

バージョンが表示されていればインストールは成功しています。

Vscodeをインストール

EC2上でテキスト等を編集するので、私はVscodeをインストールしました。
mongo-expressのインストールに必須のものではないので、お好みでインストールするかしないかお決めください。

※インストーラーのダウンロードは以下からできます。

code.visualstudio.com

mongo-expressのインストール

まず、フォルダ構造をわかりやすくしたいため、フォルダ(handson-mongo)を作成します。

PS C:\Users\Administrator> mkdir handson-mongo


    ディレクトリ: C:\Users\Administrator


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2024/01/19      4:13                handson-mongo

実際に作成されているかdirコマンドで確認します。

PS C:\Users\Administrator> dir


    ディレクトリ: C:\Users\Administrator


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-r---        2024/01/19      4:00                3D Objects
d-r---        2024/01/19      4:00                Contacts
d-r---        2024/01/19      4:00                Desktop
d-r---        2024/01/19      4:00                Documents
d-r---        2024/01/19      4:03                Downloads
d-r---        2024/01/19      4:00                Favorites
d-----        2024/01/19      4:13                handson-mongo
d-r---        2024/01/19      4:00                Links
d-r---        2024/01/19      4:00                Music
d-r---        2024/01/19      4:00                Pictures
d-r---        2024/01/19      4:00                Saved Games
d-r---        2024/01/19      4:00                Searches
d-r---        2024/01/19      4:00                Videos

先ほど作成したディレクトリに移動し、mongo-expressをインストールします。
※mongo-expressの違うバージョンで試したところ、mongo-expressをインストールすることができなかったので、今回はバージョン1.0.0をインストールしています。

PS C:\Users\Administrator> cd .\handson-mongo\
PS C:\Users\Administrator\handson-mongo> npm install mongo-express@1.0.0
npm WARN deprecated json2csv@3.11.5: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
npm WARN deprecated swig-templates@2.0.3: unmaintained

added 278 packages in 28s

17 packages are looking for funding
  run `npm fund` for details

dirコマンドでディレクトリ配下に何が作られているか、確認します。

PS C:\Users\Administrator\handson-mongo> dir


    ディレクトリ: C:\Users\Administrator\handson-mongo


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2024/01/19      4:19                node_modules
-a----        2024/01/19      4:19         125793 package-lock.json
-a----        2024/01/19      4:19             58 package.json

※詳しくは以下のGithubをご覧ください。

github.com

6.mongo-expressのconfig.jsの編集

mongo-expressはアプリケーション実行時に、設定ファイルである config.js を読み込みます。
そのため、config.js を作成し、必要な設定に書き換えていきます。

config.js の作成

カレントディレクトリから node_modules\mongo-express に移動します。

PS C:\Users\Administrator\handson-mongo> cd .\node_modules\mongo-express\
PS C:\Users\Administrator\handson-mongo\node_modules\mongo-express> dir


    ディレクトリ: C:\Users\Administrator\handson-mongo\node_modules\mongo-express


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2024/01/19      4:19                .bluemix
d-----        2024/01/19      4:19                .github
d-----        2024/01/19      4:19                build
d-----        2024/01/19      4:19                lib
d-----        2024/01/19      4:19                public
d-----        2024/01/19      4:19                test
-a----        2024/01/19      4:18            188 .cfignore
-a----        2024/01/19      4:19              5 .dockerignore
-a----        2024/01/19      4:19             38 .eslintignore
-a----        2024/01/19      4:19           1374 .eslintrc.js
-a----        2024/01/19      4:19             19 .gitattributes
-a----        2024/01/19      4:19             89 .mocharc.js
-a----        2024/01/19      4:19           4482 app.js
-a----        2024/01/19      4:19           3111 build-assets.json
-a----        2024/01/19      4:19           8640 config.default.js
-a----        2024/01/19      4:19           1894 Dockerfile
-a----        2024/01/19      4:19          15105 HISTORY.md
-a----        2024/01/19      4:19            203 manifest.yml
-a----        2024/01/19      4:19           2780 package.json
-a----        2024/01/19      4:19          14965 README.md
-a----        2024/01/19      4:19           2925 webpack.config.js

mongo-expressディレクトリ(YOUR_PATH/node_modules/mongo-express)には、デフォルトの設定ファイルであるconfig.default.js(YOUR_PATH/node_modules/mongo-express/config.default.js)があるので、コピーしてconfig.js(YOUR_PATH/node_modules/mongo-express/config.js) を作成します。

PS C:\Users\Administrator\handson-mongo\node_modules\mongo-express> cp config.default.js config.js
PS C:\Users\Administrator\handson-mongo\node_modules\mongo-express> dir


    ディレクトリ: C:\Users\Administrator\handson-mongo\node_modules\mongo-express


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2024/01/19      4:19                .bluemix
d-----        2024/01/19      4:19                .github
d-----        2024/01/19      4:19                build
d-----        2024/01/19      4:19                lib
d-----        2024/01/19      4:19                public
d-----        2024/01/19      4:19                test
-a----        2024/01/19      4:18            188 .cfignore
-a----        2024/01/19      4:19              5 .dockerignore
-a----        2024/01/19      4:19             38 .eslintignore
-a----        2024/01/19      4:19           1374 .eslintrc.js
-a----        2024/01/19      4:19             19 .gitattributes
-a----        2024/01/19      4:19             89 .mocharc.js
-a----        2024/01/19      4:19           4482 app.js
-a----        2024/01/19      4:19           3111 build-assets.json
-a----        2024/01/19      4:19           8640 config.default.js
-a----        2024/01/19      4:19           8640 config.js
-a----        2024/01/19      4:19           1894 Dockerfile
-a----        2024/01/19      4:19          15105 HISTORY.md
-a----        2024/01/19      4:19            203 manifest.yml
-a----        2024/01/19      4:19           2780 package.json
-a----        2024/01/19      4:19          14965 README.md
-a----        2024/01/19      4:19           2925 webpack.config.js

config.js の編集

テキストエディタでconfig.js を開きます。(私はVscodeで開いています。)

データベースの接続情報の箇所を編集します。

host名は、DocumentDB>クラスター>作成したクラスター名(docdb-handson)>設定> クラスターのエンドポイントになります。

portとdbnameは、デフォルトのままで問題ないです。

usernameとpasswordを追記します。
ここで指定するのは、Document DB作成時に指定した認証情報(ユーザー名とパスワード)になります。

上記の編集を加えるとl et mongo の箇所は 下記のようなコードになります。<~>箇所は各自書き換えてください。

let mongo = {
  // Setting the connection string will only give access to that database
  // to see more databases you need to set mongodb.admin to true or add databases to the mongodb.auth list
  // It is RECOMMENDED to use connectionString instead of individual params, other options will be removed later.
  // More info here: https://docs.mongodb.com/manual/reference/connection-string/
  connectionString: process.env.ME_CONFIG_MONGODB_SERVER ? '' : process.env.ME_CONFIG_MONGODB_URL,
  host: '<Document DBのクラスターのエンドポイント>',
  port: '27017',
  dbName: '',
  username: '<Document DB作成時に指定したユーザー名>',
  password: '<Document DB作成時に指定したパスワード>',
};

また、基本アクセス認証がデフォルトのままだと危険なので、basuicAuthの箇所も書き換えます。

  basicAuth: {
    username: getFileEnv(basicAuthUsername) || '<ご自身で書き換えてください>',
    password: getFileEnv(basicAuthPassword) || '<ご自身で書き換えてください>',
  },

これで準備が完了したのでファイルを保存してください。
次の章で、mongo-expressでAmazon DocumentDBへ接続しましょう。

7.mongo-expressを用いたAmazon DocumentDBへの接続

mongo-expressディレクトリ(YOUR_PATH/node_modules/mongo-express)で、node appコマンドでアプリーションを実行させます。

PS C:\Users\Administrator\handson-mongo\node_modules\mongo-express> node app
Welcome to mongo-express
------------------------


Mongo Express server listening at http://localhost:8081

すると上記のような実行結果になります。
http://localhost:8081にアクセスしましょう。

すると認証が求められます。
6章の 「config.js の編集」で指定したbasuicAuthの値を記載します。

すると、Mongo Expressの画面が表示されました。
シェル画面にはアクセスログが表示されます。

まとめ

まとめてみると比較的シンプルですが、実際はかなりのトラブルシューティングをしていました(笑)
本記事が誰かの助けになれば幸いです。

日高 僚太(執筆記事の一覧)

EC部ソリューションアーキテクト2課 / AWS認定資格 12冠

2022年IT未経験で新卒入社しました。
最近はダーツとサウナが気になっています!
記事に関するお問い合わせや修正依頼⇒ hidaka@serverworks.co.jp