[レポート] Refactoring strategies for .NET applications as you migrate to the cloud #reinvent #XNT301

2022.12.27

いわさです。

YouTube で公開されている AWS re:Invent 2022 Breakout Session の Refactoring strategies for .NET applications as you migrate to the cloud (XNT301) のセッションレポートです。

このレポートでは数分でササッと読めるくらいでセッションのポイントと見どころを紹介したいと思います。
興味を持って頂けた方は以下のアーカイブ動画を是非ご視聴ください。

セッション概要

Modernizing .NET Framework applications by porting to .NET 6+ and refactoring to microservices can help maximize business value and ROI for your most important business applications.
In this session, learn how to accelerate .NET Framework porting using Porting Assistant for .NET and refactor monolithic .NET applications using the strangler fig pattern with AWS Microservice Extractor for .NET.

スピーカー

  • Runeet Vashisht, Sr Solutions Architect, AWS
  • Thomas Moore, Developer Advocate, AWS

レベル

  • 300 - Advanced

セッション内容

このセッションでは 7 つの移行戦略のうちのリファクタリングと再設計を行って .NET Framework アプリケーションを移行する場合のアプローチを紹介している。

お題のアプリケーション

.NET Framework 4.8 のサンプル Web アプリケーションを題材にしている。
このサンプル Web アプリケーションではメディアのアップロードからラベル付け、検索などを行うことが出来る。

構成としては EC2 + DynamoDB + S3 + CloudFront + Rekognition Image と AWS のサービスを活用したものになっている。

このアプリケーションをどういう観点で移行したいか

ビジネス的に、あるいは技術的にいくつか動機がある

  • よりスケールしやすく
  • 最新のアーキテクチャーやプラクティスを導入
  • コストを最適化
  • .NET の最新機能を使いたい
  • カスタマーフィードバックに素早く対応する

.NET Framework から .NET へ移行する

移行メリット

  • .NET でパフォーマンスが改善されている
  • クロスプラットフォームで動作出来る
    • クラウドネイティブなツールが充実している
    • Linux で動作させることでライセンス費用を削減出来る
    • ARM プロセッサでコストとパフォーマンスを最適化できる

移行にあたっての課題

  • .NET API の互換性
  • NuGet パッケージの互換性
  • 移植性の評価が難しい
  • 移行のために多くの手作業が必要になる

AWS を使って解決出来る

Porting Assistant for .NET を使う

  • 追加コストなしで多くの手動作業を自動化できる
  • ベースは .NET Framework 3.5 以降が対象
  • ソリューションファイルを含むソースコード一式が必要
  • 対応プラットフォーム
    • ASP.NET MVC
    • Web Forms から ASP.NET Core Blazor へ
    • WCF から CoreWCF へ
    • VB.NET もサポート

AWS Toolkit for .NET Refactoring というものも最近でた

  • Visual Studio に統合して使える
  • AWS へのテストデプロイ機能がある
  • DockerFile の自動生成機能やコンテナ実行時に Toolkit がサイドカーで動作してログ採取などをしてくれる

.NET Framework 4.8 を .NET 6 へ移行するデモ

このデモでは Visual Studio と AWS Toolkit for .NET Refactoring を使って、先程の Web アプリケーションを実際に移行している。
ツールの推奨事項への対処方法と自動変換部分についても解説されている。

移行後、アーキテクチャーは以下のようになり .NET 6 + Graviton で動作するようになった。

残課題

いくつかの目的を達成することが出来た。 一方でいくつかはまだ達成出来ていない

  • スケーラビリティのための最新アーキテクチャの採用
  • 最新のソフトウェア開発および導入プラクティスを採用
  • モノリスコードベースの脱却
  • DevOps の導入

マイクロサービスへリファクタリング

リファクタリングメリット

  • チームは他のチームに依存せずに新機能をビルド、テスト、リリースできる
  • オーナーシップと自主性を重視する文化を促進し、複雑さを細分化する
  • 障害が特定のサービス内に限定され、アプリケーション全体の稼働時間へのリスクを軽減する
  • きめ細かくリソース効率の高いスケーリングが可能になる

リファクタリングにあたっての課題

  • アプリケーションのうち、個別のサービスとして抽出する必要がある部分を特定するのが難しい
  • 事業領域や関連プロセスに基づいて機能をグループ化するのが難しい
  • ソースコードとランタイムメトリクスを相互に関連付けるために複数のツールを使用する必要がある
  • 機能を切り分けて展開するには手作業を行う必要がある

AWS を使って解決出来る

AWS Microservice Extracor for .NET を使うことが出来る。

  • モノリスなアプリをマイクロサービス化する際に支援してくれるツール
  • コードを解析し識別して、グループ化と抽出化を支援してくれる
  • 抽出出来たものからサービスとしてデプロイも出来る

サービスを抽出してデプロイするデモ

AWS Microservice Extracor for .NET を使うと、ソースコードを解析しクラスやインターフェースを抽出してくれる。
開発者はビジュアルグラフ上でクラスやインターフェースをサービスごとにグルーピングし、グループごとに独立した小さなサービスとして切り出すことが出来る。
切り出すと接続部分は自動で補完される。

このデモではひとつのサービスを抽出し、コンテナ化している。
変更後のアーキテクチャは以下のようになっている。

ネクストステップ

  • 残りの .NET Framework コードを .NET に移植する
  • コンテナへのデプロイ
  • 各マイクロサービスに CI/CD パイプラインを実装
  • アプリケーションをさらに分割する
  • アプリの見栄えを良くする

まとめ

  • .NET Framework アプリを .NET 6 に変換するために Porting Assistant を使う
  • マイクロサービスへリファクタリングするために AWS Microservice Extracotr を使う- 最初に .NET へ移植してから Microservice Extracotr で抽出する
  • Visual Studio 用の AWS Toolkit を使ってアプリケーションをデプロイする

さいごに

このセッションではデモを通して .NET への移行とマイクロサービスへのリファクタリングの 2 段階の移行方法を学ぶことが出来ました。
どちらもツールも以前評価したことがありましたが、このデモでは実際のコードを通して一通りの流れを実施していますので、デモ部分は特に注目して見てみてください。
Microservice Extractor でビジュアルグラフからグループ化して抽出する部分などは自動化出来ずエンジニアの判断が必要な部分なのでその辺りも参考になりました。