【開発編】.NET6.0でAWS Lambda開発

.NET6.0をRuntimeとしてAWS Lambdaを開発するための基本的な手順と参照するリファレンスについて記載します。 このページでは新規Lambdaプロジェクトの作成からテスト実行までを行います。

.NET SDKやLambda Templateのインストールがまだ終わっていない方は準備編をお読みください。

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のデバッグ機能でテストツールを起動するための設定を行います。

launch.jsonの作成

VSCode上で「Ctrl + Shift + D」を押すか画面左側のRun and Debugのアイコンをクリックしてください。

create a launch.json fileのリンクをクリックすると画面上部にSelect environmentが表示されるので「.NET 5+ and .NET Core」を選択してください。

launchファイルを作成する

.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を押すとテストツールが起動します。

テストツールを起動する

テストツールからLambdaを実行する

Function InputにはLambda実行時に渡したい値を入力します。
Execute FunctionをクリックするとLambdaが実行され、実行結果がResponseに表示されます。
この時、Function.cs側でブレークポイントを設定しておけばステップ実行も可能です。
※Config FileやAWS Credential Profile等については別の記事で紹介しようと思います。

以上

次:AWS環境へのデプロイ