
Direct Connect 未接続のVPCからオンプレターゲットへの通信を行う(PrivateLink 活用パターン)
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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 重複を許容した通信を行いたい
どなたかの参考になれば幸いです。







