LoginSignup
15
9

Azure App Service の VNet 統合 を試す!!(半閉域化)

Last updated at Posted at 2024-02-07

こんにちは、アーキテクトのやまぱんです。
今回は Azure App Service の VNet 統合を試してみたいと思います。
(とはいっても結構まえに試しており、記事執筆開始時点ですでに環境はないですが、放流します)

補足コメントや質問、いいね、拡散、是非お願いします🥺!
間違ってたら優しく教えてください!

ちなみに Private Endpoint を試した記事はこちらになります。

まえおき

Azure App Service とは

言わずもがな、 Azure を代表する PaaS サービスです。
マネージドはウェブアプリホスティングサービスです。
スケーラビリティやCICD連携などの機能もあってイチオシです

  • 公式ドキュメントはこちら

  • 内部的な仕組みはこちら

  • 日本マイクロソフトの公式 Youtube はこちら
    Azure といえば PaaS ですよ!!!!!!

VNet 統合 (VNet Integration) とは

Azure App Service をはじめ、PaaS サービスは基本的にパブリック IP がデフォルトで存在し、パブリックIP を通して通信するようになっています。
VNet 統合を利用することで PaaS サービスが VNet へアクセスできるようにする機能です。
VNet とは Azure 上のユーザーのプライベートネットワーク空間です。

Azure App Service における VNet 統合 (VNet Integration) とは

まず、ポイントとして、Azure App Service は 送信用の IP と受信用の IP があります。
Azure Portal → Azure App Service の概要のページでは以下のように確認できます。
 仮想IPアドレスが受信用のアドレス、送信IPアドレスがそのまま送信用のアドレスです。
image.png

このことは下記のあたりに記載されています。
https://qiita.com/mym/items/1d364c0251daf88d417d#%E3%83%91%E3%83%96%E3%83%AA%E3%83%83%E3%82%AF-vip

そして、VNet 統合は PaaS から VNet への通信 (つまりプライベートIPでの通信)を可能にするものです。
なので、VNet 統合を使って、VNet から PaaS への通信をプライベートな通信にすることはできません。 その際には Private Endpoint を使います。とっても大事です。

VNet 統合 (VNet Integration) と Private Endpoint と Service Endpoint

ここで 似たような名前の Service Endpoint も入れて、VNet 統合 と Private Endpoint の違いを簡単に表にしておさらいします。

名前 対象の通信 プライベート IP かパブリック IP か
VNet 統合 PaaS → VNet 宛先・送信元ともに プライベートIP
Private Endpoint VNet → PaaS 宛先・送信元ともに プライベートIP
Service Endpoint VNet → PaaS 宛先はパブリック IP / 送信元はプライベートIP

その他、Private Endpoint と Service Endpoint の詳しい違いについては下記を参考にしてください。

Azure App Service の VNet 統合 を試してみる

フリーハンドな絵で大変大変恐縮ですが、太線の Azure App Service からVNet(Azure VM)への通信を今回 VNet 統合によって実現させて、実際に確認してみます。
細線部分は VNet 統合前の Public IP を使った経路です。
image.png

準備

・Ubuntu + python3 で Web サーバー を立ち上げておきます。

簡易Webサーバー構築手順
# "www"という名前のディレクトリを作成します。
mkdir www
# "www"ディレクトリに移動します。  
cd www  
# "index.html"という名前のファイルを作成します。これは後で作成するウェブページのメインのHTMLファイルです。
touch index.html  
# "index.html"ファイルに"<h2>Hello yamapan test page</h2>"というHTMLコードを書き込みます。
echo "<h2>Hello yamapan test page</h2>" > index.html  
# "index.html"ファイルの内容を表示します。これにより、"Hello yamapan test page"というテキストが含まれることが確認できます。
cat index.html  
# 現在のディレクトリ(wwwディレクトリ)をルートとするHTTPサーバーをポート80で立ち上げます。
sudo python3 -m http.server 80  

image.png
*Hello のスペルが間違ってますが、今回の検証には問題ではないので気にせず進めます。👌
Public IP アドレスは 52.140.204.171です。
Private IP アドレスは 10.0.0.4です。

・Azure VM が属する VNet に事前にVNet 統合用の空のサブネット"Subnet-AppInteg" を構成済み。後ほどVNet 統合する際にサブネット委任する必要があり、そこで利用します。
作成していない場合は作成してください。

・デフォルトの設定で App Service は構築済
味気ないですが今回はこのまま Go 😀
image.png

デフォルトのパブリックアクセス

App Service では、App Service に Azure Portal 経由で SSH 接続することができます。
これを使ってまず、VNet 統合を構成する前の状態で Azure VM への通信を見ていきます。

  • App Service 側 から Azure VM の Pubic IPへ curl
curl -i http://52.140.204.171

image.png

Webサーバ側確認、App Service の アウトバウンド 用の Public IP 20.27.133.99 を使ってAzure VM (Webサーバ) にアクセスしてることが分かります。

image.png

ちなみにこれは、 "Azure App Service" → "ネットワーク" から確認できる送信トラフィックの構成-送信アドレス に記載されている IP アドレスに含まれます。
image.png

この Azure VM へのアクセスが Public IP ではなく Private IP からアクセスできるようになれば OK 🤞それを今回は確認します。

VNet 統合 (VNet Integration) の構成

ここから VNet 統合していきます。
事前にVNet 統合用の空のサブネット"Subnet-AppInteg" を構成済みです。

image.png

ここで準備しておいた空の Subnet "Subnet-AppInteg" を選択します。
メッセージが出ているように空の Subnet でないと指定できません。

そして、「接続」をクリック!!!
image.png

image.png

数秒で完了し、下記のような画面になります。

image.png
今回はこんな感じです。

VNet 統合の送信インターネット トラフィック について
image.png

  • 上記にチェックを入れている場合:VNet側にインターネットへのアウトバウンドもルーティングされるので疎通不可 → VNet(NSGなど)で通信制御できる
  • 上記にチェックを入れていない場合:VNet側にインターネットへのアウトバウンドはルーティングされず、直接インターネットに抜けるので疎通可能 → 制御できない

ここで対象のVNetを確認してみましょう。👍
サブネット:Subnet-AppInteg がAzure App Serviceに委任されていることが分かります。
これがいわゆる サブネットの委任 ってやつですね。

image.png

VNet統合環境でのプライベートアクセス

では App Service から Webサーバへ Private IP で curl してみましょう。
先ほど実施したように、Azure Portal からブラウザ越しにSSHして curl してみます。

curl http://10.0.0.4

下記の通りPrivate IPで通信できていることが分かります。
期待通りの結果!!
image.png

Webサーバ側 でも Private IP からのアクセスが記録されていることが確認できます。
image.png

参考

VNet 統合に関する詳細は下記をご確認ください。

仮想ネットワーク統合を使っている場合は、次の Azure ネットワーク機能を使用できます。
ネットワーク セキュリティ グループ (NSG) :統合サブネットに配置された NSG を使って送信トラフィックをブロックできます。 仮想ネットワーク統合を使ってアプリへの受信アクセスを提供することはできないため、受信規則は適用されません。
ルート テーブル (UDR) :統合サブネット上にルート テーブルを配置して、必要な場所に送信トラフィックを送信できます。
NAT ゲートウェイ: NAT ゲートウェイを使うと、専用の送信 IP を取得し、SNAT ポートの枯渇を軽減できます。

本件に関連するAzure App Service の Private Endpoint の内容を下記動画で解説してくれています。

そもそも前提として、Azure App Service のインフラ周りについてはこちらを確認していただけるとよいかと思います。
https://www.youtube.com/watch?v=lun-KPAHvi4&list=PLQEKit6tfVVI6cl89K8rQ2gkW8dpbOCML&index=6

あとがき

ということで Azure App Service のアウトバウンド通信を制御、Private IP 経由 (VNet経由)にすることができました。
しかし~!このままでは Azure App Service へのインバウンド通信は Public IP 経由の経路しかありませんす。

なのでつづいて、Azure App Service へのインバウンド通信を VNet からPrivate I P経由にしてみましょう。
つまり Private Endpoint を利用して、完全閉域化してみましょう、、、これはまたオイオイ書きたいと思います。(オイオイ!

15
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
9