教程 创建AmazonRekognitionLambda应用程序 - AWS Toolkit for Visual Studio
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

教程 创建AmazonRekognitionLambda应用程序

本教程向您展示如何创建 Lambda 使用AmazonRekognition标签的应用程序 Amazon S3 已检测到标签的对象。

有关设置 AWS Toolkit for Visual Studio,参见 使用AWS工具包的AWSLambda模板可视化工作室.

创建 Visual Studio.NET 内核 Lambda Image Rekognition 项目

  1. 打开VisualStudio和 文件 菜单,选择 项目.

  2. 对于 Visual Studio 2017::

    新项目 对话框,展开 已安装,展开 视觉C#,并选择 AWSLambda.

    对于 Visual Studio 2019::

    新项目 对话框,确保 语言平台,和 项目类型 下拉框设置为“所有...”和类型 AWSLambda搜索 字段。

  3. 选择 带测试的AWSLambda项目(.NET核心-C#) 模板。

  4. 对于 Visual Studio 2017::

    命名“Imagerekognition”项目,输入所需要的 位置等等,然后点击 .

    对于 Visual Studio 2019::

    点击 下一步. 在下一个对话框中,输入“Imagerekognition”(图像显示) 名称,输入所需的 位置等等,然后点击 创建.

  5. 选择蓝图。蓝图提供了可帮助您编写 Lambda 函数的起始代码。在此示例中,选择 检测图像标签 蓝图。

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

    
                  AWS Lambda 项目的蓝图
  6. 选择类型 Lambda 您希望开发的功能,然后选择 完成 创建VisualStudio项目。

在项目完成后,您将获得包含以下两个项目的解决方案:包含要部署到 Lambda 的 Lambda 函数代码的源项目和使用 xUnit 在本地测试函数的测试项目。


            AWS Lambda 项目的蓝图

您可能会注意到首次创建项目时,Visual Studio 不会查找所有 NuGet 引用。发生此行为是因为这些蓝图需要必须从 NuGet 检索的依赖项。创建新项目后,Visual Studio 仅在本地引用中提取,而非从 NuGet 远程引用。您可以通过右键单击您的参考并选择 恢复包裹.

检查文件

  1. 打开 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 服务客户端,并通过您在部署时分配给该函数的 IAM 角色获取这些客户端的 AWS 凭证。这些客户端的 AWS 区域已设置为运行您的 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...您可以这样做,因为已注册的LambdaJSON串行器。 包含在 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.

  2. 打开蓝图创建的 aws-lambda-tools-defaults.json 文件。此文件包含蓝图设置用于帮助预填充部署向导中的某些字段的默认值。它也有助于通过我们与 .NET 内核 CLI 的集成设置命令行选项。要使用,请导航至函数的项目目录和类型 DotNetLambda帮助.

其中的重要字段为函数处理程序。这可向 Lambda 指明代码中为了响应我们调用的函数而调用的方法。此字段的格式为 <assembly-name>::<full-type-name>::<method-name>...确保将namespace添加到类型名称中。

部署函数

  1. 右键单击Lambda项目,然后选择 发布至AWSLambda. 这将启动部署向导。请注意,许多字段均已设置。这些值来自前文所述的 aws-lambda-tools-defaults.json 文件。

  2. 输入函数名称。对于此示例,请使用 ImageRekognition,然后选择 下一步.

  3. 高级功能详情 页面,选择iam角色,允许您的代码访问S3和Rekognition。要保留此帖子,请选择 权力用户管理策略. 这些工具基于此策略创建角色。

  4. 最后,设置环境变量 MinConfidence 然后选择 上传.

    这会启动部署过程,该过程会构建 Lambda 项目和项目软件包,然后创建 Lambda 函数。出版完成后, 功能AWS探险器 窗口显示。在这里,您可以调用测试函数、查看函数的 CloudWatch Logs 以及配置事件源。

  5. 对于已部署的函数,您需要将 Amazon S3 配置为向您的新函数发送事件。在 事件来源 选项卡,选择 添加. 然后,选择要连接到您的 Lambda 函数的 Amazon S3 和存储桶。该存储桶必须位于部署 Lambda 函数的相同区域。

测试函数。

现在已部署该功能,并且将S3存储区配置为其事件源,请打开S3Bucket浏览器来从 AWS探险器 对于您选择的桶。然后上传一些图像。

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