PrivateLinkのエンドポイントサービスでMongoDBを公開してみる #reinvent

2017.12.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、菊池です。

先日のアップデートにて、VPCエンドポイントとPrivateLinkを使うことで、他のAWSアカウント/VPCにプライベートなサービスを公開可能になりました。詳細は以下の記事を併せて参照ください。

【新機能】PrivateLinkで独自エンドポイントを作ってアプリをプライベート公開する #reinvent

今回は、この機能を使って、MongoDBをサービス化して他のAWSアカウントから利用してみました。

構成

以下のような構成イメージになります。

MongoDBクラスタをNLBに登録し、別のアカウントからVPCエンドポイント/PrivateLink経由で接続可能にします。

やってみた

以下のような手順で構築します。

  1. MongoDBクラスタの作成(サービス提供アカウント)
  2. NLBの作成(サービス提供アカウント)
  3. VPCエンドポイントサービスへの公開(サービス提供アカウント)
  4. VPCエンドポイントの作成(サービス利用アカウント)
  5. VPCエンドポイントサービスの承諾(サービス提供アカウント)

1. MongoDBクラスタの作成

以下の記事の手順にてMongoDBシャードクラスタを作成します。シャード構成とするのは、mongosを利用することでNLB経由でどのインスタンスからもRead/Writeを可能にするためです。

MongoDB 3.6のシャードクラスタを構築する

2. NLBの作成

NLBを作成し、1で構成したMongoDBのインスタンスを登録します。

ロードバランサーの作成から、NLBを選択します。

プライベート接続を利用しますので、内部向けを選択します。プロトコルは、MongoDBデフォルトのTCP:27017です。

新規にターゲットグループを作成します。

作成し、インスタンスを登録しました。接続に問題がなければhealthyとなります。healthyにならない場合にはSecurityGroupなどを見直しましょう。

3. VPCエンドポイントサービスへの公開

作成したNLBをエンドポイントサービスに公開します。VPCのメニューから、[エンドポイントサービスの作成]に進みます。

作成したNLBを選択して公開します。

エンドポイントサービスが作成できたら、利用するアカウントをホワイトリストに追加します。エンドポイントサービスを選択し、[ホワイトリストにプリンシパルを追加する]に進みましょう。今回はアカウントに対して許可を与えるため、ARNにarn:aws:iam::xxxxxxxxxxxx:rootを入力して追加します。(xxxxxxxxxxxxはサービスを利用する側のアカウントID)

4. VPCエンドポイントの作成

ここからはサービス利用アカウントでの作業です。VPCのメニューから、VPCエンドポイントの作成に進みます。[サービス名称で検索]を選択します。

3.で作成したエンドポイントサービスのサービス名を入力し[検証]します。

サービスが見つかったら、セキュリティグループを設定し、エンドポイントを作成します。

5. VPCエンドポイントサービスの承諾

サービス提供アカウントに戻ります。

エンドポイント接続が、[承認]の保留中となっていますので、リクエストを承諾しましょう。

確認が出ますので、承諾します。

これで、サービスが利用可能になります。

接続確認

利用側のアカウントで、接続確認してみます。ステータスが利用可能であることを確認しましょう。

エンドポイントを作成したVPCから、DNS名で参照可能になっています。

$ nslookup vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.vpce-svc-xxxxxxxxxxxxxxxx.ap-northeast-1.vpce.amazonaws.com
Server:		172.31.0.2
Address:	172.31.0.2#53

Non-authoritative answer:
Name:	vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.vpce-svc-xxxxxxxxxxxxxxxx.ap-northeast-1.vpce.amazonaws.com
Address: 172.31.18.195
Name:	vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.vpce-svc-xxxxxxxxxxxxxxxx.ap-northeast-1.vpce.amazonaws.com
Address: 172.31.10.116

サブネットごとにENIが配置され、IPが割り当てられています。mongoshellで接続してみます。

$ mongo vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.vpce-svc-xxxxxxxxxxxxxxxx.ap-northeast-1.vpce.amazonaws.com:27017
MongoDB shell version v3.6.1
connecting to: mongodb://vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.vpce-svc-xxxxxxxxxxxxxxxx.ap-northeast-1.vpce.amazonaws.com:27017/test
MongoDB server version: 3.6.1
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
	http://docs.mongodb.org/
Questions? Try the support group
	http://groups.google.com/group/mongodb-user
Server has startup warnings:
2017-12-28T03:34:53.182+0000 I CONTROL  [main]
2017-12-28T03:34:53.182+0000 I CONTROL  [main] ** WARNING: Access control is not enabled for the database.
2017-12-28T03:34:53.182+0000 I CONTROL  [main] **          Read and write access to data and configuration is unrestricted.
2017-12-28T03:34:53.182+0000 I CONTROL  [main]
2017-12-28T04:52:54.111+0000 E -        [main] Error loading history file: FileOpenFailed: Unable to fopen() file /home/ec2-user/.dbshell: No such file or directory
mongos>

接続できました!

まとめ

VPCエンドポイントとPrivateLinkを活用した、MongoDBのプライベートなサービスを構築してみました。これまでは異なるアカウント/VPCにプライベート接続でサービスを提供するためには、VPCピアリングが必要でしたが、この機能を使うことで、VPCのCIDR競合などを気にせずにエンドポイントのみを公開することができます。

これから色々なサービスが出てくることが楽しみですね。