イベント駆動型関数をホストするだけでなく、.NET と Lambda を組み合わせて軽量な ASP.NET アプリケーションをホストすることもできます。Amazon.Lambda.AspNetCoreServer
NuGet パッケージを使用して ASP.NET アプリケーションを構築し、デプロイすることができます。このセクションでは、.NET Lambda CLI ツールを使用して ASP.NET ウェブ API を Lambda にデプロイする方法について説明します。
前提条件
- .NET 8 SDK
-
.NET 8
SDK と ASP.NET Core ランタイムをインストールします。 - Amazon.Lambda.Tools
-
Lambda 関数を作成するには、Amazon.Lambda.Tools
.NET Global Tools 拡張機能 を使用します。Amazon.Lambda.Tools をインストールするには、以下のコマンドを実行します。 dotnet tool install -g Amazon.Lambda.Tools
Amazon.Lambda.Tools .NET CLI 拡張機能の詳細については、GitHub の「AWS Extensions for .NET CLI
」リポジトリを参照してください。 - Amazon.Lambda.Templates
-
Lambda 関数コードを生成するには、Amazon.Lambda.Templates
NuGet パッケージを使用します。このテンプレートパッケージをインストールするには、以下のコマンドを実行します。 dotnet new --install Amazon.Lambda.Templates
ASP.NET ウェブ API を Lambda にデプロイする
ASP.NET を使用してウェブ API をデプロイするには、.NET Lambda テンプレートを使用して新しいウェブ API プロジェクトを作成します。次のコマンドを使用して、新しい ASP.NET ウェブ API プロジェクトを初期化します。このコマンド例では、プロジェクトに AspNetOnLambda
という名前を付けています。
dotnet new serverless.AspNetCoreWebAPI -n AspNetOnLambda
このコマンドは、プロジェクトディレクトリに以下のファイルとディレクトリを作成します。
.
└── AspNetOnLambda
├── src
│ └── AspNetOnLambda
│ ├── AspNetOnLambda.csproj
│ ├── Controllers
│ │ └── ValuesController.cs
│ ├── LambdaEntryPoint.cs
│ ├── LocalEntryPoint.cs
│ ├── Readme.md
│ ├── Startup.cs
│ ├── appsettings.Development.json
│ ├── appsettings.json
│ ├── aws-lambda-tools-defaults.json
│ └── serverless.template
└── test
└── AspNetOnLambda.Tests
├── AspNetOnLambda.Tests.csproj
├── SampleRequests
│ └── ValuesController-Get.json
├── ValuesControllerTests.cs
└── appsettings.json
Lambda が関数を呼び出すとき、使用するエントリポイントは LambdaEntryPoint.cs
ファイルです。.NET Lambda テンプレートによって作成されたファイルには、次のコードが含まれています。
namespace AspNetOnLambda;
public class LambdaEntryPoint : Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction
{
protected override void Init(IWebHostBuilder builder)
{
builder
.UseStartup≪Startup≫();
}
protected override void Init(IHostBuilder builder)
{
}
}
Lambda が使用するエントリポイントは、Amazon.Lambda.AspNetCoreServer
パッケージ内の 3 つの基本クラスのいずれかから継承する必要があります。この 3 つの基本クラスは以下のとおりです。
-
APIGatewayProxyFunction
-
APIGatewayHttpApiV2ProxyFunction
-
ApplicationLoadBalancerFunction
提供されている .NET Lambda テンプレートを使用して LambdaEntryPoint.cs
ファイルを作成するときに使用されるデフォルトクラスは APIGatewayProxyFunction
です。関数で使用する基本クラスは、Lambda 関数の前にある API レイヤーによって異なります。
3 つの基本クラスにはそれぞれ、FunctionHandlerAsync
という名前のパブリックメソッドが含まれています。このメソッドの名前は、Lambda が関数を呼び出すために使用するハンドラー文字列の一部になります。この FunctionHandlerAsync
メソッドは、受信イベントペイロードを正しい ASP.NET 形式に変換し、ASP.NET レスポンスを Lambda レスポンスペイロードに戻します。示されているサンプル AspNetOnLambda
プロジェクトでは、ハンドラー文字列は次のようになります。
AspNetOnLambda::AspNetOnLambda.LambdaEntryPoint::FunctionHandlerAsync
API を Lambda にデプロイするには、次のコマンドを実行して、ソースコードファイルが含まれるディレクトリに移動し、AWS CloudFormation を使用して関数をデプロイします。
cd AspNetOnLambda/src/AspNetOnLambda dotnet lambda deploy-serverless
ヒント
コマンドを使用して API をデプロイすると、AWS CloudFormation によりデプロイ時に指定したスタック名に基づき Lambda 関数に名前が付けられます。Lambda 関数にカスタム名を付けるには、dotnet lambda deploy-serverless
serverless.template
ファイルを編集して AWS::Serverless::Function
リソースに FunctionName
プロパティを追加します。詳細については、「AWS CloudFormation ユーザーガイド」の「Name タイプ」を参照してください。
ASP.NET の最小限の API を Lambda にデプロイする
ASP.NET の最小限の API を Lambda にデプロイするには、.NET Lambda テンプレートを使用して、新しい最小限の API プロジェクトを作成します。次のコマンドを使用して、新しい最小限の API プロジェクトを初期化します。この例では、プロジェクトに MinimalApiOnLambda
という名前を付けています。
dotnet new serverless.AspNetCoreMinimalAPI -n MinimalApiOnLambda
このコマンドは、プロジェクトディレクトリに以下のファイルとディレクトリを作成します。
└── MinimalApiOnLambda
└── src
└── MinimalApiOnLambda
├── Controllers
│ └── CalculatorController.cs
├── MinimalApiOnLambda.csproj
├── Program.cs
├── Readme.md
├── appsettings.Development.json
├── appsettings.json
├── aws-lambda-tools-defaults.json
└── serverless.template
Program.cs
ファイルには次のコードが含まれています。
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Add AWS Lambda support. When application is run in Lambda Kestrel is swapped out as the web server with Amazon.Lambda.AspNetCoreServer. This
// package will act as the webserver translating request and responses between the Lambda event source and ASP.NET Core.
builder.Services.AddAWSLambdaHosting(LambdaEventSource.RestApi)
;
var app = builder.Build();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.MapGet("/", () => "Welcome to running ASP.NET Core Minimal API on AWS Lambda");
app.Run();
最小限の API を Lambda で実行するように設定するには、Lambda と ASP.NET Core 間のリクエストとレスポンスが正しく変換されるように、このコードを編集する必要がある場合があります。デフォルトでは、この関数は REST API イベントソース用に設定されます。HTTP API または Application Load Balancer の場合は、以下のオプションのいずれかに (LambdaEventSource.RestApi)
を置き換えてください。
-
(LambdaEventSource.HttpAPi)
-
(LambdaEventSource.ApplicationLoadBalancer)
最小限の API を Lambda にデプロイするには、次のコマンドを実行して、ソースコードファイルが含まれるディレクトリに移動し、AWS CloudFormation を使用して関数をデプロイします。
cd MinimalApiOnLambda/src/MinimalApiOnLambda dotnet lambda deploy-serverless