[AWS] DocumentDB（MongoDB互換）へ踏み台サーバ経由で接続してみた

# １．はじめに
皆さんDocumentDBはご存知でしょうか？MongoDBとAPIレベルで互換性があるAWSのデータベースサービスで、DocumentDBを使えばバックアップや冗長化などめんどくさい部分をAWSにまるっと任せることができるので管理が非常に楽になります。
DocumentDB（≒MongoDB）内のデータをメンテナンスする際にはRobo 3TなどのGUIツールを使いたいところですが、DocumentDBをPrivateサブネットに配置すると少々ややこしい設定が必要になるため、今回はその具体的な設定方法について記載していきたいと思います。


# ２．今回の構成図
やり方は色々あると思いますが、今回は踏み台サーバを使ってみました。以下の図の通り、DocumentDBはプライベートサブネットに配置し、クライアントPCのRobo 3Tから踏み台サーバ経由で接続する形になります。（SSHトンネル経由で接続）
![構成図_文字大.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/4896c0db-8c61-8adc-d559-8db3c370cea7.png)




# ３．AWSネットワークの設定方法
まずはサブネットやセキュリティグループ等、ネットワーク周りの設定方法について記載しています。

## ３－１．サブネット作成
DocumentDBを配置するPrivateサブネットを新たに作成します。今回はVPCとpublicサブネットはデフォルトのものを使う前提です。マルチAZ構成とするため、PrivateサブネットはAZを変えて２つ切ります。CIDRは何でもいいですが、ここでは 172.31.128.0/24、172.31.129.0/24 としました。
サブネット作成時の画面はこんな感じです。
![【完成版】3-1-1サブネット作成_網掛けあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/c3696a2d-7ca5-84ca-ff99-841d99bcbed9.png)


## ３－２．ルートテーブルの作成とサブネットへの割り当て
上記で作成したPrivateサブネット用のルートテーブルを作成します。作成時の画面はこんな感じ。ルーティングの設定内容はデフォルトのままでOKです。
![【完成版】3-1-2ルートテーブル作成_網掛けあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/71c21b43-21d2-d17f-0175-dfeff0e900e5.png)

続いて作成したルートテーブルをサブネットに割り当てます。まずはルートテーブルの詳細画面から「サブネットの関連付けを編集」をクリックします。
![【完成版】3-1-3ルートテーブル割り当て_網掛けあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/b7dede08-7dab-f238-e6e9-6ba15bf387e4.png)

続く画面で今回作成した２つのPrivateサブネットを選択し、「関連付けを保存」をクリックします。
![【完成版】3-1-3-2ルートテーブル割り当て_網掛けあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/fb8b48b1-2998-5377-b06b-c6caef23fd72.png)

無事割り当たりました。
![【完成版】3-1-3-3ルートテーブル割り当て_網掛けあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/62dcd956-a6be-fb70-619d-e97d17de36cd.png)


## ３－３．踏み台サーバ用のセキュリティグループ作成
踏み台サーバに割り当てる使用するセキュリティグループを作成します。
インバウンドルールはこちら。

| タイプ | プロトコル | ポート範囲 | ソース |
| :-:  | :-:  | :-:  | :-: |
| SSH | TCP | 22 | 接続元PCのIPアドレス/32 |

続いてアウトバウンドルールはこちら。デフォルトではアウトバウンドを全て許可した状態になりますが、今回はアウトバウンドを含めルールを強めに縛ってしています。セキュリティを考えると個人的にはこちらの方が好みです。

| タイプ | プロトコル | ポート範囲 | ソース |
| :-:  | :-:  | :-:  | :-: |
| カスタム TCP | TCP | 27017 | DocumentDBのセキュリティグループ |
| HTTPS| TCP | 443 | 0.0.0.0/0 |
| HTTP | TCP | 80 | 0.0.0.0/0 |

なお上記で指定しているDocumentDBのセキュリティグループはすぐ下の手順で作成しますので、その値を設定してください。


## ３－４．DocumentDB用のセキュリティグループ作成
DocumentDBに割り当てる使用するセキュリティグループを作成します。インバウンドルールはこちら。

| タイプ | プロトコル | ポート範囲 | ソース |
| :-:  | :-:  | :-:  | :-: |
| カスタム TCP | TCP | 27017 | 踏み台サーバのセキュリティグループ |

アウトバウンドルールは設定不要です。好みはありますが、私はデフォルトの定義を削除しました。


## ３－４．踏み台サーバ用のElastic IP（EIP）作成
踏み台サーバに固定IPを割り当てたいのでEIPを作成します。
まずはAWSコンソール上でEIPの画面を表示し、「Elastic IPアドレスを割り当てる」をクリックします。
![【完成版】3-1-4-1_EIP作成_網掛けあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/84805a0f-9f39-a289-0c01-e660b5358dcb.png)

以下の画面でリージョン等々を選択して「割り当て」をクリックするとEIPが作成されます。
![【完成版】3-1-4-2_EIP作成_網掛けあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/63d794a4-e01c-b21d-8a41-26917cd4a190.png)


# ４．踏み台サーバ作成
DocuemntDBへ接続する際に、踏み台として使用するサーバを作成します。

## ４－１．踏み台サーバ用のEC2インスタンス作成
まず踏み台サーバ用のEC2インスタンスを作成します。EC2については色んなところで作成方法が紹介されているのでここでは割愛させて頂きます。主な設定内容は以下の通りです。

| 設定項目 | 設定値 | 
| :--  | :--  |
| AMI | Amazon Linux 2 AMI (HVM), SSD Volume Type |
| インスタンスタイプ | t2.micro（無料枠） |
| ネットワーク | デフォルトのVPCを指定 |
| サブネット | デフォルトサブネット（Public）のうち、任意の１つを指定 |
| 自動割り当てパブリックIP | 無効化（後程EIPを割り当てるため） |
| ストレージ | 8GB（デフォルトから変えず） |
| セキュリティグループ | 上記で作成したセキュリティグループ |


## ４－２．EC2インスタンスへのEIP割り当て
EC2作成後、EIPを割り当てます。AWSコンソールで先程作成したEIPを選択し、アクションから「Elastic IPアドレスの関連付け」を選択します。
![【完成版】3-1-5-2_踏み台サーバへのEIP割り当て_網掛けあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/57466045-3b09-c0dd-2c3b-d682a769c1bf.png)

続く画面で踏み台サーバのインスタンスを選択し、「関連付ける」をクリックすればEC2にEIPが割り当たります。
![【完成版】3-1-5-3_踏み台サーバへのEIP割り当て_網掛けあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/dbab2f1d-bb00-7566-494c-65244855571d.png)


# ５．DocumentDB作成
以下、DocumentDBクラスターの作成方法について記載します。

## ５－１．サブネットグループの作成
まずはDocumentDBの所属先となるサブネットグループを作成します。以下DocumentDBコンソールの左メニューから「サブネットグループ」を選択します。この画面上で「作成」ボタンをクリックします。
![【完成版】3-1-6-1_サブネットグループ作成_網掛けあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/5c846100-1c1a-fd0a-7eb0-938d3459a6fb.png)

続く画面で、先ほど作成した２つのプライベートサブネットを指定し、「作成」ボタンをクリックします。
![【完成版】3-1-6-2_サブネットグループ作成_網掛けあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/72fe1684-5392-65ab-3f2f-1d384dbc49ce.png)


## ５－２．パラメータグループの作成（TLS無効化）
DocumentDBはデフォルトでTLSが有効になっており、AWSが提供する証明書を使わないとDBにアクセスすることができません。これだとちょっと使いづらいですし、暗号化は踏み台サーバのSSHトンネル上でも行われるので、今回はTLSを無効にしておきたいと思います。この辺は良し悪しあるので各々の判断で実施ください。
やり方としては、DocumentDBコンソールの左メニューから「パラメータグループ」を選択します。この画面上で「作成」ボタンをクリックします。
![【完成版】5-2-1_パラメータグループ_網掛けあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/505cfd59-ad1d-4071-3bef-88ce13f5b601.png)

以下の画面が開くのでパラメータグループの名前と説明を入力します。
![【完成版】5-2-2_パラメータグループ_網掛けあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/94b90606-8e37-bf15-f269-8a9fa0504d0c.png)

作成後の画面はこんな感じです。新しく作ったパラメータグループ名のリンクをクリックします。
![【完成版】5-2-3_パラメータグループ_網掛けあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/f7ab3093-3700-d9a3-511c-42e03612323a.png)

続く画面で「tls」を選択して「編集」をクリックします。
![【完成版】5-2-4_パラメータグループ_網掛けあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/13963219-1f73-21f6-9bb7-b3923de5a670.png)

disabledを選択して保存します。
![【完成版】5-2-5_パラメータグループ_網掛けあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/d3a1186d-cbd6-5c01-bf94-b3ff765953df.png)


## ５－３．DocumentDBクラスターの作成
DocumentDBコンソールの左メニューから「クラスター」を選択します。この画面上で「作成」ボタンをクリックします。
![【完成版】5-2-1_DocumentDB作成_網掛けあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/e0fbbfb2-862a-8b2b-1dfc-eefe3aed0e5e.png)

以下の画面が開くので設定情報を入力していきます。
![【完成版】5-2-2_DocumentDB作成_網掛けあり.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/103226de-46fa-772a-a6d0-d0d912560be4.png)

入力項目はまあまあ多いです。私の場合は以下の設定にしました。

| 設定項目 | 設定値 | 
| :--  | :--  |
| クラスター識別子 | 任意の文字列 |
| エンジンバージョン | 4.0.0 |
| インスタンスクラス | 任意 |
| インスタンス数 | 1（複数ノードのクラスタを作りたい場合は数を増やす） |
| マスターユーザ名 | 任意（ただし、adminは使えないようなので注意） |
| マスターパスワード | 任意 |
| VPC | デフォルトVPC |
| サブネットグループ | 前述の手順で作成したサブネットグループを指定 |
| セキュリティグループ | 前述の手順で作成したDocumentDB用のセキュリティグループを指定 |
| ポート | 27017（デフォルトのまま変更せず） |
| クラスターパラメータグループ | 前述の手順で作成したパラメーターグループ |
| 保管時の暗号化 | デフォルトのまま |
| バックアップ | デフォルトのまま |
| ログのエクスポート | デフォルトのまま |
| メンテナンス | デフォルトのまま |



# ６．クライアントPCの設定方法
続いてクライアントPC側の設定方法について記載していきます。ちなみにOSはWindows10が前提になります。

## ６－１．Robo 3Tのインストール
DocumentDB（MongoDB）向けのGUIツールはいくつかありますが、今回はRobo 3Tの無償版を使いたいと思います。
[こちら](https://robomongo.org/)からダウンロードしてインストールします。ZIP版だと任意のフォルダに置くだけでよいので楽かと思います。


## ６－２．Puttyのインストール
Puttyをインストールします。DocumentDBへ繋げる際のSSHトンネルの作成に使用します。
[こちら](https://www.putty.org/)からインストーラをダウンロードして実行してください。

## ６－３．Putty用のキーファイル作成
踏み台用のEC2インスタンスを作成した際に、キーペアも一緒に作成したかと思います。この時にダウンロードできる秘密鍵（pem）はそのままではPuttyで使えないため、ppkに変換します。
まずはスタートメニューからPuTTY→PuTTYgenを選択し、PuTTYgenを起動します。この画面上で「Load」ボタンをクリックし、AWSからダウンロードしたpemファイルを指定します。
![【完成版】6-3-1_PPK作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/3b9ace6b-1766-be1a-0f6f-467c3d7807c6.png)

そうすると以下の画面が表示されます。任意のパスフレーズを設定し、「Save private key」をクリックすればppkへの変換は完了です。パスフレーズは無しでもOKですが、セキュリティを考えるとできる限り入れておいた方がよいと思います。
![【完成版】6-3-3_PPK作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/b160b021-31fa-35d4-93fd-bfd70ae1dc38.png)


## ６－４．PuttyのSSHトンネル設定
DocumentDBへ接続する際に使用する、SSHトンネルの設定を行います。
まずはスタートメニューからPuttyを開きます。最初に表示される以下画面の「Host Name」欄に「ec2-user@踏み台サーバのIP」を入力します。踏み台サーバのIPは、前段で取得したElastic IPのIPアドレスを指定してください。
![【完成版】6-4-1_Puttyトンネル設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/b7fe14e6-b31d-7db0-7687-bea4618b2a48.png)

プロキシ経由でインターネット接続している場合は以下の設定を行います。左メニューから「Connection - Proxy」を選択し、プロキシサーバのIP＆ポート番号を入力してください。（プロキシを使っていない場合は設定不要です。）
![【完成版】6-4-2_Puttyトンネル設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/8b0f3b24-a260-b9ce-2535-f71e0fc5f824.png)

KeepAliveの設定を行います。左メニューの「Connection」を選択し、一番上の項目に任意の時間（秒）を入力します。ここでは30秒としました。これにより、無操作状態でもPuttyが一定間隔で通信を投げてくれるため、セッションタイムアウトを防ぐことができます。
![【完成版】6-4-3_Puttyトンネル設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/d03b9491-bf70-a9cf-227c-204558972159.png)

続いてPPKファイルのパスを指定します。「Connection - SSH - Auth」を選択し、一番下のテキストボックスに先程作成したPPKファイルのパスを指定します。
![【完成版】6-4-4_Puttyトンネル設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/34a22eb4-758d-4416-40f0-43003bf86622.png)

トンネル設定を行います。「Connection - SSH - Auth - Tunnels」を選択し、「Source port」に任意のポート番号を、「Destination」にDocumentDBのホスト名とポート番号（27017）を設定します。「Source port」に指定したポートは後程Robo 3Tから接続する際に使用します。ここでは8001にしてみました。
![【完成版】6-4-5_Puttyトンネル設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/6d8b32a2-8ba2-7cc6-1c82-0c1cdd2499ca.png)

入力したら「Add」ボタンをクリックします。すると上部のエリアにトンネル設定が登録されます。
![【完成版】6-4-6_Puttyトンネル設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/aa084983-124b-d1ed-6d33-586add6ac02f.png)

以上で設定完了ですが、このままPuttyを閉じると苦労して入れた設定が全て消えてしまうので保存しておきましょう。左メニューから「Session」を選択し、「Save Sessions」に任意の名前を入力して「Save」ボタンを選択します。これで保存は完了です。
![【完成版】6-4-7_Puttyトンネル設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/6723a11b-6af6-ee2a-c532-a0fccf5c8c5b.png)


## ６－５．Robo 3TからDocumentDBへの接続
それではRobo 3TからDocumentDBへ接続してみましょう。
まず先程設定したPuttyでの接続を行います。スタートメニューからPuttyを起動し、保存したセッション名を選択して「Open」ボタンをクリックします。すると以下の画面が表示されます。PPKにパスフレーズを設定している場合はここで聞かれるので入力しましょう。
![【完成版】6-5-1_DocDBへの接続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/ebc2cac2-3465-de20-7fe0-1798118ee155.png)

パスフレーズ入力後の画面はこんな感じです。無事ログインできました。これでSSHトンネルが通った状態になります。
![【完成版】6-5-2_DocDBへの接続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/b0817f16-1346-cc78-fc19-300cab67a3b1.png)

続いてRobo 3Tを起動します。以下の画面が開くので、左上の「Create」リンクをクリックします。
![【完成版】6-5-3_DocDBへの接続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/72520f82-abc6-3cab-0388-161ba910eb10.png)

以下の画面が開くので、「Name」に任意の名前を入力します。「Address」には localhost と、前段でPuttyに設定したクライアントPC側のポート番号を指定します。ここでは8001です。
![【完成版】6-5-4_DocDBへの接続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/89c03d1b-9784-17a5-0d57-d8caa5114074.png)

つづいて「Authentication」タブを選択します。「User Name」にDocumentDB作成時に設定したマスターユーザ名を、「Password」に同じくパスワードを入力します。その後「Save」ボタンで保存します。
![【完成版】6-5-5_DocDBへの接続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/7f1cd2bc-df73-6c72-2cd1-94a3833309ba.png)

こんな感じになります。この状態で「Connect」ボタンを押すとDocumentDBへ接続できます。やってみましょう。
![【完成版】6-5-6_DocDBへの接続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/9c1792a2-ccb9-7cf8-2a55-3da800d0131f.png)

無事繋がりました。左メニューにDocumentDB内のデータベースが表示されていますね。
![【完成版】6-5-7_DocDBへの接続.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1234157/c9b5a6bd-fd3f-2749-b549-ab6c6afb1dd0.png)




# ７．おわりに
今回はRobo 3TでDocumentDBへ接続する際の各種設定方法について記載させて頂きました。Robo 3Tに限らず他のGUIツールでも同じように接続できるはずなので、興味のある方は試して頂ければと思います。
この記事が誰かのお役に立てると幸いです。