教程:创建 Amazon Rekognition Lambda 应用程序 - Amazon 适用于 Visual Studio 的工具包
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

教程:创建 Amazon Rekognition Lambda 应用程序

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

有关设置的先决条件和信息 Amazon Toolkit for Visual Studio,请参阅使用 Visual Stu Amazon dio Amazon 工具包中的 Lambda 模板

创建 Visual Studio .NET Core Lambda Image Rekognition 项目

以下过程介绍如何通过创建 Amazon Rekognition Lambda 应用程序。 Amazon Toolkit for Visual Studio

注意

创建后,您的应用程序将有一个包含两个项目的解决方案:一个包含要部署到 Lambda 的 Lambda 函数代码的源项目,以及一个使用 xUnit 在本地测试函数的测试项目。

有时 Visual Studio 无法找到你的项目的所有 NuGet 参考资料。这是因为蓝图需要必须从中 NuGet检索的依赖关系。创建新项目时,Visual Studio 仅从中提取本地引用,而不会从 NuGet中提取远程引用。要修复 NuGet 错误,请右键单击您的参考文献,然后选择 “还原包”。

  1. 从 Visual Studio 中展开 “文件” 菜单,展开 “新建”,然后选择 “项目”。

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

  3. 选择 “Amazon Lambda 带测试”(.NET Core-C#)模板。

  4. 单击 “下一步” 打开 “配置您的新项目” 对话框。

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

  6. “选择蓝图” 对话框中,选择 “检测图像标签” 蓝图,然后选择 “完成” 创建 Visual Studio 项目。

    注意

    此蓝图提供了用于侦听 Amazon S3 事件的代码,并使用 Amazon Rekognition 检测标签并将其作为标记添加到 S3 对象。

查看项目文件

以下各节将研究这些项目文件:

  1. Function.cs

  2. aws-lambda-tools-defaults.json

1. Function.cs

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 角色中检索这些客户端的 Amazon 证书。客户端的 Amazon 区域设置为运行您的 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

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

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

注意

函数处理程序指示 Lambda 要调用什么方法来响应被调用的函数。此字段的格式为:<assembly-name>::<full-type-name>::<method-name>. 命名空间必须包含在类型名称中。

部署函数

以下过程描述了如何部署 Lambda 函数。

  1. 解决方案资源管理器中,右键单击 Lambda 项目,然后选择 “发布到 Lambda” 以打开 “ Amazon 上传到” 窗口。 Amazon Lambda

    注意

    预设值是从aws-lambda-tools-defaults.json文件中检索的。

  2. 在 “上传到 Amazon Lambda” 窗口中,在 “函数名称” 字段中输入名称,然后选择 “下一步” 按钮前进到 “高级函数详细信息” 窗口。

    注意

    此示例使用函数名称ImageRekognition

  3. 在 “高级功能详情” 窗口中,选择一个 IAM 角色,该角色允许您的代码访问您的 Amazon S3 和 Amazon Rekognition 资源。

    注意

    如果您正在关注此示例,请选择AWSLambda_FullAccess角色。

  4. 将环境变量设置MinConfidence为 60,然后选择 U p load 启动部署过程。当 “函数” 视图显示在Amazon 资源管理器中时,发布过程即告完成。

  5. 成功部署后,通过导航到 “事件源” 选项卡,将 Amazon S3 配置为将其事件发送到您的新函数。

  6. 事件源选项卡中,选择添加按钮,然后选择要连接您的 Lambda 函数的 Amazon S3 存储桶。

    注意

    存储桶必须与您的 Lambda 函数位于同一 Amazon 区域。

测试函数。

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

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