[イベントレポート] Amazon Q Developerで.NET Frameworkから.NETへマイグレーション
はじめに
2024年2月27日、アマゾンウェブサービスジャパン様の目黒オフィスにて「.NET開発者同士でのハンズオンで体感!生成AIでレガシーな .NET Frameworkアプリを最新 .NETに変換」イベントが開催されました。イベントは前半と後半に分かれており、前半はセッション、後半はハンズオンとなっています。
この記事はそのイベントレポートとなります。
概要
イベント名からわかるように、生成AIを用いて.NET Frameworkから.NET(旧称.NET Core)へのマイグレーションをハンズオンで体験できるイベントです。
事実上の後継である.NETが登場してからも、.NET Frameworkはまだまだ現役で使われている技術です。実際、イベントに参加された方々も.NET Framework製のアプリケーションを開発・運用しているとのことでした。
.NETへのマイグレーションは、コスト削減やパフォーマンス向上など、多くのメリットがありますが、その一方で、大規模なアプリケーションの場合、リソースの確保や時間的な制約があるため、なかなか進まないという課題もあります。
そんな中、以下にもあるように、AWS re:Invent 2024で Amazon Q Developer
の Code Transformation for .NET
機能が発表されました。
以降、この記事ではQCT .NETと呼びます。QCT .NETは生成AIを活用することで、.NET Frameworkから.NETへのマイグレーションを支援することが期待されています。
今回のイベントでは、QCT .NETを使って.NET Frameworkのアプリケーションを.NETに変換するという内容になっています。
.NETにマイグレーションする利点
セッションでも説明されていましたが、.NETにマイグレーションする利点は大きく以下のようなものがあります。
- インスタンスのコストを削減できる
- Linuxで動作することにより、Windows on EC2に比べて40〜50%のコスト削減になる
- アプリケーションにもよるが、コードの実行速度が30〜40%増加する
- CPUにGravitonを採用すると、さらに最大40%の費用対性能が向上する
- OSSのメリットを享受できる
- ベンダーロックイン、ライセンスの価格改定・ポリシーの変更影響を受けなくなる
- 軽量なコンテナ環境への移行することで、ポータビリティやスケーラビリティが向上する
- Lambdaへのデプロイが可能になるなどサーバレスへの移行が容易になる
多くのアプリケーションでコストメリットが期待できますが、個々のアプリケーションによって結果は異なりますのでご注意ください。
マイグレーションが進まない理由
マイグレーションのメリットは明らかであるものの、なぜそれが進まないのかというと、以下のような理由が挙げられます。
- 大規模で複雑なアプリケーション
- アプリケーションによってはソリューション内のプロジェクト数が100を超えることも
- 時間的にも人的にもリソースの確保が難しい
- 移行をサポートするツールがまだまだ不十分
- deprecatedなAPIを使っている処理のリファクタリングが必要
こういった課題を解決する選択肢の1つとして、QCT .NETが登場しました。
ハンズオン
ハンズオンの流れは以下の通りです。
- Windows on EC2のVisual StudioからQCT .NETを使えるようにする
- ASP.NET MVCのWebアプリケーションをQCT .NETで変換
- QCT .NETでは変換されない部分を手動で修正
- 変換したアプリケーションをLinuxコンテナにデプロイ
以下のリポジトリにあるアプリケーションを変換していきます。
ソリューションには5つのプロジェクトがあり、変換対象のファイル数は126ファイルです。このアプリケーションをQCT .NETで変換していきます。
ハンズオンの手順に従って進めていきましたが、変換に掛かった時間は約13分でした。
内容を見てみると、名前空間の宣言が追加されていたり、メソッドが変換されていたり、ASP.NET MVCのApp_Startフォルダ配下のファイルが削除(厳密にはbak拡張子に移動)されたり、ASP.NET Coreのスタートアップクラスである Program.cs
が追加されていたり、必要に応じて追加・更新・削除がおこなわれていました。
例えば、クッキーを有効期限切れにするといったログアウト処理を行うコントローラーのメソッドですが、元々は以下のようになっていました。
private ActionResult LocalSignOut()
{
if (HttpContext.Request.Cookies["LocalAuthentication"] != null)
{
HttpContext.Response.Cookies.Add(new HttpCookie("LocalAuthentication") { Expires = DateTime.Now.AddDays(-1) });
}
return RedirectToAction("Index", "Home");
}
これがQCT .NETで変換されると以下のようになります。
private ActionResult LocalSignOut()
{
if (Request.Cookies["LocalAuthentication"] != null)
{
Response.Cookies.Delete("LocalAuthentication");
}
return RedirectToAction("Index", "Home");
}
これだけを見ると大した変更ではないように見えますが、手動で同じような変更作業を行おうとすると、多大な時間と労力がかかることは想像に難くありません。変更後の仕様、ここで言うと.NETの仕様も把握しておく必要があります。
ただし、全てのコードが完全に自動で変換できるわけではありません。.cshtml、.master、.razor などの UI ファイル内のコードの変換は現時点ではサポートしていません。手動で修正する必要があるので、ドキュメントを参考にしながらトライアンドエラーで解決していくことにはなります。
例えば、以下のような.cshtmlファイルのコードは変換されず、Visual Studio上でエラーが発生します。
<div class="col-12">
<label class="visually-hidden" for="OfferStatusSelect">Offer status</label>
@Html.EnumDropDownListFor(a => a.Filters.OfferStatus, "All Offer Statuses", new { @class = "form-select" })
</div>
エラーメッセージは EnumDropDownListForの定義がない
などで、要するに.NET 8ではサポートされていないということです。これを修正するためには、手動で修正する必要があります。
<div class="col-12">
<label class="visually-hidden" for="OfferStatusSelect">Offer status</label>
<select asp-for="Filters.OfferStatus" asp-items="Html.GetEnumSelectList<OfferStatus>()" class="form-select">
<option value="">All Offer Statuses</option>
</select>
</div>
今回はハンズオン資料に修正方法が記載されていたため、それに従って修正をおこないました。しかし、実際には修正方法が明らかになっている場面は少なく、事前知識なしでこのような修正を行うのは難しいかもしれません。
この辺りの課題がGAに向けて改善されることを期待したいところです。
おわりに
とは言え、思っていたよりも正確に変換されていたり、手動で修正する部分も少なかったりと、QCT .NETは十分に使えるツールであると感じました。特に、大規模なアプリケーションの場合、このツールを使うことで、大幅な時間短縮が期待できるのではないでしょうか。
UIファイルが変換されないという課題はありますが、だからといってQCT .NETを試さないというのは違うかなと思いました。実際に動かしてみることで見えてくるものもあるかと思いますので、.NET Framework資産をお持ちの方は、ぜひ一度試してみてはいかがでしょうか。
(おまけ)会場での質疑
Q. 読み込まれたコードは学習に使われるのでしょうか?
A. モデルの学習には一切使われませんので、セキュリティはご安心ください。
Q. サービス利用のコストはいくらでしょうか?
A. 2025年2月現在はプレビュー版で、Pro Tierをサブスクライブ(月額20ドル)すれば、追加費用なしに変換が可能です。