Amazon Rekognition Lambda 関数の作成 - Amazon Rekognition

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon Rekognition Lambda 関数の作成

このチュートリアルでは、Java Lambda 関数を使用して、ラベルの検出用にビデオ分析オペレーションの結果を取得する方法を示します。

注記

このチュートリアルでは AWS SDK for Java 1.x. を使用します。Rekognition と AWS SDK for Java バージョン 2 については、「AWSドキュメント SDK の例 GitHub リポジトリ」を参照してください。

Amazon Rekognition Video オペレーションで Lambda 関数を使用できます。たとえば、以下の図に示しているウェブサイトは、Lambda 関数を使用して、Amazon S3 バケットにアップロードされたビデオの分析を自動的に開始します。Lambda 関数がトリガーされると、StartLabelDetection を呼び出して、アップロードされたビデオのラベルの検出を開始します。Lambda を使用して Amazon S3 バケットからのイベント通知を処理する方法については、「Amazon S3 イベント で AWS Lambda の使用」を参照してください。

分析の完了ステータスが登録済み Amazon SNS トピックに送信されると、2 番目の Lambda 関数がトリガーされます。2 番目の Lambda 関数は GetLabelDetection を呼び出して分析結果を取得します。取得した結果はウェブページに表示するためにデータベースに保存されます。この 2 番目のラムダ関数は、このチュートリアルの焦点です。

このチュートリアルでは、Amazon Rekognition Video によってビデオ分析の完了ステータスが登録済み Amazon SNS トピックに送信されると、 Lambda 関数がトリガーされます。この関数は GetLabelDetection を呼び出して、ビデオの分析結果を収集します。デモの目的で、このチュートリアルでは、ラベル検出結果を CloudWatch ログに書き込みます。アプリケーションの Lambda 関数では、後で使用するために分析結果を保存するようにします。たとえば、Amazon DynamoDB を使用して分析結果を保存できます。詳細については、「DynamoDB の使用」を参照してください。

ここでは、以下の手順を示します。

  • Amazon SNS トピックを作成し、アクセス権限を設定する。

  • Lambda 関数を作成し、AWS Management Console を使用し、Amazon 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 トピックと Amazon Rekognition Video にその Amazon SNS トピックへのアクセスを許可する IAM サービスロールを作成します。詳細については、「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. Author from scratch(製作者を最初から) を選択します。

  4. [Function name] に、関数の名前を入力します。

  5. [Runtime] で、[Java 8] を選択します。

  6. [Choose or create an execution role] を選択します。

  7. [Execution role] で、[Create a new role with basic Lambda permissions] を選択します。

  8. [Basic information] セクションの下部に表示される新しいロールの名前をメモします。

  9. [機能の作成]を選択します。

Lambda 関数を設定

Lambda 関数を作成したら、「SNS トピックを作成する」で作成した Amazon SNS トピックによってトリガーされるように、その関数を設定します。また、Lambda 関数のメモリ要件とタイムアウト期間も調整します。

Lambda 関数を設定
  1. [関数コード] に、[com.amazonaws.lambda.demo.JobCompletionHandler] として「ハンドラ」と入力します。

  2. [Basic settings] で、[Edit] を選択します。[Edit basic settings] ダイアログが表示されます。

    1. メモリ1024 を選択します。

    2. [タイムアウト] で、[10 ]秒 を選択します。

    3. [Save (保存)] を選択します。

  3. [Designer] で、[Add trigger] を選択します。[Add trigger] ダイアログが表示されます。

  4. [Trigger configuration] で、[SNS] を選択します。

    SNS トピックで、「SNS トピックを作成する」で作成した Amazon SNS トピックを選択します。

  5. [トリガーの有効化] を選択します。

  6. トリガーを追加するには、[追加] を選択します。

  7. [保存] を選択して、更新された Lambda 関数を保存します。

IAM Lambda ロールを設定する

Amazon Rekognition Video オペレーションを呼び出すには、AmazonRekognitionFullAccess AWS マネージドポリシーを IAM Lambda ロールに追加します。StartLabelDetection などの開始オペレーションでは、Amazon Rekognition Video が Amazon SNS トピックへのアクセスに使用する IAM サービスロールに、ロールの引き渡し権限も必要です。

ロールを設定するには
  1. AWS Management Console にサインインして、https://console.aws.amazon.com/iam/ で IAM コンソールを開きます。

  2. ナビゲーションペインで Roles (ロール) を選択します。

  3. リストで、「Lambda 関数を作成する」で作成した実行ロールの名前を選択します。

  4. [Permissions] (許可) タブを選択します。

  5. [ポリシーのアタッチ] を選択します。

  6. ポリシーのリストから [AmazonRekognitionFullAccess] を選択します。

  7. [ポリシーのアタッチ] を選択します。

  8. 再度、実行ロールを選択します。

  9. [Add inline policy] (インラインポリシーの追加) を選択します。

  10. [JSON] タブを選択します。

  11. 既存のポリシーを以下のポリシーに置き換えます。servicerole を、「SNS トピックを作成する」で作成した IAM サービスロールに置き換えます。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "mysid", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:servicerole" } ] }
  12. [ポリシーの確認] を選択します。

  13. [Name*] (名前*) にポリシーの名前を入力します。

  14. [Create policy] (ポリシーを作成) を選択します。

AWS Toolkit for Eclipse Lambda プロジェクトを作成

Lambda 関数がトリガーされると、以下のコードが Amazon SNS トピックから完了ステータスを取得し、GetLabelDetection を呼び出して分析結果を取得します。検出されたラベルの数と、検出されたラベルのリストが CloudWatch log に書き込まれます。Lambda 関数では、後で使用するためにビデオ分析結果を保存するようにします。

AWS Toolkit for Eclipse Lambda プロジェクト を作成
  1. AWS Toolkit for EclipseAWS Lambda プロジェクトを作成

    • [プロジェクト名:] に、選択したプロジェクトの名前を入力します。

    • [Class Name: (クラス名:) に、「JobCompletionHandler」と入力します。

    • [Input type:] (入力タイプ:) で、[SNS Event] (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; 行の下線部分にマウスを置きます。

    • [Fix project set up...] (プロジェクト設定の修正...) を選択します。

    • 最新バージョンの Amazon Rekognition アーカイブを選択します。

    • [OK] を選択して、アーカイブをプロジェクトに追加します。

  4. ファイルを保存します。

  5. Eclipse コードウィンドウ内で右クリックし、[AWS Lambda] を選択して、[Upload function to AWS Lambda] を選択します。

  6. [Select Target Lambda Function] ページで、使用する AWS リージョンを選択します。

  7. [Choose an existing lambda function] (既存の Lambda 関数の選択) を選択してから、「Lambda 関数を作成する」で作成した Lambda 関数を選択します。

  8. [Next] (次へ) をクリックします。[Function Configuration] ダイアログボックスが表示されます。

  9. [IAM Role] で、「Lambda 関数を作成する」で作成した IAM ロールを選択します。

  10. [完了] を選択すると、Lambda 関数が AWS にアップロードされます。

Lambda 関数をテストする

以下の AWS CLI コマンドを使用して、ビデオ内のラベル検出分析を開始することで Lambda 関数をテストします。分析が終了すると、Lambda 関数がトリガーされます。CloudWatch Logs ログを確認して、分析が成功したことを確認します。

Lambda 関数をテストする
  1. S3 バケットに MOV あるいは MPEG-4 形式のビデオファイルをアップロードします。テストの場合、長さが 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 関数によって作成されたログエントリが表示されます。このオペレーションが成功すると、以下のようになります。

    [Job id] (ジョブ ID) の値は、手順 3 で記録した JobId の値と一致しています。