AWS Lambda での.NET ワークロード

モジュール 5

モジュール 5: ユニットテストとデバッグ

 学習モジュール

ここで紹介した例を参考にしてもかまいませんが、その必要はありません。

Lambda 関数をテストするにはさまざまな方法があります。最も簡単なのは、AWS Lambda プロジェクトテンプレートで提供されるユニットテストを使用して構築することです。テストを実行するために必要なのは、IDE の使い慣れたテストランナー、または単純な dotnet テストだけです。

もう 1 つのオプションは、AWS .NET モックラムダテストツールを使用することです。現在プレビュー中です。これにより、Lambda 関数のテストとデバッグの両方が可能になります。このツールは Visual Studio 用 AWS ツールキットの一部として含まれています。ただし、ダウンロードして、コマンドライン、VS Code、Rider で使用できます。

コンテナにデプロイされる Lambda 関数を開発する場合、ランタイムインターフェイスエミュレータを使用すると、コンテナ内で実行される関数をテストできます。

localstack のようなサードパーティのツールを使ってローカルで関数をテストできますが、機能テストを行う最善の方法は、Lambda 関数を AWS にデプロイし、そこでテストすることです。AWS では、すべてのアカウントに 1 か月あたり 100 万件の無料リクエスト、つまり 1 か月あたり最大 320 万秒の計算時間を提供しています。そのため、AWS クラウドで機能をテストしない理由はほとんどありません。

料金の詳細については、次の 2 ページを参照してください。AWS 無料利用枠の AWS Lambda 料金表から始めましょう。

これらのローカルテストツールを使えば、デバッグも簡単に行えます。簡単な例は後で説明します。

 所要時間

30 分 

xUnit テストプロジェクト

.NET Lambda 関数プロジェクトテンプレートの多くには xUnit テストプロジェクトが含まれています。何も変更しなくても、このプロジェクトでテストを実行すれば合格します。
Lambda 関数を作成します。
dotnet new lambda.EmptyFunction -n FunctionWithTestProject
FunctionwithTestProject/test/FunctionwithTestProject.tests ディレクトリに変更します
cd FunctionWithTestProject/test/FunctionWithTestProject.Tests
そのプロジェクトを IDE で開きます。

FunctionWithTestProject.Tests.csproj ファイルを開くと、Lambda 関数プロジェクトへのプロジェクト参照が表示されます。
<ProjectReference Include="..\..\src\FunctionWithTestProject\FunctionWithTestProject.csproj" />

コマンドラインから、以下を使用してテストを実行します。

dotnet test
次のような出力が表示されます-
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.

Passed!  - Failed:     0, Passed:     1, Skipped:     0, Total:     1, Duration: < 1 ms - FunctionWithTestProject.Tests.dll (net6.0)
もちろん、Visual Studio、VS Code、または Rider でテストプロジェクトを開き、そこからテストを実行することもできます。

Visual Studio では、[テスト] メニューに移動し、[すべてのテストを実行] を選択します。また、テストエクスプローラーが開き、テストの結果が表示されます。
Rider で、「テスト」メニューに移動し、「ソリューションからすべてのテストを実行」を選択します。これによりテストが実行され、ユニットテストウィンドウが開き、結果が表示されます。
VS Code では、個々のテストまたはファイル内のすべてのテストを簡単に実行できます。
ただし、テストが複数のファイルにある場合は、テストランナー拡張が必要になります。詳細やテストの設定と実行については、拡張機能のドキュメントを参照してください。

関数内のコードを変更すると、通常のテストプロジェクトと同じようにテストを更新します。これはあなたが書く他のプロジェクトと同じようにテストプロジェクトなので、moq のような同じライブラリを使って手助けすることができます。

AWS .NET モックラムダテストツール

このツールを使用すると、定義したペイロードを使用してローカルで Lambda 関数を呼び出し、レスポンスを調べることができます。

前述のように、Visual Studio で AWS ツールキットを使用している場合は、ツールが既に含まれています。

このツールは、Visual Studio、VS Code、Rider、またはコマンドラインから使用できます。

コマンドラインでは、次の 2 つのモードで実行できます。

1.Web ブラウザベースの UI を使用

2.UI なしで

次のいくつかのステップでは、コマンドラインからツールを使用する方法を示しますが、必要に応じて Visual Studio のセクションに進んでください。

ツールキットをインストールする

コマンドライン、VS Code、Rider の場合は、ツールをインストールする必要があります。

コマンドラインから以下を実行します。
dotnet tool install -g Amazon.Lambda.TestTool-6.0
既にインストールされている場合は、以下を使用して更新してください。
dotnet tool update -g Amazon.Lambda.TestTool-6.0

コマンドラインテスト

上記のサンプルプロジェクトを使用して、コマンドラインから FunctionWithTestProject/src/FunctionWithTestProject ディレクトリに移動します。

コマンドラインからテストを実行するには、--no-ui オプションを指定し、ペイロードを渡す必要があります。ペイロードのエスケープは、使用しているシェルによって異なります。以下は PowerShell で動作します。

コマンドラインから、以下を実行します。
dotnet lambda-test-tool-6.0 --no-ui --payload '\"hello\"'
bash で使用する場合:
dotnet lambda-test-tool-6.0 --no-ui --payload '"hello"'
次のような出力が表示されるはずです-
AWS .NET Core 6.0 Mock Lambda Test Tool (0.12.3)
Loaded local Lambda runtime from project output C:\dev\FunctionWithTestProject\src\FunctionWithTestProject\bin/Debug/net6.0
Executing Lambda function without web interface
Found Lambda config file C:\dev\FunctionWithTestProject\src\FunctionWithTestProject\aws-lambda-tools-defaults.json
... Using config file C:\dev\FunctionWithTestProject\src\FunctionWithTestProject\aws-lambda-tools-defaults.json
... Using function handler FunctionWithTestProject::FunctionWithTestProject.Function::FunctionHandler
... Using payload with the value "hello"
... Setting AWS_PROFILE environment variable to default.
... No default AWS region configured. The --region switch can be used to configure an AWS Region.
Captured Log information:    

Request executed successfully
Response:
"HELLO"
Press any key to exit 
レスポンスセクションでは、Lambda 関数の出力を確認できます。

Web UI テスト、コマンドラインから起動

コマンドラインからツールを使用して、テスト用の Web UI を起動することもできます。

UI では独自のペイロードを入力できますが、この場合はエスケープについて心配する必要はありません。または、サンプルリクエストペイロードのセットから選択することもできます。これにより、S3、Kinesis、SQS などの他の AWS サービスからのリクエストをシミュレートできます。

ただし、今のところ、ペイロードとして「hello」(引用符を含む)と入力し、[関数の実行] ボタンを押します。

応答セクションには、関数が返した内容が表示されます。

関数にログステートメントを追加した場合、それらはログ出力セクションに表示されます。

Visual Studio

Visual Studio 用 AWS ツールキットがインストールされている場合は、AWS .NET モックラムダテストツールが既にインストールされていることになります。

Visual Studio で FunctionWithTestProject/src/FunctionWithTestProject プロジェクトを開きます。

Visual Studio は Properties ディレクトリを作成し、そのディレクトリ内に launchsettings.json ファイルを作成します。このファイルにより、AWS .NET モックラムダテストツールがコードに接続されます。

次のように表示されます。
{
  "profiles": {
    "Mock Lambda Test Tool": {
      "commandName": "Executable",
      "commandLineArgs": "--port 5050",
      "workingDirectory": ".\\bin\\$(Configuration)\\net6.0",
      "executablePath": "%USERPROFILE%\\.dotnet\\tools\\dotnet-lambda-test-tool-6.0.exe"
    }
  }
}
F5 を押してアプリケーションを起動します。上記と同じページが開くので、ペイロードを入力して Execute Function ボタンを押します。

VS コード

AWS .NET Mock Lambda テストツールを VS Code で使用するには、こちらの手順に従ってください-https://github.com/aws/aws-lambda-dotnet/tree/master/Tools/LambdaTestTool#configure-for-visual-studio-code

注:

1. dotnet-lambda-test-tool-3.1 を dotnet-lambda-test-tool-6.0 に変更する必要があります。

2. Linux/Mac を使っている場合、dotnet-lambda-test-tool-6.0 には.exe 拡張子が付いていません。

Rider

Rider 用 AWS .NET モック Lambda テストツールを設定するには、以下の手順に従ってください。
こちら -

コンテナとランタイムインターフェイスエミュレータ

Lambda 関数をコンテナ内にデプロイする場合は、 AWS ランタイムインターフェイスエミュレータ (RIE) を使用してローカルテストをもう1つ実行できます。新しいツールをインストールする必要はありません。ツールはビルドしたコンテナ内に自動的にパッケージ化されます。

この例では、2 つの関数ハンドラーを持つサーバーレスアプリケーションを作成します。

以下を使用して新しいコンテナベースのプロジェクトを作成します。

dotnet new serverless.image.EmptyServerless --name TestingFunctionWithRIE
プロジェクトには Dockerfile が含まれています。これを開くと、Docker が bin/release/lambda-Publish ディレクトリーから Docker コンテナーにファイルをコピーしていることがわかります。
COPY "bin/Release/lambda-publish"  .
Function.cs ファイルを開き、Get (..) メソッドを次のものに置き換えます。
public APIGatewayProxyResponse Get(APIGatewayProxyRequest request, ILambdaContext context)
{
    context.Logger.LogInformation($"Get method invoked. You requested {request.PathParameters["Id"]}");

    var response = new APIGatewayProxyResponse
    {
        StatusCode = (int)HttpStatusCode.OK,
        Body = $"You were looking for something with an Id of : {request.PathParameters["Id"]}",
      Headers = new Dictionary<string, string> {
        {
      "Content-Type",
      "application/json"
         }

        }
    };
            
    return response;
}
TestingFunctionWithRIE/src/TestingFunctionWithRIE 機能に変更します。
cd TestingFunctionWithRIE/src/TestingFunctionWithRIE 
次のクエリを実行します。
dotnet build -c Release -o .\bin\Release\lambda-publish\ 
これでアプリケーションがビルドされ、バイナリがに配置されます。\ bin\ リリース\ ラムダ-パブリッシュディレクトリ。

Docker が実行中であることを確認し、コンテナーをビルドします。
docker build -t testing_function_with_rie:latest .
それが完了したら、コンテナを起動します。
docker run -it -p 9000:8080 testing_function_with_rie:latest TestingFunctionWithRIE::TestingFunctionWithRIE.Functions::Get
このコマンドは Docker コンテナーを起動し、コンピューターのポート 9000 を介して内部ポート 8080 を公開し、関数ハンドラーをパラメーターとして渡します。ランタイムインターフェイスエミュレータは、これを使用してアプリケーション内の適切なメソッドを実行します。

コードに複数の関数ハンドラーがある場合は、それぞれを順番にテストし、コンテナーを起動し、その都度適切な関数ハンドラーを渡します。

最後に、ランタイムインターフェイスエミュレータに HTTP リクエストを行います。フィドラー、ポストマン、インソムニアなどを使用できます。以下は、VS Code Rest クライアントまたは Rider Http クライアントで使用するためのリクエストです。
POST http://localhost:9000/2015-03-31/functions/function/invocations HTTP/1.1
content-type: application/json

{
    "PathParameters": {
        "Id": "999"
    }
}
以下のような応答が表示されます。
HTTP/1.1 200 OK
Date: Fri, 29 Jul 2022 18:03:56 GMT
Content-Length: 148
Content-Type: text/plain; charset=utf-8
Connection: close

{
  "statusCode": 200,
  "headers": {
    "Content-Type": "application/json"
  },
  "body": "You were looking for something with an Id of : 999",
  "isBase64Encoded": false
}
コードを変更して再度テストする場合は、以下を使用してください。.NET ビルド、コンテナビルドが組み合わされ、コンテナが 1 行で起動されます。
dotnet build -c Release -o .\bin\Release\lambda-publish\ ; docker build -t testing_function_with_rie:latest . ; docker run -it -p 9000:8080 testing_function_with_rie:latest TestingFunctionWithRIE::TestingFunctionWithRIE.Functions::Get

AWS で Lambda 関数をテストする

上記のツールは、Lambda 関数をローカルでテストするのに最適です。シミュレートされた AWS 環境に役立つツールもありますが、関数をテストする最善の方法は AWS Lambda サービスを使用することです。

AWS には、毎月 100 万件の Lambda リクエストを無料で実行できる充実した無料利用枠があり、その制限を超えると、今後 100 万回の実行には 0.20 USD、つまり 1 回の実行につき 0.0000002 USD の費用がかかります。メモリ使用量と実行時間に関する価格設定には、いくつかの注意点があります。詳細については、「AWS 無料利用枠と AWS Lambda 料金表から始める 」を参照してください。

エミュレータツールはインターネット接続がない場合は便利かもしれませんが、実際の AWS サービスとまったく同じように動作しない場合があります。AWS で Lambda 関数をテストすれば、コードをデプロイするときになっても驚くことはありません。

必要なのは.NET テストプロジェクトを作成することだけです。xUnit テンプレートは良い選択です。そこから、AWS にデプロイする Lambda 関数を対象とする機能テストを作成します。

dotnet new xunit -n LambdaTestProject

AWS にデプロイされた.NET Lambda 関数のテスト手順については、ブログ記事「.NET Core AWS Lambda 関数の開発」を参照してください。

デバッグ

Lambda 関数をローカルでデバッグしたい場合があります。これを行うには簡単な方法が 2 つあります。

1.ユニットテストプロジェクトにブレークポイントを設定してから、関数にステップインします。

2.IDE 内から AWS .NET Mock Lambda テストツールを起動し、関数にブレークポイントを設定して、テストツールから関数を実行します。

ユニットテストプロジェクトを使用する

Visual Studio、VS Code、および Rider を使用する場合も同じ原則が適用されます。

テストプロジェクトを開き、コード内の Lambda 関数を呼び出す場所にブレークポイントを設定します。

テストをデバッグします。ブレークポイントに達したら、Lambda 関数にステップインします。
これで Lambda 関数のコードができました。


AWS .NET モックラムダテストツールを使用する

これは 3 つの IDE すべてでも機能します。VS Code または Rider を使用している場合の手順については、上記を参照してください。

Visual Studio では、テストプロジェクトではなく関数プロジェクトを開きます。

関数ハンドラーにブレークポイントを設定します。Web UI で、関数入力を追加し、[実行] を押します。

ブレークポイントがヒットし、他のメソッドと同様に Lambda 関数をデバッグできます。

まとめ

このモジュールでは、コマンドラインと IDE の両方から Lambda 関数をテストおよびデバッグするさまざまな方法について説明しました。

Lambda 関数の作成に慣れてくると、関数をテストするさまざまな方法を切り替えることができますが、できるだけ早く実際の AWS Lambda サービスを使用してコードをテストすることを強くお勧めします。それを行うには最高の場所です。

また、関数をローカルでデバッグする方法についても説明しました。これにより、コードをステップごとに実行して何が起きているかを確認できます。


知識のチェック

これで、モジュール 5「ユニットテストとデバッグ」を完了しました。以下のテストでは、これまでに学んだことを確認できます。

1.Lambda 関数のユニットテストを実行できる IDE はどれですか?(1 つ選択してください)

a.Visual Studio

b.VS コード

c.Rider

d.上記のすべて

2.AWS .NET モックラムダテストツールではなにができますか?(1 つ選択する)

a..NET 依存関係を模擬してテストする

b.Lambda 関数が呼び出すためのモック AWS サービス

c.Lambda 関数でパフォーマンステストを実行する

d.関数コードをローカルで呼び出す

3.ランタイムインターフェイスエミュレータはどのタイプの Lambda 関数に適していますか?(1 つ選択してください)

a.マネージドランタイム Lambda 関数

b.コンテナベースの Lambda 関数

c.カスタムランタイム Lambda 関数

d.すべてのタイプの Lambda 関数

回答:1-d, 2-d, 3-b

まとめ

このモジュールでは、コマンドラインと IDE の両方から Lambda 関数をテストおよびデバッグするさまざまな方法について説明しました。

Lambda 関数の作成に慣れてくると、関数をテストするさまざまな方法を切り替えることができますが、できるだけ早く実際の AWS Lambda サービスを使用してコードをテストすることを強くお勧めします。それを行うには最高の場所です。

また、関数をローカルでデバッグする方法についても説明しました。これにより、コードをステップごとに実行して何が起きているかを確認できます。

このページは役に立ちましたか?

ハンズオンラボ:LAMBDA 関数の作成とデプロイ