Power Platform はマイクロソフトが提供するSaaSなので、サービス自体のIPアドレスが固定ではなかったり、自社のプライベートネットワーク上にデプロイできるわけではありません。
ただ、Azure の豊富なAI機能であったり、Key Vault など様々なサービスにインターネットへの公開を行わず、閉域網経由で通信したいという要望があります。
それを実現するのが「サブネット委任 (subnet delegation)」という機能です。例えば、カスタムコネクタを経由してAzure OpenAI などのAPI に接続する場合、以下のようなネットワーク構成を取ることができる機能です。
https://learn.microsoft.com/ja-jp/power-platform/admin/vnet-support-overview

Power Platform はSaaS として存在しつつ、自社のサブネットにサービスをホストしているかのように許可する機能です(図の「サブネットへの委任」部分)。
これにより、接続を許可しているAzure のサービスにこのサブネット経由でアクセスできるようになります(図の「アクセス許可」の部分)。
目次
他のサービスとの比較
プライベートネットワーク (閉域網) 接続を実現する方法としては、他にもオンプレミスデータゲートウェイ(ODGW)を経由する方法があります。
サービス | 提供形態 | 保守性 | マネージド環境 |
---|---|---|---|
オンプレミスデータ ゲートウェイ(ODGW)経由 | IaaS | VMを立て、ODGW経由で接続するため、 VMのサイジングから保守・運用に至るまで自社で 運用する必要がある | 不要 |
サブネット委任 | サービス | Microsoft によるマネージドサービス | 必要 |
ただし、ODGW経由では、自前でVMをデプロイして、そのサーバーのアーキテクチャ設計からお守りと、何から何まで自社で検討・構築・保守・運用する必要があり、かつ、そのVM 維持費用はコスト負担になるため課題となっていました。
今回のサブネット委任は、それらを根本から解決するサービスです。
類似のサービス
全く別のサービスですが、名称が似ているサービスとして、仮想ネットワーク データ ゲートウェイがあります。
仮想ネットワークゲートウェイは、オンプレミスのデータ ゲートウェイを設定せずに、仮想ネットワーク内から Azure および Power Platform サービスにアクセスできるようにするマネージド ゲートウェイです。
仮想ネットワークゲートウェイはサブネット委任と比較して、適用対象が異なるサービスです。
サービス | 対象サービス |
---|---|
サブネット委任 | ※次の図3をご覧ください |
仮想ネットワーク ゲートウェイ | Power BI Power Platform データフローの ETL (抽出、変換、読み込み) ワークロード用 |
Power BI および Power Platform データフローの ETL (抽出、変換、読み込み) ワークロード用に最適化されています。
リリース状況
現在サブネット委任は、すべてのサービスについて一般提供されています。
エリア | 委任可能なサービス | リリース状況 |
---|---|---|
Dataverse | Dataverse プラグイン | 一般提供 |
コネクタ | SQL Server Azure SQLデータ ウェアハウス Azure Queue カスタムコネクタ Azure Key Vault Azure File ストレージ Azure BLOBストレージ | 一般提供 |
最新の情報については、Microsoft Learn にサブネット委任に関するリリース状況の説明がありますので、こちらからご確認ください。
https://learn.microsoft.com/power-platform/admin/vnet-support-overview
今回は、セットアップ方法についてご紹介いたします。
前提条件
- Power Platform のマネージド環境が有効になっている
- Power Platform とAzure 仮想ネットワークが同じGeoに存在、または新規作成できる
- PowerShell の操作に慣れており、エンタープライズポリシーを適用できる
- 同じテナント内にAzure サブスクリプションとPower Platform がある
- Azure OpenAI が同じリージョンに存在している
マネージド環境の有効化
接続する環境はマネージド環境である必要があります。
こちらの記事を参考にマネージド環境を有効化してください。
サブネット委任の設定
作成するリソース
最終的に作成するリソースは以下のとおりです。
ただし、Key Vault とAzure OpenAIは直接的にはサブネット委任に関わりませんので、接続したいサービスに応じてリソースを作成してください。
セットアップにはおおよそ1時間ぐらいかかるかと思います。

リソースプロバイダーの設定
Power Platform のリソースプロバイダーを設定します。

Power Platform が登録されたことを確認します。

仮想ネットワークとサブネットの作成
もし仮想ネットワークとサブネットがある場合、それを利用することができます。
利用できるIPアドレスの範囲が/24以上である必要があります。
もし作成する場合は、例えば以下のように作成します。
2つの日本リージョン(東日本、西日本)の両方にセットで仮想ネットワークとサブネットを作成します。
マーケットプレイスからVirtual Network
と検索して選択します。

西日本リージョンの場合このように作成しておきます。
東日本リージョンの場合はJapan East
をリージョンに指定してください。
ネットワーク名 | サブネット | サブネットの目的 | IPv4 アドレスの範囲 | リージョン |
---|---|---|---|---|
vnet-1 | subnet-1 | Default | 10.0.0/16 | 東日本 |
secondary-vnet-1 | subnet-1 | Default | 10.0.0/16 | 西日本 |

Azure OpenAI から接続できるように、接続可能なサービスタグを追加します。
プライマリのリージョンとセカンダリのリージョンの両方のサブネットにサービスタグを追加します。
追加するサービスタグはMicrosoft.CognitiveServices
です。

Azure OpenAI の作成
仮想ネットワークからのみアクセスできるAzure OpenAI サービスをデプロイします。
マーケットプレイスからAzure OpenAI
と検索してデプロイします。

ネットワークには一旦プライマリのネットワークを指定しておきます。
あとでセカンダリも登録することができます。

デプロイ後、こちらから既存のフェイルオーバー用のネットワークを追加します。

セカンダリのネットワークを指定して追加します。

Azure OpenAI から利用するキーコンテナーの作成
Azure OpenAI のAPI キー情報を安全に管理するためにAzure Key Vault を作成します。
こちらも仮想ネットワーク経由でのみアクセスできるように設定します。
マーケットプレイスでは以下のようなサービス名で見つけられます。

今回はJapan East にデプロイすることとします。

選択されたネットワークからしかアクセスできないこととします。

キーコンテナーに仮想ネットワークを追加します。
キーコンテナーに関しては複数のネットワークを一度に登録することができます。
また、東日本リージョンにデプロイしても、東日本リージョンと西日本リージョンにある仮想ネットワークの両方に接続することができます。

有効化を待ってから追加を行います。

仮想ネットワークのみとすると、コンテナにキーを登録する際にも影響が及びます。例えば、Azure ポータルからでもシークレットを登録できなくなります。そのため、そのタイミングだけ許可したりして、ただちに切り替えるか、特定のIPアドレスのみ許可するなどが良いでしょう。
ここまでで、接続したいサービスをすべて仮想ネットワークに接続しておく必要があります。
ここからエンタープライズポリシーの設を行うため、仮想ネットワークへの参加が制限される場合があります。
PowerShell サンプルスクリプトのダウンロード
GitHub 上に実行ができるスクリプトが提供されています。
プライマリとセカンダリの両方に実施する必要があります。
まずは、関連するPowerShell のコードをGitHub から全てダウンロードします。
以下よりモジュールを取得することができます。
https://github.com/microsoft/PowerApps-Samples/tree/master/powershell/enterprisePolicies
一括ダウンロード
ソースコードを一式ダウンロードするには以下のリンクが利用できます。
https://github.com/microsoft/PowerApps-Samples/archive/refs/heads/master.zip
利用する部分のみのダウンロード
ただし非常に容量が大きく時間がかかってしまうため、推奨としては必要なコードのみ入手するのが良いかと思います。
Visual Studio Code での作業を行っている方はenterprisePolicies配下のデータをダウンロードしてください。
もし、Webブラウザ上で実施している方はファイルまでたどって行くとダウンロードすることができます。

ブラウザからスクリプトを準備する方はその要領で以下の項目をダウンロードしましょう。
- InstallPowerAppsCmdlets.ps1
- SetupSubscriptionForPowerPlatform.ps1
- Commonフォルダ配下のファイルすべて
- SubnetInjection フォルダ配下の以下のファイル
- SetupVnetForSubnetDelegation.ps1
- CreateSubnetInjectionEnterprisePolicy.ps1
- ValidateVnetLocationForEnterprisePolicy.ps1
- NewSubnetInjection.ps1
ダウンロードしたファイルは、GitHub と同じようなフォルダ階層にして、ps1ファイルを保存しましょう。

Power Shell 実行の流れ
ダウンロードできまして、準備ができたらPowerShell 実行の流れを確認します。以下の流れで実行していきます。
実行順 | ファイル名 | 目的 |
---|---|---|
1 | InstallPowerAppsCmdlets.ps1 | モジュールのインストール |
2 | SetupSubscriptionForPowerPlatform.ps1 | サブスクリプションの登録 |
3 | SetupVnetForSubnetDelegation.ps1 | 委任の設定 |
4 | CreateSubnetInjectionEnterprisePolicy.ps1 | エンタープライズポリシーの設定 |
5 | NewSubnetInjection.ps1 | サブネットへの委任の実行 |
1. モジュールのインストール
PowerShell モジュールを最初にインストールします。
InstallPowerAppsCmdlets.ps1 を実行します。
2. サブスクリプションの登録
SetupSubscriptionForPowerPlatform.ps1 を実行します。
実行後、このようなログが吐き出されます。
Subscription registered for Microsoft.PowerPlatform
Registering the subscription for feature enterprisePoliciesPreview for Microsoft.PowerPlatform
Subscription registered for feature enterprisePoliciesPreview for Microsoft.PowerPlatform
Tenant: Geek Fujiwara (xxxx-83fa-xxxx-xxxxx-xxxxxxxx)
SubscriptionName SubscriptionId Account Environment
---------------- -------------- ------- -----------
geek f7451da2-xxxx-xxxx-xxxx-545430xxxx xxxx@xxxx.com AzureCloud
3. 委任の設定
SubnetInjection\SetupVnetForSubnetDelegation.ps1 を実行します。
このような内容を質問されますので、以下のように回答します。
virtualNetworkSubscriptionId はサブスクリプションIDを指定します。
virtualNetworkSubscriptionId: xxxx-9e56-4ff3-xxxx-xxxx
virtualNetworkName: vnet-1
subnetName: subnet-1
プライマリ、セカンダリ両方にそれぞれ実行します。こちらのようにログが吐き出されます。
with a developer tool that supports Azure single sign on.'
Getting virtual network vnet-1
Virtual network reterieved
Getting virtual network subnet subnet-1
Virtual network subnet reterieved
Adding delegation for Microsoft.PowerPlatform/enterprisePolicies to subnet Microsoft.Azure.Commands.Network.Models.PSSubnet.Name in vnet vnet-1
Added delegation for Microsoft.PowerPlatform/enterprisePolicies to subnet Microsoft.Azure.Commands.Network.Models.PSSubnet in vnet vnet-1
ResourceGroupName Name Location ProvisioningState EnableDdosProtection
----------------- ---- -------- ----------------- --------------------
GeekAI vnet-1 japaneast Succeeded False
4. エンタープライズポリシーの設定
SubnetInjection\CreateSubnetInjectionEnterprisePolicy.ps1 を実行します。
以下のようなことを質問されます。それぞれこんな感じで回答します。
- ポリシー名はここで名前をつけます。
primaryVnetId
とsecondaryVnetId
はAzure ポータルにて、仮想ネットワークのプロパティから取得できます。リソースID
が該当します。
subscriptionId: xxxx-xxxx-xxxx-xxxx-xxxxxx
resourceGroup: GeekAI
enterprisePolicyName: pppolicy-subnet-1
enterprisePolicylocation: japan
primaryVnetId: /subscriptions/xxxxxx-xxxx-xxxx-xxxx-xxxxxx/resourceGroups/GeekAI/providers/Microsoft.Network/virtualNetworks/vnet-1
primarySubnetName: subnet-1
secondaryVnetId: /subscriptions/xxxxxx-xxxx-xxxx-xxxx-xxxxxx/resourceGroups/GeekAI/providers/Microsoft.Network/virtualNetworks/secondary-vnet-1
secondarySubnetName: subnet-1
以下のようにログが出力されます。
リソースID ResourceId
は後で利用するのでメモしておきます。
Policy created
{
"ResourceId": "/subscriptions/xxxx-xxxx-xxxx-xxxx-xxxx/resourceGroups/GeekAI/providers/Microsoft.PowerPlatform/enterprisePolicies/pppolicy-subnet-1",
"Id": "/subscriptions/xxxx-xxxx-xxxx-xxxx-xxxx/resourceGroups/GeekAI/providers/Microsoft.PowerPlatform/enterprisePolicies/pppolicy-subnet-1",
"Identity": null,
"Kind": "NetworkInjection",
"Location": "japan",
"ManagedBy": null,
"ResourceName": "pppolicy-subnet-1",
"Name": "pppolicy-subnet-1",
"ExtensionResourceName": null,
"ParentResource": null,
"Plan": null,
"Properties": {
"systemId": "/regions/japan/providers/Microsoft.PowerPlatform/enterprisePolicies/xxxx-xxxx-xxxx-xxxx-xxxx",
"healthStatus": "Undetermined",
"networkInjection": {
"virtualNetworks": [
{
"id": "/subscriptions/xxxx-xx-xx-xx-xx/resourceGroups/GeekAI/providers/Microsoft.Network/virtualNetworks/vnet-1",
"subnet": {
"name": "subnet-1"
}
},
{
"id": "/subscriptions/xx-9e56-xx-xx-xxxx/resourceGroups/GeekAI/providers/Microsoft.Network/virtualNetworks/secondary-vnet-1",
"subnet": {
"name": "subnet-1"
}
}
]
}
},
"ResourceGroupName": "GeekAI",
"Type": "Microsoft.PowerPlatform/enterprisePolicies",
"ResourceType": "Microsoft.PowerPlatform/enterprisePolicies",
"ExtensionResourceType": null,
"Sku": null,
"Tags": {},
"TagsTable": null,
"SubscriptionId": "xxxx-xx-xxx-xxx-xxxx",
"CreatedTime": null,
"ChangedTime": null,
"ETag": null
}
5. ポリシーの適用
SubnetInjection\NewSubnetInjection.ps1 を実行します。
先ほど取得したエンタープライズポリシーのリソースIDをpolicyArmId
に渡します。
環境IDenvironmentId
はPower Platform 管理センターなどから入手します。
cmdlet NewSubnetInjection at command pipeline position 1
Supply values for the following parameters:
environmentId: xxxx-xxxx-xxxx-xxxx-xxxx
policyArmId: /subscriptions/xxxx-xxxx-xxxx-xxxx-xxxx/resourceGroups/GeekAI/providers/Microsoft.PowerPlatform/enterprisePolicies/pppolicy-subnet-1
次に質問されるOperationLink
は実行しなくてOKです。
ここまでで、エンタープライズポリシーの設定を行うことができました。実際にサブネット委任が行われたかはPower Platform 管理センターにて確認することができます。
履歴を開きます。

実際に実行できていることがわかります。

ここからは委任に対応しているサービスで接続することができます。
以上、ご参考になれば幸いです。
[…] サブネット委任 […]