本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:创建 Amazon Rekognition Lambda 应用程序
本教程向您说明如何创建 Lambda 应用程序,该应用程序使用 Amazon Rekognition 标记包含检测到的标签的 Amazon S3 对象。
有关设置 AWS Toolkit for Visual Studio 的先决条件和信息,请参阅在 AWS Toolkit for Visual Studio 中使用 AWS Lambda 模板。
创建 Visual Studio .NET Core Lambda Image Rekognition 项目
以下过程描述如何从 AWS Toolkit for Visual Studio 创建 Amazon Rekognition Lambda 应用程序。
注意
创建完成后,您的应用程序会生成一个包含两个项目的解决方案:一个是包含要部署到 Lambda 的 Lambda 函数代码的源项目,另一个是使用 xUnit 来本地测试函数的测试项目。
有时 Visual Studio 无法找到您的项目的所有 NuGet 引用。这是因为项目蓝图所需的依赖项必须从 NuGet 检索。创建新项目后,Visual Studio 仅在本地引用中提取,而非从 NuGet 远程引用。要修复 NuGet 错误,请右键单击您的引用,然后选择还原包。
-
在 Visual Studio 中,展开文件菜单,展开新建,然后选择项目。
-
在新建项目对话框中,确保将语言、平台和项目类型下拉框都设置为“全部...”,然后在搜索字段中键入
aws lambda。 -
选择带测试的 AWS Lambda(.NET Core – C#)模板。
-
单击下一步打开配置您的新项目对话框。
-
在配置您的新项目对话框中,对于名称,输入“ImageRekognition”,然后根据您的偏好填写剩余的字段。选择创建按钮进入选择蓝图对话框。
-
在选择蓝图对话框上,选择删除映像标签蓝图,然后选择完成以创建 Visual Studio 项目。
注意
此蓝图提供了用于侦听 Amazon S3 事件的代码,并使用 Amazon Rekognition 检测标签并将其作为标记添加到 S3 对象。
审查项目文件
以下各节分析这些项目文件:
-
Function.cs -
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 角色中检索这些客户端的 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() 的所有调用都会重定向到 Amazon CloudWatch Logs。
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 函数。
-
在解决方案浏览器中,右键单击 Lambda 项目,然后选择发布到 AWS Lambda 以打开上传到 AWS Lambda 窗口。
注意
预设值是从
aws-lambda-tools-defaults.json文件中检索的。 -
从上传到 AWS Lambda 窗口中,在函数名称字段中输入名称,然后选择下一步按钮进入高级函数详细信息窗口。
注意
该示例使用函数名称
ImageRekognition。
-
从高级函数详细信息窗口,选择一个 IAM 角色,该角色授予您的代码访问 Amazon S3 和 Amazon Rekognition 资源的权限。
注意
如果您正在按照此示例进行操作,请选择
AWSLambda_FullAccess角色。 -
将环境变量
MinConfidence设置为 60,然后选择上传以启动部署过程。当函数视图显示在 AWS Explorer 中时,发布过程完成。
-
成功部署后,通过导航到事件源选项卡,配置 Amazon S3 将其事件发送到您的新函数。
-
在事件源选项卡中,选择添加按钮,然后选择要连接您的 Lambda 函数的 Amazon S3 存储桶。
注意
该存储桶必须与您的 Lambda 函数位于同一个 AWS 区域。
测试函数。
现在已部署该函数,并将 S3 桶配置为函数的事件源,请从 AWS 各区服务浏览器中为您选定的桶打开 S3 桶浏览器。然后上传一些图像。
上传完成后,您可以通过在函数视图中查看日志来确认您的函数已运行。或者,右键单击存储桶浏览器中的图像,然后选择 Properties (属性)。在 Tags (标签) 选项卡上,您可以查看应用到您的对象的标签。