创建 Amazon Rekognition Lambda 函数 - Amazon Rekognition

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

创建 Amazon Rekognition Lambda 函数

本教程介绍如何使用 Java Lambda 函数获取标签检测的视频分析操作的结果。

您可以将 Lambda 函数与 Amazon Rekognition Video 操作一起使用。例如,下图显示了一个网站,该网站在视频上传到 Amazon S3 存储桶时使用 Lambda 函数自动开始分析视频。触发 Lambda 函数时,它会调用StartLabelDetection以开始检测上传的视频中的标签。有关使用 Lambda 处理来自 Amazon S3 存储桶的事件通知的信息,请参阅将 AWS Lambda 与 Amazon S3 事件结合使用

另一个 Lambda 函数在分析完成状态发送到已注册的 Amazon SNS 主题时触发。第二个 Lambda 函数调用GetLabelDetection以获取分析结果。结果随后被存储在数据库中以做好在网页上显示的准备。此第二个 lambda 函数是本教程的重点。

该图显示 Amazon Rekognition Video 的视频处理工作流,即从上传视频到将结果存储在 Amazon DynamoDB 中以显示在网站上。

在本教程中,Lambda 函数在 Amazon Rekognition Video 将视频分析的完成状态发送到已注册的 Amazon SNS 主题时触发。它随后通过调用 GetLabelDetection 来收集视频分析结果。出于演示目的,本教程将标签检测结果写入 CloudWatch 日志。在您的应用程序的 Lambda 函数中,您应该存储分析结果以供稍后使用。例如,您可以使用 Amazon DynamoDB 来保存分析结果。有关更多信息,请参阅使用 DynamoDB

以下步骤将说明如何:

  • 创建 Amazon SNS 主题并设置权限。

  • 使用创建 Lambda 函数 AWS Management Console 并将其订阅亚马逊 SNS 主题。

  • 使用 AWS Management Console配置 Lambda 函数。

  • 向 AWS Toolkit for Eclipse 项目添加示例代码并将其上传到 Lambda 函数。

  • 使用 AWS CLI测试 Lambda 函数。

注意

在整个教程中使用相同的 AWS 区域。

先决条件

本教程假定您熟悉 AWS Toolkit for Eclipse。有关更多信息,请参阅 AWS Toolkit for Eclipse

创建 SNS 主题

Amazon Rekognition Video 视频分析操作的完成状态将发送到 Amazon SNS 主题。此过程将创建 Amazon SNS 主题和 IAM 服务角色(向 Amazon Rekognition Video 授予对您的 Amazon SNS 主题的访问权限)。有关更多信息,请参阅 调用 Amazon Rekognition Video 操作

创建 Amazon SNS 主题
  1. 如果您尚未创建 IAM 服务角色,请创建一个该角色来为 Amazon Rekognition Video 提供对 Amazon SNS 主题的访问权限。记下 Amazon 资源名称(ARN)。有关更多信息,请参阅 提供对多个 Amazon SNS 主题的访问权限

  2. 使用 Amazon SNS 控制台创建 Amazon SNS 主题。您只需要指定主题名称即可。在主题名称前面加上。AmazonRekognition记录主题 ARN。

创建 Lambda 函数

您可使用 AWS Management Console创建 Lambda 函数。然后使用 AWS Toolkit for Eclipse 项目将 Lambda 函数程序包上传到 AWS Lambda。也可以使用 AWS Toolkit for Eclipse创建 Lambda 函数。有关更多信息,请参阅教程:如何创建、上传和调用 AWS Lambda 函数

创建 Lambda 函数
  1. 登录 AWS 管理控制台,然后在上打开 AWS Lambda 控制台。https://console.aws.amazon.com/lambda/

  2. 选择创建函数

  3. 选择从头开始创作

  4. 对于函数名称,键入函数的名称。

  5. 运行时系统中,选择 Java 8

  6. 选择选择或创建执行角色

  7. 执行角色中,选择创建具有基本 Lambda 权限的新角色

  8. 记下基本信息部分底部显示的新角色的名称。

  9. 选择创建函数

配置 Lambda 函数

在创建 Lambda 函数后,您可以将其配置为由您在 创建 SNS 主题 中创建的 Amazon SNS 主题触发。您还可以调整 Lambda 函数的内存要求和超时期限。

配置 Lambda 函数
  1. 函数代码中,为处理程序键入 com.amazonaws.lambda.demo.JobCompletionHandler

  2. 基本设置中,选择编辑。此时将显示编辑基本设置对话框。

    1. 内存选择 1024

    2. 对于超时,选择 10 秒。

    3. 选择保存

  3. 设计器中,选择 + 添加触发器。此时将显示“添加触发器”对话框。

  4. 触发器配置中,选择 SNS

    SNS 主题中,选择您在 创建 SNS 主题 中创建的 Amazon SNS 主题。

  5. 选择启用触发器

  6. 要添加触发器,请选择添加

  7. 选择保存以保存 Lambda 函数。

配置 IAM Lambda 角色

要调用 Amazon Rekognition Video 操作,您需要将 AmazonRekognitionFullAccessAWS 托管策略添加到 IAM Lambda 角色中。启动操作(例如 StartLabelDetection)还需要 Amazon Rekognition Video 用于访问亚马逊 SNS 主题的 IAM 服务角色的传递角色权限。

配置角色
  1. 登录 AWS Management Console 并打开 IAM 控制台,网址为https://console.aws.amazon.com/iam/

  2. 在导航窗格中,选择角色

  3. 在列表中,选择您在 创建 Lambda 函数中创建的执行角色的名称。

  4. 选择 Permissions(权限)选项卡。

  5. 选择附加策略

  6. AmazonRekognitionFullAccess从策略列表中选择。

  7. 选择附加策略

  8. 再次选择此执行角色。

  9. 选择添加内联策略

  10. 选择 JSON 选项卡。

  11. 将现有策略替换为以下策略。将 servicerole 替换为您在 创建 SNS 主题 中创建的 IAM 服务角色。

  12. 选择查看策略

  13. 名称* 中键入策略的名称。

  14. 选择创建策略

创建 AWS Toolkit for Eclipse Lambda 项目

触发 Lambda 函数时,以下代码会从 Amazon SNS 主题中获取完成状态,并GetLabelDetection调用以获取分析结果。将检测到的标签计数和检测到的标签列表写入 CloudWatch 日志。您的 Lambda 函数应该存储视频分析结果以供稍后使用。

创建 AWS Toolkit for Eclipse Lambda 项目
  1. 创建一个 AWS Toolkit for EclipseAWS Lambda 项目

    • 对于项目名称:,键入您选择的项目名称。

    • 在 “类名:” 中,输入JobCompletionHandler

    • 对于输入类型:,选择 SNS 事件

    • 使其他字段保持不变。

  2. Eclipse 项目资源管理器中,打开生成的 Lambda 处理程序方法 (JobCompletionHandler.java),然后将内容替换为以下内容:

    //Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. //PDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-rekognition-developer-guide/blob/master/LICENSE-SAMPLECODE.) package com.amazonaws.lambda.demo; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.SNSEvent; import java.util.List; import com.amazonaws.regions.Regions; import com.amazonaws.services.rekognition.AmazonRekognition; import com.amazonaws.services.rekognition.AmazonRekognitionClientBuilder; import com.amazonaws.services.rekognition.model.GetLabelDetectionRequest; import com.amazonaws.services.rekognition.model.GetLabelDetectionResult; import com.amazonaws.services.rekognition.model.LabelDetection; import com.amazonaws.services.rekognition.model.LabelDetectionSortBy; import com.amazonaws.services.rekognition.model.VideoMetadata; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; public class JobCompletionHandler implements RequestHandler<SNSEvent, String> { @Override public String handleRequest(SNSEvent event, Context context) { String message = event.getRecords().get(0).getSNS().getMessage(); LambdaLogger logger = context.getLogger(); // Parse SNS event for analysis results. Log results try { ObjectMapper operationResultMapper = new ObjectMapper(); JsonNode jsonResultTree = operationResultMapper.readTree(message); logger.log("Rekognition Video Operation:========================="); logger.log("Job id: " + jsonResultTree.get("JobId")); logger.log("Status : " + jsonResultTree.get("Status")); logger.log("Job tag : " + jsonResultTree.get("JobTag")); logger.log("Operation : " + jsonResultTree.get("API")); if (jsonResultTree.get("API").asText().equals("StartLabelDetection")) { if (jsonResultTree.get("Status").asText().equals("SUCCEEDED")){ GetResultsLabels(jsonResultTree.get("JobId").asText(), context); } else{ String errorMessage = "Video analysis failed for job " + jsonResultTree.get("JobId") + "State " + jsonResultTree.get("Status"); throw new Exception(errorMessage); } } else logger.log("Operation not StartLabelDetection"); } catch (Exception e) { logger.log("Error: " + e.getMessage()); throw new RuntimeException (e); } return message; } void GetResultsLabels(String startJobId, Context context) throws Exception { LambdaLogger logger = context.getLogger(); AmazonRekognition rek = AmazonRekognitionClientBuilder.standard().withRegion(Regions.US_EAST_1).build(); int maxResults = 1000; String paginationToken = null; GetLabelDetectionResult labelDetectionResult = null; String labels = ""; Integer labelsCount = 0; String label = ""; String currentLabel = ""; //Get label detection results and log them. do { GetLabelDetectionRequest labelDetectionRequest = new GetLabelDetectionRequest().withJobId(startJobId) .withSortBy(LabelDetectionSortBy.NAME).withMaxResults(maxResults).withNextToken(paginationToken); labelDetectionResult = rek.getLabelDetection(labelDetectionRequest); paginationToken = labelDetectionResult.getNextToken(); VideoMetadata videoMetaData = labelDetectionResult.getVideoMetadata(); // Add labels to log List<LabelDetection> detectedLabels = labelDetectionResult.getLabels(); for (LabelDetection detectedLabel : detectedLabels) { label = detectedLabel.getLabel().getName(); if (label.equals(currentLabel)) { continue; } labels = labels + label + " / "; currentLabel = label; labelsCount++; } } while (labelDetectionResult != null && labelDetectionResult.getNextToken() != null); logger.log("Total number of labels : " + labelsCount); logger.log("labels : " + labels); } }
  3. Rekognition 命名空间未被解析。纠正方法:

    • 将鼠标指针停留在行 import com.amazonaws.services.rekognition.AmazonRekognition; 的带下划线的部分。

    • 选择修复项目设置...

    • 选择最新版本的 Amazon Rekognition 存档。

    • 选择确定以将存档保存到项目。

  4. 保存该文件。

  5. 在 Eclipse 代码窗口中右键单击,选择 AWS Lambda,然后选择将函数上传到 AWS Lambda

  6. 选择目标 Lambda 函数页面上,选择要使用的 AWS 区域。

  7. 选择选择现有 Lambda 函数,然后选择您在 创建 Lambda 函数 中创建的 Lambda 函数。

  8. 选择下一步。此时将显示函数配置对话框。

  9. IAM 角色中,选择您在 创建 Lambda 函数 中创建的 IAM 角色。

  10. 选择完成,Lambda 函数将上传到 AWS。

测试 Lambda 函数

使用以下 AWS CLI 命令通过启动视频的标签检测分析来测试 Lambda 函数。分析完成后,将触发 Lambda 函数。通过检查 CloudWatch 日志来确认分析成功。

测试 Lambda 函数
  1. 将 MOV 或 MPEG-4 格式的视频文件上传到您的 S3 存储桶。对于测试,请上传时长不超过 30 秒的视频。

    有关说明,请参阅《Amazon Simple Storage Service 用户指南》中的将对象上传到 Amazon S3

  2. 运行以下 AWS CLI 命令开始检测视频中的标签。

    aws rekognition start-label-detection --video "S3Object={Bucket="bucketname",Name="videofile"}" \ --notification-channel "SNSTopicArn=TopicARN,RoleArn=RoleARN" \ --region Region

    更新以下值:

    • bucketnamevideofile 更改为您要在其中检测标签的视频的 Amazon S3 存储桶名称和文件名。

    • TopicARN 更改为您在 创建 SNS 主题 中创建的 Amazon SNS 主题的 ARN。

    • RoleARN 更改为您在 创建 SNS 主题 中创建的 IAM 角色的 ARN。

    • 切换Region到您正在使用的 AWS 区域。

  3. 记下响应中 JobId 的值。该响应看上去与以下 JSON 示例类似。

    { "JobId": "547089ce5b9a8a0e7831afa655f42e5d7b5c838553f1a584bf350ennnnnnnnnn" }
  4. 打开 https://console.aws.amazon.com/cloudwatch/ 控制台

  5. 当分析完成时,Lambda 函数的日志条目将显示在日志组中。

  6. 选择 Lambda 函数以查看日志流。

  7. 选择最新日志流以查看由 Lambda 函数制作的日志条目。如果操作成功,则显示类似于以下输出,其中显示了视频识别操作的详细信息,包括作业 ID、操作类型 StartLabelDetection “” 以及检测到的标签类别列表,例如瓶子、服装、人群和食物:

    日志输出显示视频识别操作详细信息。

    任务 ID 的值应与您在步骤 3 中记下的 JobId 的值匹配。