Azure App Service の Private Endpoint を試す！！(半閉域化)

こんにちは、アーキテクトのやまぱんです。
補足コメントや質問、<font color="red">いいね、拡散</font>、是非お願いします🥺！
間違ってたら<font color="red">優しく</font>教えてください！

以前下記の記事を書きました。
今回はその続きです！！ **前回のと合わせて完全閉域化となります。**
ただし、順序はどちらから実施して頂いても構いません。

https://qiita.com/aktsmm/items/e3867d02202cc10a49e3

続きとはいっても、環境は例のごとく作り直しています。

## おさらい
+ Azure App Service の閉域化は受信と送信それぞれを考える必要がある
+ 送信方向の閉域化 → VNet 統合 [前回実施済！]
+ 受信方向の閉域化 → Private Endpoint <font color="red">[今回実施]</font>

 似たような名前の Service Endpoint も入れて、VNet 統合 と Private Endpoint の違いを例のごとく以下に簡単に表にします。
|名前|対象の通信|プライベート IP かパブリック IP か|
|:-|:-:|:-|
|VNet 統合|PaaS → VNet|宛先・送信元ともに プライベートIP|
|Private Endpoint |<font color="red">VNet → PaaS </font>|宛先・送信元ともに プライベートIP|
|Service Endpoint |VNet → PaaS |宛先はパブリック IP / 送信元はプライベートIP|

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

https://jpaztech.github.io/blog/network/pe-difference-se/

今回は PaaS からみた受信方向の通信を閉域化、つまり Private Endpoint (プライベート エンドポイント) を構成します。

# Azure App Service の Private Endpoint を試してみる

前回に引き続き今回もフリーハンドなざっくりな絵で大変、大変恐縮ですが、「インターネット経由の Azure App Service へのインバウンド通信」を「プライベート エンドポイント経由(<font color="red" style="background-color: yellow;">**赤字の経路下側**</font>)」にして、実際にプライベートアクセスになっていることを確認してみます。
細線部分は Private Endpoint 構成前の インターネット経由 / Public IP を使った経路です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/a8cd0382-2faa-57fd-1cf7-bd27bc028bed.png)
## 前提
+ Azure App Service はデプロイ済み
+ Vnet統合 により、Azure App Service  → Azure VM 経路は閉域構成ができている前提
+ Free Plan では Private Endpoint を利用できないので、注意
> プライベート エンドポイントは、App Service プランの Basic、Standard、PremiumV2、PremiumV3、IsolatedV2、Functions Premium (Elastic Premium プランとも呼ばれています) でホストされている Windows および Linux のアプリ (コンテナー化されているかどうかにかかわらず) に使用できます。
ref : App Service アプリにプライベート エンドポイントを使用する
https://learn.microsoft.com/ja-jp/azure/app-service/networking/private-endpoint


## Azure App Service 準備
今回 Azure App Service にアクセスしたクライアントの IP アドレスを表示するように **IPアドレス確認くん**を構成しました。
こんな感じでアクセスするとクライアントの IP アドレスが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/682975f2-4421-953c-be9a-09bd7bc2dcdd.png)

URLは https://yamapantest.azurewebsites.net

構成手順は下記を参考にしてください。

https://qiita.com/aktsmm/items/51a1d7ad7029ff9b9a98


## デフォルトのパブリックアクセス
まずは Private Endpoint 構成前の Public IP から Azure App Service (**IPアドレス確認くん**) にアクセスしてみます。
Windows VM にPublic IP(172.207.230.209) 経由で RDP し、その環境から、Azure App Service へブラウザ経由でアクセス。
Azure App Service へも Public IP (172.207.230.209) でアクセスしていることが分かる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/70cafccb-3221-45fc-a8bb-fb5c43b7b324.png)

また、yamapantest.azurewebsites.net の名前解決の結果、**”13.78.106.96"** に解決されていることが分かりますね。


## Private Endpoint の構成
Azure App Service → ネットワーク → プライベート エンドポイント を確認。
ここで先ほど出てきた **IPアドレス：13.78.106.96** が Azure App Service の受信アドレスに表示されていることが確認来ます。
+ 「プライベート エンドポイント」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/4bc2c2db-eb6b-baa4-ea21-16ba8b0c9935.png)
+ Windows VM が存在する Vnet/Subnet を選択しよしなに設定を入れて【OK】を押します
なお、今回は**あえてプライベート DNSゾーン とは統合しません**が、検証簡略化するのであれば入れても構いません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/7bd8b69d-6603-9e3c-b914-cca734fb6dc7.png)

作成されたプライベート エンドポイントを確認し、NIC をたどり、割り当てられている Private IP を確認します。 **10.0.0.6** 、Windows VM が存在する ネットワーク 10.0.0.0/24 内の IP アドレスが正しく割り当てられていることが分かります。

+ Azure App Service のプライベート エンドポイント IP：**10.0.0.6**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/19456932-a6f9-f592-2d11-2e2268f71ed8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/3a17166c-193a-aa52-ab95-84e702c1441f.png)

## プライベート エンドポイント経由でアクセスその１
では早速、Azure App Service のプライベート エンドポイント IP、**10.0.0.6** にアクセスしてみましょう。

はい、こんな感じで IP アドレス直打ちだとアクセスできません。
正確には L4 レベルでは疎通が取れている(プライベート エンドポイント経由になっているといえる)し、Azure App Serviceのエラー画面が出ているので Azure App Service 自体へのアクセスできるともいえますが、想定した画面になりません。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/02fd1175-8ae5-a246-cf75-22e2171251fc.png)

:::note
Azure App Service は IP アドレスを他のインスタンスとも共有しているので IP だけではアクセスできないようになっています。
:::
ちなみにこの状態であれば、対象の VM から、yamapantest.azurewebsites.net 宛で、インターネット経由でアクセスすることは可能です。(DNS ゾーン統合していないので、名前解決をするとプライベートIP ではなくパブリック IP アドレスに解決されるため。)

## プライベート エンドポイント経由でアクセスその２
キチンと表示されるために、今回は hosts ファイルを使います。
DNS on VM を立てても、PaaS サービスの Private DNS ゾーンにレコードを登録してもよいですが、今回は **hosts ファイルを編集**します。

■ hosts ファイル編集
> + Win + X → A で管理者権限で PowerShell を起動
> + "C:\windows\system32\drivers\etc\hosts" を貼り付けてエンターを押し、メモ帳を起動
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/925c60bb-33de-0abf-9b52-16b9395481b4.png)
> + Azure App Service のホスト名とプライベート エンドポイントのIPを入れる、追記する
今回はこんな感じ。
> 10.0.0.6	yamapantest.azurewebsites.net
> 
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/36b1b82b-1b43-0eac-4309-cd712716ee65.png)
> + 追記したら　Ctrl ＋ S で上書き保存

完了したら、ホスト名 URL でアクセスします。
以下の通り、無事 Windows VM の Private IP (**10.0.0.5**) から Azure App Service のプライベート エンドポイント(**10.0.0.6**)へアクセスできていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/1d9b239a-b7bc-2c09-183a-ffe0e52265bd.png)


:::note info
ちなみに今回は hosts ファイルを編集したので、名前解決の結果は変わらず、グローバル IP が返って来ています。
プライベート DNS 統合したり、プライベート DNS ゾーンを使ってレコードを登録して正しく参照されている場合は名前解決の結果もプライベート IP になるはずです。
:::

## 不要なインバウンド通信を絞る
プライベート エンドポイントが構成できましたが、これだけでは Public IP 経由のアクセスも可能な状態です。
例えば今回の場合、下記のように設定することでプライベート エンドポイント経由以外のアクセスを遮断することができ、理論上閉域化が可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/8ee9ab7b-6349-4cc5-f4be-ab589446a309.png)


一応確認してみましょう！！
試しにこの状態では手元の端末からの Public IP / インターネット経由でのアクセスは不可能になります。(L4 レベルでは通信できているのでAzure App Serviceの画面が表示されるが、L7 レベルで弾かれているので目的のIPアドレス確認くんの画面が表示されない。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/1f907a94-56d4-a7fa-e63e-4d32350bb86c.png)



# 参考
Azure App Service の Private Endpoint の内容を下記動画で解説してくれています。

https://www.youtube.com/watch?v=ekZfLqEnI4I


そもそも前提として、Azure App Service のインフラ周りについてはこちらを確認していただけるとよいかと思います。

https://www.youtube.com/watch?v=lun-KPAHvi4&list=PLQEKit6tfVVI6cl89K8rQ2gkW8dpbOCML&index=6