Power Platform の Azure Virtual Network サポート (サブネット委任)

:::note info
2024/07/05 別々のユーザーで作業する方法を追記
2024/07/25 ARM テンプレートを使った Enterprise Policy の作成と Power Platform 管理センターからの設定方法を追記
2024/08/01 ライセンス要件を削除
2024/08/30 シングルVNet の記載を削除
2024/09/19 GA の記載を追記
:::

Power Platform の Azure Virtual Network サポート (サブネット委任) が~~パブリックプレビュー~~ GA となっています。この機能を使うことで　Power Platform から Azure の仮想ネットワークに閉じた環境へ接続できるようになります。
以前からオンプレミスデータゲートウェイを利用することで Azure 上の仮想ネットワーク上のリソースへの接続も実現できていましたが、Azure VM で構成する必要があり、[扱えるデータサイズに制限](https://learn.microsoft.com/ja-jp/data-integration/gateway/service-gateway-onprem#considerations)があったり、Azure 用のマネージドコネクタが使えない等の制限がありました。

https://learn.microsoft.com/ja-jp/azure/logic-apps/connect-on-premises-data-sources#supported-data-sources

この機能を利用することで Power Platform に仮想ネットワークのサブネットを委任できるようになり、オンプレミスデータゲートウェイを利用せずに、Azure の仮想ネットワーク上のリソース (仮想マシン、プライベートエンドポイント、ロードバランサー等) にアクセスできます。
設定手順や留意点等をまとめてみましたのでご利用の際はご一読いただければ幸いです。

https://learn.microsoft.com/ja-jp/power-platform/admin/vnet-support-overview

# Power Platform からの Azure へのアクセス経路
Power Platform から Azure へ接続するシナリオは様々なので、要件に応じて接続方法と利用するサービスを選ぶ必要があります。
以下によくある接続シナリオをまとめてみました。

| 接続サービス | ネットワーク | サポートされる主な Power Platform のサービス |
|:-----------|:------------|:------------|
| なし | パブリック |すべて |
| API Management  | パブリック | Power Automate, Power Apps |
| オンプレミスデータゲートウェイ  | プライベート (Azure からのアウトバウンド通信のみ) | Power Automate, Power Apps, Power BI |
| 仮想ネットワークデータゲートウェイ  | プライベート (Azure からのアウトバウンド通信のみ) | Microsoft Fabric |
| Azure VNet サポート (サブネット委任) | プライベート | Dataverse, Power Automate, Power Apps |

# Virtual Network サポートの構成図
以下のような構成で動作確認を行っています。20240412 時点ではなぜか私の環境では、日本で作成した環境がうまく動かなかったため、US の仮想ネットワークと Power Platform の環境を利用しています。<font color="Red">(20240521 時点で日本のマネージド環境でも動作することを確認。)</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/8860bf92-2871-2cc3-b1bb-91d8d60f0528.png)

# 考慮事項

- Azure の仮想ネットワークはペアリージョンも必要になる。日本であれば JapanEast, JapanWest、米国であれば EastUS, WestUS の両方のリージョンで作った仮想ネットワークが必要になる。
- パブリックのエンドポイントに接続する場合は、Azure Firewall や Nat Gateway を使いアウトバウンド接続をできるようにしておく必要あり。
- 一部のコネクタのみのサポート。サポートされているコネクタの一覧は[こちら。](https://learn.microsoft.com/en-us/power-platform/admin/vnet-support-overview#supported-services)
- サポートされていないコネクタを利用した場合はサブネットを経由せず、通常のネットワーク経路になる模様。
- Power Platfrom の環境単位でサブネット委任が反映されるため、既存の環境への適用は注意が必要。
- ~~ライセンス体系はこちら。~~
- マネージド環境が必要。

# Virtual Network サポートの設定手順

## 事前準備

- 構成図のように仮想ネットワーク、サブネットをそれぞれ作成しておく ※サブネット委任用の[サブネットサイズはこちらを確認](https://learn.microsoft.com/en-us/power-platform/admin/vnet-support-overview#estimating-subnet-size-for-power-platform-environments)
- 接続確認用に Azure OpenAI Service, Azure Storage, Azure SQL Database を作成しておく
- それぞれの PaaS でプライベートエンドポイントと Private DNS Zone を作成し、サブネット委任用の仮想ネットワークに Private DNS ゾーンをリンクしておく
- Azure サブスクリプションの管理者権限 (所有者、共同作成者等) で Microsoft.PowerPlatform の[リソースプロバイダーを登録しておく](https://learn.microsoft.com/ja-jp/power-platform/admin/vnet-support-setup-configure#register-microsoftpowerplatform-as-a-resource-provider)

## 1. 権限の付与

- 作業するユーザーに Azure, Power Platfrom 用の権限を付与します。スクリプト内で両方の環境を参照するため同一ユーザーでの作業が望ましいです。
- Azure / Power Platform で別々のユーザーで作業する場合は[こちら](https://qiita.com/Isato-Hiyama/items/08cdca65f2abad9f8757#azure--power-platform-%E3%81%A7%E5%88%A5%E3%80%85%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%A7%E4%BD%9C%E6%A5%AD%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88)。

| サービス | 必要な権限 |スコープ|備考|
|:-----------|:------------|:------------|:------------|
| Azure リソースプロバイダーの登録 | 管理者権限 (所有者、共同作成者等) |サブスクリプション|事前準備で実施|
| Azure サブネットの設定、ポリシーの作成| ネットワーク共同作成者, "Microsoft.Resources/deployments/validate/action", "Microsoft.PowerPlatform/enterprisePolicies/write", "Microsoft.PowerPlatform/enterprisePolicies/read" |リソースグループ|カスタムロールを使わない場合、"共同作成者" でも可|
| Power Platfrom | Power Plaftform 管理者 ||Entra ロール|

Azure 側の権限 (Azure Portal から設定) ※カスタムロールを使用しない場合の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/30239e44-d3e6-5cca-36b8-f599ec6a93b8.png)

Power Platform 側の権限 (Azure Portal の Entra ID から設定)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/bdf5374d-cc0d-2dcb-b92b-e416dfb78a78.png)

## 2. Azure 側の設定
### 2-1. クライアント端末の準備
Windows 端末で Azure Powershell と Power Platform の Powershell を使えるようにしておきます。

https://learn.microsoft.com/ja-jp/powershell/azure/install-azps-windows?view=azps-11.5.0&tabs=powershell&pivots=windows-psgallery

https://learn.microsoft.com/ja-jp/power-platform/admin/powerapps-powershell#module-installation

以下の Git のファイル群を Git Clone または Zip でダウンロードして端末に保存します。
https://github.com/microsoft/PowerApps-Samples

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/c2cc9e1a-0821-5a15-4ce0-1ba2fbe2ebdf.png)

ダウンロードした Zip を任意の場所に解凍します。

### 2-2. リソースプロバイダーの登録
**サブスクリプションの管理者権限**があるユーザーで Azure Portal にログインし、サブスクリプションのリソースプロバイダーの画面で "Microsoft.PowerPlatform" を選択し、登録をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/6a208e4a-e374-b0d1-2a8d-9496385bcf0a.png)

### 2-3. サブネットの委任設定
**ネットワーク共同作成者**があるユーザーで Azure Portal にログインし、EastUS に作成した仮想ネットワークのサブネット設定を開き、"サブネットをサービスに委任" で "Microsoft.PowerPlatform/enterprisePolicies" を選択し保存します。同様の設定を、WestUS に作成した作成した仮想ネットワークでも実施します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/8f2068ef-877c-c7aa-f286-55c6573ed2b4.png)

以下の公開情報ではスクリプトを使ってますが、上記手順でも設定可能です。

https://github.com/microsoft/PowerApps-Samples/tree/master/powershell/enterprisePolicies#1-setup-virtual-network-for-subnet-injection

### 2-4. Enterprise Policy の作成
Powershell または ARM テンプレートを使って Policy を作成します。

#### Powershell からの作成

Powershell でダウロードしたフォルダ内の "powershell\enterprisePolicies\SubnetInjection" のフォルダに移動します。

```
cd C:\xxxx\xxxx\PowerApps-Samples-master\powershell\enterprisePolicies\SubnetInjection
```

仮想ネットワークがあるサブスクリプションを指定します。
```
Update-AzConfig -DefaultSubscriptionForLogin cdf800d0-xxxx-xxxx-xxxx-2d72a5e63630
```

Enterprise Policy を作成するためのスクリプト (CreateSubnetInjectionEnterprisePolicy.ps1) を実行します。

| 項目 | 設定値 |備考|
|:-----------|:------------|:------------|
| subscriptionId | 仮想ネットワークがあるサブスクリプション ID |
| resourceGroup | ポリシーを配置するリソースグループ ||
| enterprisePolicyName | ポリシー名 | 
| enterprisePolicylocation | ポリシーを配置する国  | 例: japan,unitedstates |
| primaryVnetId | VNet の ID (プライマリ) | 例 : EastUS の VNet |
| primarySubnetName | サブネット委任用のサブネット名 (プライマリ) | 
| secondaryVnetId | VNet の ID (セカンダリ) | 例 : WestUS の VNet |
| secondarySubnetName | サブネット委任用のサブネット名 (セカンダリ)  | 

```
.\CreateSubnetInjectionEnterprisePolicy.ps1

cmdlet CreateSubnetInjectionEnterprisePolicy at command pipeline position 1
Supply values for the following parameters:
(Type !? for Help.)
subscriptionId: cdf800d0-xxxx-xxxx-xxxx-2d72a5e63630
resourceGroup: rg-spoke-ppsubnet-1
enterprisePolicyName: vnet-pptest-entpolicy-001
enterprisePolicylocation: unitedstates
primaryVnetId: /subscriptions/cdf800d0-xxxx-xxxx-xxxx-2d72a5e63630/resourceGroups/rg-spoke-ppsubnet-1/providers/Microsoft.Network/virtualNetworks/vnet-eus-pptest-001
primarySubnetName: PP-EUS-Subnet
secondaryVnetId: /subscriptions/cdf800d0-xxxx-xxxx-xxxx-2d72a5e63630/resourceGroups/rg-spoke-ppsubnet-1/providers/Microsoft.Network/virtualNetworks/vnet-wus-pptest-001
secondarySubnetName: PP-WUS-Subnet
```
[オプション] Powershell 実行時に以下のようなエラーが出た場合、Powershell の実行ポリシーを変更する必要があります。

<font color="Red">xxx is not digitally signed. You cannot run this script on the current system.</front>

上記のエラーが出た場合、以下のコマンドにて Powershell の実行ポリシーを変更します。
```
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
```

スクリプトが成功すると以下のように出力されます。
出力結果の **"ResourceId"** を後ほど使うためメモしておきます。
```
Logging In...
Logged In...
Creating Enterprise policy...
Subnet Injection Enterprise policy created
Policy created
{
    "ResourceId":  "/subscriptions/cdf800d0-xxxx-xxxx-xxxx-2d72a5e63630/resourceGroups/rg-spoke-ppsubnet-1/providers/Microsoft.PowerPlatform/enterprisePolicies/vnet-pptest-entpolicy-001",
    "Id":  "/subscriptions/cdf800d0-xxxx-xxxx-xxxx-2d72a5e63630/resourceGroups/rg-spoke-ppsubnet-1/providers/Microsoft.PowerPlatform/enterprisePolicies/vnet-pptest-entpolicy-001",
    "Identity":  null,
    "Kind":  "NetworkInjection",
    "Location":  "unitedstates",
    "ManagedBy":  null,
    "ResourceName":  "vnet-pptest-entpolicy-001",
    "Name":  "vnet-pptest-entpolicy-001",
~~省略~~
    "CreatedTime":  null,
    "ChangedTime":  null,
    "ETag":  null
}
```

#### ARM テンプレートでデプロイ

事前準備として利用する仮想ネットワークの "プロパティ" からリソース ID をコピーし、メモ帳に書いておきます。
サブネット名も書いておきます。

Azure Portal で "テンプレート" で検索し、"テンプレートのデプロイ" をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/90333813-326f-32db-ac18-e006aa004e86.png)

"エディターで独自のテンプレートを作成する" をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/31c3b0f8-79ae-44b9-78c3-39821ee32b38.png)

以下のテンプレートを貼り付けます。2VNet の構成に合わせてコピーします。

2VNet 構成用
```
{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "enterprisePolicies_policy_name": {
            "defaultValue": "subnetpolicy",
            "type": "String"
        },
        "virtualNetworks_vnet1_externalid": {
            "defaultValue": "/subscriptions/xxxxx/resourceGroups/rg-ppvnetsup-001/providers/Microsoft.Network/virtualNetworks/vnet-pptest-jpe-001",
            "type": "String"
        },
        "virtualNetworks_vnet2_externalid": {
            "defaultValue": "/subscriptions/xxxxx/resourceGroups/rg-ppvnetsup-001/providers/Microsoft.Network/virtualNetworks/vnet-ppfjpw-001",
            "type": "String"
        }
    },
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.PowerPlatform/enterprisePolicies",
            "apiVersion": "2020-10-30-preview",
            "name": "[parameters('enterprisePolicies_policy_name')]",
            "location": "japan",
            "kind": "NetworkInjection",
            "properties": {
                "healthStatus": "Undetermined",
                "networkInjection": {
                    "virtualNetworks": [
                        {
                            "id": "[parameters('virtualNetworks_vnet1_externalid')]",
                            "subnet": {
                                "name": "subnet1"
                            }
                        },
                        {
                            "id": "[parameters('virtualNetworks_vnet2_externalid')]",
                            "subnet": {
                                "name": "subnet2"
                            }
                        }
                    ]
                }
            }
        }
    ]
}
```

仮想ネットワークの "ポリシー名", "リソース ID", "Location", "サブネット名" を変更して "保存" します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/b7f95271-a5ba-4a8b-3b24-399458c71129.png)

サブスクリプションとリソースグループ(ポリシーが配置されるリソースグループ)を指定して、作成を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/84e48735-a017-fe8e-79c4-0682aa9c62cc.png)

サブネットの設定が完了しており、テンプレートに問題なければデプロイが成功するはずです。
成功したらリソースに移動して、リソース ID をコピーします。(次の手順でも GUI 使う場合は不要)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/d403414c-dd53-a76a-5df2-b91fab300636.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/088648f2-25a0-7f5f-25f2-3ce5599aaff4.png)


## 3.Power Platform 側の設定

### 3-1. 環境の作成

サブネット委任の設定は Power Platform の "環境" 単位で行われますので、検証用に新しく環境を作成します。
Power Platform 管理センターに同じユーザーでログインし、[環境] -> [新規] をクリックし、[名前]、[地域]、[種類] 等を適宜設定し、保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/a2c86a16-7892-206a-a5f3-80c81cd32456.png)

作成した環境を選択し、**"環境 ID"** をメモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/6e6884a0-5c82-6b99-943f-da243c417390.png)

作成した環境を選びマネージド環境を有効化しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/9129ab5e-0136-aa54-8cf6-247222f64059.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/4085b0a3-382a-9dc1-8cda-6060573869e9.png)

### 3-2. サブネット委任の設定実施
サブネット委任の設定は Powershell または Power Platform 管理センターのどちらからでも実施可能です。

#### Powershell での実施
サブネット委任を設定するための (NewSubnetInjection.ps1) を実行します。

environmentId は先ほどメモした、"環境ID"、policyArmId は先ほどメモした "ResourceId" です。
```
.\NewSubnetInjection.ps1

cmdlet NewSubnetInjection at command pipeline position 1
Supply values for the following parameters:
environmentId: 825cb1e0-xxxx-xxxx-b407-7a99fbd6e21a
policyArmId: /subscriptions/cdf800d0-xxxx-xxxx-xxxx-2d72a5e63630/resourceGroups/rg-spoke-ppsubnet-1/providers/Microsoft.PowerPlatform/enterprisePolicies/vnet-pptest-entpolicy-001
Logging In...
WARNING: The names of some imported commands from the module 'Microsoft.PowerApps.AuthModule' include unapproved verbs
that might make them less discoverable. To find the commands with unapproved verbs, run the Import-Module command again
 with the Verbose parameter. For a list of approved verbs, type Get-Verb.
Logged In...
Environment reterieved

Enterprise Policy reterieved

Linking of vnet policy started for environement 825cb1e0-7787-ee40-b407-7a99fbd6e21a
Do you want to poll the linking operation (y/n)

Polling the link operation every 5 seconds.
Operation finished with state Succeeded
```

Power Platform 管理センターから該当の環境を開き、最近の操作にて "New Network Injection Policy" の状態が "成功" となっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/d75712ec-ba75-f6c5-3df8-f25616fa633b.png)

#### Power Platform 管理センターからの実施

Power Platform 管理センターに Power Platform 管理者でログインし、Security -> Network Security -> Azure Virtual Network をクリックして、対象の環境を選択し、Next をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/2f1453ac-bfb3-9c45-2b22-49e8b438bdb6.png)

対象のポリシーを選んで、Save をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/241cf11f-661f-a577-4bb7-15865f65d5b9.png)

Assign をクリックします。(※割り当てを元に戻す場合、Powershell を使う必要があります)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/b23adc05-90d6-4e1d-e8f0-0017c98f639d.png)

Power Platform 管理センターから該当の環境を開き、最近の操作にて "New Network Injection Policy" の状態が "成功" となっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/d75712ec-ba75-f6c5-3df8-f25616fa633b.png)

# Azure / Power Platform で別々のユーザーで作業する場合

以下のステップで進めれば設定できました。

1. Azure の共同作成者にて **"2. Azure 側の設定"** をすべて実施
2. RBAC の操作が可能なユーザー (所有者相当) にて Azure Portal にログインし、Enterprise policy の読み取り権限を付与

すべてのリソースで非表示の種類を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/7c89bf46-f99b-6ea3-8789-c43d9e6f4e01.png)

"種類" の値に "enterprisepolicies" を入力し、適用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/564f6de8-23c5-6914-47df-97d2d9195a95.png)

作成したポリシーが表示されるので、アクセス制御にて閲覧権限を Power Platform 管理者に付与します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/8ba890f1-ede9-e85b-2fcb-10372e24c7af.png)

3 **"3.Power Platform 側の設定"** を実施

# 動作確認

## Private Endpoint 経由で接続

### Azure SQL Database

SQL Database 用の接続を Microsoft Entra 認証にて作成します。(事前に SQL Server 側で認証設定済み)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/015a2503-bb6f-ef4a-049d-50b12024f1b4.png)

以下のような簡易なフローを作り、パブリックアクセスが無効となっている SQL Database からテーブルを取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/a86d05e1-35e5-4e37-7ece-a0dab7bc240c.png)

参考：SQL Server 側のネットワーク設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/f9249dd2-8d9b-6755-967a-7d75c33ba963.png)
プライベートエンドポイントは設定済み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/cb917c14-857a-7116-5c63-6e1dd6ba0cdd.png)

サンプル DB 内のテーブルを取得できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/88d41066-be5c-160a-8f5d-b3ead56ee508.png)


### カスタムコネクタ + Azure OpenAI Service

Power Automate, Power Apps と組わせて利用するシナリオが多い OpenAI Service への接続をカスタムコネクタで実施してみます。

以下のようなシンプルなカスタムコネクタを作成し、Azure OpenAI Service に接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/cc32f607-6896-fcd3-0f49-9dbb8401b4c7.png)

パブリックアクセスは無効にされている環境ですが、OpenAI Service から応答が正しく返ってきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/97b1a80d-b9eb-49db-262d-fba1a296e60c.png)


## サービスエンドポイント経由で接続
### Azure Queue Storage
Azure Storage はグローバルのサービスエンドポイントの利用がサポートされているので Azure Storage へのサービスエンドポイントでのアクセスも試してみます。

https://learn.microsoft.com/ja-jp/azure/storage/common/storage-network-security?toc=%2Fazure%2Fvirtual-network%2Ftoc.json&tabs=azure-portal#azure-storage-cross-region-service-endpoints

Storage アカウントを作成し、サブネット委任が設定されている二つのサブネットをストレージのファイアウォールで許可します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/dc093273-f3ca-d3af-3c8d-842a1978f0d0.png)

テスト用にキューにサンプルデータを入れておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/65a065f7-dfd3-44f9-856e-08aebff49f2a.png)

サービスエンドポイント経由でデータを取得することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/0cce0ae4-a927-57aa-42a6-c61b12098b39.png)

## NSG
対象のサブネットに NSG を設定し、通信制御を試してみます。試しにアウトバウンド通信をすべて拒否します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/9317da6e-aaa3-a247-0235-ee8668eef366.png)

SQL Server に接続できなくなりましたので NSG の設定は効いているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/497007fe-7a14-5113-266e-ee1ddd045a67.png)

# 複数環境から同じサブネットを共有
以下のような文言が公開情報に記載があることから、複数の Power Platform の環境から同じサブネットを共有して利用することはサポートされていそうです。
試しに動作確認もしてみましたが、問題なく利用できました。

https://learn.microsoft.com/ja-jp/power-platform/admin/vnet-support-setup-configure#set-up-the-virtual-network-and-subnets

::: note info
同じサブネットを複数の環境に委任するには、そのサブネット内でさらに多くの IP アドレスが必要です。
:::

# シングル VNet 構成
ドキュメントが更新されたため削除

~~(20240521 追記)
[公開ドキュメント](https://learn.microsoft.com/ja-jp/power-platform/admin/vnet-support-overview#how-can-i-configure-virtual-network-support-for-power-platform-in-devtest-environments-without-using-two-separate-virtual-networks-in-different-azure-regions)に開発、テスト環境では単一 VNet の利用が推奨である旨の記載があります。~~


# ネットワーク構成
英語ですが、アーキテクチャの例を以下にいくつか記載しています。

https://techcommunity.microsoft.com/blog/azurenetworkingblog/architecture-of-azure-vnet-support-for-power-platform/4304802

## Private Endpoint をそれぞれの仮想ネットワークに作成
[こちら](https://qiita.com/Isato-Hiyama/items/6c61a65f12c9e7042bb2#%E9%9B%86%E7%B4%84%E5%9E%8B1-%E3%82%AA%E3%83%B3%E3%83%97%E3%83%AC%E5%90%84-spoke-%E3%81%8B%E3%82%89%E3%81%AE%E5%90%8D%E5%89%8D%E8%A7%A3%E6%B1%BA%E3%81%AF%E3%81%99%E3%81%B9%E3%81%A6-hub-vnet-%E3%81%AB%E9%9B%86%E7%B4%84)で説明しているように 1 つの Private DNS ゾーンでは管理できないため、Private DNS ゾーンを 2 つ作成 (リソースグループも分ける) する必要があります。リージョン障害を想定する場合は推奨される構成です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/fa03bd02-c6a1-81fd-469d-2f032345b2cf.png)

## グローバル VNet ピアリングを利用
アドレス空間が重複しているとピアリングできないため注意が必要です。また、常に片方のリージョンのネットワーク経由となるためリージョン冗長の要件がないかは事前に確認が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/aa976133-e031-d96b-7398-ac4dbb3e4021.png)

## サービスエンドポイントを利用
ストレージのようにリージョンをまたいでサービスエンドポイントを使うことができるサービスもあるため、サービスエンドポイントを利用します。**サポートされるサービスであるかは要確認です。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/6f4ad38a-dbf9-49cf-a03d-48411929d5c0.png)


## Hub & Spoke + Azure Firewall
Hub VNet にサブネットを追加する構成も可能だと思いますが、既存環境の場合、Hub VNet の拡張が難しかったり、共有基盤である Hub に手を入れたくないといった要件もあると思いましたので、以下のような構成で Spoke VNet としてサブネット委任用の VNet を追加して接続を試してみましたが、問題なく利用可能でした。UDR も問題なく動作しているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/94039ee1-8752-64e3-8c94-b6c9860b2438.png)

サブネット委任が設定されたアドバイス空間から SQL Server のプライベートエンドポイントへの通信が Azure Firewall のログとしても記録されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/bdfb7dd7-5a69-ecb9-3279-080e76c439c4.png)


# 環境の削除

利用後に環境を削除したい場合、以下の順序でやる必要があります。

1). RevertSubnetInjection.ps1 のスクリプトを流して Enterprise Policy の割り当てを解除する
環境 ID とポリシーのリソース ID が必要になります。
```
> .\RevertSubnetInjection.ps1

cmdlet RevertSubnetInjection at command pipeline position 1
Supply values for the following parameters:
environmentId: d8cad0fb-0c05-e108-83db-4929a5f0cbb3
policyArmId: /subscriptions/xxxxxx-xxxxx-4093-b19c-94eba5afa598/resourceGroups/rg-ppfsubnet-001/providers/Microsoft.PowerPlatform/enterprisePolicies/jpe-jpw-2vnet-001
Logging In...
WARNING: The names of some imported commands from the module 'Microsoft.PowerApps.AuthModule' include unapproved verbs that might make them less discoverable. To find the commands with unapproved verbs, run the Import-Module
command again with the Verbose parameter. For a list of approved verbs, type Get-Verb.
Please select the account you want to login with.

Retrieving subscriptions for the selection...
[Announcements]
With the new Azure PowerShell login experience, you can select the subscription you want to use more easily. Learn more about it and its configuration at https://go.microsoft.com/fwlink/?linkid=2271909.

If you encounter any problem, please open an issue at: https://aka.ms/azpsissue

Logged In...
Environment reterieved

Enterprise Policy reterieved

Unlinking of vnet policy started for environement d8cad0fb-0c05-e108-83db-4929a5f0cbb3
Do you want to poll the unlink operation (y/n)
y
Polling the unlink operation every 5 seconds.
Operation finished with state Succeeded
```
2). Power Platform 側の環境を削除
3). Azure ポータルからポリシーを削除する (非表示の種類なので注意)

ポリシーの割り当て解除の前に Power Platform 側の環境を削除してしまうとポリシー削除時に接続先の環境 ID がないためエラーで削除できなくなります。

# ポリシー適用後、うまく動作しないとき
ポリシーの適用直後は反映まで時間がかかる場合があります。
1 時間程度経過後、カスタムコネクタをアップデートすると改善する場合があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/9fbbb28c-6574-01b0-3270-6e1fefcfe6f2.png)