AWS Lambdaが.NET Core 3.1に対応しました

2020.04.14

しばたです。
先月末の話なのですが、AWS Lambdaが.NET Core 3.1のサポートを開始したのでブログにまとめておきます。

以前の.NET Core 2.1対応が2018年7月ですのでだいたい1年8ヶ月ぶりのバージョンアップとなります。

.NET Core 3.1について

最初に.NET Core 3.1について軽く触れておきます。

.NET Core 3.1は2019年12月にリリースされた.NET Core最新の長期サポートリリース(LTS)版となります。
長期サポートなのでリリースから3年のサポートとなり、2022年12月3日までのサポートが予定されています。
.NET Core 2.1もLTS版ですがサポート期限は2021年8月21日までとなっています。

Lambdaのサポートと.NET Coreのサポートは別物ですが、現在.NET Core 2.1のLambdaをお使いの方は早めの移行計画を立ておくのが良いでしょう。

.NET Core 3.1新機能

.NET Core 2.x系の更新では.NET Frameworkとの互換性強化やパフォーマンス改善に関するものが多くありました。
.NET Core 3.0および3.1では、

  • C# 8.0
  • .NET Standard 2.1
  • 階層型コンパイル
  • Windows Presentation Foundation (WPF) および Windows Form のサポート (Windowsのみ)
  • 単一ファイルの実行可能ファイル のサポート
  • System.Index 型、非同期ストリームといったAPIの機能追加
  • System.Text.Json 名前空間
  • HTTP/2 のサポート

といった新機能が提供されており、Lambdaに直接関係しそうな機能は少ない印象を受けます。

またバージョン毎での破壊的変更については以下のドキュメントにまとめられていますので、.NET Core 2.1からの移行の際に参考になると思います。

AWS Lambdaの.NET Core 3.1対応

前置きが長くなりましたがここから本題に入ります。

ランタイムと対応言語

これまでの.NET Core 2.1ランタイムではAmazon Linuxを基盤OSとし、C#およびPowerShell(PowerShell Core 6.0)が対応していました。
.NET Core 3.1ランタイムでは基盤OSがAmazon Linux 2に更新され、C#およびPowerShell(PowerShell 7)対応となっています。

OSの更新については以下の記事が参考になります。

PowerShell 7対応については以下の記事をご覧ください。

Lambdaの.NET Core 3.1対応

最初に紹介したAWS Compute Blogの記事によると以下の点で.NET Core 3.1対応しているそうです。

  • Amazon.Lambda.AspNetCoreServerなどのライブラリの最新化
  • System.Text.Jsonを使ったAmazon.Lambda.Serialization.SystemTextJson.LambdaJsonSerializerシリアライザ
    • 従来のAmazon.Lambda.Serialization.Json.JsonSerializerJson.NETを使用
  • 階層型コンパイルの使用によるコールドスタート時のパフォーマンス改善 (Linux環境のみサポート)
    • デプロイ時のパラメーターで"/p:PublishReadyToRun=true --self-contained false"を指定
  • AWS Mock .NET Lambda Test Toolの更新

.NET Core 3.1 Lambdaへの移行

既存の.NET Core 2.1 Lambda関数を.NET Core 3.1に移行するには以下の手順を踏むことでプロジェクト設定を移行できます。

  1. プロジェクトファイル(.csprojor.fsproj)を開き TargetFrameworknetcoreapp3.1 に書き換えて更新
  2. aws-lambda-tools-defaults.json ファイルを開き
    • function-runtime フィールドがあれば netcoreapp3.1 に書き換えて更新
    • framework フィールドがあれば netcoreapp3.1 に書き換えて更新 (削除してプロジェクトファイルの設定に合わせる形でも可)
  3. serverless.template ファイルがある場合、 AWS::Lambda::FunctionAWS::Servereless::FunctionRuntimeプロパティをnetcoreapp3.1 に書き換えて更新
  4. 全ての Amazon.Lambda.* なNuGetパッケージを最新バージョンに更新

あくまでもこれはLambda関数およびSAMアプリケーションを.NET Core 3.1でビルドできる様にするだけの移行ですので、個別の検証は別途必要となります。

最後に

ざっとこんな感じです。
まだ開発環境を整えてている最中で"やってみる"ことができていないのですが、準備ができ次第この記事に追記するか別記事で紹介したいと思います。


【2020/04/15追記】

開発環境の構築と合わせて.NET Core 3.1 Lambdaを試してみましたのでこちらも併せてご覧ください。