Azure App Serviceで.NET 8アプリを運用している場合、今回の結論は明確です。.NET 8 LTSのサポート終了日は2026年11月10日であり、App Service上の.NET 8アプリは早めに.NET 10 LTSへの移行計画を作るべきです。2026年4月24日にMicrosoft公式のAzure Updatesで「Retirement: Support for .NET 8 (LTS) ends on November 10, 2026—upgrade your apps to .NET 10 (LTS)」が公開され、Azure ID 558033としてロードマップに追加されました。(Microsoft Azure)
重要なのは、「サポート終了後もアプリが即停止するわけではない」一方で、「安全に運用できる状態とは言えなくなる」点です。App Serviceでは、サポート終了後も対象ランタイムのアプリが動き続ける場合がありますが、ランタイムに対するセキュリティパッチや関連するカスタマーサポートは期待できなくなります。開発者、DevOpsエンジニア、プラットフォームチームは、単なるバージョン更新ではなく、セキュリティ・CI/CD・運用責任の見直しとして対応する必要があります。(Microsoft Learn)
Azure App Service / .NETの2026年4月更新ポイント
今回のAzure App Service / .NET更新は、新機能追加ではなく廃止・サポート終了の事前告知です。つまり、今すぐ本番環境が壊れる変更ではありません。しかし、2026年11月10日以降も.NET 8を使い続ける場合、セキュリティ修正やサポート面でリスクを抱えることになります。
| 更新ポイント | 実務上の意味 | 取るべき対応 |
|---|---|---|
| .NET 8 LTSのサポート終了日が2026年11月10日と案内された | App Service上の.NET 8アプリも移行対象として扱う必要がある | 対象アプリを棚卸しし、移行期限をバックログに入れる |
| 推奨移行先として.NET 10 LTSが示された | .NET 9への移行は長期対策になりにくい | 本番アプリは原則.NET 10 LTSを移行先候補にする |
| アプリは停止しない可能性があるが、サポートとセキュリティ更新が問題になる | 「動いているから問題ない」という判断が危険になる | セキュリティレビュー、監査、SLAへの影響を確認する |
| App Serviceのランタイムライフサイクルは言語コミュニティのサポートタイムラインに従う | Azure側だけで延命できるとは限らない | .NET公式サポートポリシーとApp Service設定をセットで確認する |
Microsoftの.NETサポートポリシーでは、2026年4月時点で.NET 8と.NET 9はいずれも2026年11月10日にサポート終了、.NET 10はLTSとして2028年11月14日までサポート対象とされています。移行先を検討するなら、.NET 9ではなく.NET 10を優先するのが自然です。(Microsoft)
何が変わるのか:「動く」と「サポートされる」は別問題
Azure App Serviceの.NET 8サポート終了で最も誤解されやすいのは、サポート終了日を過ぎた瞬間にアプリが起動しなくなると考えることです。実際には、App Serviceのポリシー上、サポート終了後も既存アプリがそのまま動き続ける場合があります。
ただし、これは「安全に使い続けられる」という意味ではありません。
特に問題になるのは次の3点です。
| リスク | 具体例 | 影響を受ける担当 |
|---|---|---|
| セキュリティ更新の停止 | .NET 8ランタイムに脆弱性が見つかっても修正を受けられない可能性がある | セキュリティ担当、SRE、DevOps |
| サポート対象外 | 障害調査時に「サポートされるランタイムへ移行してください」と案内される可能性がある | プラットフォームチーム、運用チーム |
| 監査・コンプライアンス上の指摘 | EOL済みランタイムの利用が内部統制や顧客監査で問題になる | 情報システム、監査対応担当 |
| 将来のApp Service設定変更への追随困難 | ポータル上で古いランタイムが選択しづらくなる、構成変更時に制約が出る | 開発者、インフラ担当 |
App Serviceの言語ランタイムサポートポリシーでは、サポート終了後のランタイムはセキュリティパッチや関連サポートを受けられず、問題が発生した場合はサポート対象バージョンへの移行が必要になると説明されています。(Microsoft Learn)
対象になるアプリの見分け方
まず確認すべきなのは、「Azure App Serviceにデプロイしている.NETアプリが、本当に.NET 8に依存しているか」です。App Serviceの画面だけを見て判断すると、見落としが発生します。
確認すべき場所
| 確認対象 | 見るべきポイント | 注意点 |
|---|---|---|
.csproj | <TargetFramework>net8.0</TargetFramework> | 複数プロジェクト構成ではWebアプリ以外のライブラリも確認する |
global.json | 使用SDKバージョン | CIとローカルでSDKがずれているとビルド結果が変わる |
| App Serviceのランタイムスタック | Linuxの場合はlinuxFxVersion | Windows App ServiceではKuduで実行環境を確認する |
| CI/CDパイプライン | setup-dotnet、Dockerイメージ、ビルドエージェント | ビルドだけ.NET 8、実行は別バージョンというケースもある |
| Dockerfile | mcr.microsoft.com/dotnet/aspnet:8.0など | カスタムコンテナはApp Service側の自動更新だけでは不十分 |
| Self-contained deployment | アプリにランタイムを同梱しているか | ランタイム更新責任がアプリ側に寄る |
特に注意したいのは、フレームワーク依存デプロイと自己完結型デプロイの違いです。フレームワーク依存デプロイではApp Service側のランタイム更新の影響を受けます。一方、自己完結型デプロイではアプリにランタイムを含めるため、開発チームが再ビルドと再デプロイでランタイムを更新する必要があります。Microsoftの.NETサポートポリシーでも、自己完結型デプロイではアプリ側がランタイム更新に責任を持つと説明されています。(Microsoft)
Azure App Serviceで.NETバージョンを確認する方法
Linux App Serviceで現在の.NETランタイムスタックを確認する場合は、Azure CLIで次のように確認できます。
az webapp config show \
--resource-group <resource-group-name> \
--name <app-name> \
--query linuxFxVersion
利用可能なLinux向けランタイムは次のコマンドで確認できます。
az webapp list-runtimes --os linux | grep DOTNET
Microsoft Learnでも、App ServiceのLinux環境ではlinuxFxVersionで現在の.NET Coreバージョンを確認し、az webapp list-runtimes --os linuxで利用可能なランタイムを確認する方法が案内されています。Windows App Serviceでは、Kuduのコンソールでdotnet --infoを実行して、インストール済みランタイムとSDKを確認できます。(Microsoft Learn)
複数サブスクリプションにApp Serviceがある場合は、Azure Resource Graphで棚卸しするのが現実的です。
az graph query -q "
Resources
| where type =~ 'microsoft.web/sites'
| project
subscriptionId,
resourceGroup,
name,
kind,
linuxFxVersion=tostring(properties.siteConfig.linuxFxVersion),
netFrameworkVersion=tostring(properties.siteConfig.netFrameworkVersion)
"
この結果だけで完全に判断せず、各アプリのリポジトリ、CI/CD、Dockerfile、runtimeconfig.jsonも確認してください。App Serviceの設定上は.NET 8に見えなくても、ビルド成果物やコンテナイメージが.NET 8ベースになっている場合があります。
.NET 10 LTSへ移行すべき理由
今回の更新で実務上の移行先として最も現実的なのは.NET 10 LTSです。.NET 9はSTSですが、2026年4月時点の公式サポート表では.NET 8と同じ2026年11月10日にサポート終了します。つまり、.NET 8から.NET 9へ移行しても、サポート期限の延長効果はほとんどありません。(Microsoft)
.NET 10はLTSであり、ASP.NET Core 10.0ではBlazor、OpenAPI、Minimal API、診断、Identityのパスキー対応などの更新が含まれます。単にサポート期限を延ばすだけでなく、今後のWebアプリ基盤として整理し直すタイミングにもなります。(Microsoft Learn)
| 移行先 | 判断 | 向いているケース |
|---|---|---|
| .NET 10 LTS | 第一候補 | 本番運用、長期保守、グローバル展開、監査対象システム |
| .NET 9 | 原則おすすめしにくい | 短期検証、.NET 10移行前の一時的な互換性確認 |
| .NET 8継続 | 期限付きの例外対応 | 移行不可の依存ライブラリがあり、リスクを明示して暫定運用する場合 |
| カスタムコンテナ | 特定ランタイムやOS依存が強い場合 | App Service標準スタックでは要件を満たせない場合 |
移行作業の基本手順
.NET 8から.NET 10への移行は、単にApp Serviceのランタイムスタックを変更するだけでは不十分です。アプリのターゲットフレームワーク、SDK、NuGet、CI/CD、監視項目を一緒に更新する必要があります。
現実的な移行フロー
| 手順 | 作業内容 | 完了条件 |
|---|---|---|
| 棚卸し | App Service、リポジトリ、Dockerfile、CI/CDの.NET 8利用箇所を洗い出す | 対象アプリ一覧と責任者が決まっている |
| 影響調査 | NuGet、EF Core、ASP.NET Core、認証、ログ、外部API連携を確認する | 破壊的変更や要修正箇所がチケット化されている |
| 開発環境更新 | .NET 10 SDK、IDE、CIビルド環境を整える | ローカルとCIで同じSDK系列を使える |
| ターゲット更新 | TargetFrameworkをnet10.0へ変更する | ビルドが通る |
| テスト | 単体、結合、E2E、負荷、セキュリティテストを実行する | 本番相当の検証環境で主要シナリオが通る |
| App Service設定更新 | Linuxランタイムスタックやコンテナベースイメージを更新する | ステージングスロットで正常起動する |
| 段階リリース | Deployment slots、カナリア、ロールバック手順を用意する | 影響を限定して本番反映できる |
| 運用移行 | 監視、アラート、Runbook、障害対応手順を更新する | 運用チームが.NET 10前提で対応できる |
Microsoftの.NETアップグレード手順では、新しい.NETバージョンへ移行する際にSDKを更新し、プロジェクトファイルのTargetFrameworkを新しいバージョンへ変更してビルドする流れが説明されています。ただし、実務では警告、依存パッケージ、破壊的変更、テストの確認が不可欠です。(Microsoft Learn)
.csprojの変更例
.NET 8のプロジェクトは、たとえば次のようになっています。
<TargetFramework>net8.0</TargetFramework>
.NET 10へ移行する場合は、次のように変更します。
<TargetFramework>net10.0</TargetFramework>
複数ターゲットの場合は、TargetFrameworksも確認します。
<TargetFrameworks>net8.0;netstandard2.1</TargetFrameworks>
このような構成では、どのターゲットを残すかを決める必要があります。社内ライブラリやNuGetパッケージを配布している場合、利用側アプリの対応状況も確認してください。
App Service側で変更するときの注意点
Linux App Serviceで.NET 10のランタイムスタックへ変更する場合、利用可能な値を確認したうえで設定します。値は環境や公開状況によって変わる可能性があるため、先にaz webapp list-runtimes --os linuxで確認してください。
az webapp config set \
--name <app-name> \
--resource-group <resource-group-name> \
--linux-fx-version "DOTNETCORE|10.0"
ただし、App Serviceのランタイムだけを変更しても、アプリ本体がnet8.0のままなら移行は完了していません。逆に、アプリをnet10.0へ変更しても、App Service側やコンテナ側が.NET 10を実行できない状態ならデプロイ後に起動エラーになります。
よくある失敗パターン
| 失敗パターン | 起きること | 防ぎ方 |
|---|---|---|
| App Service設定だけを.NET 10にする | アプリ本体が.NET 8のままで、移行完了と誤認する | .csproj、ビルドログ、実行ログを確認する |
| CIのSDKが古い | ローカルでは成功するがCIでビルド失敗する | global.jsonとCIのsetup-dotnetを更新する |
| Dockerfileのベースイメージを変更し忘れる | 本番だけ.NET 8のまま動く | aspnet:8.0やsdk:8.0を検索する |
| ステージングスロットなしで本番反映する | 起動エラー時に即ユーザー影響が出る | Deployment slotsで事前検証する |
| ログ・監視の確認を後回しにする | 起動後の性能劣化や例外増加に気づきにくい | レスポンスタイム、例外率、依存先エラーを比較する |
| グローバル環境の時差を考慮しない | 期限直前の地域別リリースで混乱する | 2026年11月10日より前の共通凍結日を設定する |
DevOpsとプラットフォームチームが今すぐやるべきこと
.NET 8のサポート終了対応は、開発チームだけに任せると漏れが出やすい作業です。App Service、CI/CD、コンテナ、監視、アラート、Service Health通知の受信者まで含めて、プラットフォーム全体で管理する必要があります。
App Serviceの通知は、サブスクリプション所有者や管理者などに送られますが、ContributorやReaderなどのロールは、Service Health Alertsに明示的に登録しない限り直接通知を受け取らない場合があります。移行担当者が通知を受け取れるよう、アラート設計も見直してください。(Microsoft Learn)
担当別チェックリスト
| 担当 | チェック項目 |
|---|---|
| 開発者 | TargetFramework、NuGet、EF Core、ASP.NET Core、認証・認可、API互換性を確認する |
| DevOps | CIのSDK、GitHub Actions / Azure Pipelines、Dockerfile、ビルドキャッシュ、デプロイスロットを更新する |
| プラットフォームチーム | App Service一覧、ランタイムスタック、Service Health Alert、Azure Policy、タグ設計を整備する |
| セキュリティ担当 | EOLランタイム利用の例外承認、脆弱性管理、監査証跡を確認する |
| プロダクト責任者 | リリース凍結期間、ユーザー影響、移行期限、ロールバック判断基準を決める |
移行スケジュールの目安
2026年11月10日がサポート終了日だからといって、11月に作業を始めるのは危険です。特にグローバル向けサービスでは、各地域のリリース凍結、年末商戦、監査、顧客レビューの時期と重なる可能性があります。
| 時期 | 推奨アクション |
|---|---|
| 2026年4月〜5月 | 対象App Serviceと.NET 8利用箇所を棚卸しする |
| 2026年6月〜7月 | .NET 10移行ブランチを作り、主要アプリからビルド検証を始める |
| 2026年8月 | ステージング環境で結合テスト、負荷テスト、監視確認を行う |
| 2026年9月 | 優先度の高い本番アプリから段階移行する |
| 2026年10月 | 残タスク、例外承認、顧客影響のあるアプリを最終処理する |
| 2026年11月前半 | 期限直前の変更を避け、既に移行済みであることを確認する |
大規模な組織では、App Serviceの数よりも「依存関係の数」がボトルネックになります。たとえば、共通認証ライブラリ、社内NuGet、ログ基盤、決済APIクライアント、古いEF Core依存が移行を遅らせることがあります。まず共通部品を.NET 10対応にし、その後に個別アプリを移行すると手戻りを減らせます。
ツール活用時の注意点
.NETの移行支援では、従来.NET Upgrade Assistantが使われてきました。ただし、2026年時点のMicrosoft Learnでは、.NET Upgrade Assistantは公式に非推奨とされ、Visual Studio 2026やVisual Studio 2022 17.14.16以降に含まれるGitHub Copilot modernization chat agentの利用が案内されています。(Microsoft Learn)
ツールを使う場合でも、以下は人間が判断すべきです。
| 判断項目 | なぜ重要か |
|---|---|
| 破壊的変更の受け入れ可否 | 自動修正でビルドが通っても、業務仕様が変わる可能性がある |
| NuGet更新の範囲 | 依存パッケージのメジャー更新で挙動が変わることがある |
| 認証・認可の確認 | Cookie、JWT、OpenID Connect周りは本番影響が大きい |
| パフォーマンス比較 | .NET 10で改善する箇所もあれば、設定変更が必要な箇所もある |
| ロールバック設計 | ランタイムとアプリを同時に戻せる状態にしておく必要がある |
AIや移行支援ツールは、作業の入口としては有効です。しかし、本番App Serviceの移行では、最終的に「ビルドできる」ではなく「本番トラフィックで安全に運用できる」ことを基準にしてください。
移行できないアプリがある場合の考え方
すべての.NET 8アプリを短期間で.NET 10に移行できるとは限りません。古いライブラリ、ベンダー製SDK、業務上の凍結期間、リソース不足などで遅れることもあります。その場合でも、何もしないのではなく、例外管理として扱うべきです。
例外対応で最低限決めること
| 項目 | 決める内容 |
|---|---|
| 例外理由 | どの依存関係が移行を妨げているのか |
| 暫定期限 | いつまで.NET 8を使うのか |
| リスク所有者 | セキュリティリスクを誰が承認するのか |
| 追加対策 | WAF、監視強化、アクセス制限、脆弱性管理の方法 |
| 最終移行計画 | .NET 10移行、リプレース、廃止のいずれか |
「サポート終了後もApp Serviceで動くかもしれない」ことを延命策にしてはいけません。サポート対象外ランタイムを使い続ける場合、障害時の調査、セキュリティ説明、顧客監査のすべてで説明責任が発生します。
まず着手すべき具体的なアクション
今日から始めるなら、次の順番が現実的です。
- Azure Resource GraphまたはAzure CLIでApp Serviceを棚卸しする
net8.0、DOTNETCORE|8.0、aspnet:8.0、sdk:8.0をリポジトリ全体で検索する- 対象アプリに「移行責任者」「移行予定月」「影響度」を付ける
- 代表的な1アプリで.NET 10移行ブランチを作り、CIとステージングデプロイを検証する
- 共通ライブラリとベースDockerイメージを先に.NET 10対応する
- 2026年10月末より前に本番移行を完了する計画にする
Azure App Service / .NETの今回の更新は、緊急障害対応ではなく、計画的な技術負債解消の合図です。.NET 8アプリがあるなら、まず棚卸しを行い、.NET 10 LTSへの移行可否を確認してください。最も避けるべきなのは、2026年11月10日直前になって、アプリ本体、App Service設定、CI/CD、コンテナ、監視のすべてを同時に変更することです。
移行は早く始めるほど、通常の開発サイクルに組み込みやすくなります。まずは1つの代表アプリで.NET 10移行の手順を固め、その手順をテンプレート化して、残りのApp Serviceへ横展開するのが最も安全です。

コメント