![[アップデート] AWS Transform for .NET のモダナイゼーションが GA となり CLI でも実行できるようになりました](https://images.ctfassets.net/ct0aopd36mqt/6sr6qXoJHrSGCktI3d56Hk/4504fc5f0b23d1e8430dfc948c18f606/aws-transform.png?w=3840&fm=webp)
[アップデート] AWS Transform for .NET のモダナイゼーションが GA となり CLI でも実行できるようになりました
いわさです。
AWS Transform for .NET は、.NET Framework のアプリケーションを新しい .NET へ変換する機能です。
これまではマネジメントコンソールからセットアップできる AWS Transform の Web ポータルや Visual Studio などから使えました。私も以前 Visual Studio から試したことがあります。
先日のアップデートで .NET モダナイゼーションが GA となり、CLI のコマンド 1 つでも実行できるようになりました。
AWS Transform 自体は ATX という CLI の機能が以前からあったのですが、すべてのプラットフォーム定義がサポートされている状態ではありませんでした。多分ですが今回の GA で .NET が加わった感じだと思います。
今回こちらを確認してみたので紹介します。
atx CLI をインストールする
今回は私の開発端末 macOS(M1 Max)にインストールしました。
Node.js 22 以降と Git が必要です[1]。
curl -fsSL https://transform-cli.awsstatic.com/install.sh | bash
なお、Web コンソールから使うときは IAM Identity Center のセットアップして使っていたんですが、CLI は IAM ユーザーやロールの認証情報だけで使うことができます。
今回は AWSTransformCustomFullAccess ポリシーをアタッチした IAM ユーザーで東京リージョンから実行しました。
利用できる変換定義は atx custom def list で確認できます。.NET モダナイゼーションは AWS/dotnet-modernization という AWS 管理の変換定義として提供されていて、atx 本体ではなくこの定義を実行する形です。
$ atx custom def list
...
│ 🏢 AWS/dotnet-modernization │ Migrate .NET Framework solutions to modern .NET (net1 │ 2026-08-27 │
右端の列は定義のバージョンです。
この変換定義カタログはサーバー側で管理されていて、古いバージョンの atx から list しても同じ一覧が返ってきます。一覧には 2025 年付の定義もある中で、AWS/dotnet-modernization は 2026-08-27 付でした。
今回はこの定義を使います。
変換元に net48 のアプリを用意する
.NET Framework 4.8 の小さなコンソールアプリを用意しました。
旧形式(非 SDK スタイル)の .csproj、App.config から設定値を読む ConfigurationManager、packages.config など含んでいます。
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
namespace HelloLegacy
{
class Program
{
static void Main(string[] args)
{
string greeting = ConfigurationManager.AppSettings["Greeting"] ?? "Hello";
var names = new List<string> { "fuga", "piyo", "hoge" };
var sorted = names.OrderBy(n => n).ToList();
foreach (var name in sorted)
{
Console.WriteLine("{0}, {1}!", greeting, name);
}
Console.WriteLine("Running on .NET Framework 4.8");
}
}
}
一点注意点として、atx は変換対象が Git リポジトリであることを前提とするようなので、git init して初期コミットまで済ませておきました。
コマンド 1 つで変換してみる
変換の実行は atx custom def exec です。-p に対象リポジトリのパス、-n に変換定義名を渡します。CI やスクリプトから自動実行したい場合は -x(非対話)を付けます。
atx custom def exec -p . -n AWS/dotnet-modernization -x -t --limit 30
非対話モードでは、ツールの実行許可を毎回確認できないため -t(--trust-all-tools)が必須でした。
--limit はエージェントの作業時間(Agent Minutes)の上限です。上限に達すると終了コード 2 で止まり、表示される atx --conversation-id <id> -t --limit <increased_limit> で続きから再開できます。
この挙動を理解せずに最初使っていて、今回は 30 分で一度止まってしまったので、値を増やして再開してます。
⚠️ Budget limit reached: 30.41 / 30.00 Agent Minutes. Exiting.
実行すると、プロジェクトを検出して移行計画を出し、.csproj の SDK スタイルへの書き換え、ConfigurationManager の置き換え、レガシーファイルの削除、ビルド検証(dotnet build での確認)まで進みました。変換の各ステップは Git のコミットとして記録されます。
$ git log --oneline
07c1d19 Migrate HelloLegacy to net10.0
fb18ef9 Initial commit: .NET Framework 4.8 sample
net10.0 に変わったか確認する
変換後の .csproj は SDK スタイルになり、ターゲットが net10.0 になっていました。
ConfigurationManager 用の参照は消え、代わりに Microsoft.Extensions.Configuration の PackageReference が入っています。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<RootNamespace>HelloLegacy</RootNamespace>
<AssemblyName>HelloLegacy</AssemblyName>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="10.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="10.0.0" />
</ItemGroup>
</Project>
設定値の読み取りも、App.config + ConfigurationManager から appsettings.json + Microsoft.Extensions.Configuration に置き換わっていました。
var configuration = new ConfigurationBuilder()
.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: false)
.Build();
string greeting = configuration["Greeting"] ?? "Hello";
net10.0 でビルドが通り、実行結果も移行前と同じでした。
$ dotnet run --project HelloLegacy/HelloLegacy.csproj
Hello, fuga!
Hello, hoge!
Hello, piyo!
Running on .NET 10.0
さいごに
本日は AWS Transform for .NET のモダナイゼーションが GA となり CLI でも実行できるようになったので、net48 のコンソールアプリを net10.0 に変換してみました。
変換コードの妥当性は評価してないですが、atx custom def exec -x -t だけで、変換からビルド検証、コミットまで通りました。
CLI だと AI エージェントから操作させやすくて良きですね。
今回は小さなコンソールアプリだったので、大きめのソリューションでの精度や所要時間は追って試してみたいです。









