AWS Elastic Beanstalk だけいつのまにか .NET 8 をサポートしていた

2024.01.16

いわさです。

.NET の最新バージョンの 8 が 2023 年 11 月の .NET Conf 2023 のタイミングでリリースされました。

AWS でも .NET をマネージドにサポートするサービスがいくつかあるのですが、実は本日時点ではまだ .NET 8 はサポートされていません。
AWS Lambda も AWS App Runner もマネージドランタイムとしてサポートされているのは一つ前の LTS である .NET 6 までです。

AWS で .NET 8 を本格的に使えるのはまだ先かなぁと思っていたら、.NET 8 を密かにサポートしているサービスを偶然発見しました。
それは Elastic Beanstalk の .NET Windows Server プラットフォームです。

.NET Windows Server の 2.13.0 以降からサポート

2023 年 12 月 5 日から使える Windows Server 2019 with IIS 10.0 version 2.13.0 などから利用可能になっていました。知らなかった!

本日時点で .NET on Windows Server の IIS 10.0 は、次のプラットフォームバージョンを選択することが出来ます。
2.13 系の最新である 2.13.1 は .NET 8 と .NET Framework 4.8 が、2.10 系は .NET 6 が、2.6.8 系は .NET 5 が利用可能です。ちなみに .NET 5 は LTS ではないですしサポートも終了していますね。

なお、残念ながら .NET Core on Linux はまだ .NET 6 までしか使えません!くっ...

Amazon Linux 2023 対応に苦労しているようだ

次のページには Lambda のマネージドランタイムのリリース予定が記載されています。
2023 年 11 月ごろでは確か .NET 8 の対応は 2024 年 1 月と記載されていました。

しかし、本日見てみると 2024 年 2 月になっていますね!!(日本語ページは 1 月のままだが)

次の AWS Lambda .NET の Issue を眺めていたのですが、どうやらリリース予定が延長されている点や Amazon Linux 2023 対応で問題が生じている点について触れられていますね。

.NET Lambda の 8 対応はもう少し先になりそうということで、気長に待ちましょう。

Elastic Beanstalk で .NET 8 アプリを実行してみる

ただ、.NET 8 を使えないなら話にならない。という人もいると思います。
.NET Framework ならまだしも、Elastic Beanstalk の Windows プラットフォームで .NET 8 を実行する人はかなり珍しいと思いますが、本日は本当に使えるのか確認してみたので紹介します。

アプリを作ってローカルで確認

dotnet new webで最小の ASP.NET Core アプリを用意し、次のように .NET ランタイムバージョンを出力出来るようにちょっとだけコードを変更しました。

Program.cs

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => Environment.Version.ToString());

app.Run();

そのまま実行してみましょう。

% dotnet run
Building...
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5233
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /Users/iwasa.takahito/work/hoge0116dotnet

.NET 8.0 だと確認が出来ました。

デプロイして確認

では、これを Elastic Beanstalk にデプロイします。
手動でやるとここがちょっと面倒なのですが、次の手順にしたがって進めれば、まぁうまくいきます。

公開用にビルドしたモジュールを Zip 圧縮し、マニフェストファイルを作ってさらに Zip ファイルで同梱させます。

% dotnet publish -o site
MSBuild version 17.8.3+195e7f5a3 for .NET
  Determining projects to restore...
  All projects are up-to-date for restore.
/usr/local/share/dotnet/sdk/8.0.101/Current/SolutionFile/ImportAfter/Microsoft.NET.Sdk.Solution.targets(36,5): warning NETSDK1194: The "--output" option isn't supported when building a solution. Specifying a solution-level output path results in all projects copying outputs to the same directory, which can lead to inconsistent builds. [/Users/iwasa.takahito/work/hoge0116dotnet/hoge0116dotnet.sln]
  hoge0116dotnet -> /Users/iwasa.takahito/work/hoge0116dotnet/bin/Release/net8.0/hoge0116dotnet.dll
  hoge0116dotnet -> /Users/iwasa.takahito/work/hoge0116dotnet/site/
% cd site
site % zip ../site.zip *
  adding: appsettings.Development.json (deflated 28%)
  adding: appsettings.json (deflated 26%)
  adding: hoge0116dotnet (deflated 77%)
  adding: hoge0116dotnet.deps.json (deflated 51%)
  adding: hoge0116dotnet.dll (deflated 58%)
  adding: hoge0116dotnet.pdb (deflated 49%)
  adding: hoge0116dotnet.runtimeconfig.json (deflated 49%)
  adding: web.config (deflated 37%)
site % cd ..
% cat aws-windows-deployment-manifest.json 
{
    "manifestVersion": 1,
    "deployments": {
        "aspNetCoreWeb": [
        {
            "name": "test-dotnet-core",
            "parameters": {
                "appBundle": "site.zip",
                "iisPath": "/",
                "iisWebSite": "Default Web Site"
            }
        }
        ]
    }
}

% zip test-dotnet-core.zip site.zip aws-windows-deployment-manifest.json
  adding: site.zip (stored 0%)
  adding: aws-windows-deployment-manifest.json (deflated 49%)

あとは AWS マネジメントコンソール上から Elastic Beanstalk のアプリと環境を作成し、アプリケーションコードとして作成したバンドルファイルを指定します。

数分時間がかかりますが、環境のデプロイが完了したら発行された URL にアクセスしてみましょう。

.NET 8 が Elastic Beanstalk で実行されていることが確認出来ました。

さいごに

本日は AWS Elastic Beanstalk だけいつのまにか .NET 8 をサポートしていたので実際に試してみました。

Windows だけですが、.NET 8 使えましたね。
Windows の .NET Core だと Web よりワーカーの利用のほうが多いのかなと個人的に思っているのですが、Windows 依存のライブラリとかで .NET 8 の機能使いたい場合だとまだ需要があるのでしょうかね。