

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

# Amazon Rekognition Lambda 関数の作成
<a name="stored-video-lambda"></a>

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

**注記**  
このチュートリアルでは、 AWS SDK for Java 1.x を使用します。Rekognition と AWS SDK for Java バージョン 2 を使用するチュートリアルについては、[AWS 「Documentation SDK examples GitHub repository](https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javav2/usecases/video_analyzer_application)」を参照してください。

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

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

![Amazon Rekognition Video のビデオ処理ワークフローを示す図。ビデオのアップロードから Amazon DynamoDB への結果の保存、ウェブサイトへの表示までの流れを表している。](http://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/images/VideoRekognitionLambda.png)


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

ここでは、以下の手順を示します。
+ Amazon SNS トピックを作成し、アクセス権限を設定する。
+ を使用して Lambda 関数を作成し AWS マネジメントコンソール 、Amazon SNS トピックにサブスクライブします。
+  AWS マネジメントコンソールを使用して Lambda 関数を設定します。
+ サンプルコードを AWS Toolkit for Eclipse プロジェクトに追加し、Lambda 関数にアップロードします。
+  AWS CLIを使用して Lambda 関数をテストする。

**注記**  
チュートリアル全体で同じ AWS リージョンを使用します。

## 前提条件
<a name="lambda-stored-video-prerequisites"></a>

このチュートリアルでは、 AWS Toolkit for Eclipseに精通していることを前提としています。詳細については、「[AWS Toolkit for Eclipse](https://docs.aws.amazon.com/toolkit-for-eclipse/v1/user-guide/welcome.html)」を参照してください。

## SNS トピックを作成する
<a name="lambda-create-sns-topic"></a>

Amazon Rekognition Video ビデオ分析オペレーションの完了ステータスは、Amazon SNS トピックに送信されます。この手順では、Amazon SNS トピックと Amazon Rekognition Video にその Amazon SNS トピックへのアクセスを許可する IAM サービスロールを作成します。詳細については、「[Amazon Rekognition Video オペレーションを呼び出す](api-video.md)」を参照してください。

**Amazon SNS トピックを作成するには**

1. まだ作成していない場合は、IAM サービスロールを作成して、Amazon Rekognition Video に Amazon SNS トピックへのアクセスを許可します。Amazon リソースネーム (ARN) を記録しておきます。詳細については、「[複数の Amazon SNS トピックへのアクセスを許可する](api-video-roles.md#api-video-roles-all-topics)」を参照してください。

1. [Amazon SNS コンソール](https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html) を使用して [Amazon SNS トピック](https://console.aws.amazon.com/sns/v2/home) を作成する。トピック名を指定するだけで済みます。トピック名の先頭に *AmazonRekognition* を追加します。トピックの ARN を書き留めておきます。

## Lambda 関数を作成する
<a name="lambda-create-function"></a>

 AWS マネジメントコンソールを使用して Lambda 関数を作成できます。次に、 AWS Toolkit for Eclipse プロジェクトを使用して、Lambda 関数パッケージを AWS Lambdaにアップロードします。 AWS Toolkit for Eclipseを使用して Lambda 関数を作成することもできます。詳細については、「[チュートリアル: AWS Lambda 関数の作成、アップロード、呼び出し方法](https://docs.aws.amazon.com/toolkit-for-eclipse/v1/user-guide/lambda-tutorial.html)」を参照してください。

**Lambda 関数を作成するには**

1. AWS マネジメントコンソールにサインインして AWS Lambda コンソールを [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) で開きます。

1. [**関数を作成**] を選択します。

1. **[一から作成]** を選択します。

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

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

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

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

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

1. [**関数を作成**] を選択します。

## Lambda 関数を設定
<a name="lambda-configure-function"></a>

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

**Lambda 関数を設定**

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

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

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

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

   1. **[保存]** を選択します。

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

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

   **SNS トピック**で、「[SNS トピックを作成する](#lambda-create-sns-topic)」で作成した Amazon SNS トピックを選択します。

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

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

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

## IAM Lambda ロールを設定する
<a name="configure-lambda-role"></a>

Amazon Rekognition Video オペレーションを呼び出すには、*AmazonRekognitionFullAccess* AWS マネージドポリシーを IAM Lambda ロールに追加します。[StartLabelDetection](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_StartLabelDetection.html) などの開始オペレーションでは、Amazon Rekognition Video が Amazon SNS トピックへのアクセスに使用する IAM サービスロールに、ロールの引き渡し権限も必要です。

**ロールを設定するには**

1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) で IAM コンソールを開きます。

1. ナビゲーションペインで **Roles (ロール) ** を選択してください。

1. リストで、「[Lambda 関数を作成する](#lambda-create-function)」で作成した実行ロールの名前を選択します。

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

1. **ポリシーのアタッチ** を選択します。

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

1. **[Attach policy]** (ポリシーのアタッチ) を選択します。

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

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

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

1. 既存のポリシーを以下のポリシーに置き換えます。`servicerole` を、「[SNS トピックを作成する](#lambda-create-sns-topic)」で作成した IAM サービスロールに置き換えます。

1. **[ポリシーの確認]** を選択します。

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

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

## AWS Toolkit for Eclipse Lambda プロジェクトを作成する
<a name="lambda-create-code"></a>

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

**AWS Toolkit for Eclipse Lambda プロジェクトを作成するには**

1. [AWS Toolkit for EclipseAWS Lambda プロジェクトを作成します](https://docs.aws.amazon.com/toolkit-for-eclipse/v1/user-guide/lambda-tutorial.html#lambda-tutorial-create-handler-class)。
   + [**プロジェクト名:**] に、選択したプロジェクトの名前を入力します。
   + [**Class Name:** (クラス名:) に、「*JobCompletionHandler*」と入力します。
   + [**Input type:**] (入力タイプ:) で、[**SNS Event**] (SNS イベント) を選択します。
   + 他のフィールドはそのままにしておきます。

1. [**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);
   
      }
   
   
   }
   ```

1. Rekognition 名前空間は解決されません。この問題を修正するには:
   + `import com.amazonaws.services.rekognition.AmazonRekognition;` 行の下線部分にマウスを置きます。
   + [**Fix project set up...**] (プロジェクト設定の修正...) を選択します。
   + 最新バージョンの Amazon Rekognition アーカイブを選択します。
   + [**OK**] を選択して、アーカイブをプロジェクトに追加します。

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

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

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

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

1. [**次へ**] を選択します。[**Function Configuration**] ダイアログボックスが表示されます。

1. [**IAM Role**] で、「[Lambda 関数を作成する](#lambda-create-function)」で作成した IAM ロールを選択します。

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

## Lambda 関数をテストする
<a name="lambda-test-function"></a>

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

**Lambda 関数をテストする**

1. S3 バケットに MOV あるいは MPEG-4 形式のビデオファイルをアップロードします。テストの場合、長さが 30 秒以内のビデオをアップロードしてください。

   手順については、[*Amazon Simple Storage Service ユーザーガイド*] の [[Amazon S3 へのオブジェクトのアップロード](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UploadingObjectsintoAmazonS3.html)] を参照してください。

1. 次の AWS CLI コマンドを実行して、ビデオ内のラベルの検出を開始します。

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

   以下の値を更新します。
   + `bucketname` と `videofile` を、Amazon S3 バケットの名前と、ラベルを検出する対象のビデオの名前に変更します。
   + `TopicARN` を、「[SNS トピックを作成する](#lambda-create-sns-topic)」で作成した Amazon SNS トピックの ARN に変更します。
   + `RoleARN` を、「[SNS トピックを作成する](#lambda-create-sns-topic)」で作成した IAM ロールの ARN に変更します。
   + を、使用している AWS リージョン`Region`に変更します。 ``

1. 応答内の `JobId` の値に注意してください。この応答は次の JSON の例のようになります。

   ```
   {
       "JobId": "547089ce5b9a8a0e7831afa655f42e5d7b5c838553f1a584bf350ennnnnnnnnn"
   }
   ```

1.  コンソール [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) を開きます。

1. 分析が完了すると、Lambda 関数のログエントリが [**ロググループ**]に表示されます。

1. Lambda 関数を選択すると、ログストリームが表示されます。

1. 最新のログストリームを選択すると、Lambda 関数によって作成されたログエントリが表示されます。オペレーションが成功した場合、出力は以下のようになります。ジョブ ID、オペレーションタイプ「StartLabelDetection」、検出されたラベルのカテゴリ (「Bottle」、「Clothing」、「Crowd」、「Food」など) のリストといった、ビデオ認識オペレーションの詳細が示されています。  
![ビデオ認識オペレーションの詳細を示すログ出力。](http://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/images/log.png)

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