Direct Connect 未接続のVPCからオンプレターゲットへの通信を行う(PrivateLink 活用パターン)

Direct Connect 未接続のVPCから、オンプレミスの特定ターゲットへの接続を実現する方法を書きます。今回は PrivateLink を活用します。IPが重複していても接続可能な点がメリットです。
2022.03.15

DX未接続のVPCからオンプレへの通信を行いたい

img

共有型 Direct Connect(DX) を使っている環境で、 上図のように source(オンプレへの経路無し) から target(オンプレ) へ接続したいケースを考えます。 Direct Connect Gateway(DXGW) は VPCの接続上限 (10個) があるので 多くの VPCには繋げられません。

img

今回は PrivateLink を使ってこの要件を解決します。 PrivateLink はインターネットを経由せずにサービスに繋ぐことができる機能です。 ここでいうサービスには「AWSの APIアクセス」や「パートナーが提供しているサービス」、 「 自身で展開したサービス(今回の対象) 」などが含まれます。 ネットワーク間で CIDRの重複を気にする必要が無い点が大きなメリットです。

今回のネットワーク構成図について、以下 4点がポイントです。

  • ① NLB のターゲットにオンプレサーバー を指定します。
  • ② エンドポイントサービス を作成します。 サービス作成時に 上のNLBを指定します。
  • ③ エンドポイント を作成します。
  • ④ エンドポイント へ接続することで、 target と通信できます

このオンプレサーバーに通信したい VPCごとにエンドポイントを設置します。 以下 複数VPC利用のイメージです。

img

なお、本ブログは以下の素晴らしい AWSブログを大いに参考にしています。 詳細や他手段についてはこちらを参照ください。

構築してみる

DXGW接続の検証環境が無いので、以下のようにオンプレ環境を模した環境を想定します。 (この部分の構築は割愛します)

img

なお PrivateLink のメリット「IPアドレス重複問題の解決」を意識するために SourceTarget の CIDR は同じにしています。

img

ここから NLBおよび PrivateLink を作成して source から target へのアクセス (今回は HTTP) を実現します。

以下の順番で進めます。

  • 1a: ターゲットグループを作成する
  • 1b: NLBを作成する
  • 2: エンドポイントサービスを作成する
  • 3a: エンドポイント用のSGを作成する
  • 3b: エンドポイントを作成して、利用できるようにする

img

1a. ターゲットグループを作成する

※ ここの手順は 前回ブログ(NLB活用パターン) とほとんど同じです。

NLBのターゲットグループ を事前に作成します。 [EC2 > ターゲットグループ] から [ターゲットグループの作成] を選択します。

img

ターゲットタイプは [IPアドレス] とします。

img

以下基本的な設定のパラメータを埋めます。

  • ターゲットグループ名: 適当に入力(例 onprem-server-tg )
  • プロトコル: TCP
  • ポート: 80
  • IPアドレスタイプ: IPv4
  • VPC: DX用VPC

img

ヘルスチェックはデフォルトの設定で [次へ] を選択します。

「ターゲットの登録」 にて ネットワークを [その他のプライベートIPアドレス] 、 アベイラビリティーゾーンを [すべて] にします。 IPアドレスに ターゲットのIPアドレス を入力します。 [保留中として以下を含める] を選択します。

img

以下のように 「ターゲットの確認」に表示されていれば OKです。

img

[ターゲットグループの作成] を選択して完了です。

1b. NLBを作成する

※ ここの手順は 前回ブログ(NLB活用パターン) と同じです。

[EC2 > ロードバランサー] から [ロードバランサーの作成] を選択します。

img

ロードバランサーのタイプは [Network Load Balancer] を選択します。

img

以下基本的な設定のパラメータを埋めます。

  • ロードバランサー名: 適当に入力(例 onprem-server-nlb )
  • スキーム: 内部
  • IPアドレスタイプ: IPv4

img

ネットワークマッピング設定の 「VPC」は DX用VPC を選択します。 サブネットも指定します。

img

  • ※1: 今回は Single-AZ の設定です
  • ※2: プライベート IPv4アドレス の設定欄で固定IP化も可能です

リスナーとルーティングは以下のように設定します。

  • プロトコル: TCP
  • ポート: 80
  • デフォルトアクション > 転送先: 先ほど作成したターゲットグループ

img

設定を確認して [ロードバランサーの作成] を選択します。

img

状態が Active になれば完了です。

2. エンドポイントサービスを作成する

[VPC > エンドポイントのサービス] から [エンドポイントサービスを作成] を選択します。

img

以下基本情報を記入します。

  • 名前: 適当に入力(例 onprem-server-service )
  • ロードバランサーのタイプ: ネットワーク
  • ロードバランサー: (先ほど作成したNLB)

img

追加設定は以下のようにしましょう。

  • エンドポイントの承諾が必要: yes(チェックを入れる)
  • プライベートDNS名を有効化: 任意 ( こちらのアップデート の機能です。 (補足) DNS周りの追加設定 章で別途説明します)

問題なければ [作成] を選択して完了です。

次のステップのために以下の [サービス名] はメモしておきましょう。

img

3a. エンドポイント用のSGを作成する

この後の「エンドポイント作成」に備えてセキュリティグループを作成しておきます。 Source VPC上に 以下パラメータのセキュリティグループを作成します

  • インバウンドルール: 0.0.0.0/0 からの 使用するプロトコル/ポート(今回は HTTP)
  • アウトバウンドルール: 0.0.0.0/0 への全てのトラフィック

img

3b. エンドポイントを作成して、利用できるようにする

エンドポイントの作成

[VPC > エンドポイント] から [エンドポイントを作成] を選択します。

img

名前は適当(例 onprem-server-endpoint) に入力します。 サービスカテゴリは [その他のエンドポイントサービス] を選択します。

img

[サービス名]先程メモしたサービス名 を入力して [サービスの検証] を選択します。

img

「サービス名が検証されました。」の表示が出ればOKです。

img

[VPC] には Source VPC を選択します。 [DNS名を有効化] は任意です(これも こちらのアップデート の機能です。 (補足) DNS周りの追加設定 章で別途説明します)。

img

[サブネット] には VPCエンドポイントを展開するサブネットを選択します。

img

[セキュリティグループ] には 先ほど作成したセキュリティグループ を選択します。

img

問題なければ VPCエンドポイントを作成します。

エンドポイントの承諾

エンドポイントのサービス に戻ります。

[エンドポイント接続] タブにて、 Pending acceptance 状態となっているものが、先程作成したエンドポイントです。 [アクション > エンドポイント接続リクエストの承諾] を選択します。

img

「承諾」を入力しましょう。

img

Available 状態になればOKです。

img

接続確認

img

source 用に立てたインスタンスから接続できるか確かめてみます。 事前に VPCエンドポイントのDNS名 vpce-(xxx).vpce-svc-(xxx).ap-northeast-1.vpce.amazonaws.com をメモしておきましょう。

SSM Session Manager から curl http://${endpoint}/index.html を実行。 ターゲットに配置していたWebサーバからの応答が返ってきました。

img

(補足) DNS周りの追加設定

オプションで プライベートDNS名 を付けられます。 ※これは 2020年の以下アップデートで利用できるようになった機能です。

img

サービスのエンドポイントのプライベートDNS名 (例 onprem-server.example.com) を設定できます。 接続元からは、エンドポイント固有のホスト( vpce-(xxx).vpce-svc-(xxx).ap-northeast-1.vpce.amazonaws.com ) ではなくプライベートDNS名 (例 onprem-server.example.com)からサービスに接続できます。

実際の設定の流れは以下の通りです。

  1. 「プライベートDNS名を有効化」した エンドポイントサービスを作成する
  2. パブリックホストゾーンに 指定されたTXTレコード を登録する
  3. プライベートDNS名が無効の状態 のエンドポイントを作成して、承諾される
  4. エンドポイントの設定を変更して プライベートDNS名を有効化する

以降でそれぞれのステップの概要をざっと説明します。

1. エンドポイントサービスの作成

エンドポイント作成時に、以下の「追加設定」で [プライベートDNS名をサービスに関連付ける] を選択して、 希望のDNS名を入力しましょう。

img

エンドポイント作成後の 「ドメインの検証名」 および 「ドメインの検証値」 をメモしておきましょう。

img

2. TXTレコードの登録

先程メモした 「ドメインの検証名」 および 「ドメインの検証値」 を使って TXTレコードを登録しましょう。

img

しばらく待って、エンドポイントサービスの 「ドメインの検証ステータス」が Verified になればOKです。

img

3. エンドポイントの作成

エンドポイントを新規作成するときは [DNS名を有効化] にチェックを入れずに 作成しましょう。 エンドポイントが 承諾された後でないと プライベートDNS名を有効にできないからです。

img

4. プライベートDNS名の有効化

エンドポイントを承諾して利用できるようになったら、 エンドポイントの設定を変更します。

エンドポイントを選択して [アクション > プライベートDNS名を変更] を選択します。

img

[プライベートDNS名を有効化] にチェックを入れて [変更を保存] します。

img

これで設定完了です。 以下のようにプライベートDNS名で接続を確認できました。

img

おわりに

PrivateLink + NLBを使って DX未接続のVPCからオンプレターゲットへの 通信を行ってみました。 本パターンは以下を満たす場合に活用できるでしょう。

  • オンプレとVPC間で CIDR 重複を許容した通信を行いたい

どなたかの参考になれば幸いです。

参考