.NET Core CLI - AWS Lambda

.NET Core CLI

.NET Core CLI では、クロスプラットフォームで .NET ベースの Lambda アプリケーションを作成することができます。このセクションでは、.NET Core CLI がインストールされていることを想定しています。まだインストールしていない場合は、Microsoft の Web サイトで、「Download .NET」を参照してください。

.NET CLI では、コマンドラインから .NET プロジェクトを作成するために new コマンドを使用します。これは、Visual Studio 以外でプロジェクトを作成する場合に便利です。使用可能なプロジェクトタイプのリストを表示するには、コマンドラインを開いて .NET Core ランタイムをインストールした場所に移動し、以下のコマンドを入力します。

dotnet new -all Usage: new [options] ... Templates Short Name Language Tags ---------------------------------------------------------------------------------------------------------------------------- Console Application console [C#], F#, VB Common/Console Class library classlib [C#], F#, VB Common/Library Unit Test Project mstest [C#], F#, VB Test/MSTest xUnit Test Project xunit [C#], F#, VB Test/xUnit ... Examples: dotnet new mvc --auth Individual dotnet new viewstart dotnet new --help

Lambda では、Amazon.Lambda.Templates の NuGet パッケージを介して追加のテンプレートを提供しています。次のコマンドを実行して、このパッケージをインストールします。

dotnet new -i Amazon.Lambda.Templates

インストールが完了すると、Lambda テンプレートは dotnet new の一部として表示されます。テンプレートに関する詳細を確認するには、help オプションを使用します。

dotnet new lambda.EmptyFunction --help

この lambda.EmptyFunction テンプレートでは、以下のオプションがサポートされています。

これらのオプションは、aws-lambda-tools-defaults.json という名前のファイルに保存されます。

関数プロジェクトを lambda.EmptyFunction テンプレートを使用して作成します。

dotnet new lambda.EmptyFunction --name MyFunction

src/myfunction ディレクトリで次のファイルを調べます。

  • aws-lambda-tools-defaults.json: Lambda 関数をデプロイするときに指定するコマンドラインオプションの場所です。次に例を示します。

    "profile" : "default", "region" : "us-east-2", "configuration" : "Release", "function-runtime":"dotnet6", "function-memory-size" : 256, "function-timeout" : 30, "function-handler" : "MyFunction::MyFunction.Function::FunctionHandler"
  • Function.cs: Lambda ハンドラの関数コード。これは、デフォルトの Amazon.Lambda.Coreライブラリ とデフォルトの LambdaSerializer 属性が含まれる C# テンプレートです。要件とオプションのシリアル化に関する詳細は、「Lambda 関数のシリアル化」を参照してください。これには、Lambda 関数コードに適用するために編集できるサンプル関数も含まれています。

    using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Amazon.Lambda.Core; // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class. [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace MyFunction { public class Function { public string FunctionHandler(string input, ILambdaContext context) { return input.ToUpper(); } } }
  • MyFunction.csproj: アプリケーションを構成するファイルとアセンブリをリスト表示する MSBuild ファイル。

    <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles> <AWSProjectType>Lambda</AWSProjectType> <!-- Makes the build directory similar to a publish directory and helps the AWS .NET Lambda Mock Test Tool find project dependencies. --> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <!-- Generate ready to run images during publishing to improve cold start time. --> <PublishReadyToRun>true</PublishReadyToRun> </PropertyGroup> <ItemGroup> <PackageReference Include="Amazon.Lambda.Core" Version="2.1.0 " /> <PackageReference Include="Amazon.Lambda.Serialization.SystemTextJson" Version="2.2.0" /> </ItemGroup> </Project>
  • Readme: このファイルを使用して Lambda 関数をドキュメント化します。

myfunction/test ディレクトリで次のファイルを調べます。

  • myFunction.Tests.csproj: 既に説明したように、これは、テストプロジェクトを構成するファイルとアセンブリをリスト表示するための、MSBuild ファイルです。Amazon.Lambda.Core ライブラリが含まれているため、関数のテストに必要な Lambda テンプレートをシームレスに統合できることにも留意してください。

    <Project Sdk="Microsoft.NET.Sdk"> ... <PackageReference Include="Amazon.Lambda.Core" Version="2.1.0 " /> ...
  • FunctionTest.cs: src ディレクトリに含まれているのと同様の C# コードテンプレートファイルです。このファイルを編集して関数の本番稼働コードを写し、本番稼働環境にアップロードする前に Lambda 関数をテストします。

    using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Xunit; using Amazon.Lambda.Core; using Amazon.Lambda.TestUtilities; using MyFunction; namespace MyFunction.Tests { public class FunctionTest { [Fact] public void TestToUpperFunction() { // Invoke the lambda function and confirm the string was upper cased. var function = new Function(); var context = new TestLambdaContext(); var upperCase = function.FunctionHandler("hello world", context); Assert.Equal("HELLO WORLD", upperCase); } } }

関数のテストに成功したら、Amazon.Lambda.Tools の .NET Core Global Tool を使用して、ビルドおよびデプロイを実行できます。.NET Core Global Tool をインストールするには、次のコマンドを実行します。

dotnet tool install -g Amazon.Lambda.Tools

ツールがすでにインストールされている場合には、次のコマンドを実行し、最新バージョンを使用していることを確認します。

dotnet tool update -g Amazon.Lambda.Tools

Amazon.Lambda.Tools の .NET Core Global Tool の詳細については、GitHub の AWS Extensions for .NET CLI リポジトリを参照してください。

Amazon.Lambda.Tools がインストールされたら、次のコマンドを実行して関数をデプロイします。

dotnet lambda deploy-function MyFunction --function-role role

デプロイが完了したら、次のコマンドで Lambda 関数のハンドラに異なる値を渡しながら、本番稼働環境での再テストを実施できます。

dotnet lambda invoke-function MyFunction --payload "Just Checking If Everything is OK"

すべてが成功すると、次のメッセージが表示されます。

dotnet lambda invoke-function MyFunction --payload "Just Checking If Everything is OK" Payload: "JUST CHECKING IF EVERYTHING IS OK" Log Tail: START RequestId: id Version: $LATEST END RequestId: id REPORT RequestId: id Duration: 0.99 ms Billed Duration: 1 ms Memory Size: 256 MB Max Memory Used: 12 MB