【VPC エンドポイントサービス (AWS PrivateLink)】オンプレから既存インスタンスのIPを別クラスのIPとして通信する検証をしてみました。

AWS運用自動化サービス「Cloud Automator」

こんにちは、技術4課の城です。
私事ですが、梅雨明けし一気に暑くなってきたところで、早くも夏風邪をひきました。
気合で乗り切りたいと思いますが、子供が小さいとありがちな家族内の風邪ループが発生しており、いち早く収束してくれることを願っています。
話は変わり、「何を言っているんだお前は?」と言われそうな長いタイトルですが、ちょっと複雑な要件のVPCと外部ネットワークの接続について検証し実現できましたので、共有します。

実現したい要件について

さっそくですが、こんな要件です。

  • オンプレ側のネットワークに手を入れることは不可、GWでのNATは出来ない
  • 既存EC2のIPアドレスはクラスCのIP(192.168.0.10)で設定されている
  • オンプレ側から既存EC2へはクラスBのIP(172.16.0.10)としてアクセスさせたい
  • 双方向の通信が必要

VPC エンドポイントサービス (AWS PrivateLink)とは

そもそもVPC エンドポイントサービス (AWS PrivateLink)とはどのようなサービスなのかと言いますと、
公式ドキュメントに下記記載があります。

VPC で独自のアプリケーションを作成し、これを AWS PrivateLink を使用するサービス (エンドポイントサービス) として設定できます。

作成したNLBにアクセスするインターフェースを別のVPC(アカウント問わず)作成できるサービスというと、理解がしやすいかもしれません。

VPC エンドポイントサービス (AWS PrivateLink)

構成図と概要

構成図は下図となります。

オンプレ側からは既存EC2を172.16.0.10としてアクセスします。
このIPはNATサーバーに付与されており、NATサーバーからAWS PrivateLinkを介して既存EC2に転送されます。
既存EC2からはまずVPC Endpointのインターフェースにアクセスし、これがNATサーバーで送信元をNATサーバー、送信先をオンプレサーバーとしてNATし、オンプレサーバーに転送される仕組みです。
今回はhttpアクセスを利用して、双方向通信が実現できているか確認したいと思います。

VPC Peeringじゃダメなんでしょうか?

VPC Peeringでは既存EC2からオンプレサーバーのルートをNATサーバーを指定すれば・・・とも考えましたが、ルートテーブルを定義することが出来ず、断念しました。
NATサーバーは既存VPC外の為、宛先10.200.0.10に対し、NATサーバーをターゲットとして指定することが出来ません。

各リソースについて

VPC

図中右側のvpc-test01(10.200.0.0/16)が仮想オンプレ環境です。
図中左側のvpc-test02(192.168.0.0/16)が既存AWS(以降、既存VPC)環境です。
図中中央のvpc-test03(172.16.0.0/16)が中継に利用するVPC(以降、中継VPC)になります。
仮想オンプレ環境にVPNサーバーを用意し、中継VPCとVPN GatewayにてVPN接続しています。

接続サーバー

ec2-test01(192.168.0.10)(以降、既存EC2)、ec2-test02(10.200.0.10)(以降、オンプレサーバー)を用意しました。
それぞれhttpdを起動させています。

VPCエンドポイントとNLB

通信方向につき1セット(今回は双方向なので2セット)必要となります。

NATサーバー

条件に応じてNAT処理を行うサーバーとなります。
今回はSophos UTM9を利用しています。

各リソースの設定

NLB

下記の内容で作成しました。

オンプレサーバー⇒既存EC2用NLB

項目 パラメータ
Name nlb-test02
スキーム internal
subnet subnet-test02(192.168.0.0/24)
Listener TCP:80
Listenerの転送先 tg-test02

オンプレサーバー⇒既存EC2用NLBの転送先ターゲットグループ

項目 パラメータ
Name tg-test02
プロトコル TCP
ポート 80
ターゲット ec2-test02(既存EC2)
ターゲットのポート 80

既存EC2用NLB⇒オンプレサーバー

項目 パラメータ
Name nlb-test03
スキーム internal
subnet subnet-test03(172.16.0.0/24)
Listener TCP:80
Listenerの転送先 tg-test03

既存EC2⇒オンプレサーバー用NLBの転送先ターゲットグループ

項目 パラメータ
Name tg-test03
プロトコル TCP
ポート 80
ターゲット NATサーバー
ターゲットのポート 80

VPCエンドポイントサービス

VPCダッシュボードのサイドバーの[エンドポイントのサービス]から作成します。
各NLBに対し、1つのエンドポイントサービスを作成します。
VPCエンドポイント(Private Link)作成時に下記サービス名が必要になります。
com.amazonaws.vpce.ap-northeast-1.vpce-svc-*****************

エンドポイント

VPCダッシュボードのサイドバーの[エンドポイント]から作成します。

オンプレサーバー⇒既存EC2用エンドポイント

項目 パラメータ
サービスカテゴリ サービスを名前で検索
サービス名 前項で作成したサービス名
VPC vpc-test03(中継VPC)
サブネット subnet-test03
セキュリティグループ NATサーバーからのTCP80を許可ルールを記載したSG

既存EC2⇒オンプレサーバー用エンドポイント

項目 パラメータ
サービスカテゴリ サービスを名前で検索
サービス名 前項で作成したサービス名
VPC vpc-test02(既存VPC)
サブネット subnet-test02
セキュリティグループ 既存EC2からのTCP80を許可ルールを記載したSG

それぞれのエンドポイントのIPアドレスを確認しておきます。
各エンドポイントの[サブネットタブ]で確認可能です。

NATサーバー

ここではNAT設定に関する部分を記載します。

ネットワーク定義

SophosUTMではホスト、ネットワーク、ネットワークグループを一元的に定義することができ、今回は下記のとおり、定義します。

名前 タイプ IPv4アドレス
ec2-test01 ホスト 10.200.0.10
ec2-test02 ホスト 192.168.0.10
NAT-Server ホスト 172.16.0.10
subnet-test03 ネットワーク 172.16.0.0/24
vpc-endpoint03 ホスト 172.16.0.243

vpc-endpoint03は[オンプレサーバー⇒既存EC2用エンドポイント]を設定します。
IPv4アドレスは確認したエンドポイントのIPアドレスになります。

NAT

サイドバーの[ネットワークプロテクション] > [NAT] を選択し、タブの[NAT]をクリックして設定します。
下図のようにマッチング条件、アクションを設定します。

確認

オンプレサーバー、及び、既存EC2からcurlコマンドにて確認してみます。

オンプレサーバー

既存EC2

疎通できました!

できなかったこと

既存EC2からオンプレサーバーのIPアドレスでアクセスしようと、
ルートテーブルに 10.200.0.10/32⇒VPCエンドポイントのENIを登録してみましたが、
レスポンスが返ってこず、出来ませんでした。
VPCエンドポイントのIPアドレス、または、DNS名でアクセスする必要がありそうです。

最後に

VPCのCIDR追加には同一クラスしか追加出来ないという制限があり、上記検証をしました。
リソースの増加と設定項目が多いことにより、管理コストは高くなりそうですが、
どうしてもそのサーバー自体と接続する必要がある場合の回避策として、使えるかと思います。
どなたかの参考になれば幸いです。

AWS運用自動化サービス「Cloud Automator」