AWSLambda関数を使用した.NET入門
AWS Lambda Functionsは、サーバーなしでコードを実行できるサーバーレスコンピューティングモデルです。これらは通常、JavaScriptやPythonなどの言語で記述されていますが、AWSは現在、を含む多くの異なるランタイムをサポートしています。C#用のNET。
なぜ使用するのか。ラムダのNET?
現在、ラムダで利用できる言語はたくさんあるので、多くのオプションがあります。通常、JavaScriptとPythonは、起動と実行をすばやく処理する単純な自動化関数に使用されます。しかし、それらは重い処理に対して最もパフォーマンスが高く、動的に型付けされたスクリプト言語は複雑なアプリケーションにとって重大な欠点です。
C#言語を好む場合、特にPythonまたはJavaScriptへの切り替えが面倒な場合は、LambdaにC#を使用してもそれほど多くの欠点はありません。AWSが提供するツールも優れており、AWS SDK全体にアクセスできるため、LambdaやDynamoDBなどのサービスを簡単に検索できます。
さらに、AWSはランタイム全体をサポートします。NET。これは、バイナリにコンパイルされるC#以外の言語も使用できることを意味します。ネット。C#が最も人気がありますが、F#またはVB.NETでラムダ関数を作成することもできます。
使い方?
JavaやC#のような言語ははるかに優れている傾向がありますが、それらを使用することには欠点があります。どちらも起動時にコンパイルする必要のあるバイトコードにコンパイルされるため、特にコールド起動時に起動時間が長くなります。「コールドスタート」とは、AWSが過去数分間に機能を実行しなかったため、キャッシュされない場合です。実行するには、時間内に再度コンパイルする必要があります。このプロセスにより、関数の応答に1秒以上かかる可能性がありますが、これはWebアプリケーションには適していません。
ただし、Lambdaを頻繁に使用すると、この問題は大幅に軽減されます。専用の並列処理により、コールドスタート時間を完全に短縮することもできます。の一般的な応答時間。NETは非常に大きく、パフォーマンスはGoやRustなどの完全にコンパイルされた言語と同等です。
現在JavaforLambda関数を使用している場合、C#は最新のランタイムであるため、実行可能な代替手段になる可能性があります。NET 6はメモリの使用量が少なく、ほとんどの場合、JVMよりも高速に起動します。
C#ラムダ関数の設定
まず、インストールする必要があります。ネット。AWSがサポートしています。NETCore3.1および。NET 6なので、これら2つのランタイムのいずれかが機能しますが、最も重要なdotnet
のは、LambdaテンプレートをインストールできるようにCLIをインストールする必要があることです。あなたは得ることができます。MicrosoftドキュメントポータルからのNET。
LambdaテンプレートとグローバルLambdaツールをインストールする必要があります。
dotnet new -i Amazon.Lambda.Templates
dotnet tool install -g Amazon.Lambda.Tools
これにより、多くのオプションが設定されます。あなたはそれらすべてをリストすることができます:
dotnet new --list
このツールは、さまざまなユースケース向けに事前構成された多くのパッケージ化されたテンプレートが付属しているため、非常に便利です。通常、ビルドサイズを小さく保つには、プロジェクトごとに1つの関数が必要ですが、CloudFormationテンプレートを使用してデプロイされたAWSサーバーレステンプレートを使用する場合は、1つのDLLに複数の関数を含めることができます。それらは管理がはるかに難しいので、あなたに利益をもたらす場合にのみ使用してください。
ただし、ソリューションファイルを使用します。NETでは、共有アセンブリを参照する複数の並列プロジェクトを持つことができるため、これは大したことではありません。
ここでは、を使用してプロジェクトを作成する単純な「空関数」テンプレートを使用します。NET6.コマンドラインまたはエディターの新しいプロジェクト画面から作成できます。
dotnet new lambda.EmptyFunction --name SimpleLambdaFunction --profile default --region us-east-1
これにより、非常に単純な関数が生成されます。入力として文字列を受け取り、を渡しILambdaContext
ます。これMain()
はLambdaのエントリポイント関数であり、Lambda関数が呼び出されるたびにランタイムによって呼び出されます。この特定の関数はを返しますが、これを実行して を返すstring
こともできます。async
Task<string?>
上部に、JSONシリアライザーを構成するアセンブリ属性が表示されます。内部的には、Lambdaが入力コンテンツを逆シリアル化してから、関数を呼び出します。その後、何かを返すと、応答ストリームに書き込まれます。Lambdaライブラリはこのパターンを処理し、関数をラップするコードはにありHandlerWrapper
ます。
基本的に、すべての種類のメソッドシグネチャを処理し、関数が入力を受け取ると、それらの入力を逆シリアル化します。関数が出力を返す場合、その出力をシリアル化します。rawクラスを操作する関数を記述できるため、これを実際に行う必要はありませんが、作業をStream
簡単にするための優れたラッパークラスです。
これは、関数との間で受け渡される入力と出力に対して独自のモデルを自由に定義できることを意味します。これは、C#を使用したJSON処理の優れた利点の1つです。
この関数ではInputModel
、クラスを逆シリアル化し、非同期で1秒間待機してからOutputModel
、クラスを返します。このクラスはシリアル化されて出力ストリームに戻されるため、Lambdaはそれを処理できます。
ラムダ関数の実行
作成後に関数を実行するのは、Lambdaコマンドラインインターフェイスなので非常に簡単です。NETはそれを展開するための方法を提供します。で実行deploy-function
するだけ
dotnet lambda deploy-function SimpleNETFunction
IAMロールを選択するか、新しいロールを作成する必要があります。また、この新しいロールにアクセス許可を追加する必要がある場合があります。これで、コンソールに関数が表示されます。
Lambdaには、JSONを渡すことができる組み込みのテスターが用意されています。
これにより、実行され、実行に関するすべての詳細が表示されます。この場合、最小関数が非常に小さいため、コールドスタート時間は500ミリ秒未満であり、これはかなり適切です。NETおよびLambda全般。暖かくなるとすぐに、支払われる期間は数ミリ秒に短縮されます。
この場合、関数はメモリをまったく使用せず、関数を128MBに減らしても問題は発生しませんでした。
コメントを残す