

# .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) のサンプルを参照してください。