Lambda(C#)でトップレベルステートメントをつかってみた

2022.03.06

いわさです。

先日、AWS Lambdaで.NET 6が利用出来るようになりました。

C# 9.0ではトップレベルステートメントが利用可能です。
ただ、Lambdaでは関数をハンドラーとして指定する必要がありますが、トップレベルステートメントの場合、どのようになるのか確認してみました。

トップレベルステートメント

トップレベルステートメントは簡単にいうと、C#の定型コードを除外し、クラスや名前空間外にエントリポイント相当のコードを記述出来るようになりました。
詳細は以下を参照ください。

ただし、LambdaにおいてはAmazon.Lambda.RuntimeSupportを追加する必要があるため、定型コードとしてそこは逆に増えています。
メリットがあるかどうかでいうとちょっとまだよくわからないですね。

ただし、AWS Toolkit for Visual Studio 2022でもトップレベルステートメントに対応したテンプレートが既に存在しています。

ためしてみた

.NET 6を利用するため、Visual Studio 2022を使います。
AWS上ではあらかじめ.NET 6のLambda関数を作成しておき、Visual Studio上にはAWS Toolkit for Visual Studio 2022拡張機能をインストールしておきます。

AWS Toolkit for Visual Studio 2022では.NET 6が既にサポートされています。

従来型

トップレベルステートメントを使わない場合は通常どおり、クラスとメソッドを定義します。
そしてハンドラにて、アセンブリ名::名前空間.クラス名::メソッド名の形式で指定をします。

using Amazon.Lambda.Core;

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
namespace AWSLambda1;

public class Function
{
    public string FunctionHandler(string input, ILambdaContext context)
    {
        return input.ToUpper();
    }
}

トップレベルステートメント

トップレベルステートメントの場合はクラスやメソッドとして明示的に定義しません。
トップレベルステートメントの場合はアセンブリ名のみを指定します。

using Amazon.Lambda.Core;
using Amazon.Lambda.RuntimeSupport;
using Amazon.Lambda.Serialization.SystemTextJson;

var handler = (string input, ILambdaContext context) =>
{
    return input.ToUpper();
};
await LambdaBootstrapBuilder.Create(handler, new DefaultLambdaJsonSerializer()).Build().RunAsync();

さいごに

Lambda(C#)でトップレベルステートメントを使ってみました。
従来まではアセンブリ名::名前空間.クラス名::メソッド名でハンドラを定義していました。
トップレベルステートメントで定義する場合はアセンブリ名を指定するだけで良いので覚えておきましょう。

ただ、必ずしもトップレベルステートメントが良いかというと、制限事項も少しあるので利用にあたっては十分理解が必要だと思いました。
通常、Lambda自体がシンプルな関数実装になるのでトップレベルステートメントのメリットがFaaSにおいてどれだけあるか私がまだわかっていませんが少し使ってみたいと思います。