Direct Connect 未接続のVPCからオンプレターゲットへの通信を行う(PrivateLink 活用パターン)
DX未接続のVPCからオンプレへの通信を行いたい
共有型 Direct Connect(DX) を使っている環境で、 上図のように source(オンプレへの経路無し) から target(オンプレ) へ接続したいケースを考えます。 Direct Connect Gateway(DXGW) は VPCの接続上限 (10個) があるので 多くの VPCには繋げられません。
PrivateLink を活用する
今回は PrivateLink を使ってこの要件を解決します。 PrivateLink はインターネットを経由せずにサービスに繋ぐことができる機能です。 ここでいうサービスには「AWSの APIアクセス」や「パートナーが提供しているサービス」、 「 自身で展開したサービス(今回の対象) 」などが含まれます。 ネットワーク間で CIDRの重複を気にする必要が無い点が大きなメリットです。
今回のネットワーク構成図について、以下 4点がポイントです。
- ① NLB のターゲットにオンプレサーバー を指定します。
- ② エンドポイントサービス を作成します。 サービス作成時に 上のNLBを指定します。
- ③ エンドポイント を作成します。
- ④ エンドポイント へ接続することで、 target と通信できます
このオンプレサーバーに通信したい VPCごとにエンドポイントを設置します。 以下 複数VPC利用のイメージです。
なお、本ブログは以下の素晴らしい AWSブログを大いに参考にしています。 詳細や他手段についてはこちらを参照ください。
構築してみる
DXGW接続の検証環境が無いので、以下のようにオンプレ環境を模した環境を想定します。 (この部分の構築は割愛します)
なお PrivateLink のメリット「IPアドレス重複問題の解決」を意識するために
Source
と Target
の CIDR は同じにしています。
ここから NLBおよび PrivateLink を作成して source から target へのアクセス (今回は HTTP) を実現します。
以下の順番で進めます。
- 1a: ターゲットグループを作成する
- 1b: NLBを作成する
- 2: エンドポイントサービスを作成する
- 3a: エンドポイント用のSGを作成する
- 3b: エンドポイントを作成して、利用できるようにする
1a. ターゲットグループを作成する
※ ここの手順は 前回ブログ(NLB活用パターン) とほとんど同じです。
NLBのターゲットグループ を事前に作成します。 [EC2 > ターゲットグループ] から [ターゲットグループの作成] を選択します。
ターゲットタイプは [IPアドレス] とします。
以下基本的な設定のパラメータを埋めます。
- ターゲットグループ名: 適当に入力(例
onprem-server-tg
) - プロトコル: TCP
- ポート: 80
- IPアドレスタイプ: IPv4
- VPC: DX用VPC
ヘルスチェックはデフォルトの設定で [次へ] を選択します。
「ターゲットの登録」 にて
ネットワークを [その他のプライベートIPアドレス] 、
アベイラビリティーゾーンを [すべて] にします。
IPアドレスに ターゲットのIPアドレス
を入力します。
[保留中として以下を含める] を選択します。
以下のように 「ターゲットの確認」に表示されていれば OKです。
[ターゲットグループの作成] を選択して完了です。
1b. NLBを作成する
※ ここの手順は 前回ブログ(NLB活用パターン) と同じです。
[EC2 > ロードバランサー] から [ロードバランサーの作成] を選択します。
ロードバランサーのタイプは [Network Load Balancer] を選択します。
以下基本的な設定のパラメータを埋めます。
- ロードバランサー名: 適当に入力(例
onprem-server-nlb
) - スキーム: 内部
- IPアドレスタイプ: IPv4
ネットワークマッピング設定の 「VPC」は DX用VPC を選択します。 サブネットも指定します。
- ※1: 今回は Single-AZ の設定です
- ※2:
プライベート IPv4アドレス
の設定欄で固定IP化も可能です
リスナーとルーティングは以下のように設定します。
- プロトコル: TCP
- ポート: 80
- デフォルトアクション > 転送先: 先ほど作成したターゲットグループ
設定を確認して [ロードバランサーの作成] を選択します。
状態が Active になれば完了です。
2. エンドポイントサービスを作成する
[VPC > エンドポイントのサービス] から [エンドポイントサービスを作成] を選択します。
以下基本情報を記入します。
- 名前: 適当に入力(例
onprem-server-service
) - ロードバランサーのタイプ: ネットワーク
- ロードバランサー: (先ほど作成したNLB)
追加設定は以下のようにしましょう。
- エンドポイントの承諾が必要:
yes(チェックを入れる)
- プライベートDNS名を有効化: 任意 ( こちらのアップデート の機能です。
(補足) DNS周りの追加設定
章で別途説明します)
問題なければ [作成] を選択して完了です。
次のステップのために以下の [サービス名] はメモしておきましょう。
[2023/05/02追記] クロスアカウントアクセスの場合、エンドポイントサービス作成後に、追加で「プリンシパルの許可」設定が必要です
3a. エンドポイント用のSGを作成する
この後の「エンドポイント作成」に備えてセキュリティグループを作成しておきます。 Source VPC上に 以下パラメータのセキュリティグループを作成します
- インバウンドルール:
0.0.0.0/0
からの 使用するプロトコル/ポート(今回はHTTP
) - アウトバウンドルール:
0.0.0.0/0
への全てのトラフィック
3b. エンドポイントを作成して、利用できるようにする
エンドポイントの作成
[VPC > エンドポイント] から [エンドポイントを作成] を選択します。
名前は適当(例 onprem-server-endpoint
) に入力します。
サービスカテゴリは [その他のエンドポイントサービス] を選択します。
[サービス名] に 先程メモしたサービス名
を入力して [サービスの検証] を選択します。
「サービス名が検証されました。」の表示が出ればOKです。
[VPC] には Source VPC を選択します。
[DNS名を有効化] は任意です(これも こちらのアップデート の機能です。
(補足) DNS周りの追加設定
章で別途説明します)。
[サブネット] には VPCエンドポイントを展開するサブネットを選択します。
[セキュリティグループ] には 先ほど作成したセキュリティグループ
を選択します。
問題なければ VPCエンドポイントを作成します。
エンドポイントの承諾
エンドポイントのサービス に戻ります。
[エンドポイント接続] タブにて、 Pending acceptance
状態となっているものが、先程作成したエンドポイントです。
[アクション > エンドポイント接続リクエストの承諾] を選択します。
「承諾」を入力しましょう。
Available
状態になればOKです。
接続確認
source 用に立てたインスタンスから接続できるか確かめてみます。
事前に VPCエンドポイントのDNS名
vpce-(xxx).vpce-svc-(xxx).ap-northeast-1.vpce.amazonaws.com
をメモしておきましょう。
SSM Session Manager から `curl http://${endpoint}/index.html` を実行。 ターゲットに配置していたWebサーバからの応答が返ってきました。
(補足) DNS周りの追加設定
オプションで プライベートDNS名 を付けられます。 ※これは 2020年の以下アップデートで利用できるようになった機能です。
サービスのエンドポイントのプライベートDNS名 (例 onprem-server.example.com
)
を設定できます。
接続元からは、エンドポイント固有のホスト( vpce-(xxx).vpce-svc-(xxx).ap-northeast-1.vpce.amazonaws.com
)
ではなくプライベートDNS名 (例 onprem-server.example.com
)からサービスに接続できます。
実際の設定の流れは以下の通りです。
- 「プライベートDNS名を有効化」した エンドポイントサービスを作成する
- パブリックホストゾーンに 指定されたTXTレコード を登録する
- プライベートDNS名が無効の状態 のエンドポイントを作成して、承諾される
- エンドポイントの設定を変更して プライベートDNS名を有効化する
以降でそれぞれのステップの概要をざっと説明します。
1. エンドポイントサービスの作成
エンドポイント作成時に、以下の「追加設定」で [プライベートDNS名をサービスに関連付ける] を選択して、 希望のDNS名を入力しましょう。
エンドポイント作成後の 「ドメインの検証名」 および 「ドメインの検証値」 をメモしておきましょう。
2. TXTレコードの登録
先程メモした 「ドメインの検証名」 および 「ドメインの検証値」 を使って TXTレコードを登録しましょう。
しばらく待って、エンドポイントサービスの 「ドメインの検証ステータス」が
Verified
になればOKです。
3. エンドポイントの作成
エンドポイントを新規作成するときは [DNS名を有効化] にチェックを入れずに 作成しましょう。 エンドポイントが 承諾された後でないと プライベートDNS名を有効にできないからです。
4. プライベートDNS名の有効化
エンドポイントを承諾して利用できるようになったら、 エンドポイントの設定を変更します。
エンドポイントを選択して [アクション > プライベートDNS名を変更] を選択します。
[プライベートDNS名を有効化] にチェックを入れて [変更を保存] します。
これで設定完了です。 以下のようにプライベートDNS名で接続を確認できました。
おわりに
PrivateLink + NLBを使って DX未接続のVPCからオンプレターゲットへの 通信を行ってみました。 本パターンは以下を満たす場合に活用できるでしょう。
- オンプレとVPC間で CIDR 重複を許容した通信を行いたい
どなたかの参考になれば幸いです。