【保存版】ASP.​NETアプリのモダナイゼーション戦略のクラウド3社比較

オンプレで動かしている ASP.NET アプリケーションをどうやってモダナイズ進めて行くか。これは Windows Server のライフサイクルを考える上で必ず出てくる問題です。最近ではオンプレからオンプレへの更改事例はかなり少なく、クラウドに乗せることで自分達で管理する IT 資産を減らし運用コストを最適化していこうというのが基本的な方針になっています。しかしクラウドサービスも数多く、モダナイゼーションの手法もたくさんあるので、どうやってクラウド化を進めていったら良いか検討するのが結構めんどうだったりします。

そこで、どうやってモダナイズ先を選択するか超簡単な Decision Tree をつくってみました。
この記事ではクラウド配備モデル、.NET のライフサイクル、代表クラウド3社のそれぞれのサービス概要をみていくことで、いま持っている ASP.NET アプリのモダナイズ先にはどんな選択肢があるのかを整理したいと思います。
![スクリーンショット 2022-04-07 17.31.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/3fb8254d-4e27-486b-f196-da55c82226a0.png)


# クラウド配備モデル整理
まずはクラウド配備モデルを整理しておきます。クラウド配備モデルとは、IT資産のどの部分を誰が管理するのかをレイヤーごとに示したもので、クラウドサービスを説明する際によく使われるものです。こちらが一般的なクラウド配備モデルの図です。
![スクリーンショット 2022-04-01 17.10.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/071d7ee2-cb8d-392c-d61a-1a8c5574ec0c.png)
この図で赤枠で囲んで示しているところがいわゆるクラウドサービスと呼ばれる部分で、どこまでクラウドベンダーに管理してもらうかによって、IaaS/CaaS/PaaS/FaaS、といったパターンがあります。クラウド活用で代表されるのがクラウドの仮想マシンを使うことですが、これはIaaSと呼ばれる分類にあたるもので、その他にもコンテナサービスを使うもの、プラットフォームとして使うもの、サーバーレス環境を使うものといった分類がありそれぞれ CaaS/PaaS/FaaSと呼ばれています。.NET のアプリをクラウド移行するにせよ、現行のアプリケーションはどこを狙ってクラウド化を進めていくかを検討する必要があるということです。

## クラウド配備モデル Azure / AWS / GCP 比較
ではクラウド配備モデルに沿って、.NET アプリを動かす環境としてどんなクラウドサービスがあるか整理してみます。代表的な Azure / AWS / GCP の3社のサービスを上のクラウド配備モデルに当てはめてみます。
![スクリーンショット 2022-04-01 17.21.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/2433085f-1e31-5ff9-5c64-14363ba63a77.png)
この図から見てもわかるように、.NET アプリを移行させる先のクラウドサービスは多くの選択肢があるため、適切なサービスを選択しないと思わぬ落とし穴を踏んでしまう可能性もあります。どういった観点で選択をすれば良いのか、まずは .NET のライフサイクルから整理します。

# .NET Framework でいくか、.NET Core でいくか
IIS で .NET ベースのアプリケーションを運用している場合、クラウド移行の際には .NET Framework でいくか　.NET Core でいくががひとつの分岐点となります。違いと特徴について簡単にまとめておきたいと思います。
## .NET Framework と .NET Core の違い
### .NET Framework とは
.NET Framework は、Windows でアプリケーションをビルドして実行するためのソフトウェア開発フレームワークです。.NET Framework は、Linux、macOS、Windows、iOS、Android などのアプリを構築するためのテクノロジのコレクションである .NET プラットフォームの一部です。
.NET Frameworkの 2 つの主要なコンポーネントは、共通言語ランタイムと.NET Framework クラス ライブラリです。
- 共通言語ランタイム (CLR) は、実行中のアプリケーションを処理する実行エンジンです。スレッド管理、ガベージ コレクション、タイプ セーフ、例外処理などのサービスを提供します。
- クラス ライブラリには、一般的な機能のための一連の API と型が用意されています。文字列、日付、数値などの型を提供します。クラス ライブラリには、ファイルの読み取りと書き込み、データベースへの接続、描画などの API が含まれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/8cb78cc2-e538-4357-b585-ed6795659498.png)

### .NET Core とは
.NET は、さまざまな種類のアプリケーションを構築するための、無料のクロスプラットフォームのオープン ソース開発者用プラットフォームです。.NET を使用すると、複数の言語、エディター、ライブラリを使用して、Web、モバイル、デスクトップ、ゲーム、IoT 向けにビルドすることができます。
.NET Core　は .NET Framework　を継承しているクロスプラットフォーム言語で、さまざまなプラットフォームに対応しています。.NET  を使用するとコンテナやマイクロサービスも作成しやすくなります。

この二つの違いをまとめると、.NET Framework は古くからあるフレームワークのアプリケーションに使われているフレームワーク、.NET (.NET Core)はライブラリやパフォーマンス、クロスプラットフォーム観点で .NET Framework より充実したプラットフォームと言えるでしょう。.NET Framework を否定する訳ではなく、サポートライフサイクルや要件から適切な方を選択するのが良いと思います。
参考 : https://docs.microsoft.com/ja-jp/dotnet/standard/choosing-core-framework-server
参考 : https://www.microfocus.co.jp/manuals/ED50/VS2017/GUID-3EF28F11-9A12-4E80-9BF7-A16D25626C64.html

## ライフサイクルを考える
クロスプラットフォームを見据えると .NET (.NET Core)なのですが、新しい言語プラットフォームであるがゆえにサポートライフサイクルも短かったりします。一方で .NET Framework は4.8 が最終バージョンとされており、OS がサポートする限り .NET Framework 4.8 のまま大きなメジャーバージョンアップがないとされています。それぞれのライフサイクルについてまとめておきます。

### .NET Framework のライフサイクル
.NET Framework は 4.8 が最後のメジャーバージョンとなっており、OS のライフサイクルに従うという形になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/6986708b-c4ee-4e65-386e-ee5d14286da8.png)
参考 : https://blog.inedo.com/jp/dotnet/demystifying-net-lts
つまり、OS がサポートされていれば、その上で動いている .NET Framework 4.8 はサポートされ続けるということです。現在 Windows 11 や Windows Server 2022 が最新バージョンですが、それらの上で .NET Framework は動かすことができるため、それらの OS のサポート切れまでその上でサポートのもと動かすことができます。Windows Server 2022 は 2031 年となっているためかなり長い間使用できると想像ができます。

### .NET Core (.NET 6) のライフサイクル
.NET(.NET Core)のサポートライフサイクルポリシーは以下のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/e1d9e7a3-e937-8693-7195-ea054a2f51cf.png)
LTS の場合は3年、current バージョンの場合は18ヶ月となります。かなり早いライフサイクルだということがわかります。日本のエンタープライズのお客様は塩漬けにさせたりといった要望もあったりしますので、このライフサイクルだとウォーターホール開発を進めているうちにサポートライフサイクル期限がきてしまう、と言った形になってしまいます。
一方でこのライフサイクルに耐えられる形で DevOps を適用できる場合は、新しいテクノロジーを採用できたりクロスプラットフォームに対応できたりするため、アプリの拡張性という意味では .NET は良い選択肢になるでしょう。

# コンテナ化は検討できるかどうか
既存アプリケーションをコンテナ化させるためのリソースやナレッジがあるのであれば一つの選択肢です。.NET アプリケーションをコンテナ化するにはアプリケーション自体の改修が必要で、さらにアプリが動いているインフラも考慮する必要があるのでそれなりのイニシャルコストがかかるのですが、今後のポータビリティなどを考えてもメリットがある場合があります。ただそもそも業務アプリの更改タイミングの場合は、イニシャルコストの問題や組織の問題でコンテナ化という選択肢が取れない場合があるので、検討が必要です。
そんな背景はありますが、.NET アプリをコンテナ化する際には、.NET Framework のままコンテナ化する方法、.NET Core にアップデートしてからコンテナ化する方法があります。
## .NET Framework のままコンテナ化
.NET Framework をコンテナ化する場合は Windows 上で実行する必要があるため、Windows Container の技術を使用します。下の図がわかりやすいのですが、.NET Framework アプリは Windows Server Core をターゲットとしたコンテナ化となります。
https://docs.microsoft.com/ja-jp/dotnet/architecture/modernize-with-azure-containers/modernize-existing-apps-to-cloud-optimized/deploy-existing-net-apps-as-windows-containers
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/e495a193-98d0-8ced-5369-2625f0dfe393.png)
Windows Container のメリットとしては、既存のコードにあまり手を加えずにコンテナ化が実現できるという点と、.NET Framework ベースでコンテナ化することで長く使い続けるアプリケーションが構築できるという点です。

## .NET Core にアップデートしてコンテナ化
.NET Core にアップデートできるのであれば、Linux 上で動くアプリが構築できます。なので言ってしまえば Docker エンジンさえある環境であればどこでも動くアプリケーションが構築できます。.NET Framework と .NET は別物なのでアップデートするのにコストがかかりますが、さまざまなプラットフォームで動かすことができるので最新のテクノロジーを享受しながらアプリを構築できるという点でメリットがあります。

.NET Framework を .NET Core にアップデートするツールはいくつかありますが、マイクロソフトが提供している公式ツールは以下です。
https://docs.microsoft.com/ja-jp/dotnet/core/porting/upgrade-assistant-overview
アシスタントツールは以下のように Visual Studio で実行できるので、実はそこまで難しくはなかったりします。ただ業務アプリでさまざまなパッケージを使っていると一概にツールだけではアップグレードが難しいのは事実です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/7ae61ebb-4c7f-748c-f2df-b3b90fcb7cbf.png)

コストや難易度、そしてコンテナ化させた後の運用を見据えて選択する必要がありそうです。

# IaaS でいくか、PaaS でいくか CaaS でいくか
クラウド配備モデルそれぞれのメリットデメリットをまとめておきたいと思います。昨今クラウド化の本命は PaaS だ、いやいやコンテナ化こそ真のクラウドネイティブだと言われがちですが、それぞれのメリットデメリットを考慮して最適な選択をするのが重要です。
![スクリーンショット 2022-04-07 17.06.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/679dc866-22df-cb86-2b01-c46e35c26661.png)

.NET アプリケーションの場合は IIS で運用している場合がほとんどです。その場合 IaaS 選択をした場合は、クラウド上のサーバーにIISをインストールして運用をして行く形になります。そのためオンプレミスと同様の運用が必要なため負荷は減るわけではないです。PaaS の場合は .NET アプリをホストできる環境が既に準備された状態でクラウドリソースを立てることができるので運用コストを下げることができます。CaaS も同様でアプリが動くインフラはコンテナ技術によって自動的に生成される形になります。PaaS / CaaS どちらもクラウドで運用するとコストという観点でメリットがありますが、どちらもそのための構成に変更しなくてはいけないのでイニシャルコストが IaaS に比べてかかります。このあたりもコスト観点で判断していくことになるでしょう。

# .NET アプリを動かす Azure のクラウドサービス概要
ASP.NET の Web アプリケーションを動かす環境はクラウド代表3社では多く用意されています。それぞれ概要レベルで確認していきましょう。
#### Azure VM (IaaS)
Azure VM は Microsoft Azure が提供しているコンピューティングリソースで、サイトには以下のように定義されています。

>Azure Virtual Machines (VM) は、Azure が提供するスケーラブルなオンデマンド コンピューティング リソースの 1 つです。 通常、コンピューティング環境を他の手段より細かく管理する必要がある場合に、Azure VM を選択します。
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/overview

#### WebApp for Container、AKS (CaaS)
Web App for Container は Microsoft Azure が提供しているコンテナホスト環境サービスの一つで、公式 Docs には以下のように説明されています。

>Web App for Container は 「Web アプリに最適化された、Docker コンテナの実行基盤」です。 コンテナイメージを使用して Web アプリをデプロイできるコンテナホスト環境を提供するものです。
https://azure.microsoft.com/ja-jp/services/app-service/containers/#overview

Azure Kubernetes Service は Microsoft Azure が提供している Kubernetes のフルマネージドサービスで、公式サイトにも以下のように記載があります。

>AKS はマイクロソフトが提供しているフルマネージドのKubernetesサービスです。
https://docs.microsoft.com/ja-jp/azure/aks/

#### App Service (PaaS)
App Service は Microsoft Azure が提供する WebApp ホスト環境の PaaS で公式サイトには以下のように記載されています。

>Azure App Service を使用すると、独自のクラウド サービスを利用してより短時間でのアプリ作成が可能になります。素早く簡単に、どのプラットフォームやデバイス向けでも、エンタープライズ対応の Web アプリやモバイル アプリを作成し、作成したアプリをスケーラブルで信頼性の高いクラウド インフラストラクチャ上にデプロイできます。
https://azure.microsoft.com/ja-jp/services/app-service/

#### Azure Functions (FaaS)
Azure Functions は Microsoft Azure が提供する Serverless サービスで、公式サイトに以下の説明があります。

>Azure Functions は、記述するコードと管理するインフラストラクチャを減らし、コストを節約できるサーバーレス ソリューションです。 クラウド インフラストラクチャによって、アプリケーションの実行を維持するために必要な最新のリソースがすべて提供されるので、サーバーのデプロイや管理について心配する必要はありません。
https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-overview

### .NET アプリを動かす AWS のクラウドサービス
#### Amazon EC2 (IaaS)
Amazon EC2 は AWS が提供しているコンピューティングリソースで、サイトには以下のように定義されています。

>Amazon Elastic Compute Cloud (Amazon EC2) は、Amazon Web Service (AWS) クラウドでスケーラブルなコンピューティングキャパシティーを提供します。Amazon EC2 の使用により、ハードウェアに事前投資する必要がなくなり、アプリケーションをより速く開発およびデプロイできます。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts.html

#### ECS、EKS (CaaS)
Amazon Elastic Container Service (Amazon ECS) は、クラスターでコンテナの実行、停止、管理を簡単に行うことのできる、高度にスケーラブルで高速なコンテナ管理サービスです。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/Welcome.html

Amazon Elastic Kubernetes Service (Amazon EKS) は、クラウドまたはオンプレミスで Kubernetes アプリケーションを実行、スケールするマネージドコンテナサービスです。
https://aws.amazon.com/jp/eks/

#### Elastic Beanstalk (PaaS)
AWS Elastic Beanstalk は、Java、.NET、PHP、Node.js、Python、Ruby、Go および Docker を使用して開発されたウェブアプリケーションやサービスを、Apache、Nginx、Passenger、IIS など使い慣れたサーバーでデプロイおよびスケーリングするための、使いやすいサービスです。
https://aws.amazon.com/jp/eks/

#### Amazon Lamdba (FaaS)
AWS Lambda は、サーバーレスでイベント駆動型のコンピューティングサービスであり、サーバーのプロビジョニングや管理をすることなく、事実上あらゆるタイプのアプリケーションやバックエンドサービスのコードを実行することができます。
https://aws.amazon.com/jp/lambda/

### .NET アプリを動かす GCP のクラウドサービス
#### Compute Engine (IaaS)
Google のインフラストラクチャで仮想マシンを作成して実行できる、安全性の高いカスタマイズ可能なコンピューティング サービスです。
https://cloud.google.com/compute?hl=ja

#### GKE (CaaS)
Kubernetes を自動でデプロイ、スケーリング、管理できるシンプルな方法です。
https://cloud.google.com/kubernetes-engine?hl=ja

#### App Engine (PaaS)
App Engine は、大規模なウェブ アプリケーションを開発およびホスティングするための、フルマネージド型のサーバーレス プラットフォームです。アプリの開発では複数の一般的な言語、ライブラリ、フレームワークからの選択が可能で、開発したアプリのインスタンスのサーバー プロビジョニングとスケーリングは App Engine によってオンデマンドで行われます。
https://cloud.google.com/appengine/docs/flexible/dotnet?hl=ja

#### Cloud Functions (FaaS)
Google Cloud Functions は、クラウド サービスの構築と接続に使用するサーバーレスのランタイム環境です。Cloud Functions を使用すると、クラウドのインフラストラクチャやサービスで生じたイベントに関連する、シンプルで一義的な関数を作成できます。
https://cloud.google.com/functions/docs/concepts/overview?hl=ja


# <まとめ> .NET モダナイゼーションの　Decision Tree (Original)
ここまで基礎的なものを見てきましたが、ではどのクラウドをどう選択するべきなのか、Disicion Tree を作成してみました。あくまで個人的に作成した大まかな指針になりますので参考までにご覧いただけると幸いです。

![スクリーンショット 2022-04-07 17.31.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/3fb8254d-4e27-486b-f196-da55c82226a0.png)

ポイントは .NET Framework 4.8 を PaaS で運用できるのは Azure しかないということです。そのほかはコンテナ化してしまえばどの環境でも動かせますし、VM を立てる場合はその上に　IIS を入れて行く形になるので大きな差がありません。これからモダナイズを考えようとしている方々は、.NET Framework で行くのか .NET Core でいくのかを考えた上で、運用コスト下げるためのモダナイズとして PaaS を選択する場合は Azure Apps Service が良い選択肢といれるかと思います。

※記事はあくまで個人の見解です。