

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# AWS Lambda
<a name="lambda-index"></a>

使用开发和部署基于.NET 内核的 C\$1 Lambda 函数。 AWS Toolkit for Visual Studio AWS Lambda 是一项计算服务，允许您在不预置或管理服务器的情况下运行代码。Visual Studio 工具包包括 Visual Studio 的 AWS Lambda .NET 核心项目模板。

有关的更多信息 AWS Lambda，请参阅 [AWS Lambda 开发人员指南](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)。

有关 .NET Core 的更多信息，请参阅 Microsoft [.NET Core](https://docs.microsoft.com/en-us/dotnet/articles/core/) 指南。有关适用于 Windows、macOS 和 Linux 平台的 .NET Core 先决条件和安装说明，请参阅 [.NET Core 下载](https://www.microsoft.com/net/download/core)。

以下主题介绍如何 AWS Lambda 使用适用于 Visual Studio 的 Toolkit。

**Topics**
+ [基础 AWS Lambda 项目](lambda-creating-project-in-visual-studio.md)
+ [创建 Docker 镜像的基本 AWS Lambda 项目](lambda-creating-project-docker-image.md)
+ [教程：使用以下方法构建和测试无服务器应用程序 AWS Lambda](lambda-build-test-severless-app.md)
+ [教程：创建 Amazon Rekognition Lambda 应用程序](lambda-rekognition-example.md)
+ [教程：使用 Amazon 日志框架和 AWS Lambda 创建应用程序日志](cw-log-frameworks.md)

# 基础 AWS Lambda 项目
<a name="lambda-creating-project-in-visual-studio"></a>

您可以使用 AWS Toolkit for Visual Studio中提供的 Microsoft .NET Core 项目模板来创建 Lambda 函数。

## 创建 Visual Studio .NET Core Lambda 项目
<a name="create-a-visual-studio-net-core-lam-project"></a>

您可以使用 Lambda Visual Studio 模板和蓝图来帮助加速项目初始化。Lambda 蓝图包含预先编写好的函数，它们简化了创建灵活项目基础的过程。

**注意**  
Lambda 服务对不同程序包类型有数据限制。有关数据限制的详细信息，请参阅《AWS Lambda 用户指南》**中的 [Lambda 配额](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html)主题。

**在 Visual Studio 中创建 Lambda 项目**

1. 在 Visual Studio 中，展开**文件**菜单，展开**新建**，然后选择**项目**。

1. 在**新建项目**对话框中，将**语言**、**平台**和**项目类型**下拉框都设置为“全部”，然后在**搜索**字段中键入 **aws lambda**。选择 **AWS Lambda 项目（.NET Core - C＃）**模板。

1. 在**名称**字段中输入 **AWSLambdaSample**，指定所需的文件**位置**，然后选择**创建**以继续。

1. 在**选择蓝图**页面上，选择**空函数**蓝图，然后选择**完成**以创建 Visual Studio 项目。

## 复查项目文件
<a name="review-the-project-files"></a>

有两个项目文件需要复查：`aws-lambda-tools-defaults.json` 和 `Function.cs`。

以下示例显示 `aws-lambda-tools-defaults.json` 文件，该文件作为项目的一部分自动创建。您可以使用该文件中的字段设置构建选项。

**注意**  
 Visual Studio 中的项目模板包含多个不同的字段，请注意以下几点：  
**function-handler**：指定运行 Lambda 函数时运行的方法
在 **function-handler** 字段中指定一个值会在发布向导中预先填充该值。
如果您重命名了函数、类或程序集，则也需要更新 `aws-lambda-tools-defaults.json` 文件中的相应字段。

```
{
  "Information": [
    "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.",
    "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.",
    "dotnet lambda help",
    "All the command line options for the Lambda command can be specified in this file."
  ],
  "profile": "default",
  "region": "us-west-2",
  "configuration": "Release",
  "function-architecture": "x86_64",
  "function-runtime": "dotnet8",
  "function-memory-size": 512,
  "function-timeout": 30,
  "function-handler": "AWSLambdaSample::AWSLambdaSample.Function::FunctionHandler"
}
```

检查 `Function.cs` 文件。`Function.cs` 定义了要作为 Lambda 函数公开的 c\$1 函数。这里的 `FunctionHandler` 是在运行 Lambda 函数时运行的 Lambda 功能。在此项目中，定义了一个函数：`FunctionHandler`，它在输入文本上调用 `ToUpper()`。

您的项目现在可发布到 Lambda。

## 发布到 Lambda
<a name="publish-to-lam"></a>

以下过程和图像演示了如何使用 AWS Toolkit for Visual Studio将您的函数上传到 Lambda。

![\[调用测试函数页\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/uploadnet8.png)


**将函数发布到 Lambda**

1. 展开 “**视图**” 并选择 “ AWS 资源管理器”，即可导航到**AWS 资源管理器**。

1. 在**解决方案资源管理器**中，打开（右键单击）要发布的项目的快捷菜单，然后选择**发布到 AWS Lambda 以打开上传 Lambd** **a 函数窗口**。

1. 在**上传 Lambda 函数**窗口中，填写以下字段：

   1. **程序包类型**：选择 **Zip**。作为构建过程的结果，将创建一个 ZIP 文件并将其上传到 Lambda。或者，也可以选择**程序包类型** **Image**。[教程：创建 Docker 映像的基本 Lambda 项目](lambda-creating-project-docker-image.md)描述了如何使用**程序包类型** **Image** 进行发布。

   1. **Lambda 运行时**：从下拉菜单中选择 Lambda 运行时。

   1. **架构**：通过单选按钮选择您偏好的架构。

   1. **函数名称**：通过单选按钮选择**创建新函数**，然后输入 Lambda 实例的显示名称。 AWS 浏览器和 AWS 管理控制台 显示器都会引用此名称。

   1. **处理程序**：使用此字段指定函数处理程序。例如：**AWSLambdaSample::AWSLambdaSample.Function::FunctionHandler**。

   1. *（可选）***描述**：输入描述性文本，该文本将在 AWS 管理控制台中与您的实例一同显示。

   1. **配置**：从下拉菜单中选择所需的配置。

   1. **框架**：从下拉菜单中选择所需的框架。

   1. **保存设置**：选中此框将您当前的设置保存到 `aws-lambda-tools-defaults.json` 中，作为未来部署的默认值。

   1. 选择**下一步**进入**高级函数详细信息**窗口。

1. 在**高级函数详细信息**窗口中，填写以下字段：

   1. **角色名称**：选择与您的账户关联的角色。该角色为函数中的代码发出的任何 AWS 服务调用提供临时证书。如果您没有角色，请在下拉选择器中滚动找到 “**基于 AWS 托管策略的新角色**”，然后选择**AWSLambdaBasicExecutionRole**。此角色拥有最小访问权限。
**注意**  
您的账户必须拥有运行 IAM ListPolicies 操作的权限，否则**角色名称**列表将为空，您将无法继续。

   1. *（可选）*如果您的 Lambda 函数访问 Amazon VPC 上的资源，请选择子网和安全组。

   1. *（可选）*设置您的 Lambda 函数所需的任何环境变量。这些密钥会被默认服务密钥自动加密，此项服务是免费的。或者，您可以指定需要付费的 AWS KMS 密钥。[KMS](https://aws.amazon.com/kms/) 是一项托管服务，可使用它创建和控制用于对数据进行加密的加密密钥。如果您有 AWS KMS 密钥，则可以从列表中将其选中。

1. 选择**上传**以打开**上传函数**窗口并开始上传过程。
**注意**  
**函数上传**到时，将显示 “上传函数” 页面 AWS。要使向导在上传后保持打开状态以便查看报告，请在上传完成之前取消选中表单底部的**在成功完成时自动关闭向导**。  
函数上传后，您的 Lambda 函数就会上线。**函数：**视图页面将打开并显示您的新 Lambda 函数的配置。

1. 在**测试函数**选项卡上，在文本输入字段输入 `hello lambda!`，然后选择**调用**以手动调用您的 Lambda 函数。您的文本会出现在**响应**选项卡中，并已转换为大写字母。
**注意**  
您可以随时通过双击 **AWS Explorer** 内 **AWS Lambda** 节点下已部署的实例来重新打开**函数：**视图。  
![\[调用测试函数页\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/invokeBasic.PNG)

1. *（可选）*要确认您已成功发布您的 Lambda 函数，请登录 AWS 管理控制台 并选择 Lambda。控制台会显示您发布的所有 Lambda 函数，包括您刚刚创建的函数。

## 清理
<a name="cleanup-lam"></a>

如果您不打算继续使用此示例进行开发，请删除您部署的函数，这样就不会为账户中未使用的资源付费。

**注意**  
Lambda 会自动为您监控 Lambda 函数，并通过亚马逊报告指标。 CloudWatch要监控您的函数并对其进行故障排除，请参阅 AWS Lambda 开发者指南中的使用 [Amazon 进行故障排除和监控 AWS Lambda 函数 CloudWatch](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-functions.html)的主题。

**删除函数**

1. 在 **AWS Explorer** 中，展开 **AWS Lambda** 节点。

1. 右键单击已部署的实例，然后选择**删除**。

# 创建 Docker 镜像的基本 AWS Lambda 项目
<a name="lambda-creating-project-docker-image"></a>

你可以使用 Visual Studio 的 Toolkit for Visual Studio 将你的 AWS Lambda 函数部署为 Docker 镜像。使用 Docker 可以更好地控制运行时。例如，您可以选择诸如 .NET 8.0 这样的自定义运行时。您可以像部署任何其他容器映像一样部署 Docker 映像。本教程与[教程：基本 Lambda 项目](lambda-creating-project-in-visual-studio.md)非常相似，但有两个区别：
+ 项目中包含一个 Dockerfile。
+ 选择了备用发布配置。

有关 Lambda 容器映像的信息，请参阅《AWS Lambda 开发人员指南》**中的 [Lambda 部署包](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-package.html)。

有关使用 Lambda 的更多信息 AWS Toolkit for Visual Studio，请参阅本用户指南 AWS Toolkit for Visual Studio主题[中的使用 AWS Lambda 模板](lambda-index.md)。

## 创建 Visual Studio .NET Core Lambda 项目
<a name="create-a-visual-studio-net-core-lam-project"></a>

您可以使用 Lambda Visual Studio 模板和蓝图来帮助加快项目初始化的速度。Lambda 蓝图包含预先编写好的函数，它们简化了创建灵活项目基础的过程。

**创建 Visual Studio .NET Core Lambda 项目**

1. 在 Visual Studio 中，展开**文件**菜单，展开**新建**，然后选择**项目**。

1. 在**新建项目**对话框中，将**语言**、**平台**和**项目类型**下拉框都设置为“全部”，然后在**搜索**字段中键入 **aws lambda**。选择 **AWS Lambda 项目（.NET Core - C＃）**模板。

1. 在**项目名称**字段中输入 **AWSLambdaDocker**，指定您的文件**位置**，然后选择**创建**。

1. 在 **“选择蓝图”** 页面上，选择 **.NET 8（容器映像）**蓝图，然后选择 “**完成**” 创建 Visual Studio 项目。您可以现在复查项目的结构和代码。

## 审查项目文件
<a name="review-the-project-files"></a>

以下各节分析了 **.NET 8（容器映像）**蓝图创建的三个项目文件：

1. `Dockerfile`

1. `aws-lambda-tools-defaults.json`

1. `Function.cs`

### 1. Dockerfile
<a name="dockerfile"></a>

一个 `Dockerfile` 执行三个主要操作：
+ `FROM`：确定构建此映像所依据的基础映像。此基础映像包含 .NET 运行时系统、Lambda 运行时系统以及为 Lambda .NET 进程提供入口点的 shell 脚本。
+ `WORKDIR`：将映像的内部工作目录确定为 `/var/task`。
+ `COPY`：将构建过程生成的文件从其本地位置复制到映像的工作目录中。

您可以指定以下可选 `Dockerfile` 操作：
+ `ENTRYPOINT`：基础映像已经包含一个 `ENTRYPOINT`，即启动映像时执行的启动过程。如要指定自己的入口点，可以覆盖该基本入口点。
+ `CMD`: 指示您要执行 AWS 哪个自定义代码。这要求自定义方法有一个完全限定名称。此行可以直接包含在 Dockerfile 中，也可以在发布过程中指定。

  ```
  # Example of alternative way to specify the Lambda target method rather than during the publish process.
  CMD [ "AWSLambdaDocker::AWSLambdaDocker.Function::FunctionHandler"]
  ```

以下是 .NET 8（容器映像）蓝图创建的 Dockerfile 的示例。

```
FROM public.ecr.aws/lambda/dotnet:8

WORKDIR /var/task

# This COPY command copies the .NET Lambda project's build artifacts from the host machine into the image. 
# The source of the COPY should match where the .NET Lambda project publishes its build artifacts. If the Lambda function is being built 
# with the AWS .NET Lambda Tooling, the `--docker-host-build-output-dir` switch controls where the .NET Lambda project
# will be built. The .NET Lambda project templates default to having `--docker-host-build-output-dir`
# set in the aws-lambda-tools-defaults.json file to "bin/Release/lambda-publish".
#
# Alternatively Docker multi-stage build could be used to build the .NET Lambda project inside the image.
# For more information on this approach checkout the project's README.md file.
COPY "bin/Release/lambda-publish"  .
```

### 2。 aws-lambda-tools-defaults.json
<a name="aws-lambda-tools-defaults"></a>

`aws-lambda-tools-defaults.json` 文件用于为 Toolkit for Visual Studio 部署向导和 .NET Core CLI 指定默认值。以下列表描述了可在 `aws-lambda-tools-defaults.json` 文件中设置的字段。
+ `profile`: 设置您的 AWS 个人资料。
+ `region`：设置您的资源存储 AWS 区域。
+ `configuration`：设置用于发布函数的配置。
+ `package-type`：将部署包类型设置为容器映像或 .zip 文件存档。
+ `function-memory-size`：设置函数的内存分配大小（以 MB 为单位）。
+ `function-timeout`：超时是指一个 Lambda 函数可以运行的最长时间（以秒为单位）。您能够以 1 秒为增量来调整此值，最大值为 15 分钟。
+ `docker-host-build-output-dir`：设置构建过程的输出目录，该目录与 `Dockerfile` 中的指令相关。
+ `image-command`：您的方法的完全限定名称，即您希望 Lambda 函数运行的代码。语法如下：`{Assembly}::{Namespace}.{ClassName}::{MethodName}`。有关更多信息，请参阅[处理程序签名](https://docs.aws.amazon.com/lambda/latest/dg/csharp-handler.html#csharp-handler-signatures)。在此处设置 `image-command` 后，稍后会在 Visual Studio 的“发布”向导中预填充此值。

以下是 aws-lambda-tools-defaults .NET 8（容器镜像）蓝图创建的.json 示例。

```
{
  "Information": [
    "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.",
    "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.",
    "dotnet lambda help",
    "All the command line options for the Lambda command can be specified in this file."
  ],
  "profile": "default",
  "region": "us-west-2",
  "configuration": "Release",
  "package-type": "image",
  "function-memory-size": 512,
  "function-timeout": 30,
  "image-command": "AWSLambdaDocker::AWSLambdaDocker.Function::FunctionHandler",
  "docker-host-build-output-dir": "./bin/Release/lambda-publish"
}
```

### 3. Function.cs
<a name="w2aac15c45c16c17c21"></a>

`Function.cs` 文件定义要作为 Lambda 函数公开的 c\$1 函数。`FunctionHandler` 是在运行 Lambda 函数时运行的 Lambda 功能。在这个项目中，`FunctionHandler` 对输入的文本调用 `ToUpper()`。

## 发布到 Lambda
<a name="publish-to-lam"></a>

构建过程中生成的 Docker 映像上传到 Amazon Elastic Container Registry（Amazon ECR）。Amazon ECR 一个完全托管式 Docker 容器映像库，您可以使用该映像库存储、管理和部署 Docker 容器映像。Amazon ECR 托管映像，然后 Lambda 会引用该映像，以便在调用时提供编程的 Lambda 功能。

**将函数发布到 Lambda**

1. 在**解决方案浏览器**中，（右键单击）打开项目的上下文菜单，然后选择**发布到 AWS Lambda** 以打开**上传 Lambda 函数**窗口。

1. 在**上传 Lambda 函数**页面上，执行以下操作：  
![\[用于将基于图像的 Lambda 函数发布到的上传屏幕 AWS\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/lambda-upload-docker-03192024.png)

   1.  对于**包类型**，**Image** 已被自动选为**包类型**，因为发布向导在项目中检测到了 `Dockerfile`。

   1. 对于**函数名称**，为 Lambda 实例输入显示名称。此名称是在 Visual Studio 的 AWS 各区服务浏览器中和 AWS 管理控制台中显示的引用名称。

   1.  对于**描述**，输入要在 AWS 管理控制台中与您的实例一起显示的文本。

   1. 对于**映像命令**，输入希望 Lambda 函数运行的方法的完全限定路径：**AWSLambdaDocker::AWSLambdaDocker.Function::FunctionHandler**
**注意**  
此处输入的任何方法名称都将覆盖 Dockerfile 中的任何 CMD 指令。只有在 `Dockerfile` 包含用于指示如何启动 Lambda 函数的 `CMD` 时，输入**映像命令**才是可选的。

   1. 对于**映像存储库**，输入新的或现有 Amazon Elastic Container Registry 的名称。构建过程创建的 Docker 映像将上传到此映像库。要发布的 Lambda 定义将引用该 Amazon ECR 映像。

   1.  对于**映像标签**，输入一个 Docker 标签以与存储库中的映像相关联。

   1. 选择**下一步**。

1. 在**高级函数详细信息**页面的**角色名称**中，选择与您的账户关联的角色。该角色用于为函数中的代码所发起的任何 Amazon Web Services 调用提供临时凭证。如果您没有角色，请选择 “**基于 AWS 托管策略新建角色**”，然后选择**AWSLambdaBasicExecutionRole**。
**注意**  
您的账户必须拥有运行 IAM ListPolicies 操作的权限，否则**角色名称**列表将为空。

1. 选择**上传**以启动上传和发布过程。
**注意**  
上传函数时，将显示**正在上传函数**页面。然后，发布过程根据配置参数构建映像，必要时创建 Amazon ECR 存储库，将映像上传到存储库，然后创建引用包含该映像的存储库的 Lambda。  
上传函数后，**函数**页面将打开并显示新 Lambda 函数的配置。

1. 要手动调用 Lambda 函数，请在**测试函数**选项卡上，在请求的自由文本输入字段输入 `hello image based lambda`，然后选择**调用**。您的文本将转换为大写并显示在**响应**中。  
![\[已发布函数视图页面的“测试函数”选项卡上有用于手动调用 Lambda 方法的按钮。\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/lambda-invoke-docker-03192024.png)

1. 要查看存储库，请在 **AWS 各区服务浏览器**中的 **Amazon Elastic Container Service** 下选择**存储库**。

   您可以随时通过双击 **AWS Explorer** 内 **AWS Lambda** 节点下已部署的实例来重新打开**函数：**视图。
**注意**  
如果你的 AWS 资源管理器窗口未打开，你可以通过 “**视图**”-> “**AWS 资源管理器”** 将其停靠

1. 请注意**配置**选项卡上其他特定于映像的配置选项。此选项卡提供了一种覆盖可能已在 Dockerfile 中指定的 `ENTRYPOINT`、`CMD`、和 `WORKDIR` 的方法。**描述**是您在上传/发布期间输入的描述（如果有）。

## 清理
<a name="cleanup-lam"></a>

如果您不打算继续使用此示例进行开发，请记得删除已部署的函数和 ECR 映像，这样就不会为账户中未使用的资源付费。
+ 右键单击位于 **AWS 各区服务浏览器**中 **AWS Lambda** 节点下的已部署实例，即可删除函数。
+ 可以在 **AWS 各区服务浏览器**中的 **Amazon Elastic Container Service** -> **存储库**下删除存储库。

## 后续步骤
<a name="next-steps-lam"></a>

有关创建和测试 Lambda 映像的信息，请参阅[使用 Lambda 容器映像](https://docs.aws.amazon.com/lambda/latest/dg/lambda-images.html)。

有关容器映像部署、权限和覆盖配置设置的信息，请参阅[配置函数](https://docs.aws.amazon.com/lambda/latest/dg/configuration-images.html)。

# 教程：使用以下方法构建和测试无服务器应用程序 AWS Lambda
<a name="lambda-build-test-severless-app"></a>

您可以使用模板构建无服务器 Lambda 应用程序。 AWS Toolkit for Visual Studio Lambda 项目模板包括一个用于**AWS 无服务器应用程序**的模板，即[AWS 无服务器应用程序模型 (S](https://github.com/awslabs/serverless-application-model) AM) 的 AWS Toolkit for Visual Studio 实现。AWS 使用此项目类型，您可以开发一组 AWS Lambda 函数，并使用任何必要的 AWS 资源将它们作为整个应用程序进行部署， AWS CloudFormation 用于协调部署。

有关设置的先决条件和信息 AWS Toolkit for Visual Studio，请参阅[使用 Visual Stu AWS dio AWS 工具包中的 Lambda 模板](lambda-index.md)。

**Topics**
+ [创建新的 AWS 无服务器应用程序项目](#create-a-new-aws-serverless-application-project)
+ [查看无服务器应用程序文件](#examine-the-files-in-the-serverless-application)
+ [部署无服务器应用程序](#deploy-the-serverless-application)
+ [测试无服务器应用程序](#test-the-serverless-application)

## 创建新的 AWS 无服务器应用程序项目
<a name="create-a-new-aws-serverless-application-project"></a>

AWS 无服务器应用程序项目使用无服务器模板创建 Lambda 函数。 CloudFormation CloudFormation 模板使您能够定义其他资源，例如数据库、添加 IAM 角色和一次部署多个函数。这与 AWS Lambda 项目不同，后者侧重于开发和部署单个 Lambda 函数。

以下过程介绍了如何创建新的 AWS 无服务器应用程序项目。

1. 在 Visual Studio 中，展开**文件**菜单，展开**新建**，然后选择**项目**。

1. 在**新建项目**对话框中，确保将**语言**、**平台**和**项目类型**下拉框都设置为“全部...”，然后在**搜索**字段中键入 **aws lambda**。

1. 选择**带测试的AWS 无服务器应用程序（.NET Core - C\$1）**模板。
**注意**  
**带测试的AWS 无服务器应用程序（.NET Core - C＃）**模板可能不会填充到结果的顶部。

1. 单击**下一步**打开**配置您的新项目**对话框。

1. 在**配置您的新项目**对话框中，为**名称**输入 **ServerlessPowertools**，然后根据您的偏好填写其余字段。选择**创建**按钮进入**选择蓝图**对话框。

1. 在**选择蓝图**对话框中，选择 **Powertools for AWS Lambda** 蓝图，然后选择**完成**以创建 Visual Studio 项目。

## 查看无服务器应用程序文件
<a name="examine-the-files-in-the-serverless-application"></a>

以下各节详细介绍为您的项目创建的三个无服务器应用程序文件：

1. serverless.template 

1. Functions.cs

1. aws-lambda-tools-defaults.json

### 1. serverless.template
<a name="blogcs"></a>

`serverless.template`文件是用于声明您的无服务器函数和其他 AWS 资源的 AWS CloudFormation 模板。此项目附带的该文件中包含单个 Lambda 函数的声明，该函数将作为一项 `HTTP *Get*` 操作通过 Amazon API Gateway 公开。您可以编辑此模板以自定义现有函数或添加应用程序所需的更多函数和其他资源。

以下是 `serverless.template` 文件的示例：

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::Serverless-2016-10-31",
  "Description": "An AWS Serverless Application.",
  "Resources": {
    "Get": {
      "Type": "AWS::Serverless::Function",
      "Properties": {
         "Architectures": [
            "x86_64"
            ],
         "Handler": "ServerlessPowertools::ServerlessPowertools.Functions::Get",
         "Runtime": "dotnet8",
         "CodeUri": "",
         "MemorySize": 512,
         "Timeout": 30,
         "Role": null,
         "Policies": [
            "AWSLambdaBasicExecutionRole"
            ],
         "Environment": {
            "Variables": {
               "POWERTOOLS_SERVICE_NAME": "ServerlessGreeting",
               "POWERTOOLS_LOG_LEVEL": "Info",
               "POWERTOOLS_LOGGER_CASE": "PascalCase",
               "POWERTOOLS_TRACER_CAPTURE_RESPONSE": true,
               "POWERTOOLS_TRACER_CAPTURE_ERROR": true,
               "POWERTOOLS_METRICS_NAMESPACE": "ServerlessGreeting"
               }
            },
         "Events": {
            "RootGet": {
               "Type": "Api",
               "Properties": {
                  "Path": "/",
                  "Method": "GET"
                  }
               }
            }
         }
      }
   },
  "Outputs": {
    "ApiURL": {
      "Description": "API endpoint URL for Prod environment",
      "Value": {
        "Fn::Sub": "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/"
      }
    }
  }
}
```

请注意，许多 `...AWS:: Serverless::Function...` 声明字段都与 Lambda 项目部署的字段类似。Powertools 日志、指标和跟踪是通过以下环境变量配置的：
+ POWERTOOLS 服务名称= ServerlessGreeting
+ POWERTOOLS\$1LOG\$1LEVEL=Info
+ POWERTOOLS\$1LOGGER\$1C PascalCase
+ POWERTOOLS\$1TRACER\$1CAPTURE\$1RESPONSE=true
+ POWERTOOLS\$1TRACER\$1CAPTURE\$1ERROR=true
+ POWERTOOLS\$1METRICS\$1NAMESPAC ServerlessGreeting

有关环境变量的定义和其他详细信息，请参阅 [Powertools 供 AWS Lambda 参考](https://awslabs.github.io/aws-lambda-powertools-dotnet/references/)网站。

### 2. Functions.cs
<a name="functionscs"></a>

`Functions.cs` 是一个包含 C\$1 方法的类文件，该方法映射到模板文件中声明的单个函数。该 Lambda 函数响应来自 API Gateway 的 `HTTP Get` 方法。以下是 `Functions.cs` 文件的示例：

```
public class Functions
{
    [Logging(LogEvent = true, CorrelationIdPath = CorrelationIdPaths.ApiGatewayRest)]
    [Metrics(CaptureColdStart = true)]
    [Tracing(CaptureMode = TracingCaptureMode.ResponseAndError)]
    public APIGatewayProxyResponse Get(APIGatewayProxyRequest request, ILambdaContext context)
    {
        Logger.LogInformation("Get Request");

        var greeting = GetGreeting();

        var response = new APIGatewayProxyResponse
        {
            StatusCode = (int)HttpStatusCode.OK,
            Body = greeting,
            Headers = new Dictionary (string, string) { { "Content-Type", "text/plain" } }
        };

        return response;
    }

    [Tracing(SegmentName = "GetGreeting Method")]
    private static string GetGreeting()
    {
        Metrics.AddMetric("GetGreeting_Invocations", 1, MetricUnit.Count);

        return "Hello Powertools for AWS Lambda (.NET)";
    }
}
```

### 3。 aws-lambda-tools-defaults.json
<a name="functionscs"></a>

`aws-lambda-tools-defaults.json`提供了 Visual Studio 内部 AWS 部署向导的默认值以及添加到.NET Core CLI 中的 AWS Lambda 命令。以下是本项目附带的 `aws-lambda-tools-defaults.json` 文件的示例：

```
{
  "profile": "Default",
  "region": "us-east-1",
  "configuration": "Release",
  "s3-prefix": "ServerlessPowertools/",
  "template": "serverless.template",
  "template-parameters": ""
}
```

## 部署无服务器应用程序
<a name="deploy-the-serverless-application"></a>

要部署无服务器应用程序，请完成以下步骤：

1. 在**解决方案资源管理器**中，打开项目的快捷菜单（右键单击），然后选择 “**发布到 AWS Lambda” 以**打开 “**发布 AWS 无服务器**应用程序” 对话框。

1. 在 “**发布 AWS 无服务器应用程序**” 对话框中，在 CloudFormation 堆栈名称字段中输入堆**栈容器的名称**。

1. 在 **S3 存储桶**字段中，选择您的应用程序捆绑包将上传到的 Amazon S3 存储桶，或者选择**新建...**按钮，输入新 Amazon S3 存储桶的名称。然后选择**发布**以进行发布，来部署您的应用程序。
**注意**  
您的 CloudFormation 堆栈和 Amazon S3 存储桶必须位于同一 AWS 区域。您的项目的其余设置在 `serverless.template` 文件中定义。  
![\[“发布 AWS 无服务器应用程序” 对话框的图像。\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/lambda-upload-serverless-03192024.png)

1. 在发布过程中，**堆栈**视图窗口会打开，当部署完成后，**状态**字段将显示：`CREATE_COMPLETE`。  
![\[Visual Studio 中部署堆栈视图窗口的图像。\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/lambda-upload-stackview-03192024.png)

## 测试无服务器应用程序
<a name="test-the-serverless-application"></a>

堆栈创建完成后，您可以使用 **AWS 无服务器 URL** 查看您的应用程序。如果您在完成本教程时未添加任何其他函数或参数，则访问您的 AWS 无服务器 URL 会在您的网络浏览器中显示以下短语：`Hello Powertools for AWS Lambda (.NET)`。

# 教程：创建 Amazon Rekognition Lambda 应用程序
<a name="lambda-rekognition-example"></a>

本教程向您说明如何创建 Lambda 应用程序，该应用程序使用 Amazon Rekognition 标记包含检测到的标签的 Amazon S3 对象。

有关设置的先决条件和信息 AWS Toolkit for Visual Studio，请参阅[使用 Visual Stu AWS dio AWS 工具包中的 Lambda 模板](lambda-index.md)。

## 创建 Visual Studio .NET Core Lambda Image Rekognition 项目
<a name="create-a-visual-studio-net-core-lam-image-rekognition-project"></a>

以下过程描述如何从 AWS Toolkit for Visual Studio创建 Amazon Rekognition Lambda 应用程序。

**注意**  
创建完成后，您的应用程序会生成一个包含两个项目的解决方案：一个是包含要部署到 Lambda 的 Lambda 函数代码的源项目，另一个是使用 xUnit 来本地测试函数的测试项目。  
有时 Visual Studio 无法找到你的项目的所有 NuGet 参考资料。这是因为蓝图需要必须从中 NuGet检索的依赖关系。创建新项目时，Visual Studio 仅从中提取本地引用，而不会从 NuGet中提取远程引用。要修复 NuGet 错误，请右键单击您的参考文献，然后选择 “**还原包**”。

1. 在 Visual Studio 中，展开**文件**菜单，展开**新建**，然后选择**项目**。

1. 在**新建项目**对话框中，确保将**语言**、**平台**和**项目类型**下拉框都设置为“全部...”，然后在**搜索**字段中键入 **aws lambda**。

1. 选择**带测试的AWS Lambda （.NET Core – C＃）**模板。

1. 单击**下一步**打开**配置您的新项目**对话框。

1. 在 “**配置您的新项目**” 对话框中，在 “**名称 ImageRekognition**” 中输入 “”，然后根据自己的喜好填写其余字段。选择**创建**按钮进入**选择蓝图**对话框。

1. 在**选择蓝图**对话框上，选择**删除映像标签**蓝图，然后选择**完成**以创建 Visual Studio 项目。
**注意**  
此蓝图提供了用于侦听 Amazon S3 事件的代码，并使用 Amazon Rekognition 检测标签并将其作为标记添加到 S3 对象。

## 审查项目文件
<a name="examine-the-files"></a>

以下各节分析这些项目文件：

1. `Function.cs`

1. `aws-lambda-tools-defaults.json`

### 1. Function.cs
<a name="functioncs"></a>

在 `Function.cs` 文件中，第一段代码是位于文件顶部的程序集属性。默认情况下，Lambda 只接受 `System.IO.Stream` 类型的输入参数和返回类型。您必须注册一个序列化程序才能使用类型化类作为输入参数和返回类型。该程序集属性注册了 Lambda JSON 序列化程序，它使用 `Newtonsoft.Json` 将流转换为类型化类。您可以在程序集或方法级别设置串行器。

以下是程序集属性的一个示例：

```
// 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))]
```

该类有两个构造函数。第一个是 Lambda 调用您的函数时使用的默认构造函数。此构造函数创建 Amazon S3 和 Amazon Rekognition 服务客户端。构造函数还会从您在部署函数时分配给该函数的 IAM 角色中检索这些客户端的 AWS 证书。客户端的 AWS 区域设置为运行您的 Lambda 函数的区域。在此蓝图中，您只想在 Amazon Rekognition 服务对标签具有最低置信度时，才将标签添加到 Amazon S3 对象。此构造函数将检查环境变量 `MinConfidence` 以确定可接受的置信度级别。您可以在部署 Lambda 函数时设置该环境变量。

以下是 `Function.cs` 中第一个类构造函数的示例：

```
public Function()
{
    this.S3Client = new AmazonS3Client();
    this.RekognitionClient = new AmazonRekognitionClient();

    var environmentMinConfidence = System.Environment.GetEnvironmentVariable(MIN_CONFIDENCE_ENVIRONMENT_VARIABLE_NAME);
    if(!string.IsNullOrWhiteSpace(environmentMinConfidence))
    {
        float value;
        if(float.TryParse(environmentMinConfidence, out value))
        {
            this.MinConfidence = value;
            Console.WriteLine($"Setting minimum confidence to {this.MinConfidence}");
        }
        else
        {
            Console.WriteLine($"Failed to parse value {environmentMinConfidence} for minimum confidence. Reverting back to default of {this.MinConfidence}");
        }
    }
    else
    {
        Console.WriteLine($"Using default minimum confidence of {this.MinConfidence}");
    }
}
```

以下示例演示如何利用第二个构造函数进行测试。测试项目会配置它自己的 S3 和 Rekognition 客户端并将其传入：

```
public Function(IAmazonS3 s3Client, IAmazonRekognition rekognitionClient, float minConfidence)
{
    this.S3Client = s3Client;
    this.RekognitionClient = rekognitionClient;
    this.MinConfidence = minConfidence;
}
```

以下是 `Function.cs` 文件内的 `FunctionHandler` 方法示例。

```
public async Task FunctionHandler(S3Event input, ILambdaContext context)
{
    foreach(var record in input.Records)
    {
        if(!SupportedImageTypes.Contains(Path.GetExtension(record.S3.Object.Key)))
        {
            Console.WriteLine($"Object {record.S3.Bucket.Name}:{record.S3.Object.Key} is not a supported image type");
            continue;
        }

        Console.WriteLine($"Looking for labels in image {record.S3.Bucket.Name}:{record.S3.Object.Key}");
        var detectResponses = await this.RekognitionClient.DetectLabelsAsync(new DetectLabelsRequest
        {
            MinConfidence = MinConfidence,
            Image = new Image
            {
                S3Object = new Amazon.Rekognition.Model.S3Object
                {
                    Bucket = record.S3.Bucket.Name,
                    Name = record.S3.Object.Key
                }
            }
        });

        var tags = new List();
        foreach(var label in detectResponses.Labels)
        {
            if(tags.Count < 10)
            {
                Console.WriteLine($"\tFound Label {label.Name} with confidence {label.Confidence}");
                tags.Add(new Tag { Key = label.Name, Value = label.Confidence.ToString() });
            }
            else
            {
                Console.WriteLine($"\tSkipped label {label.Name} with confidence {label.Confidence} because maximum number of tags reached");
            }
        }

        await this.S3Client.PutObjectTaggingAsync(new PutObjectTaggingRequest
        {
            BucketName = record.S3.Bucket.Name,
            Key = record.S3.Object.Key,
            Tagging = new Tagging
            {
                TagSet = tags
            }
        });
    }
    return;
}
```

 `FunctionHandler` 是 Lambda 构建实例后调用的方法。请注意，输入参数的类型是 `S3Event`，而不是 `Stream`。您可以执行此操作，因为您已注册 Lambda JSON 串行器。`S3Event` 包含在 Amazon S3 中触发的事件的所有信息。该函数将遍历组成事件的所有 S3 对象并让 Rekognition 检测标签。在检测标签后，标签将作为标记添加到 S3 对象。

**注意**  
代码中包含对 `Console.WriteLine()` 的调用。当该函数在 Lambda 中运行时，所有调用都`Console.WriteLine()`将重定向到 Ama CloudWatch zon 日志。

### 2。 aws-lambda-tools-defaults.json
<a name="toolsdefaults"></a>

`aws-lambda-tools-defaults.json` 文件包含由蓝图设置的默认值，用于预填充部署向导中的某些字段。它也有助于设置与 .NET Core CLI 集成的命令行选项。

要访问 .NET Core CLI 集成，请导航到该函数的项目目录并键入 **dotnet lambda help**。

**注意**  
函数处理程序指明了 Lambda 在响应函数调用时要调用的方法。此字段的格式为：`<assembly-name>::<full-type-name>::<method-name>`。类型名称必须包含命名空间。

## 部署函数
<a name="deploy-the-function"></a>

以下过程介绍如何部署您的 Lambda 函数。

1. **在**解决方案资源管理器**中，右键单击 Lambda 项目，然后选择 “**发布到 Lambda” 以打开 “ AWS 上传**到” 窗口。 AWS Lambda**
**注意**  
预设值是从 `aws-lambda-tools-defaults.json` 文件中检索的。

1. 从**上传到 AWS Lambda** 窗口中，在**函数名称**字段中输入名称，然后选择**下一步**按钮进入**高级函数详细信息**窗口。
**注意**  
该示例使用**函数名称** **ImageRekognition**。  
![\[AWS Lambda function upload interface with package type, runtime, and configuration options.\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/lambda-upload-imgrek-03192024.png)

1. 从**高级函数详细信息**窗口，选择一个 IAM 角色，该角色授予您的代码访问 Amazon S3 和 Amazon Rekognition 资源的权限。
**注意**  
如果您正在按照此示例进行操作，请选择 `AWSLambda_FullAccess` 角色。

1. 将环境变量 `MinConfidence` 设置为 60，然后选择**上传**以启动部署过程。当**函数**视图显示在 **AWS Explorer** 中时，发布过程完成。  
![\[AWS Lambda function configuration interface showing permissions, execution, and environment settings.\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/lambda-upload-imgrek-advanced-03192024.png)

1. 成功部署后，通过导航到**事件源**选项卡，配置 Amazon S3 将其事件发送到您的新函数。

1. 在**事件源**选项卡中，选择**添加**按钮，然后选择要连接您的 Lambda 函数的 Amazon S3 存储桶。
**注意**  
存储桶必须与您的 Lambda 函数位于同一 AWS 区域。

## 测试函数。
<a name="test-the-function"></a>

现在已部署该函数，并将 S3 桶配置为函数的事件源，请从 **AWS 各区服务浏览器**中为您选定的桶打开 S3 桶浏览器。然后上传一些图像。

上传完成后，您可以通过在函数视图中查看日志来确认您的函数已运行。或者，右键单击存储桶浏览器中的图像，然后选择 **Properties (属性)**。在 **Tags (标签)** 选项卡上，您可以查看应用到您的对象的标签。

![\[Properties window showing metadata tags for an image file in a cloud storage bucket.\]](http://docs.aws.amazon.com/zh_cn/toolkit-for-visual-studio/latest/user-guide/images/lambda-object-properties.png)


# 教程：使用 Amazon 日志框架和 AWS Lambda 创建应用程序日志
<a name="cw-log-frameworks"></a>

您可以使用 Amazon CloudWatch Logs 来监控、存储和访问应用程序的日志。要将日志数据导入 CloudWatch 日志，请使用 S AWS DK 或安装 Log CloudWatch s 代理来监控某些日志文件夹。 CloudWatch 日志与几个流行的.NET 日志框架集成，从而简化了工作流程。

要开始使用 CloudWatch 日志和.NET 日志框架，请将相应的 NuGet 包和 CloudWatch 日志输出源添加到您的应用程序中，然后像往常一样使用您的日志库。这使您的应用程序能够使用.NET 框架记录消息，将其发送到 Lo CloudWatch gs，在日志控制台中显示应用程序的 CloudWatch 日志消息。您还可以根据应用程序的日志消息，在 CloudWatch 日志控制台中设置指标和警报。

受支持的 .NET 日志记录框架包括：
+ **NLog**: 要查看，请参阅 [nuget.org 软件包。 NLog ](https://www.nuget.org/packages/AWS.Logger.NLog)
+ **Log4net**：若要查看，请访问 [nuget.org Log4net 包](https://www.nuget.org/packages/AWS.Logger.NLog)。
+ **ASP.NET Core logging Framework**：若要查看，请访问 [nuget.org ASP.NET Core 日志记录框架包](https://www.nuget.org/packages/AWS.Logger.AspNetCore/)。

以下是一个文件示例，该`NLog.config`文件通过将`AWS.Logger.NLog` NuGet 软件包和 AWS 目标添加到中来启用日志和控制台作为日志消息的输出`NLog.config`。 CloudWatch 

```
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      throwExceptions="true">
  <targets>
    <target name="aws" type="AWSTarget" logGroup="NLog.ConfigExample" region="us-east-1"/>
    <target name="logfile" xsi:type="Console" layout="${callsite} ${message}" />
  </targets>
  <rules>
    <logger name="*" minlevel="Info" writeTo="logfile,aws" />
  </rules>
</nlog>
```



日志插件都建立在之上，通过类似于 SDK 的流程对您的 AWS 凭据进行身份验证。 适用于 .NET 的 AWS SDK 以下示例详细说明了日志插件凭据访问 CloudWatch 日志所需的权限：

**注意**  
. AWS NET 日志插件是一个开源项目。有关更多信息、示例和说明，请参阅 Lo [AWS gging .NET GitHub 存储库中的[示例](https://github.com/aws/aws-logging-dotnet/tree/master/samples)](https://github.com/aws/aws-logging-dotnet)和[说明](https://github.com/aws/aws-logging-dotnet/blob/master/README.md)主题。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogGroups"
      ],
      "Resource": [
        "arn:aws:logs:*:*:*"
      ]
    }
  ]
}
```

------