MongoDB Atlasへの接続方法をインターネット経由からVPCピアリング接続に切り替えてみた
はじめに
Amazon EC2インスタンスからMongoDB Atlasへの接続方法をインターネット経由からVPCピアリング接続に切り替える方法をまとめました。
インターネット経由では、EC2インスタンスから直接インターネット経由でMongoDB Atlasに接続します。
その場合、セキュリティを強化するためには、MongoDB Atlas側でIP制限を設定する必要があります。
ただし、EC2インスタンスがAuto Scalingを使用する場合、NAT Gatewayを設置してIPを固定も可能ですが、ランニングコストが高くなるため、今回はVPCピアリング接続経由に切り替えます。
下記記事に、MongoDB Atlasへの各接続方法のメリットデメリットをまとめております。
構成図
インターネット経由の場合は、以下の構成です。右側のVPCは、MongoDB Atlasで管理されています。
VPCピアリング経由の場合は、以下の構成です
事前準備
- AWSアカウントでEC2インスタンスを作成済み
- SSH接続、もしくはセッションマネージャが利用できる
- OS:Amazon Linux 2
- インターネットにアクセスできる
- セキュリティグループのアウトバウンドは、0.0.0.0/0
- MongoDB Atlasのアカウントを作成済み
- 作成していない場合、下記ブログをご参考にしてください
DBを作成する
まず、DBを作成します。
高度な設定でDBを作成するため、[advanced configuration options.]をクリックします。
安く済ませたいので、下記以外は、デフォルト設定で作成します。最低価格の$0.10/hour
で作成できているか確認しましょう。
- Proveider
- AWS
- Region
- Tokyo (ap-northeast-1)
- Cluster Tier
- M10 (2 GB RAM, 10 GB Storage)
- Auto-scale
- 無効
- Turn on Cloud Backup (M2 and up)
- 無効
- 無効
[Create Cluster]をクリックすると、Security Quickstartに遷移します。遷移時点でDBは作成されています。
IPアクセス許可設定
ユーザー名とパスワードを設定し、[Add entries to your IP Access List]にどのパブリックIPのサーバーからでもインターネット経由でアクセスできるように、0.0.0.0/0
を設定します。
EC2インスタンスからインターネット経由でMongoDB Atlasに接続
まず、EC2インスタンスにmongosh
コマンドが利用できるようにパッケージをインストールします。
下記ドキュメント通りに進めます。
$ sudo vim /etc/yum.repos.d/mongodb-org-6.0.repo [mongodb-org-6.0] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/amazon/2/mongodb-org/6.0/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc
$ sudo yum install -y mongodb-org Complete!
インストールできました!
それでは、インターネット経由でMongoDB Atlasに接続しましょう。
MongoDB Atlas側の画面で[Connect]から[Shell]に遷移すると、コマンドが確認できます。
コマンドをコピーして、EC2インスタンスからコマンドを実行しましょう。
$ mongosh "mongodb+srv://cluster0.ek0mk.mongodb.net/" --apiVersion 1 --username admin Enter password: ******** Current Mongosh Log ID: 64a8a8f0e30accfc670e16aa Connecting to: mongodb+srv://<credentials>@cluster0.ek0mk.mongodb.net/?appName=mongosh+1.10.1 Using MongoDB: 6.0.6 (API Version 1) Using Mongosh: 1.10.1 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. Atlas atlas-f5yrfb-shard-0 [primary] test> show databases admin 264.00 KiB config 220.00 KiB local 492.00 KiB
インターネット経由で接続できることを確認できました。
ただし、MongoDB Atlasへのアクセスは、0.0.0.0/0
で誰でもアクセスできてしまいますので、VPCピアリング経由の接続に変更します。
VPCピアリング接続経由に変更
VPC内からMongoDB Atlasへ接続するためのエンドポイントは、インターネット経由とVPC ピアリング接続経由ともに同じエンドポイントは共通ですので、接続コマンドは変える必要はありません。
インターネット経由からVPCピアリング経由に接続を切り替える流れは以下です。
- MongoDB Atlas側でVPCピアリングを設定する
- AWS側でピアリングを承認
- AWS側でサブネットのルートテーブルにMongoDB AtlasのVPC CIDRを加える
- MongoDB Atlasの0.0.0.0/0のIPアクセス許可設定を削除する
- 接続確認
1 MongoDB Atlas側でVPCピアリングを設定する
MongoDB Atlas側でVPCピアリングを設定します
アカウントID、AWS側のVPCのID、AWS側のVPCのCIDR、リージョンを入力します
今回、MongoDB Atlas側のVPC CIDRは、192.168.248.0/21
のため、AWS側のVPC CIDRが重複している場合、VPCピアリング接続はできません。
Statusは、Waiting for Approved
です。AWS側で承認することで、ピアリング接続が完了します。
IP Access List(以降、IPアクセス許可設定)には、AWS側のVPC CIDRが加わっていることが確認できます。
2 AWS側でピアリングを承認
ピアリングを承認する前に、EC2インスタンスからMongoDB Atlasの名前解決(ドメイン名から対応するIPアドレスを求める行為)では、MongoDB AtlasのパブリックIPが返ることを確認します。
$ nslookup cluster0-shard-00-02.ek0mk.mongodb.net Server: 10.0.0.2 Address: 10.0.0.2#53 Non-authoritative answer: cluster0-shard-00-02.ek0mk.mongodb.net canonical name = ec2-35-72-220-228.ap-northeast-1.compute.amazonaws.com. Name: ec2-35-72-220-228.ap-northeast-1.compute.amazonaws.com Address: 35.72.220.228
パブリックIPの35.72.220.228
が返りました。
ピアリング経由で接続するには、プライベートIPが返る必要があります。
現在は、インターネット経由で接続できています。
$ mongosh "mongodb+srv://cluster0.ek0mk.mongodb.net/" --apiVersion 1 --username admin Enter password: ******** Atlas atlas-f5yrfb-shard-0 [primary] test>
それでは、AWS側でVPCピアリング接続を承認します。
MongoDB Atlas側では、StatusがSetting UP Routes
です。
承認直後は、MongoDB Atlasの名前解決は、パブリックIPが返ります。解決元のDNSサーバーは、VPCのDNSで変わっておりません。
$ nslookup cluster0-shard-00-02.ek0mk.mongodb.net Server: 10.0.0.2 Address: 10.0.0.2#53 Non-authoritative answer: cluster0-shard-00-02.ek0mk.mongodb.net canonical name = ec2-35-72-220-228.ap-northeast-1.compute.amazonaws.com. Name: ec2-35-72-220-228.ap-northeast-1.compute.amazonaws.com Address: 35.72.220.228
数分後には、MongoDB Atlas側では、StatusがAvaliable
になります。
MongoDB Atlasの名前解決は、プライベートIP(192.168.253.138)が返るようになりました。解決元のDNSサーバーは、VPCのDNSで変わっておりません。
$ nslookup cluster0-shard-00-02.ek0mk.mongodb.net Server: 10.0.0.2 Address: 10.0.0.2#53 Non-authoritative answer: cluster0-shard-00-02.ek0mk.mongodb.net canonical name = ec2-35-72-220-228.ap-northeast-1.compute.amazonaws.com. Name: ec2-35-72-220-228.ap-northeast-1.compute.amazonaws.com Address: 192.168.253.138
ただし、ルートテーブルを追加設定していないため、MongoDB Atlasに接続はまだできません。
承認後、数分後に名前解決でプライベートIPが返る理由
ドキュメントに明記はありませんが、MongoDB AtlasのStatusがAvaliable
になると、MongoDB Atlas側のVPC ピアリング接続設定で リクエスタDNS 解決
が有効の状態であるからだと推測します。
リクエスタDNS 解決
の有効とは、 アクセプタ VPC (承認側VPC/今回はAWS側) がリクエスタ VPC (リクエスト側/今回はMongoDB Atlas側)ホストの DNS をプライベート IP に解決できる機能です。
詳しくは、下記記事を一読ください。
リクエスタDNS 解決
は、アカウントが別の場合、VPCピアリングをリクエストしたアカウント側でのみ有効化できます。
AWS側でピアリングを承認したことをトリガーに、MongoDB Atlas側でリクエスタDNS 解決
が有効されることで、MongoDB Atlasの名前解決は、プライベートIPが返るようになったと思われます。
ちなみに、MongoDB AtlasからEC2インスタンスにプライベートIPを返す必要はないので、AWS側のVPC側で、アクセプタ DNS 解決
は有効にする必要はありません。
ルートテーブルを追加設定していないため、MongoDB Atlasに接続はできず、次に進みます。
3 AWS側でルートテーブルにMongoDB AtlasのVPC CIDRを加える
MongoDB Atlas側のVPC CIDR(192.168.248.0/21
)をEC2インスタンスが存在するサブネットのルートテーブルに加えます。
これで、MongoDB AtlasにVPCピアリング経由で接続できます。
ただし、インターネット経由でないことを確認するために、IPアクセス許可設定で0.0.0.0/0
を先に削除します
4 MongoDB Atlas側でIPアクセス許可設定を削除する
IPアクセス許可設定の0.0.0.0/0
を削除します。
5 接続確認
VPCピアリング経由で、EC2インスタンスから接続できることが確認できました。
$ mongosh "mongodb+srv://cluster0.ek0mk.mongodb.net/" --apiVersion 1 --username admin Enter password: ******** Current Mongosh Log ID: 64a8e132f6f50bbf8c0835d3 Connecting to: mongodb+srv://<credentials>@cluster0.ek0mk.mongodb.net/?appName=mongosh+1.10.1 Using MongoDB: 6.0.6 (API Version 1) Using Mongosh: 1.10.1 For mongosh info see: https://docs.mongodb.com/mongodb-shell/ Atlas atlas-f5yrfb-shard-0 [primary] test>
接続確認の前に、サーバーを再起動する必要がある場合
サーバーのアプリケーションによっては、サーバー起動時、名前解決のIPなどの情報をキャッシュして持つことがあります。
そのため、サーバーを再起動しないと名前解決が変わらずパブリックIPが返る可能性がありますので、接続出来ない場合、サーバーを再起動することで接続できることが考えられます。
下記でも名前解決したIPアドレスをキャッシュされたアプリの挙動が確認されました。
切り戻す場合
VPCピアリング経由からインターネット経由に戻したい場合、以下の対応をする必要があります。
- MongoDB Atlas の0.0.0.0/0のIPアクセス許可設定を追加
- MongoDB Atlas側でVPCピアリングを削除
- VPCピアリングからインターネット経由に切り替わります。
- 接続確認
あとは、AWS側でVPCピアリングとルートテーブルでの追加設定を削除などをします。
最後に
今回は、インターネット経由からVPCピアリング経由に接続を切り替える方法についてまとめました。
切り替え方法は、個々のアプリケーションによって変わる可能性がありますので、あくまでも参考程度にしていただければと思います。
実際に切り替える場合、検証環境でしっかり確認しましょう。