Amazon DocumentDB のコンソール画面からたどり着けるハンズオンコンテンツのご紹介とコマンドの最新版

ハンズオンコンテンツはそのままでは実行できなかったり、警告が出る部分などがありますので、本ブログに記載のコマンドを参考にしてください。
2024.03.31

コーヒーが好きな emi です。

DocumentDB について学習コンテンツを探していましたところ、マネジメントコンソールから DocumentDB のハンズオンコンテンツにたどり着けることに気づきました。ハンズオンコンテンツをそのまま実行するといくつかバージョンの関係でうまくいかないところがありましたので、補足を交えつつご紹介します。

構成図

ハンズオンを実施すると以下のような構成で DocumentDB を構築できます。Cloud9 から DocumentDB に接続してクエリをいくつか実行します。

ハンズオンコンテンツの場所

ハンズオンコンテンツは DocumentDB コンソールの左ナビゲーションペインの下部からたどり着けます。動画やブログへのリンクもありますが、今回は「セルフサービストレーニング」タブを開き、「Amazon DocumentDB (MongoDB 互換) の使用を開始する」を選択していただくと、AWS Skill Builder(以降「スキルビルダー」と記載)のコンテンツに飛び、ハンズオンを実施することができます。

AWS Skill Builder へのログインとハンズオン開始

「Amazon DocumentDB (MongoDB 互換) の使用を開始する」をクリックすると、以下のスキルビルダー画面に遷移します。このままだと英語なので、「日本語」をクリックしてください。

日本語でハンズオンを実施することができます。「ENROLL」をクリックします。

ハンズオンコンテンツはスキルビルダーで提供されていますので、AWS スキルビルダー ID でのログインが必要です。「SIGN IN TO AWS SKILL BUILDER」をクリックします。

AWS スキルビルダー ID でログインします。AWS スキルビルダー ID が無い方は無料で作成できますので、お手数ですが作成をお願いします。私は作成済みでしたので、そのままサインインしました。

サインインできたら、「ENROLL」を続行します。「START LEARNING NOW」をクリックすると、コンテンツが開始されます。

このような画面で学習を開始できます。

日本語のコースを選ぶと、字幕ではなく、分かりやすい日本語解説の動画を視聴できます。

概要

以下のようなアジェンダで学習をすすめます。

  • このコースの利用方法
  • Amazon DocumentDB の基礎
  • アーキテクチャとユースケース
  • AMAZON DOCUMENTDB の使用
    • Amazon DocumentDB クラスターの作成
    • Amazon DocumentDB でのデータの挿入とクエリ
    • Amazon DocumentDB で AWS CLI を使用する
    • プログラミング言語を使用して Amazon DocumentDB に接続する
    • その他のリソース

座学部分、動画部分があります。DocumentDB の概要やユースケースを学んだあと、実際に DocumentDB クラスターを作成する手順が動画で提供されます。

既存のハンズオンコンテンツでの注意点

2024/3/30 現在、以下のような注意点がありました。

  • Cloud9 をスキルビルダーの手順で作成するとプラットフォームが Amazon Linux 2023 になります。
  • DocumentDB に接続するためにインストールする mongo shell がスキルビルダーで案内されているバージョンだと Amazon Linux 2023 に対応していません。
    • スキルビルダーで提供されているコマンドは MongoDB 4.0 バージョンという、2024/3/30 現在では古いものとなっています。
  • Cloud9 から DocumentDB への接続を TLS 暗号化するための証明書バンドルが古いものとなっています。
  • AWS CLI を使用した DocumentDB の作成の部分で提供されるコマンドでは削除保護が有効になります。

そのまま動画の手順に従っていたところ、ハンズオンで少し躓いた部分がありました。以下に最新版のコマンドや補足を記載していきます。

最新版コマンド

まずは動画の手順に従って DocumentDB クラスターを作成しましょう。docdb-yyyy-mm-dd-hh-mm-ss という名前のクラスターができます。

リポジトリファイルの作成

以降のコマンドはハンズオンで作成した Cloud9(Amazon Linux 2023)で実行します。

以下のコマンドで yum リポジトリの設定をシステムに追加します。

リポジトリ情報を /etc/yum.repos.d/mongodb-org-7.0.repo ファイルに書き込みます。

echo -e "[mongodb-org-7.0]\nname=MongoDB Repository\nbaseurl=https://repo.mongodb.org/yum/amazon/2023/mongodb-org/7.0/x86_64/\ngpgcheck=1\nenabled=1\ngpgkey=https://pgp.mongodb.com/server-7.0.asc" | sudo tee /etc/yum.repos.d/mongodb-org-7.0.repo

▼実行結果例

EmiKitani:~/environment $ echo -e "[mongodb-org-7.0]\nname=MongoDB Repository\nbaseurl=https://repo.mongodb.org/yum/amazon/2023/mongodb-org/7.0/x86_64/\ngpgcheck=1\nenabled=1\ngpgkey=https://pgp.mongodb.com/server-7.0.asc" | sudo tee /etc/yum.repos.d/mongodb-org-7.0.repo
[mongodb-org-7.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/amazon/2023/mongodb-org/7.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://pgp.mongodb.com/server-7.0.asc
EmiKitani:~/environment $

上記コマンドでは MongoDB のバージョン 7.0 相当をインストールするためのリポジトリを Amazon Linux のパッケージマネージャ(yum)の設定に追加しています。

追記:2023/3/30 時点で DocumentDB はまだ Mongo7.0 をサポートしておりませんでした。本記事で案内するコマンドは稼働確認を取っておりますが、手順は参考としてみて下さい。

  • echo コマンドを使用して MongoDB 7.0 の yum リポジトリ設定をテキストとして生成しています。この設定にはリポジトリの名前、基本 URL、GPG キーの URL などが含まれます。
  • -e オプションは、echo が特殊文字(今回は改行文字 \n)を解釈するように設定します。
  • tee コマンドは標準入力から受け取った内容をファイル(今回は /etc/yum.repos.d/mongodb-org-7.0.repo)に書き出し、また標準出力にも出力します。

このコマンドを実行することで、MongoDB のリポジトリ情報が /etc/yum.repos.d/mongodb-org-7.0.repo ファイルに保存され、yum パッケージマネージャーがこのリポジトリを使用して MongoDB パッケージをインストールできるようになります。

/etc/yum.repos.d/mongodb-org-7.0.repo に MongoDB のリポジトリ情報が保存できたか確認します。

cat /etc/yum.repos.d/mongodb-org-7.0.repo

▼実行結果例

EmiKitani:~/environment $ cat /etc/yum.repos.d/mongodb-org-7.0.repo
[mongodb-org-7.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/amazon/2023/mongodb-org/7.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://pgp.mongodb.com/server-7.0.asc
EmiKitani:~/environment $

保存されていますね。

では、yum のリポジトリ情報を更新します。

sudo yum update

▼実行結果例

EmiKitani:~/environment $ sudo yum update
Amazon Linux 2023 repository                                                                                                                                48 MB/s |  26 MB     00:00    
Amazon Linux 2023 Kernel Livepatch repository                                                                                                              648 kB/s | 165 kB     00:00    
MongoDB Repository                                                                                                                                          32 kB/s |  26 kB     00:00    
Dependencies resolved.
Nothing to do.
Complete!
EmiKitani:~/environment $
リポジトリに関する補足(クリックで展開)
  • リポジトリとは
    • リポジトリは、ソフトウェアパッケージとそれに関連するメタデータを保存するための中央の保管場所です。
    • メタデータには、パッケージの名前、バージョン、依存関係などの情報が含まれます。
    • 各リポジトリは一意の名前で識別されます(例:mongodb-org-7.0)。
  • リポジトリ情報の設定
    • リポジトリ情報は、/etc/yum.repos.d/ ディレクトリ内の .repo ファイルに保存されます。
    • .repo ファイルには、リポジトリの名前、URL、GPG キーなどの情報が含まれます。
    • yum はこれらの .repo ファイルを読み込んで、利用可能なリポジトリとそれらが提供するパッケージを認識します。
  • パッケージのインストール
    • yum install コマンドを実行すると、yum は設定されたリポジトリを検索して、指定されたパッケージを探します。
    • リポジトリ内のメタデータを参照して、パッケージの依存関係を解決し、適切な順序でパッケージをダウンロードしてインストールします。
    • MongoDB の場合、デフォルトの Amazon Linux 2023 のリポジトリには MongoDB パッケージが含まれていません。そのため、MongoDB の公式リポジトリ情報を手動で追加する必要があります。

/etc/yum.repos.d/mongodb-org-7.0.repo ファイルを作成し、そこに MongoDB 7.0 のリポジトリ情報を書き込むことで yum が MongoDB の公式リポジトリを認識できるようになります。

では、次のコマンドで mongosh を使うための mongodb-mongosh-shared-openssl3 パッケージをインストールします。

sudo yum install -y mongodb-mongosh-shared-openssl3
実行結果例(クリックで展開)
EmiKitani:~/environment $ sudo yum install -y mongodb-mongosh-shared-openssl3
Last metadata expiration check: 0:00:33 ago on Thu Mar 28 20:43:26 2024.
Dependencies resolved.
==========================================================================================================================================================================================================================================
 Package                                                                 Architecture                                   Version                                             Repository                                               Size
==========================================================================================================================================================================================================================================
Installing:
 mongodb-mongosh-shared-openssl3                                         x86_64                                         2.2.2-1.el8                                         mongodb-org-7.0                                          52 M

Transaction Summary
==========================================================================================================================================================================================================================================
Install  1 Package

Total download size: 52 M
Installed size: 206 M
Downloading Packages:
mongodb-mongosh-shared-openssl3-2.2.2.x86_64.rpm                                                                                                                                                           12 MB/s |  52 MB     00:04    
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                                                                      12 MB/s |  52 MB     00:04     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                                                                                                                                  1/1 
  Installing       : mongodb-mongosh-shared-openssl3-2.2.2-1.el8.x86_64                                                                                                                                                               1/1 
  Running scriptlet: mongodb-mongosh-shared-openssl3-2.2.2-1.el8.x86_64                                                                                                                                                               1/1 
  Verifying        : mongodb-mongosh-shared-openssl3-2.2.2-1.el8.x86_64                                                                                                                                                               1/1 

Installed:
  mongodb-mongosh-shared-openssl3-2.2.2-1.el8.x86_64                                                                                                                                                                                      

Complete!
EmiKitani:~/environment $ 

バージョン確認
mongosh --version
▼実行結果
EmiKitani:~/environment $ mongosh --version
2.2.2
EmiKitani:~/environment $

証明書バンドルをダウンロードして転送中のデータを暗号化する

Cloud9 と DocumentDB 間の通信を SSL/TLS で暗号化するには証明書バンドルが必要です。証明書バンドルとは、一つまたは複数の証明書が含まれるファイルのことを指します。これにはルート証明書、中間証明書、エンドユーザー証明書などが含まれます。

ハンズオンコンテンツで提供されるコマンドでは、証明書バンドルの古いバージョンがダウンロードされます。代わりに以下のコマンドで新しいものをダウンロードしてください。(このコマンドは DocumentDB コンソールのクラスターの詳細からも確認できます。)

wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem

▼実行結果例

EmiKitani:~/environment $ wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
--2024-03-28 05:42:22--  https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
Resolving truststore.pki.rds.amazonaws.com (truststore.pki.rds.amazonaws.com)... 18.172.185.20, 18.172.185.113, 18.172.185.95, ...
Connecting to truststore.pki.rds.amazonaws.com (truststore.pki.rds.amazonaws.com)|18.172.185.20|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 183356 (179K) [application/octet-stream]
Saving to: ‘global-bundle.pem’

global-bundle.pem                              100%[===================================================================================================>] 179.06K   585KB/s    in 0.3s    

2024-03-28 05:42:23 (585 KB/s) - ‘global-bundle.pem’ saved [183356/183356]

EmiKitani:~/environment $

global-bundle.pem ファイルはセキュアな SSL/TLS 接続を確立するためにクライアント側で必要とされる CA(認証局)証明書のコレクションを提供します。DocumentDB とセキュアに通信するためにはサーバーの証明書をクライアントが信頼する必要があります。サーバー証明書の信頼を確立するために、Cloud9 が Amazon が発行したルート証明書を事前に知っておく必要があります。これにより中間者攻撃に対する保護が強化されます。

DocumentDB へ接続

ここまで準備してきた mongosh のバージョンでは、マネジメントコンソール上で確認できる mongo コマンドはそのまま使うことができません。

代わりに以下の mongosh コマンドを使用してください。<クラスターのエンドポイント> は作成した DocumentDB のものをコピーして入力してください。

mongosh --tls --host <クラスターのエンドポイント>:27017 --tlsCAFile global-bundle.pem  --retryWrites=false --username DocDBAdmin

▼実行結果例(パスワードを入力)

EmiKitani:~/environment $ mongosh --tls --host docdb-2024-03-28-02-20-25.cluster-cxkg0swix4f0.ap-northeast-1.docdb.amazonaws.com:27017 --tlsCAFile global-bundle.pem  --retryWrites=false --username DocDBAdmin
Enter password: ***************
Current Mongosh Log ID: 6605d7335689bca78a1852b6
Connecting to:          mongodb://<credentials>@docdb-2024-03-28-02-20-25.cluster-cxkg0swix4f0.ap-northeast-1.docdb.amazonaws.com:27017/?directConnection=true&tls=true&tlsCAFile=global-bundle.pem&retryWrites=false&appName=mongosh+2.2.2
Using MongoDB:          5.0.0
Using Mongosh:          2.2.2

For mongosh info see: https://docs.mongodb.com/mongodb-shell/


To help improve our products, anonymous usage data is collected and sent to MongoDB periodically (https://www.mongodb.com/legal/privacy-policy).
You can opt-out by running the disableTelemetry() command.

------
   Warning: Non-Genuine MongoDB Detected
   This server or service appears to be an emulation of MongoDB rather than an official MongoDB product.
   Some documented MongoDB features may work differently, be entirely missing or incomplete, or have unexpected performance characteristics.
   To learn more please visit: https://dochub.mongodb.org/core/non-genuine-mongodb-server-warning.
------

rs0 [direct: primary] test>

Cloud9 から DocumentDB に繋がりました!

warning は、今接続した DocumentDB が MongoDB 製品ではなく MongoDB のエミュレーション(模倣)製品であることを示すものです。DocumentDB は MongoDB と互換性がありますが、一部機能に違いがあります。詳細は warning に表示されている URL Connect to a Deployment — MongoDB Shell にも記載がありますし、機能的な違い : Amazon DocumentDB と MongoDB - Amazon DocumentDB にも記載されていますので参照してください。

  • rs0:ユーザーが接続しているレプリカセットの名前です。
    • MongoDB ではデータの高可用性と耐障害性を提供するためにレプリカセットが使用されます。MongoDB の世界では「レプリカセット」と呼ばれる概念が、DocumentDBでは「DocumentDB クラスター」と呼ばれています。
    • MongoDB におけるレプリカセットは、複数の MongoDB インスタンス(ノード)で構成され、1 つのプライマリノードと複数のセカンダリノードを持ちます。プライマリノードが書き込み操作を受け付け、セカンダリノードがプライマリノードからデータを複製します。
    • DocumentDB では同様の構成を DocumentDB クラスターによって実現しています。DocumentDB クラスターは 1 つのプライマリインスタンスと 1 つ以上のレプリカインスタンスで構成されます。
  • [direct: primary]:ユーザーが直接レプリカセットのプライマリノードに接続していることを示しています。
    • DocumentDB クラスター(レプリカセット)では、プライマリノードがデータの書き込みを受け持ち、セカンダリノードはプライマリノードからのデータの複製(レプリケーション)を受けます。この表示は現在の操作がプライマリノード上で実行されていることを意味します。
  • test:現在選択されているデータベースの名前です。

バージョンを確認してみましょう。

rs0 [direct: primary] test> version()
2.2.2
rs0 [direct: primary] test>

また、デフォルトだと「test」という名前のデータベースが一つあるようです。

rs0 [direct: primary] test> show databases
test  64.00 KiB
rs0 [direct: primary] test>

スキルビルダーで案内されている「単一のドキュメントを挿入する」コマンドを実行してみます。

db.collection.insert({"hello":"DocumentDB"})

▼実行結果

rs0 [direct: primary] test> db.collection.insert({"hello":"DocumentDB"})
DeprecationWarning: Collection.insert() is deprecated. Use insertOne, insertMany, or bulkWrite.
{
  acknowledged: true,
  insertedIds: { '0': ObjectId('6605d7a25689bca78a1852b7') }
}
rs0 [direct: primary] test>

DeprecationWarning という警告が出ます。これは、db.collection.insert メソッドが非推奨(deprecated)であることを警告しています。実際にはエラーではなく挿入操作は成功しています。
警告メッセージには、代わりに insertOneinsertManybulkWrite の使用が推奨されています。

  • acknowledged:操作がデータベースによって認識され、成功したことを意味します。
  • insertedIds:挿入されたドキュメントの ID です。1 つのドキュメントが挿入され、その ObjectId が表示されています。

では、推奨されているコマンドでもう一度ドキュメントの挿入をやってみたいと思います。まず、今挿入したドキュメントを削除します。

db.collection.deleteOne({_id: ObjectId('6605d7a25689bca78a1852b7')})

▼実行結果

rs0 [direct: primary] test> db.collection.deleteOne({_id: ObjectId('6605d7a25689bca78a1852b7')})
{ acknowledged: true, deletedCount: 1 }
rs0 [direct: primary] test>

もう一度ドキュメントの挿入をします。

db.collection.insertOne({"hello":"DocumentDB"})

▼実行結果

rs0 [direct: primary] test> db.collection.insertOne({"hello":"DocumentDB"})
{
  acknowledged: true,
  insertedId: ObjectId('6605d9105689bca78a1852b8')
}
rs0 [direct: primary] test>

成功しました。これは collection という名前のコレクションに {"hello":"DocumentDB"} という内容のドキュメントを 1 つ挿入した、ということです。

追加したレコードを表示します。

db.collection.findOne()

▼実行結果

rs0 [direct: primary] test> db.collection.findOne()
{ _id: ObjectId('6605d9105689bca78a1852b8'), hello: 'DocumentDB' }
rs0 [direct: primary] test>

うまくいきました!

「複数のレコードを入力する (MongoDB シェル)」以降のコマンドは、スキルビルダーに記載のコマンドがそのまま利用できます。

AWS CLI を使用した DocumentDB の作成部分で注意すること

動画と一部コマンドが異なっており、提供されているコマンドを実行すると以下のようになります。

  • DocumentDB がデフォルト VPC のパブリックサブネットに作成されます。
  • クラスターパラメーターグループもデフォルトのものが使用されます。
  • 削除保護が有効になります。

こちらは接続試行せずすぐに削除しますので特に VPC が異なる点は問題ありませんが、削除する前に削除保護を無効にする点だけ留意してください。

削除するクラスターの詳細を開き、「変更」をクリックします。

削除保護のチェックを外し、「続行」をクリックします。

「すぐに適用」を選択し、「クラスターの変更」をクリックします。

以上の操作で削除保護を外しました。あとはクラスターの詳細からクラスターの削除を実施してください。

おわりに

Amazon DocumentDB のコンソール画面からたどり着けるハンズオンコンテンツとコマンドの最新版をご紹介しました。ご紹介した内容は 2024/3/30 時点の情報です。後ほど更新される可能性がありますので、最新のドキュメントを確認するようにしてください。どなたかのお役に立てば幸いです。

参考