

# ASP.NET アプリケーションのデプロイ
<a name="csharp-package-asp"></a>

イベント駆動型関数をホストするだけでなく、.NET と Lambda を組み合わせて軽量な ASP.NET アプリケーションをホストすることもできます。`Amazon.Lambda.AspNetCoreServer` NuGet パッケージを使用して ASP.NET アプリケーションを構築し、デプロイすることができます。このセクションでは、.NET Lambda CLI ツールを使用して ASP.NET ウェブ API を Lambda にデプロイする方法について説明します。

**Topics**
+ [

## 前提条件
](#csharp-package-asp-prerequisites)
+ [

## ASP.NET ウェブ API を Lambda にデプロイする
](#csharp-package-asp-deploy-api)
+ [

## ASP.NET の最小限の API を Lambda にデプロイする
](#csharp-package-asp-deploy-minimal)

## 前提条件
<a name="csharp-package-asp-prerequisites"></a>

**.NET 8 SDK**  
[.NET 8](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) SDK と ASP.NET Core ランタイムをインストールします。

**Amazon.Lambda.Tools**  
Lambda 関数を作成するには、[https://www.nuget.org/packages/Amazon.Lambda.Tools](https://www.nuget.org/packages/Amazon.Lambda.Tools) [.NET Global Tools 拡張機能](https://aws.amazon.com/blogs/developer/net-core-global-tools-for-aws/)を使用します。Amazon.Lambda.Tools をインストールするには、以下のコマンドを実行します。  

```
dotnet tool install -g Amazon.Lambda.Tools
```
Amazon.Lambda.Tools .NET CLI 拡張機能の詳細については、GitHub の「[AWS Extensions for .NET CLI](https://github.com/aws/aws-extensions-for-dotnet-cli)」リポジトリを参照してください。

**Amazon.Lambda.Templates**  
Lambda 関数コードを生成するには、[https://www.nuget.org/packages/Amazon.Lambda.Templates](https://www.nuget.org/packages/Amazon.Lambda.Templates) NuGet パッケージを使用します。このテンプレートパッケージをインストールするには、以下のコマンドを実行します。  

```
dotnet new --install Amazon.Lambda.Templates
```

## ASP.NET ウェブ API を Lambda にデプロイする
<a name="csharp-package-asp-deploy-api"></a>

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 が関数を呼び出すために使用する[ハンドラー文字列](csharp-handler.md#csharp-class-library-handlers)の一部になります。この `FunctionHandlerAsync` メソッドは、受信イベントペイロードを正しい ASP.NET 形式に変換し、ASP.NET レスポンスを Lambda レスポンスペイロードに戻します。示されているサンプル `AspNetOnLambda` プロジェクトでは、ハンドラー文字列は次のようになります。

```
AspNetOnLambda::AspNetOnLambda.LambdaEntryPoint::FunctionHandlerAsync
```

API を Lambda にデプロイするには、次のコマンドを実行して、ソースコードファイルが含まれるディレクトリに移動し、CloudFormation を使用して関数をデプロイします。

```
cd AspNetOnLambda/src/AspNetOnLambda
dotnet lambda deploy-serverless
```

**ヒント**  
`dotnet lambda deploy-serverless` コマンドを使用して API をデプロイすると、CloudFormation によりデプロイ時に指定したスタック名に基づき Lambda 関数に名前が付けられます。Lambda 関数にカスタム名を付けるには、`serverless.template` ファイルを編集して `AWS::Serverless::Function` リソースに `FunctionName` プロパティを追加します。詳細については、「CloudFormation ユーザーガイド」の「[Name タイプ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html)」を参照してください。

## ASP.NET の最小限の API を Lambda にデプロイする
<a name="csharp-package-asp-deploy-minimal"></a>

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 にデプロイするには、次のコマンドを実行して、ソースコードファイルが含まれるディレクトリに移動し、CloudFormation を使用して関数をデプロイします。

```
cd MinimalApiOnLambda/src/MinimalApiOnLambda
dotnet lambda deploy-serverless
```