【開発編】.NET6.0でAWS Lambda開発
.NET6.0をRuntimeとしてAWS Lambdaを開発するための基本的な手順と参照するリファレンスについて記載します。 このページでは新規Lambdaプロジェクトの作成からテスト実行までを行います。
.NET SDKやLambda Templateのインストールがまだ終わっていない方は準備編をお読みください。
.NET SDKとLambda用のテンプレートをインストールしているのでコマンドラインからプロジェクトを作成できます。
まずは空のFunctionを作成します。(記事内ではemptysampleというプロジェクト名にしています。)
dotnet new lambda.EmptyFuction -n <任意のプロジェクト名>
以下のようなファイルが作成されます。
Function本体のほかにテストプロジェクトも作成されます。
利用可能なテンプレートを確認する
dotnet new --list
を実行すると利用可能なテンプレートを確認できます。
例えば、API Gatewayと統合してServerlessのRestAPIを開発する場合はdotnet new serverless.EmptyServerless -n <任意のプロジェクト名>
が利用できます。
Function.cs
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 emptysample;
public class Function
{
/// <summary>
/// A simple function that takes a string and does a ToUpper
/// </summary>
/// <param name="input"></param>
/// <param name="context"></param>
/// <returns></returns>
public string FunctionHandler(string input, ILambdaContext context)
{
return input.ToUpper();
}
}
Lambdaが実行された時に呼び出されるのがFunctionHandler
です。
第一引数のstring input
にはトリガーから引き渡される値が入ってきます。
第二引数のILambdaContext
にはLambda自体の情報が入ってきます。
returnで呼び出し元へ実行結果を返却します。
型を指定する
トリガー毎に用意されている型を指定することも可能です。
例えば、API Gatewayをトリガーとした場合、第一引数の型をAPIGatewayProxyRequest
に、戻り値の型をAPIGatewayProxyResponse
に設定できます。
Install-Package Amazon.Lambda.APIGatewayEvents -Version 2.4.1
を実行してプロジェクトにパッケージを追加、Function.csにusing Amazon.Lambda.APIGatewayEvents;
を追加してください。
FunctionTest.cs
using Xunit;
using Amazon.Lambda.Core;
using Amazon.Lambda.TestUtilities;
namespace emptysample.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);
}
}
テストコードについては詳しく書きませんが、単にFunction.csのFunctionHandlerを呼び出して、実行結果をチェックしているだけです。
コードは修正せずにテスト実行してみます。
テストプロジェクトのcsprojファイルがあるディレクトリに移動して、テストを実行します。
# Testプロジェクトのフォルダへ移動
cd emptysample\test\emptysample.Tests
# テスト実行
dotnet test
復元対象のプロジェクトを決定しています...
D:\dev\lambdaDotnet\emptysample\src\emptysample\emptysample.csproj を復元しました (339 ms)。
D:\dev\lambdaDotnet\emptysample\test\emptysample.Tests\emptysample.Tests.csproj を復元しました (657 ms)。
emptysample -> D:\dev\lambdaDotnet\emptysample\src\emptysample\bin\Debug\net6.0\emptysample.dll
emptysample.Tests -> D:\dev\lambdaDotnet\emptysample\test\emptysample.Tests\bin\Debug\net6.0\emptysample.Tests.dll
D:\dev\lambdaDotnet\emptysample\test\emptysample.Tests\bin\Debug\net6.0\emptysample.Tests.dll (.NETCoreApp,Version=v6.0) のテスト実行
Microsoft (R) Test Execution Command Line Tool Version 17.2.0 (x64)
Copyright (c) Microsoft Corporation. All rights reserved.
テスト実行を開始しています。お待ちください...
合計 1 個のテスト ファイルが指定されたパターンと一致しました。
成功! -失敗: 0、合格: 1、スキップ: 0、合計: 1、期間: < 1 ms - emptysample.Tests.dll (net6.0)
テストコードを書いて実行する他に、Amazon.Lambda.Toolsを使えばGUIでコードを実行できます。
ここではVSCodeのデバッグ機能でテストツールを起動するための設定を行います。
VSCode上で「Ctrl + Shift + D」を押すか画面左側のRun and Debugのアイコンをクリックしてください。
create a launch.json fileのリンクをクリックすると画面上部にSelect environmentが表示されるので「.NET 5+ and .NET Core」を選択してください。
.vscode\launch.jsonを以下の通り編集してください。
{
"version": "0.2.0",
"configurations": [
{
"name": "Run Mock Lambda Test Tool",
"type": "coreclr",
"request": "launch",
"program": "C:/Users/${env:USERNAME}/.dotnet/tools/dotnet-lambda-test-tool-6.0.exe",
"args": [],
"cwd": "${fileDirname}\\bin\\Debug\\net6.0",
"console": "internalConsole",
"stopAtEntry": false,
"internalConsoleOptions": "openOnSessionStart"
},
]
}
画面左側のRun and Debugでlaunch.jsonで作成した設定のnameが指定されていることを確認しておいてください。
テストを実行したいFunction.csを開いた状態でF5を押すとテストツールが起動します。
Function InputにはLambda実行時に渡したい値を入力します。
Execute FunctionをクリックするとLambdaが実行され、実行結果がResponseに表示されます。
この時、Function.cs側でブレークポイントを設定しておけばステップ実行も可能です。
※Config FileやAWS Credential Profile等については別の記事で紹介しようと思います。
以上