

# .zip ファイルアーカイブを使用して C\$1 Lambda 関数を構築し、デプロイする
<a name="csharp-package"></a>

.NET デプロイパッケージ (.zip ファイルアーカイブ) は、関数のコンパイル済みアセンブリと、そのアセンブリのすべての依存関係で構成されています。このパッケージには、`proj.deps.json` ファイルも含まれています。これは、関数のすべての依存関係と、.NET ランタイムを設定するために使用される `proj.runtimeconfig.json` ファイルを、.NET ランタイムに伝達します。

個々の Lambda 関数をデプロイするには、`Amazon.Lambda.Tools` .NET Lambda Global CLI を使用できます。`dotnet lambda deploy-function` コマンドを使用すると、.zip デプロイパッケージが自動的に作成され、Lambda にデプロイされます。ただし、.NET アプリケーションを AWS にデプロイするには、AWS Serverless Application Model (AWS SAM) や AWS Cloud Development Kit (AWS CDK) などのフレームワークを使用することをお勧めします。

サーバーレスアプリケーションは通常、Lambda 関数とその他のマネージド AWS のサービスを組み合わせて構成され、連携して特定のビジネスタスクを実行します。AWS SAM と AWS CDK は、Lambda 関数を大規模に他の AWS のサービスと組み合わせて構築し、デプロイするのを簡略化します。[AWS SAM テンプレート仕様](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-specification.html)は、サーバーレスアプリケーションを構成する Lambda 関数、API、アクセス許可、設定、およびその他の AWS リソースを記述するためのシンプルで簡潔な構文を提供します。[AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/home.html) を使用すると、クラウドインフラストラクチャをコードとして定義し、最新のプログラミング言語と .NET などのフレームワークを使用して、信頼性が高く、スケーラブルで、コスト効率の高いアプリケーションをクラウドで構築することができます。AWS CDK と AWS SAM はどちらも、.NET Lambda Global CLI を使用して関数をパッケージ化します。

[.NET Core CLI を使用](csharp-package-cli.md#csharp-layers)することで、C\$1 の関数で [Lambda レイヤー](chapter-layers.md)を使用することは可能ですが、使用しないことをお勧めします。レイヤーを使用する C\$1 の関数では、[初期化フェーズ](lambda-runtime-environment.md#runtimes-lifecycle-ib) 中に共有アセンブリを手動でメモリに読み込みます。これにより、コールドスタート時間が長くなる可能性があります。代わりに、コンパイル時にすべての共有コードを含めて、実行時のアセンブリの読み込みによるパフォーマンスへの影響を回避してください。

AWS SAM、AWS CDK、および .NET Lambda Global CLI を使用して .NET Lambda 関数を構築およびデプロイする手順については、以下のセクションを参照してください。

**Topics**
+ [

# .NET Lambda Global CLI を使用する
](csharp-package-cli.md)
+ [

# AWS SAM を使用した C\$1 Lambda 関数のデプロイ
](csharp-package-sam.md)
+ [

# AWS CDK を使用した C\$1 Lambda 関数のデプロイ
](csharp-package-cdk.md)
+ [

# ASP.NET アプリケーションのデプロイ
](csharp-package-asp.md)

# .NET Lambda Global CLI を使用する
<a name="csharp-package-cli"></a>

.NET CLI および .NET Lambda Global Tools 拡張機能 (`Amazon.Lambda.Tools`) は、.NET ベースの Lambda アプリケーションを作成し、パッケージ化して、Lambda にデプロイするためのクロスプラットフォームな方法を提供します。このセクションでは、.NET CLI と Amazon Lambda テンプレートを使用して新しい Lambda .NET プロジェクトを作成する方法と、`Amazon.Lambda.Tools` を使用してそれらをパッケージ化してデプロイする方法を学習します。

**Topics**
+ [

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

## .NET CLI を使用して .NET プロジェクトを作成する
](#csharp-package-cli-create)
+ [

## .NET CLI を使用して .NET プロジェクトをデプロイする
](#csharp-package-cli-deploy)
+ [

## .NET CLI で Lambda レイヤーを使用する
](#csharp-layers)

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

**.NET 8 SDK**  
まだインストールしていない場合は、[.NET 8](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) SDK とランタイムをインストールします。

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

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

**AWS Amazon.Lambda.Tools .NET Global CLI 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)」リポジトリを参照してください。

## .NET CLI を使用して .NET プロジェクトを作成する
<a name="csharp-package-cli-create"></a>

.NET CLI では、コマンドラインから .NET プロジェクトを作成するために `dotnet new` コマンドを使用します。Lambda には、[https://www.nuget.org/packages/Amazon.Lambda.Templates](https://www.nuget.org/packages/Amazon.Lambda.Templates) NuGet パッケージを使用する追加のテンプレートが用意されています。

このパッケージをインストールしたら、次のコマンドを実行して、使用可能なテンプレートのリストを表示します。

```
dotnet new list
```

テンプレートに関する詳細を確認するには、`help` オプションを使用します。例えば、`lambda.EmptyFunction` テンプレートの詳細を表示するには、以下のコマンドを実行します。

```
dotnet new lambda.EmptyFunction --help
```

.NET Lambda 関数の基本テンプレートを作成するには、`lambda.EmptyFunction` テンプレートを使用します。これにより、入力として文字列を受け取り、`ToUpper` メソッドを使用して大文字に変換する単純な関数が作成されます。このテンプレートでは、以下のオプションがサポートされています。
+ `--name` － 関数の名前。
+ `--region` － 関数を作成する AWS リージョン。
+ `--profile` － AWS SDK for .NET 認証情報ファイルにあるプロファイルの名前。.NET の認証情報プロファイルの詳細については、「.NET 用 AWS SDK 開発者ガイド」の「[AWS 認証情報を設定](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-creds.html)」を参照してください。

この例では、デフォルトのプロファイルと AWS リージョン設定を使用して、`myDotnetFunction` という名前の新しい空の関数を作成します。

```
dotnet new lambda.EmptyFunction --name myDotnetFunction
```

このコマンドは、プロジェクトディレクトリに以下のファイルとディレクトリを作成します。

```
└── myDotnetFunction
    ├── src
    │   └── myDotnetFunction
    │       ├── Function.cs
    │       ├── Readme.md
    │       ├── aws-lambda-tools-defaults.json
    │       └── myDotnetFunction.csproj
    └── test
        └── myDotnetFunction.Tests
            ├── FunctionTest.cs
            └── myDotnetFunction.Tests.csproj
```

`src/myDotnetFunction` ディレクトリで次のファイルを調べます。
+ **aws-lambda-tools-defaults.json**: Lambda 関数をデプロイするときに指定するコマンドラインオプションの場所です。以下に例を示します。

  ```
    "profile" : "default",
    "region" : "us-east-2",
    "configuration" : "Release",
    "function-architecture": "x86_64",
    "function-runtime":"dotnet8",
    "function-memory-size" : 256,
    "function-timeout" : 30,
    "function-handler" : "myDotnetFunction::myDotnetFunction.Function::FunctionHandler"
  ```
+ **Function.cs**: Lambda ハンドラの関数コード。これは、デフォルトの `Amazon.Lambda.Core`ライブラリ とデフォルトの `LambdaSerializer` 属性が含まれる C\$1 テンプレートです。要件とオプションのシリアル化に関する詳細は、「[C\$1 Lambda 関数のシリアル化](csharp-handler.md#csharp-handler-serializer)」を参照してください。これには、Lambda 関数コードに適用するために編集できるサンプル関数も含まれています。

  ```
  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 myDotnetFunction;
  
  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();
      }
  }
  ```
+ **myDotnetFunction.csproj**: アプリケーションを構成するファイルとアセンブリをリスト表示する [MSBuild](https://msdn.microsoft.com/en-us/library/dd393574.aspx) ファイル。

  ```
  <Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
      <TargetFramework>net8.0</TargetFramework>
      <ImplicitUsings>enable</ImplicitUsings>
      <Nullable>enable</Nullable>
      <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
      <AWSProjectType>Lambda</AWSProjectType>
      <!-- This property makes the build directory similar to a publish directory and helps the AWS .NET Lambda Mock Test Tool find project dependencies. -->
      <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
      <!-- Generate ready to run images during publishing to improve cold start time. -->
      <PublishReadyToRun>true</PublishReadyToRun>
    </PropertyGroup>
    <ItemGroup>
      <PackageReference Include="Amazon.Lambda.Core" Version="2.2.0" />
      <PackageReference Include="Amazon.Lambda.Serialization.SystemTextJson" Version="2.4.0" />
    </ItemGroup>
  </Project>
  ```
+ **Readme**: このファイルを使用して Lambda 関数をドキュメント化します。

`myfunction/test` ディレクトリで次のファイルを調べます。
+ **myDotnetFunction.Tests.csproj**: 既に説明したように、これは、テストプロジェクトを構成するファイルとアセンブリをリスト表示するための、[MSBuild](https://msdn.microsoft.com/en-us/library/dd393574.aspx) ファイルです。`Amazon.Lambda.Core` ライブラリが含まれているため、関数のテストに必要な Lambda テンプレートをシームレスに統合できることにも留意してください。

  ```
  <Project Sdk="Microsoft.NET.Sdk">
     ... 
  
      <PackageReference Include="Amazon.Lambda.Core" Version="2.2.0 " />
     ...
  ```
+ **FunctionTest.cs**: `src` ディレクトリに含まれているのと同様の C\$1 コードテンプレートファイルです。このファイルを編集して関数の本番稼働コードを写し、本番稼働環境にアップロードする前に Lambda 関数をテストします。

  ```
  using Xunit;
  using Amazon.Lambda.Core;
  using Amazon.Lambda.TestUtilities;
  
  using MyFunction;
  
  namespace MyFunction.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);
          }
      }
  }
  ```

## .NET CLI を使用して .NET プロジェクトをデプロイする
<a name="csharp-package-cli-deploy"></a>

デプロイパッケージを構築して Lambda にデプロイするには、`Amazon.Lambda.Tools` CLI ツールを使用します。前のステップで作成したファイルから関数をデプロイするには、まず、関数の `.csproj` ファイルが含まれるフォルダに移動します。

```
cd myDotnetFunction/src/myDotnetFunction
```

コードを .zip デプロイパッケージとして Lambda にデプロイするには、以下のコマンドを実行します。独自の関数名を選択してください。

```
dotnet lambda deploy-function myDotnetFunction
```

デプロイ中、ウィザードでは [[実行ロールを使用した Lambda 関数のアクセス許可の定義](lambda-intro-execution-role.md)] を選択するよう求められます。この例では、`lambda_basic_role` を選択します。

関数をデプロイしたら、`dotnet lambda invoke-function` コマンドを使用してクラウドでテストできます。`lambda.EmptyFunction` テンプレートのサンプルコードでは、`--payload` オプションを使用して文字列を渡すことで関数をテストできます。

```
dotnet lambda invoke-function myDotnetFunction --payload "Just checking if everything is OK"
```

関数が正常にデプロイされると、以下のような出力が表示されます。

```
dotnet lambda invoke-function myDotnetFunction --payload "Just checking if everything is OK"
Amazon Lambda Tools for .NET Core applications (5.8.0)
Project Home: https://github.com/aws/aws-extensions-for-dotnet-cli, https://github.com/aws/aws-lambda-dotnet

Payload:
"JUST CHECKING IF EVERYTHING IS OK"

Log Tail:
START RequestId: id Version: $LATEST
END RequestId: id
REPORT RequestId: id  Duration: 0.99 ms       Billed Duration: 1 ms         Memory Size: 256 MB     Max Memory Used: 12 MB
```

## .NET CLI で Lambda レイヤーを使用する
<a name="csharp-layers"></a>

**注記**  
.NET の関数で[レイヤー](chapter-layers.md)を使用することは可能ですが、使用しないことをお勧めします。レイヤーを使用する .NET の関数では、`Init` 中に共有アセンブリを手動でメモリに読み込みます。これにより、コールドスタート時間が長くなる可能性があります。代わりに、コンパイル時にすべての共有コードを含めて、.NET コンパイラの組み込み最適化機能を活用してください。

.NET CLI では、レイヤーの公開や、レイヤーを使用する C\$1 関数のデプロイに役立つコマンドがサポートされています。指定した Amazon S3 バケットにレイヤーを公開するには、自身の `.csproj` と同じディレクトリで次のコマンドを実行します。

```
dotnet lambda publish-layer <layer_name> --layer-type runtime-package-store --s3-bucket <s3_bucket_name>
```

その後、.NET CLI を使用して関数をデプロイする際に、次のコマンドで使用するレイヤーの ARN を指定します。

```
dotnet lambda deploy-function <function_name> --function-layers arn:aws:lambda:us-east-1:123456789012:layer:layer-name:1
```

Hello World 関数の完全な例については、[blank-csharp-with-layer](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-csharp-with-layer) のサンプルを参照してください。

# AWS SAM を使用した C\$1 Lambda 関数のデプロイ
<a name="csharp-package-sam"></a>

AWS Serverless Application Model (AWS SAM) は、AWS のサーバーレスアプリケーションの構築と実行のプロセスを合理化するのに役立つツールキットです。YAML または JSON テンプレートでアプリケーションのリソースを定義し、AWS SAM コマンドラインインターフェイス (AWS SAM CLI) を使用して、アプリケーションを構築、パッケージ化、デプロイします。AWS SAM テンプレートから Lambda 関数を構築すると、AWS SAM は関数コードと指定した任意の依存関係を含む .zip デプロイパッケージまたはコンテナイメージを自動的に作成します。そして、AWS SAM は [CloudFormation スタック](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacks.html)を使用して関数をデプロイします。AWS SAM を使用して Lambda 関数を構築およびデプロイする方法の詳細については、「AWS Serverless Application Model 開発者ガイドの」の「[AWS SAM の開始方法](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started.html)」を参照してください。

以下の手順は、AWS SAM を使用してサンプルの .NET Hello World アプリケーションをダウンロード、構築、およびデプロイする方法を示しています。このサンプルアプリケーションは、Lambda 関数と Amazon API Gateway エンドポイントを使用して基本的な API バックエンドを実装します。API Gateway エンドポイントに HTTP GET リクエストを送信すると、API Gateway が Lambda 関数を呼び出します。この関数は、リクエストを処理する Lambda 関数インスタンスの IP アドレスと共に「hello world」メッセージを返します。

AWS SAM を使用してアプリケーションを構築し、デプロイする場合、AWS SAM CLI は背後で `dotnet lambda package` コマンドを使用して、個々の Lambda 関数コードバンドルをパッケージ化します。

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

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

**AWS SAM CLI バージョン 1.39 以降**  
AWS SAM CLI の最新バージョンをインストールする方法については、「[AWS SAM CLI のインストール](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html)」を参照してください。

## AWS SAM サンプルアプリケーションをデプロイする
<a name="csharp-package-sam-deploy"></a>

1. 次のコマンドを使用し、Hello World .NET テンプレートを使用して、アプリケーションを初期化します。

   ```
   sam init --app-template hello-world --name sam-app \
   --package-type Zip --runtime dotnet8
   ```

   このコマンドは、プロジェクトディレクトリに以下のファイルとディレクトリを作成します。

   ```
   └── sam-app
       ├── README.md
       ├── events
       │   └── event.json
       ├── omnisharp.json
       ├── samconfig.toml
       ├── src
       │   └── HelloWorld
       │       ├── Function.cs
       │       ├── HelloWorld.csproj
       │       └── aws-lambda-tools-defaults.json
       ├── template.yaml
       └── test
           └── HelloWorld.Test
               ├── FunctionTest.cs
               └── HelloWorld.Tests.csproj
   ```

1. `template.yaml file` が含まれるディレクトリに移動します。このファイルは、Lambda 関数や API Gateway API など、アプリケーションの AWS リソースを定義するテンプレートです。

   ```
   cd sam-app
   ```

1. アプリケーションのソースを構築するには、次のコマンドを実行します。

   ```
   sam build
   ```

1. AWS にアプリケーションをデプロイするには、次のコマンドを実行します。

   ```
   sam deploy --guided
   ```

   このコマンドは、次の一連のプロンプトを使用してアプリケーションをパッケージ化し、デプロイします。デフォルトのオプションを受け入れるには、[Enter] キーを押します。
**注記**  
**[HelloWorldFunction には権限が定義されていない場合がありますが、問題ありませんか?]** には、必ず `y` を入力してください。
   + **[スタック名]**: CloudFormation にデプロイするスタックの名前。この名前は AWS アカウントと AWS リージョンに対して一意である必要があります。
   + **[AWS リージョン]**: アプリをデプロイしたい AWS リージョン。
   + **[デプロイ前に変更を確認]**: [はい] を選択すると、AWS SAM がアプリケーションの変更をデプロイする前に、変更セットを手動でレビューできます。[いいえ] を選択すると、AWS SAM CLI はアプリケーションの変更を自動的にデプロイします。
   + **[SAM CLI の IAM ロールの作成を許可]**: この例の Hello World のものを含む、多くの AWS SAM テンプレートで AWS Identity and Access Management (IAM) ロールが作成され、Lambda 関数に他の AWS のサービスへのアクセス権限が付与されます。IAM ロールを作成または変更する CloudFormation スタックをデプロイする権限を付与するには、[はい] を選択します。
   + **[ロールバックを無効化]**: デフォルトでは、スタックの作成またはデプロイ中に AWS SAM でエラーが発生すると、スタックは以前のバージョンにロールバックされます。このデフォルトを受け入れるには [いいえ] を選択します。
   + **[HelloWorldFunction には権限が定義されていない場合がありますが、問題ありませんか?]**: [`y`] を入力します。
   + **[引数を samconfig.toml に保存]**: [はい] を選択して設定内容を保存します。今後は、パラメータなしで `sam deploy` を再実行して、アプリケーションに変更をデプロイできます。

1. アプリケーションのデプロイが完了すると、CLI は Hello World Lambda 関数の Amazon リソースネーム (ARN) と、その関数用に作成された IAM ロールを返します。API Gateway API のエンドポイントも表示されます。アプリケーションをテストするには、ブラウザでエンドポイントを開きます。次のようなレスポンスが表示されます。

   ```
   {"message":"hello world","location":"34.244.135.203"}
   ```

1. リソースを削除するには、次のコマンドを実行します。作成した API エンドポイントは、インターネット経由でアクセス可能なパブリックエンドポイントであることに注意してください。テスト後に、このエンドポイントを削除することを推奨します。

   ```
   sam delete
   ```

## 次のステップ
<a name="csharp-package-sam-next"></a>

AWS SAM を使用し、.NET を使用して Lambda 関数を構築し、デプロイする方法については、以下のリソースを参照してください。
+ [AWS Serverless Application Model (AWS SAM) 開発者ガイド](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html)
+ [Building Serverless .NET Applications with AWS Lambda and the SAM CLI](https://aws.amazon.com/blogs/dotnet/building-serverless-net-applications-with-aws-lambda-and-the-sam-cli/)

# AWS CDK を使用した C\$1 Lambda 関数のデプロイ
<a name="csharp-package-cdk"></a>

AWS Cloud Development Kit (AWS CDK) は、最新のプログラミング言語と .NET などのフレームワークを使用して、クラウドインフラストラクチャをコードとして定義するためのオープンソースソフトウェア開発フレームワークです。AWS CDK プロジェクトを実行して CloudFormation テンプレートを生成し、そのテンプレートを使用してコードをデプロイします。

AWS CDK を使用してサンプルの Hello World .NET アプリケーションを構築し、デプロイするには、以下のセクションの指示に従ってください。サンプルアプリケーションは、API Gateway エンドポイントと Lambda 関数で構成される基本的な API バックエンドを実装しています。エンドポイントに HTTP GET リクエストを送信すると、API Gateway によって Lambda 関数が呼び出されます。この関数は、リクエストを処理する Lambda インスタンスの IP アドレスと共に Hello World メッセージを返します。

## 前提条件
<a name="csharp-package-cdk-prereqs"></a>

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

**AWS CDK バージョン 2**  
AWS CDK の最新バージョンをインストールする方法については、「AWS Cloud Development Kit (AWS CDK) v2 開発者ガイド」の「[AWS CDK の開始方法](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html)」を参照してください。

## AWS CDK サンプルアプリケーションをデプロイする
<a name="csharp-package-cdk-deploy"></a>

1. サンプルアプリケーションのプロジェクトディレクトリを作成して、そこに移動します。

   ```
   mkdir hello-world
   cd hello-world
   ```

1. 以下のコマンドを実行して、新しい AWS CDK アプリケーションを初期化します。

   ```
   cdk init app --language csharp
   ```

   このコマンドは、プロジェクトディレクトリに以下のファイルとディレクトリを作成します。

   ```
   ├── README.md
   ├── cdk.json
   └── src
       ├── HelloWorld
       │   ├── GlobalSuppressions.cs
       │   ├── HelloWorld.csproj
       │   ├── HelloWorldStack.cs
       │   └── Program.cs
       └── HelloWorld.sln
   ```

1. `src` ディレクトリを開き、.NET CLI を使用して新しい Lambda 関数を作成します。これは、AWS CDK を使用してデプロイする関数です。この例では、`lambda.EmptyFunction` テンプレートを使用して、`HelloWorldLambda` という名前の Hello World 関数を作成します。

   ```
   cd src
   dotnet new lambda.EmptyFunction -n HelloWorldLambda
   ```

   このステップ完了後のプロジェクトディレクトリ内のディレクトリ構造は、次のようになります。

   ```
   ├── README.md
   ├── cdk.json
   └── src
       ├── HelloWorld
       │   ├── GlobalSuppressions.cs
       │   ├── HelloWorld.csproj
       │   ├── HelloWorldStack.cs
       │   └── Program.cs
       ├── HelloWorld.sln
       └── HelloWorldLambda
           ├── src
           │   └── HelloWorldLambda
           │       ├── Function.cs
           │       ├── HelloWorldLambda.csproj
           │       ├── Readme.md
           │       └── aws-lambda-tools-defaults.json
           └── test
               └── HelloWorldLambda.Tests
                   ├── FunctionTest.cs
                   └── HelloWorldLambda.Tests.csproj
   ```

1. `src/HelloWorld` ディレクトリの `HelloWorldStack.cs` ファイルを開きます。ファイルの内容を次のコードに置き換えます。

   ```
   using Amazon.CDK;
   using Amazon.CDK.AWS.Lambda;
   using Amazon.CDK.AWS.Logs;
   using Constructs;
   
   namespace CdkTest
   {
       public class HelloWorldStack : Stack
       {
           internal HelloWorldStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
           {
               var buildOption = new BundlingOptions()
               {
                   Image = Runtime.DOTNET_8.BundlingImage,
                   User = "root",
                   OutputType = BundlingOutput.ARCHIVED,
                   Command = new string[]{
               "/bin/sh",
                   "-c",
                   " dotnet tool install -g Amazon.Lambda.Tools"+
                   " && dotnet build"+
                   " && dotnet lambda package --output-package /asset-output/function.zip"
                   }
               };
   
                var helloWorldLambdaFunction = new Function(this, "HelloWorldFunction", new FunctionProps
               {
                   Runtime = Runtime.DOTNET_8,
                   MemorySize = 1024,
                   LogRetention = RetentionDays.ONE_DAY,
                   Handler = "HelloWorldLambda::HelloWorldLambda.Function::FunctionHandler",
                   Code = Code.FromAsset("./src/HelloWorldLambda/src/HelloWorldLambda", new Amazon.CDK.AWS.S3.Assets.AssetOptions
                   {
                       Bundling = buildOption
                   }),
               });
           }
       }
   }
   ```

   これは、アプリケーションコードをコンパイルしてバンドルするコードであり、Lambda 関数自体の定義でもあります。この `BundlingOptions` オブジェクトにより、zip ファイルの内容を生成するために使用される一連のコマンドと共に zip ファイルを作成できます。この場合、`dotnet lambda package` コマンドは zip ファイルのコンパイルと生成に使用されます。

1. アプリケーションをデプロイするには、次のコマンドを実行します。

   ```
   cdk deploy
   ```

1. .NET Lambda CLI を使用して、デプロイした Lambda 関数を呼び出します。

   ```
   dotnet lambda invoke-function HelloWorldFunction -p "hello world"
   ```

1. テストの完了後、作成したリソースは、保持することを希望しない限り削除できます。リソースを削除するには、次のコマンドを実行します。

   ```
   cdk destroy
   ```

## 次のステップ
<a name="csharp-package-cdk-next"></a>

AWS CDK を使用し、.NET を使用して Lambda 関数を構築し、デプロイする方法については、以下のリソースを参照してください。
+ [C\$1 で AWS CDK を操作](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-csharp.html)
+ [Build, package, and publish .NET C\$1 Lambda functions with the AWS CDK](https://aws.amazon.com/blogs/modernizing-with-aws/build-package-publish-dotnet-csharp-lambda-functions-aws-cdk/)

# 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
```