オンプレミスデータゲートウェイ経由でWebAPIにアクセスする(Http with Microsoft Entra IDコネクタの使用)
はじめに
オンプレミスデータゲートウェイを通じてHttp通信を行わないといけない機会に巡りあい、なかなか、想定以上にハマってしまったので、、備忘録もかねて記事とします。
オンプレミスデータゲートウェイとは
オンプレミス データ ゲートウェイは、ローカルにインストールされた Windows クライアント アプリケーションであり、ローカルのオンプレミス データ ソースと Microsoft クラウド内のサービスの間のブリッジとして機能します。
引用部の説明の通りなんですが、Power PlatformやAzureの一部サービスからオンプレミス上のデータをアクセスする場合に橋渡しを担うソフトウェアという理解です。
やりたいこと
端的にいいますと、以下のようにオンプレミス環境上のWebAPIに対してオンプレミスデータゲートウェイを通じて通信を行いたいです。
想定ユースケースとしては、オンプレミス環境に既設のWebAPIが存在しており、それを活用してPower Platform側も構築したい、というパターンが多いかと考えます。
環境
実際の検証環境は以下のようにHypwe-VとPower AutomateのHttp with Microsoft Entra ID コネクタを使用して通信を行います。
といいますか、2025年5月現在、オンプレミスデータゲートウェイを使用してHttp通信を行える汎用コネクタはHttp with Microsoft Entra ID コネクタしか見つけられず。。(もっと他に良い方法をご存じの方がいらっしゃいましたらコメントいただけると幸いです。)
Hypwe-Vには以下仮想マシンVMが存在するとします。
- SV1 : オンプレミスデータゲートウェイサーバー
- SV2 : Web API サーバー
WebAPI準備
オンプレミス環境上プライベートネットワーク内に配置されているテスト用WebAPIは、.NET 8 で作成された簡単なREST WebAPIを準備しました。
- ケストレルWebサーバーとして起動するとします。
- コントローラーには以下のようなHello Wroldを返すメソッドが実装されているとします。
(VS2022のASP.NETテンプレートから作成流用したので、コントローラー名が完全無欠サンプルのWeatherForecastControllerのままなのはご容赦ください。。)
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpPost("posthello", Name = "PostHelloWorld")]
public IEnumerable<string> PostHelloWorld()
{
_logger.LogInformation("PostHelloWorld");
//Hello Worldの文字列を返す
return ["Hello World by WebAPI Post"];
}
}
Microsoft Entra ID 組織ユーザーの準備
Power Platformで使用するMicrosoft 組織ユーザーは準備済みとします。
構築
準備した環境では以下4点の構築が必要です。
-
オンプレミスデータゲートウェイのインストール
オンプレミスデータゲートウェイ本体のインストールが必要です。 -
Microsoft Entra ID アプリ登録とAPI公開
Http with Microsoft Entra IDコネクタが呼び出しを行うため用のMicrosoft Entra ID アプリ登録とAPI公開が必要です。 -
WebAPIまでhttps通信が行えるようなルート証明
オンプレミスデータゲートウェイがWebAPIとhttps通信を行うために、オンプレミス環境側でルート証明の準備が必要です。 -
Http with Microsoft Entra IDコネクタの構築
Power Automateがオンプレミスデータゲートウェイを通じて、Web APIと通信するために構築が必要です。
オンプレミスデータゲートウェイのインストール
とにもかくにも、核となるオンプレミスデータゲートウェイをインストールしないと始まりません。
以下のページの「標準ゲートウェイをダウンロードおよびインストールする」よりオンプレミスデータゲートウェイのインストールexeをダウンロードします。
SV1上で上記でダウンロードしたオンプレミスデータゲートウェイインストーラexeを実行し、インストール作業を行います。
組織ユーザーでサインインします。
今回は新しいゲートウェイを作成します。
新しいゲートウェイの名前と回復キーを入力し、オンプレミスデータゲートウェイの構成を行います。
無事構成できれば、以下のような画面になります。このとき、表示されているリージョンが、使用するPower Platformのリージョンと一致している必要があるので確認しておきます。
オンプレミスデータゲートウェイの生存確認
オンプレミスデータゲートウェイのインストールが完了したら、クラウドサービス側と通信が成功するか確認を行います。
「診断」メニューより「ネットワークポートのテスト」内の「新しいテストを開始する」を実行します。
全体的な結果がすべて成功していれば、クラウドサービス側との通信は良好です。
この時点で、Power Platform管理センターに作成したオンプレミスデータゲートウェイ名と状態が参照できるはずなので、オンラインであることを確認します。
Microsoft Entra ID アプリ登録とAPI公開
Power Automate側のHttp with Microsoft Entra IDコネクタ呼び出し用のアプリ登録とAPI公開を行います。
1. アプリ登録
Azure Portal でログインし、アプリ登録を行います。
アプリ登録の名称を入力し、登録を行います。(本件にはあまり影響ない気がしますが、リダイレクトURIはWebを選択しています。)
2. API公開 アプリケーションID URI追加
Azure Portalで1.でアプリ登録を行ったアプリに対して、API公開でアプリケーションID URIを追加します。
API公開のページで追加と保存を行います。
API公開のページで、アプリケーションID URIが表示されていれば公開完了です。
アプリケーションID URIは後に行うHttp With Microsoft Entra ID コネクタ構築時に使用します。
WebAPIまでhttps通信が行えるようなルート証明
俗にいうオレオレ証明書による力技で解決を行います。
あまり詳細に記載すると、脱線しすぎてしまいますが、以下簡単に私が実施した方法を記載します。
1. Web APIが存在するサーバーSV2で証明書CAを作成する
- ルート CA 証明書の作成
管理者権限 PowerShell で以下を実行し、「MyRootCA」というルート CA 証明書を作成します。
※以下ファイルパスやIPアドレスは一例です。
$rootCert = New-SelfSignedCertificate `
-Subject "CN=MyRootCA" `
-KeyUsage CertSign, CRLSign, DigitalSignature `
-KeyExportPolicy Exportable `
-Type Custom `
-CertStoreLocation "Cert:\LocalMachine\My"
このコマンドは LocalMachine\My ストアに自己署名ルート CA を作成します。
- サーバー証明書の作成(SAN に IP アドレスを含む)
ルート CA で署名し、SAN に localhost
と SV2192.168.5.102
を含めたサーバー証明書を作成します。
# 既存のルート CA を取得
$root = Get-ChildItem Cert:\LocalMachine\My `
| Where-Object Subject -EQ "CN=MyRootCA"
# サーバー用証明書の発行
$serverCert = New-SelfSignedCertificate `
-Subject "CN=MyRootCA_Server" `
-TextExtension @("2.5.29.17={text}DNS=localhost&IPAddress=192.168.5.102") `
-KeyUsage DigitalSignature, KeyEncipherment `
-KeyExportPolicy Exportable `
-Type Custom `
-CertStoreLocation "Cert:\LocalMachine\My" `
-Signer $root `
-NotAfter (Get-Date).AddYears(5)
2.5.29.17
は SAN 拡張の標準 OID で、そのまま利用します。
また、SV2のWebAPIは、上記サーバー証明書をPFX形式でエクスポートした、プライベートキー付きのPFXファイルを使用してhttps通信を行うとします。
- ルート CA のエクスポート
作成したルート CA を.cer
形式でエクスポートします。
Export-Certificate `
-Cert $rootCert `
-FilePath "C:\Certs\MyRootCA.cer"
これで Base-64 エンコード済みのルート CA 証明書が "C:\Certs\MyRootCA.cer"
に出力されます。
2. オンプレミスデータゲートウェイが存在するサーバーSV1で、1.で作成したCAをルート証明書としてインポートする。
SV2からコピーしたルート CA (MyRootCA.cer
) を、LocalMachine の「Trusted Root Certification Authorities」ストアにPower Shellを使用してインポートします。
Import-Certificate `
-FilePath "C:\Certs\MyRootCA.cer" `
-CertStoreLocation "Cert:\LocalMachine\Root"
上記PowerShellコマンド実行後は、mmcでローカルコンピュータの信頼されたルート証明機関に証明書がインポートされていることを確認します。
Http with Microsoft Entra IDコネクタの構築
Power AutomateでHttp with Microsoft Entra IDコネクタの構築を行います。
今回は簡易的なテストが目的なので、手動実行からHttp with Microsoft Entra IDコネクタを呼び出すのみのフローとします。
Power Automateページに組織ユーザーでサインインの後、「マイフロー」ページから「新しいフロー」→「インスタントクラウドフロー」を選択します。
「フローを手動でトリガーする」を選択し、「作成」します。
フロー編集画面にて、アクションの追加より、HTTP with Microsoft Entra ID を選択します。
接続設定作成
アクションを追加後、まずは接続設定を作成する必要があります。
以下に各項目を入力します。
- オンプレミスデータゲートウェイ経由で接続:
チェックボックスをONとします。 - 接続名:
任意の名称を入力します。 - Microsoft Entra ID リソースのURI:
Azure PortalでAPI公開を行ったアプリID URI(api//XXX)を使用します。 - 基本リソースURL:
オンプレミスデータゲートウェイサーバーから見た宛先サーバーのURLです。
今回はSV2(仮IP_192.168.5.102)を指定する必要があります。 - ユーザー名:
組織ユーザー名を入力します。 - パスワード:
組織ユーザーのパスワードを入力します。 - 認証の種類:
今回はWebAPIコントローラー側で特に認証認可の実装はしていないので、Anoymousとします。 - Gateway:
インストール構築時に設定したゲートウェイ名称を選択します。
入力後に「新規作成」を押下することで、接続設定が作成されます。
REST webAPI用のコマンドを設定
Httpリクエストを行う内容を設定します。
今回はSV2に準備したWebAPIのPOSTメソッド「postHello」を実行したいので、以下のように入力します。
HttpリクエストURLも、オンプレミスデータゲートウェイサーバーからHttpリクエストを行うようなイメージで宛先URLを入力します。
動作確認
Power Automateのテストより、作成したフローを実行します。
以下の出力結果を受け取り、無事、オンプレミスデータゲートウェイを通じてHttpリクエストが成功したことを確認できました。
statusCode:200
body:Hello World by WebAPI Post
SV2のWeb APIでもlogger出力からpostHelloが呼び出されたことが確認できました。
まとめ
HTTP with Microsoft Entra IDコネクタを使用し、オンプレミスデータゲートウェイを通じてHyper-Vオンプレ想定環境上のWeb APIと簡単な通信の動作を確認しました。
実用では、アプリ登録のスコープも設定を行い、認証もAnoymousではなく、Web API側も認証認可を行うことが理想と考えます。
本記事の内容が何かのお役に立てれば幸いです。
参考
- Microsoft Learn オンプレミスデータゲートウェイとは
- Microsoft Learn Microsoft Entra ID を使用した HTTP
Discussion