

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

# 教程：创建 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)
