VNet統合、プライベートエンドポイント、サービスエンドポイントについて(App Service、Azure Database)
前書き
弊社ではAWSを用いた開発をメインで行っておりますが、ChatGPTを用いたプロダクトの提供に伴い、お客様からAzure OpenAIかつAzureでの開発を要望される機会が増えました。
Azureでは、以下のようにWeb App for Containers(以降、App Service )とAzure Database for PostgreSQL(以降、DB)を利用した構成を取ったのですが、特に、VNet統合とプライベートエンドポイントの使い方がApp ServiceとDBで異なり、頭がこんがらがったので整理しました。
※ 目下Azureと格闘中なので、正確でない情報があるかもしれません。適宜、修正させていただきます。
まとめ
- こんがらがる原因は、App ServiceとDBでVNet統合とプライベートエンドポイントの使い方が違うため!
- App Serviceにおいては、VNet統合とプライベートエンドポイントは両立するもの
- VNet統合で、VNET内にあるリソース(VNET内のプライベートIP)にアクセスできるようにする。(=送信トラフィックの制御)
- プライベートエンドポイントで、内部ネットワークからアクセスできる(=NIC=プライベートIPを設定)ようにする。その際、パブリックアクセスも共存できる。(=受信トラフィックの制御)
- DBにおいては、VNet統合か、プライベートエンドポイントはどちらか選択するもの
- VNet内からのみアクセスする場合はVNET統合で、パブリックからもアクセスが想定される場合はパブリックアクセスを有効にした上で、プライベートエンドポイントを利用
- VNet統合 = パブリックなアクセスは全て拒否(プライベートIPのみ作成され、パブリックIPは作成されない)
- VNet統合でパブリックアクセスさせる場合は、ロードバランサーを前において、パブリックからアクセスできるようにする
- プライベートエンドポイントを使うケース(パブリックIPと別に、プライベートIPを作成)
- パブリックなアクセス(パブリックIP)はファイアーウォールで制御して、プライベートなアクセス(プライベートIP)はプライベートエンドポイント経由でアクセス
- VNet統合 = パブリックなアクセスは全て拒否(プライベートIPのみ作成され、パブリックIPは作成されない)
- VNet内からのみアクセスする場合はVNET統合で、パブリックからもアクセスが想定される場合はパブリックアクセスを有効にした上で、プライベートエンドポイントを利用
- サービスエンドポイント
- PaaSのパブリックIPに対して、インターネットを経由せずに、Azureのバックボーンネットワーク上で最適化されたルートで接続するのがサービスエンドポイント。しかし、Microsoftではよりセキュアな接続方法として、プライベートエンドポイントの利用が推奨されている。ただし、サービスエンドポイントは無料の一方で、プライベートリンクについては、データ通信量とエンドポイント自体への費用がかかる。
App Serviceでのアクセス制限について
AppServiceのネットワークを見ると以下のように受信トラフィックと送信トラフィックで記載が分かれているのが分かります。
VNet統合
App Service のアプリは、ワーカーロール上でホストされます。 仮想ネットワーク統合は、委任されたサブネット内のアドレスを持つ仮想インターフェースをワーカーロールにマウントすることで機能します。 使われる仮想インターフェイスは、顧客が直接アクセスできるリソースではありません。 統合元のアドレスはお使いの仮想ネットワーク内にあるため、仮想ネットワーク内の VM と同じように、仮想ネットワーク内に存在するか、仮想ネットワークを経由してアクセスできるほとんどのものに、アクセスできます。
デフォルトではワーカーロールという作成したVNetとは異なるネットワーク上に作成され、その状態ではVNet内に作成した各リソースにはアクセスできません。VNet統合をすることで、VNet内のプライベートIPに対してアクセスすることができるようになります。
ただし、VNet統合は送信トラフィックのみのため、VNet内のリソースからAppServiceへのアクセスはできません。
プライベートエンドポイント
プライベート エンドポイントは、仮想ネットワーク内のサブネットにある App Service アプリ用の特別なネットワーク インターフェイス (NIC) です。 アプリ用のプライベート エンドポイントを作成すると、プライベート ネットワーク上のクライアントとアプリ間の安全な接続が提供されます。 プライベート エンドポイントには、仮想ネットワークの IP アドレスの範囲から IP アドレスが割り当てられます。 プライベート エンドポイントとアプリ間の接続には、セキュリティで保護された Private Link が使用されます。 プライベート エンドポイントは、アプリへの受信トラフィックにのみ使用されます。 このプライベート エンドポイントは、送信トラフィックには使用されません。 仮想ネットワーク統合機能を使用して、別のサブネット内のネットワークに送信トラフィックを挿入できます。
プライベートエンドポイントを作成(=NIC=プライベートIPを設定)することで、仮想ネットワーク内のリソースからAppServiceへのアクセスや、ピアリングされた社内環境やオンプレミスからのアクセスなどが可能となります。
トラフィックが App Service に達すると、最初に、そのトラフィックがプライベート エンドポイントから送信されたのか、または既定のエンドポイントを経由しているのかが評価されます。
注意点として、プライベートエンドポイントを設定しても、パブリックなアクセスは制御されるわけではないので、プライベートに閉じたい場合は明示的に拒否が必要です。
DBでのアクセス制限について
Azure Database for PostgreSQL - フレキシブル サーバーでは、フレキシブル サーバーに接続するために、同時に使用できないネットワーク接続方法が 2 種類サポートされています。 次の 2 つのオプションがあります。
- パブリック アクセス (許可された IP アドレス)。 この方法は、プレビュー段階の Azure Database for PostgreSQL - フレキシブル サーバーを使用した Private Link ベースのネットワークを使用すると、さらなるセキュリティ強化が可能です。
- プライベート アクセス (VNet 統合)
DBの作成時のネットワーク項目を見ると、以下のようにパブリックアクセスかプライベートアクセス(VNet統合)を選択する画面となります。
DBでは送信トラフィック、受信トラフィックに紐づいてVNet統合、プライベートリンクが利用されるわけではなく、「同時に使用できないネットワーク接続方法が 2 種類」のオプションという形で両者が利用されています。
VNet統合
フレキシブル サーバーは、VNet インジェクションを使用して Azure 仮想ネットワーク (VNet) にデプロイできます。 Azure の仮想ネットワークでは、非公開の、セキュリティで保護されたネットワーク通信が提供されます。 仮想ネットワーク内のリソースは、このネットワークで割り当てられたプライベート IP アドレスを介して通信できます。
VNet統合ではVNetに割り当てられたプライベートIPアドレスを介して通信を行います。インターネット経由でアクセスできるパブリック エンドポイントを持たないため、パブリックアクセスも想定される場合は、パブリックアクセスのオプションにした上で、プライベートリンクで内部ネットワークからのアクセスを行う必要があります。
プライベートエンドポイント
Azure Private Link を使用すると、Azure Database for PostgreSQL - フレキシブル サーバーのプライベート エンドポイントを作成して Virtual Network (VNET) 内に取り入れることができます。
プライベート エンドポイントからは、Azure サービスでプライベート アクセスできる IP アドレスが提供されますが、必ずしもパブリックネットワークアクセスを制限する必要はありません。
パブリックアクセスを許可した際のオプションとしてプライベートエンドポイントの設定があります。こちらを利用することで、VNet内からのアクセスを行うことができます。ただし、もともとのパブリックネットワークアクセスは許可されたままなので、適切に制御する必要があります。
サービスエンドポイント
仮想ネットワーク (VNet) サービス エンドポイントでは、Azure のバックボーン ネットワーク上で最適化されたルートを介して、Azure サービスに安全に直接接続できます。 エンドポイントを使用することで、重要な Azure サービス リソースへのアクセスを仮想ネットワークのみに限定することができます。 サービス エンドポイントを使用すると、VNet 内のプライベート IP アドレスは、VNet 上のパブリック IP アドレスを必要とせずに、Azure サービスのエンドポイントに接続できます。
Microsoft では、Azure プラットフォームでホストされているサービスへのセキュリティで保護されたプライベート アクセスには、Azure Private Link とプライベート エンドポイントを使用することをお勧めします。
PaaSのパブリックIPに対して、インターネットを経由せずに、Azureのバックボーンネットワーク上で最適化されたルートで接続することができます。しかし、Microsoftではよりセキュアな接続方法として、プライベートエンドポイントの利用を推奨しています。ただし、サービスエンドポイントは無料の一方で、プライベートリンクについては、データ通信量とエンドポイント自体への費用がかかります。
より詳しい比較についてはこちらの記事をご参照ください。
どなたかのお役に立てれば幸いです!
アルサーガパートナーズ株式会社のエンジニアによるテックブログです。11月14(木)20時〜 エンジニア向けセミナーを開催!詳細とご応募は👉️ arsaga.jp/news/pressrelease-cheer-up-project-november-20241114/
Discussion
このあたり調べていて記事にたどり着きました!素晴らしい記事をありがとうございます。
私もこのあたり勉強中なのですが、参考になりそうな記事をシェアさせて頂きます。
余計なお世話だったらすみません!
・Azure の バックボーン通信について
私の記事ですが、Service Endpoint 使わなくてもバックボーン通信にはなりますってことだけ。。・サービス エンドポイントとプライベート エンドポイントの違い
Azure Network サポートの方がわかりやすくまとめてくれています!・[日本語訳] Inside the Azure App Service Architecture
Azure App Service 周りで 入口と出口がちがうよっていうことについて、書かれてます。yamapan さん
コメントいただきありがとうございます!大変励みになります。
参考記事について、yamapanさんの記事含めて拝見しましたが、大変参考になりました🙏
AzureのPaaSになかなか苦労しているのですが、少し仲良くなれた気がします笑
ありがとうございます!