[アップデート] AWS Transform for .NET のモダナイゼーションが GA となり CLI でも実行できるようになりました

[アップデート] AWS Transform for .NET のモダナイゼーションが GA となり CLI でも実行できるようになりました

.NET、ATX CLI対応してなかったのか
2026.09.11

いわさです。

AWS Transform for .NET は、.NET Framework のアプリケーションを新しい .NET へ変換する機能です。
これまではマネジメントコンソールからセットアップできる AWS Transform の Web ポータルや Visual Studio などから使えました。私も以前 Visual Studio から試したことがあります。

https://dev.classmethod.jp/articles/transform-visualstudio-2026/

先日のアップデートで .NET モダナイゼーションが GA となり、CLI のコマンド 1 つでも実行できるようになりました。

https://aws.amazon.com/about-aws/whats-new/2026/09/aws-transform-dotnet-cli/

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-modernization2026-08-27 付でした。

今回はこの定義を使います。

変換元に net48 のアプリを用意する

.NET Framework 4.8 の小さなコンソールアプリを用意しました。
旧形式(非 SDK スタイル)の .csprojApp.config から設定値を読む ConfigurationManagerpackages.config など含んでいます。

Program.cs
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.ConfigurationPackageReference が入っています。

HelloLegacy.csproj
<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 に置き換わっていました。

Program.cs
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 エージェントから操作させやすくて良きですね。
今回は小さなコンソールアプリだったので、大きめのソリューションでの精度や所要時間は追って試してみたいです。

脚注
  1. Getting Started - AWS Transform ↩︎

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事