いわさです。
.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 の機能使いたい場合だとまだ需要があるのでしょうかね。