はじめに
記事の目的
2025/12現在、Azure App Service Managed InstanceはPublic Previewとなっています。
本記事もプレビュー状態で検証した内容となるため、画面構成や設定内容についてはGA後に変更となる可能性があります。
本記事では、Azure App Serviceに追加されたManaged Instanceを利用して、以下を検証してみたいと思います。
- BastionによるRDP接続
- Configuration scriptを利用したFontのインストール
Script経由でのインストールがFontなのは、インストールするCOMコンポーネントやMSIがすぐに浮かばなかったからなのですが、どうやってConfiguration Scriptを設定するのか?といった観点で読んで頂けますと幸いです。
記事が少し長くなってしまいますが、作成はAzureポータルから行っていきます。
Azure App Service Managed Instanceとは?
従来のApp Service(PaaS)の利便性を維持しながら、IaaSに近い柔軟性で利用することができる、新しいApp Serviceのオプションとなります。Azure Cloud Servicesをよりマネージドにしたような印象があります。
大きな特徴としては、以下のような点が挙げられます。
- Configuration Scriptを利用したインストール(COMコンポーネント、MSI、フォントなど)や、レジストリ設定が可能
- Vnet統合を行えば、Bastion経由でRDP接続が可能
依存コンポーネントのためにIaaSで運用するしかなかったケースでも、Managed Instanceを利用すれば、オートスケールなどApp Serviceの従来の恩恵を受けながら、レガシーなアプリケーションを実行可能となります!
ただし制限事項もあります。
- App Serivces Premium V4でしか設定ができない
- 現在のところWindows Webアプリ専用(Linuxやコンテナは非対応)
App Services Premium V4でしか利用できないのは少しつらいところですが、V3と比べて価格も10%~程度下がっており、Reserved Instanceも適用可能なので、利用シナリオによってはコストパフォーマンスを出すことができるかもしれませんね!
詳細はこちらの公式ドキュメントをご覧ください。
リソースの作成
各リソースを作成していきます。
仮想ネットワークやストレージなどは、要点のみ記載とさせていただきます。
1. Azure App Service Managed Instanceを作成する
Azureポータルから「リソースの作成」を選択して、検索欄に「Webアプリ」と入力して検索します。
二つでてきましたね…。実はまだ日本語対応されていないようで、Managed Instanceやマネージドインスタンスと入力しても表示されません(英語版では検索可能なようです)
ひとまず左側を選択します。

私の場合、左側がManaged Instanceで当たりでした 笑
Managed Instanceであることを確認し、作成を押下します。

作成画面は従来のApp Serviceとほぼ同じですので、ポイントのみ記載していきます。
- リージョンは現在、以下の4リージョンのみ対応となります。今回は「East Asia」を選択
- 料金プランについてはPremium V4しか選べませんので、一番安価なものを選択
今回は検証用ですので、ゾーン冗長も無効としました。
- AdvancedタブのConfiguration scriptは後ほど設定するので今回は入力なし
- Deploymentタブも設定なし
- Networkingについてはサイトの起動を確認したいので、パブリックアクセスをオン。仮想ネットワーク統合は後ほど設定するのでオフ
Reviewで問題なければ、そのまま作成します。
2. 仮想ネットワークを作成する
Bastionを利用してRDPしたいため、仮想ネットワークを作成します。
- App Serviceのリージョンと同じEast Asiaで仮想ネットワークを作成
- (仮想ネットワークの作成時/作成後どちらでもOK)Vnet統合用サブネットを作成(委任先にMicrosoft.Web/ServerFarmsを選択)
- Bastion用のサブネットを作成
- サブネット作成時に「サブネットの目的」から「Azure Bastion」を選択して作成できます
Vnet統合用のサブネットとBastion用のサブネットを追加し、以下のようになりました。

4. Batsionを作成する
App Service Managed InstanceへのRDPに利用するBastionを作成します。
Developerプランで作成して試したところ設定ができなかったため、SKUはBasic以上を選択してください。(今回はStandardを利用していますが、Basicで問題ないと思います)
5. ストレージを作成する
Configuration scriptはBlob Storageに格納する必要があるため、Azure Storageを作成します。
特に特別な設定は必要ありませんが、以下のポイントをご確認ください。
6. マネージドIDを作成する
App ServiceからBlob Storageへのアクセスを可能とするため、マネージドIDを作成します。
設定&動作確認
BastionやConfiguration scriptの設定を実施します。
1. Vnet統合の設定をする
App Serviceプランを仮想ネットワークに接続します。
2. Bastionの設定をする
App Serviceプランの「構成」よりBationとRDPの設定を行います。
3. BastionでRDP接続する
Bastionを設定すると、App Serviceプランの「インスタンス」からサーバーに接続することができます。

App ServiceプランのサーバーにBastion経由でRDPすることができました!
IIS Managerを開くと、ホスティングされているサイトも表示されますね。

4. Configuration scriptの設定をする
次にApp Service Managed Instanceのサーバーが起動するときに適用されるコンポーネントを設定します。
今回は検証としてフォントのインストールのみを実施するため、最小構成でファイルを用意します。
公式情報としては以下のページをご参照ください。
4-1. フォントの準備
今回、検証にはこちらの「きざし」というフォントファイルを使わせていただきました。
フォントファイルをダウンロードしておきます。
4-2. スクリプトの準備
App Service Managed Instanceは、コンポーネントのインストールにPowerShellスクリプトを使用します。
ファイル名はInstall.ps1という名称で固定されているようですので、ご注意ください。
以下は今回のサンプルPowerShellスクリプトです。
フォントファイルをFonts配下にコピーし、レジストリ登録を実行します。
# Install Fonts
# Font file paths
$FontFileName = "Kizashi-Regular.otf"
$FontSource = Join-Path $PSScriptRoot $FontFileName
$FontName = "Kizashi Regular(Custom Installed)"
$FontDest = Join-Path "C:\Windows\Fonts" $FontFileName
try {
# フォントをコピー
Copy-Item $FontSource $FontDest
# レジストリに登録
New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" `
-Name $FontName `
-PropertyType String `
-Value $FontFileName
} catch {
Write-Error "Failed to install ${FontFileName}: $_"
exit 1
}
4-3. パッケージの準備
Configuration scriptはzipファイル化してパッケージを作成します。
公式ドキュメントには以下のように記載されています。

今回、config.xmlは作成しません。
以下のファイルを「FontInstall.zip」として圧縮します。
- Install.ps1
- Kizashi-Regular.otf
4-4. Blobコンテナへアップロードする
先ほど作成したzipファイルを、Configuration script用に用意したBlobストレージのコンテナへアップロードします。

5. マネージドIDを設定する
App ServiceプランにマネージドIDを設定し、Blob Storageへのアクセスが可能となるように構成します。
5.1 マネージドIDを設定する
App Serviceプランの「ID」から、先ほど作成したマネージドIDを追加します

さて、ここからがハマりポイントなのですが、設定しただけですとApp ServiceプランはBlob Storageへのアクセスが失敗します。そのため、Configuration scriptが実行されずにコンポーネントのインストールは行われません。
App Serivceプランのログを確認すると、以下のようなエラーが表示されます。
-
Error while running install script (FontInstall), continuing: Cannot download Install Script: PlanDefaultIdentity must be configured.
どうやらPlanDefaultIdentityという設定が必要なようです。
しかしこの設定、ポータル上からは設定の箇所が見当たりません(実はあったらすみません)
今回はAzure CLIから設定します。
5-2. PlanDefaultIdentityの設定を行う
ポータル上に設定項目がなかったのでドキュメントを見ていたところ、Azure CLIにそれっぽいコマンドを発見しました。
まだプレビューのコマンドなようで、Azure CLIのバージョンを最新版にしないと利用できませんでした。

2025/12現在の最新版をインストールし、以下のバージョンでは利用可能です。
※Azure CLIのバージョンアップは環境が壊れることもありますので、慎重にご検討ください。
{
"azure-cli": "2.81.0",
"azure-cli-core": "2.81.0",
"azure-cli-telemetry": "1.1.0",
"extensions": {
"containerapp": "1.0.0b1",
"ssh": "1.1.3"
}
}
以下はドキュメントからの引用ですが、こちらのコマンドを実行するとPlanDefaultIdentityが設定されます。
各値は実際のリソース名に書き換えてご利用ください。
az appservice plan identity set-default --name MyAppServicePlan --resource-group MyResourceGroup --identity /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/MyIdentity
6. Configuration scriptを設定する
App Serviceプランの「構成」から「General settings」タブを開き、Configuration scriptを設定します。
あらかじめzipパッケージを保存しておいたBlobコンテナを指定してください。

動作確認
さて、動作確認してみましょう。
といっても今回はConfiguration scriptでフォントをインストールしただけですので、RDPしてフォントが反映されていることを確認します。
Configuration scriptはApp ServiceプランのC:\InstallScripts配下にパッケージ名で作成されたフォルダに保管されています。
こちらには実行ログも保存されますので、より複雑な手順でインストール作業を行う場合は、こちらを参照するとエラー原因などが判明するかもしれません。

今回は以下のような実行ログが出力されていました。フォントインストールのみだからか、出力されている情報はとてもシンプルでした。
Kizashi Regular(Custom Installed) : Kizashi-Regular.otf
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
NT\CurrentVersion\Fonts
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
NT\CurrentVersion
PSChildName : Fonts
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
まとめ
App Service Managed Instanceは、かなり興味深いアップデートだと思います。
既存の.NET FrameworkアプリやWindows依存アプリをクラウドへ移行する場合や、オンプレミスの複雑な構成(COM、レジストリ)を維持しつつクラウド化する、といったシナリオには非常にフィットしそうです。
現在はまだPublic Previewでリージョンも限定されていますが、GAされるときは展開リージョンも増えるのではないでしょうか。
もっと複雑な構成でのConfiguration script運用や、今回は利用しなかったレジストリ値の適用など、私がまだ検証できていない機能もありますので、いずれ試してみたいと思います。










