本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:创建 Amazon Rekognition Lambda 应用程序
本教程向您说明如何创建 Lambda 应用程序,该应用程序使用 Amazon Rekognition 标记 Amazon S3 对象并检测到的标签的 Amazon S3 对象。
有关设置的先决条件和信息Amazon Toolkit for Visual Studio,请参阅使用Amazon中的 Lambda 模板AmazonToolkit for Visual Studio.
创建 Visual Studio.NET 核心 Lambda 图像 Rekognition 项目
-
打开 Visual Studio,在 File (文件) 菜单上,选择 New (新建) 和 Project (项目)。
-
对于 Visual Studio 2017:
在新项目对话框中,展开已安装,展开Visual C#,然后选择AmazonLambda.
对于 Visual Studio 2019:
在新项目对话框中,请确保语言、平台, 和项目类型下拉框设置为 “All...” 并键入aws lambda中的搜索字段中返回的子位置类型。
-
选择Amazon带测试的 Lambda 项目(.NET 内核-C#)。
-
对于 Visual Studio 2017:
将项目命名为“ImageRekognition”,输入所需的 位置等,然后单击确定。
对于 Visual Studio 2019:
单击 Next(下一步)。在下一个对话框中,为名称输入“ImageRekognition”,输入所需位置等,然后单击创建。
-
选择蓝图。蓝图提供了可帮助您编写 Lambda 函数的起始代码。对于本示例,请选择 Detect Image Labels (直接图像标签) 蓝图。
此蓝图提供了用于侦听 Amazon S3 事件的代码,并使用 Amazon Rekognition 检测标签并将其作为标记添加到 S3 对象。
-
选择您要开发的 Lambda 函数的类型,然后选择Finish以创建 Visual Studio 项目。
在项目完成后,您将获得包含以下两个项目的解决方案:包含要部署到 Lambda 的 Lambda 函数代码的源项目和使用 xUnit 在本地测试函数的测试项目。

您可能会注意到首次创建项目时,Visual Studio 不会查找所有 NuGet 引用。发生此行为是因为这些蓝图需要必须从 NuGet 检索的依赖项。创建新项目后,Visual Studio 仅在本地引用中提取,而非从 NuGet 远程引用。您可以通过右键单击您的引用并选择 Restore Packages (还原程序包) 轻松解决这个问题。
检查文件
-
打开
Function.cs
文件并查看随蓝图提供的代码。代码的第一个部分是添加到文件顶部的程序集属性。// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class. [assembly: LambdaSerializerAttribute(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]
默认情况下,Lambda 仅接受
System.IO.Stream
类型的输入参数和返回类型。要将类型化类用作输入参数和返回类型,您必须注册串行器。此程序集属性将注册 Lambda JSON 串行器,该串行器使用Newtonsoft.Json
将流转换为类型化类。您可以在程序集或方法级别设置串行器。该类有两个构造函数。第一个是 Lambda 调用您的函数时使用的默认构造函数。此构造函数创建 S3 和 Rekognition 服务客户端,并获取Amazon这些客户端的凭证来自您在部署时分配给该函数的 IAM 角色。这些区域有:Amazon将客户端的区域设置为运行您的 Lambda 函数的区域。在此蓝图中,如果 Rekognition 服务具有标签的最小置信度级别,您只需将标记添加到 S3 对象。此构造函数将检查环境变量
MinConfidence
以确定可接受的置信度级别。您可以在部署 Lambda 函数时设置该环境变量。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; }
FunctionHandler
是 Lambda 构建实例后调用的方法。请注意,输入参数的类型是S3Event
,而不是Stream
。您可以执行此操作,因为您已注册 Lambda JSON 串行器。这些区域有:S3Event
包含 Amazon S3 中触发的事件的所有信息。该函数将遍历组成事件的所有 S3 对象并让 Rekognition 检测标签。在检测标签后,标签将作为标记添加到 S3 对象。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; }
请注意,该代码包含对
Console.WriteLine()
的调用。当该函数中在 Lambda 中运行时,的所有调用Console.WriteLine()
重定向到 Amazon CloudWatch Logs -
打开蓝图创建的
aws-lambda-tools-defaults.json
文件。此文件包含蓝图设置用于帮助预填充部署向导中的某些字段的默认值。它也有助于通过我们与 .NET 内核 CLI 的集成设置命令行选项。要使用它,请导航到函数的项目目录,然后键入 dotnet lambda help。
其中的重要字段为函数处理程序。这可向 Lambda 指明代码中为了响应我们调用的函数而调用的方法。此字段的格式为 <assembly-name>::<full-type-name>::<method-name>
。请务必在命名空间中包含类型名称。
部署函数
-
右键单击 Lambda 项目,然后选择Publish to (发布到 CloudWatch)AmazonLambda. 这将启动部署向导。请注意,许多字段均已设置。这些值来自前文所述的
aws-lambda-tools-defaults.json
文件。 -
输入函数名称。在此示例中,请使用
ImageRekognition
,然后选择 Next (下一步)。 -
在 Advanced Function Details (高级函数详细信息) 页面上,选择一个 IAM 角色,该角色可向您的代码授予访问 S3 和 Rekognition 的权限。为使本文保持简短,请选择 Power User managed policy (高级用户托管策略)。这些工具基于此策略创建角色。
-
最后,将环境变量
MinConfidence
设置为 60,然后选择 Upload (上传)。这会启动部署过程,该过程会构建 Lambda 项目和项目软件包,然后创建 Lambda 函数。发布完成后,函数在中查看Amazon探险者此时将显示窗口。在这里,您可以调用测试函数、查看函数的 CloudWatch Logs 以及配置事件源。
-
使用已部署的函数,您需要将 Amazon S3 配置为向您的新函数发送事件。在 Event Sources (事件源) 选项卡上,选择 Add (添加)。然后,选择要连接到您的 Lambda 函数的 Amazon S3 和存储桶。该存储桶必须位于部署 Lambda 函数的相同区域。
测试 函数。
现在已部署该函数并将 S3 存储桶配置为函数的事件源,请从Amazon探险者对于您选择的存储桶。然后上传一些图像。
上传完成后,您可以通过在函数视图中查看日志来确认您的函数已运行。或者,右键单击存储桶浏览器中的图像,然后选择 Properties (属性)。在 Tags (标签) 选项卡上,您可以查看应用到您的对象的标签。
