Private Link Service で VNET のアドレス空間の重複を許したサービス連携を行う
はじめに
Azure Private Link Service とは、Azure Standard Load Balancer の背後で実行されている独自のサービスが存在する場合に、 Azure Load Balancer の Private Link アクセスを有効にすることで、Virtual Network 内からのアクセスを可能にするというものになります。公式ドキュメント[1] に記載の一般的な構成は以下です。
この場合、サービスのコンシューマーが存在する Virtual Network との間に VNET ピアリングは不要であり、独自サービス側とのアドレス空間の重複が可能です。よって、公式ドキュメント[2] においても、IPv4 枯渇の防止の文脈で参照されている機能となります。
本記事では、こちらの機能を試してみます。
構成
アーキテクチャ
シンプルに以下のような構成とします。あえてアドレス空間を重複させた Virtual Network を用意し、プロバイダー 側では単純な Web アプリケーションをホストします。
実装
Virtuak Network / VM / NSG
Virtual Network および VM についてはアーキテクチャ図に合うようにデプロイします。プロバイダー 側の Virtual Network には、Private Link Service 利用時の SNAT される IP 帯として利用するアドレス空間として、サブネットを払い出しておきます。NSG はデフォルトのまま作成し、それぞれのサブネットに割り当てておきます。
Azure Standard Load Balancer
Load Balancer については以下のような設定で作成します。バックエンドプールには、コンシューマー 側の VM を追加します。
Private Link Service の構成
[Private Link センター] から [プライベートリンクサービス] を追加します。
Load Balancer を選択し、以下のような設定を入れていきます。
[アクセスセキュリティ] の項目では、アクセス権の要求が可能な範囲を選択できます。ここでは最も制限の緩い[お客様のエイリアスを持つすべてのユーザー] としています。エイリアス[4] は Private Link Service を作成すると払い出される GUID 付きの別名となります。この別名をコンシューマーと共有することで、コンシューマー側から接続要求を上げることが可能となります。接続要求に対して自動承認をしたい場合には、対象のサブスクリプションも設定しておきます。
設定を入力したらデプロイします。
暫く待つと、[プライベートリンクサービス] のリソースが作成されるため管理画面にアクセスします。ここから、コンシューマーの Virtual Network に対する Private Endpoint を作成します。
Private Endpoint を作成するのはコンシューマ側の Virtual Network なので、そちらを選択します。あとは既定値で作成します。
接続テスト
コンシューマー側の Virtual Network にデプロイした Windows VM から Private Endpoint の IP に対して HTTP アクセスしてみます。すると、Azure Standard Load Balancer のバックエンドプール内の VM で実行されている Apache のページが表示されました。
プロバイダー側の NSG では、コンシューマー側の IP レンジを許可していないのですが、アクセスができました。これは、SNAT されて プロバイダー側のサブネットから通信が来ているように見えているからですね。
Private DNS Zone に A レコードを追加して、FQDN でアクセスしてみます。
もちろんアクセスできますね。
おまけ
この構成は、VNET ピアリングをしているわけではないため、プロバイダー側からコンシューマー側の Virtual Network は見えません。よってあくまでサービス提供を前提としています。逆方向の通信が必要な場合には、パターンとして以下のようなものも提案されています。詳細はドキュメント[5] をご参照ください。
おわり
- プロバイダーがコンシューマーにサービスを提供するシナリオで用いられる Private Link Service を試してみた。
- プロバイダー側とコンシューマー側の Virtual Network の IP 帯が重複していても動作するため、組織内でこの構造が取れる場合には IP アドレスの節約のために利用することも可能だということが改めて分かった。
- 「A 部署が作ったサービスを B 部署に提供している」というシナリオでは活用してもよさそう。
-
https://learn.microsoft.com/ja-jp/azure/private-link/private-link-service-overview ↩︎
-
https://learn.microsoft.com/ja-jp/azure/architecture/guide/networking/ipv4-exhaustion ↩︎
-
https://learn.microsoft.com/ja-jp/azure/private-link/private-link-service-overview#create-your-private-link-service ↩︎
-
https://learn.microsoft.com/ja-jp/azure/private-link/private-link-service-overview#alias ↩︎
-
https://learn.microsoft.com/ja-jp/azure/architecture/guide/networking/ipv4-exhaustion#use-a-private-link-service-for-outbound-dependencies ↩︎
Discussion