Private Endpoint が有効な(パブリックネットワークアクセスが無効な) App Service に デプロイを行う方法


# はじめに

App Service において Private Endpoint を有効にし、パブリックネットワークアクセスを無効にすることができます。
本稿では、パブリックネットワークアクセスが無効なリソースにデプロイする方法を記します。

##  App Service/Azure Functions に Private Endpoint を有効にするとどうなるのか

https://learn.microsoft.com/ja-jp/azure/app-service/overview-access-restrictions#how-it-works

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4914/ee63d0f9-06ed-1680-6605-dfb89cad3509.png)

> トラフィックが App Service に達すると、最初にトラフィックがプライベート エンドポイントから送信されたか、既定のエンドポイントを経由しているかどうかを評価します。 トラフィックがプライベート エンドポイントを介して送信される場合、制限なしで直接サイトに送信されます。 プライベート エンドポイントに対する制限は、ネットワーク セキュリティ グループを使用して構成されます。
>
> トラフィックが既定のエンドポイント (多くの場合、パブリック エンドポイント) を介して送信される場合、トラフィックは最初にサイト アクセス レベルで評価されます。 ここでは、アクセスを有効または無効にすることができます。 サイト アクセスが有効になっている場合、トラフィックはアプリのアクセス レベルで評価されます。 どのアプリでも、メイン サイトと高度なツール サイト (scm または kudu サイトとも呼ばれます) の両方があります。 サイトごとに一連のアクセス制限規則を構成するオプションがあります。 ルールが一致しない場合は、動作を指定することもできます。

上記の通り、2023年02月時点では、「Private Endpoint を有効にする」という操作は必ずしも、「パブリックネットワークアクセスを無効にする」と同義ではありません。
ただし以前は、App Service/Azure Functions において、「Private Endpoint を有効にする」という操作は、「パブリックネットワークアクセスを無効にする」という操作も含んでいました。

ドキュメントは以下のように変更されています。

https://github.com/MicrosoftDocs/azure-docs/commit/7f63149a761c676c48853028eed8649c82a8e7ae

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4914/dfb027ca-8699-a7cf-4aca-e811c74d0f17.png)

これはどういうことかというと、パブリックネットワークアクセスを制御するためのプロパティとして、`Microsoft.Web/sites/publicNetworkAccess` が API の Spec として `2022-03-01` より登場している。 

https://github.com/Azure/azure-rest-api-specs/blob/main/specification/web/resource-manager/Microsoft.Web/stable/2022-03-01/WebApps.json#L28837-L28840

https://github.com/Azure/azure-rest-api-specs/blob/main/specification/web/resource-manager/Microsoft.Web/stable/2021-03-01/WebApps.json

また、ポータル上でも該当のプロパティを作成時や、作成後に変更できるようになっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4914/cb92c670-6f4f-578b-64ba-d4ff2f024f95.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4914/9427abfb-de46-7b21-88a3-b327e09453e1.png)



そのため、必ずしも「Private Endpoint が有効な状態」は「パブリックネットワークアクセスが無効な状態」ではありませんが、以前から存在するリソースなど、また Private Endpoint を有効にする意義などから「Private Endpoint が有効な状態」かつ「パブリックネットワークアクセスが無効な状態」としている環境は多いものと考えられます。


### パブリックネットワークアクセスに関するポリシー

パブリックネットワークアクセスを無効にするポリシーも存在する。

https://learn.microsoft.com/ja-jp/azure/app-service/policy-reference

ポリシーの定義から、パブリックアクセスの制御は、`Microsoft.Web/sites/publicNetworkAccess` (スロット環境の場合は `Microsoft.Web/sites/slots/publicNetworkAccess`) というプロパティで制御されている事がわかる。

https://github.com/Azure/azure-policy/blob/master/built-in-policies/policyDefinitions/App%20Service/AppService_WebApp_PublicNetworkAccess_Audit.json

https://github.com/Azure/azure-policy/blob/master/built-in-policies/policyDefinitions/App%20Service/AppService_WebApp_Slot_PublicNetworkAccess_Audit.json


# 回避方法

## Option 1. Priavte Endpoint にアクセス可能な VNet 内からデプロイを行う

https://qiita.com/georgeOsdDev@github/items/59047759c985f44affb0

## Option 1-1. Priavte Endpoint にアクセス可能な Container Apps Jobs で GitHub Action Self Hosted Runner を利用してデプロイする

https://qiita.com/georgeOsdDev@github/items/52baf8713f434a9d02eb

## Option 2. 高度なアクセス制限を用いて、Kudu サイトへのパブリックアクセスを許可する

https://qiita.com/georgeOsdDev@github/items/9e6d37f939df1fdf701a

## Option 3. src URL を指定した zip デプロイ（あるいはパッケージからの実行）

https://qiita.com/georgeOsdDev@github/items/9d9a2a16e0fefc44d53b

## Option 4. カスタムコンテナの利用

https://qiita.com/georgeOsdDev@github/items/1810b3ab4ee586d0f8d9

# その他の注意事項

Kudu の動作において、Kudu から Kudu 自身や Functions Host が提供する API にアウトバウンド通信を行うことがあります。
「パブリックネットワークアクセスが無効な状態」の場合において、Kudu が適切に Private Endpoint を利用できない場合これらの API 呼び出しが行えなくなります。

といったことを別記事で記載したらリンク追記します。