MongoDB Atlasへの接続方法をインターネット経由からVPCピアリング接続に切り替えてみた

今回は、Amazon EC2インスタンスからMongoDB Atlasへの接続をVPCピアリング経由にする方法をまとめました。サーバーは、Amazon ECSやAWS Fargateなどのコンテナでも参考になります。
2023.07.10

はじめに

Amazon EC2インスタンスからMongoDB Atlasへの接続方法をインターネット経由からVPCピアリング接続に切り替える方法をまとめました。

インターネット経由では、EC2インスタンスから直接インターネット経由でMongoDB Atlasに接続します。

その場合、セキュリティを強化するためには、MongoDB Atlas側でIP制限を設定する必要があります。

ただし、EC2インスタンスがAuto Scalingを使用する場合、NAT Gatewayを設置してIPを固定も可能ですが、ランニングコストが高くなるため、今回はVPCピアリング接続経由に切り替えます。

下記記事に、MongoDB Atlasへの各接続方法のメリットデメリットをまとめております。

Amazon EC2からMongoDB Atlasへの3つの接続方法、利用料金、考慮事項をまとめてみた

構成図

インターネット経由の場合は、以下の構成です。右側の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ピアリング経由に接続を切り替える流れは以下です。

  1. MongoDB Atlas側でVPCピアリングを設定する
  2. AWS側でピアリングを承認
  3. AWS側でサブネットのルートテーブルにMongoDB AtlasのVPC CIDRを加える
  4. MongoDB Atlasの0.0.0.0/0のIPアクセス許可設定を削除する
  5. 接続確認

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ピアリング経由からインターネット経由に戻したい場合、以下の対応をする必要があります。

  1. MongoDB Atlas の0.0.0.0/0のIPアクセス許可設定を追加
  2. MongoDB Atlas側でVPCピアリングを削除
    • VPCピアリングからインターネット経由に切り替わります。
  3. 接続確認

あとは、AWS側でVPCピアリングとルートテーブルでの追加設定を削除などをします。

最後に

今回は、インターネット経由からVPCピアリング経由に接続を切り替える方法についてまとめました。

切り替え方法は、個々のアプリケーションによって変わる可能性がありますので、あくまでも参考程度にしていただければと思います。

実際に切り替える場合、検証環境でしっかり確認しましょう。

参照