

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

.NET CLI 和.NET Lambda 全球工具扩展（`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)
+ [

## 将 Lambda 层与 .NET CLI 结合使用
](#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 工具**  
要创建您的 Lambda 函数，请使用 [https://www.nuget.org/packages/Amazon.Lambda.Tools](https://www.nuget.org/packages/Amazon.Lambda.Tools) [.NET 全球工具扩展](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 上的[适用于 .NET CLI 的 AWS 扩展](https://github.com/aws/aws-extensions-for-dotnet-cli)存储库。

## 使用 .NET CLI 创建 .NET 项目
<a name="csharp-package-cli-create"></a>

在 .NET CLI 中，您可以使用 `dotnet new` 命令从命令行创建 .NET 项目。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` – 适用于 .NET 的 AWS SDK 凭证文件中配置文件的名称。要详细了解 .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 处理程序函数代码。它是一个 C\$1 模板，该模板包含默认 `Amazon.Lambda.Core` 库和默认 `LambdaSerializer` 属性。有关序列化要求和选项的更多信息，请参阅[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
```

## 将 Lambda 层与 .NET CLI 结合使用
<a name="csharp-layers"></a>

**注意**  
尽管可以将[层](chapter-layers.md)与 .NET 中的函数结合使用，但我们不建议这样做。.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) 示例。