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 함수를 사용할 수 있습니다. 예를 들어 다음 다이어그램은 Amazon S3 버킷에 업로드되면 Lambda 함수를 사용하여 비디오 분석을 자동으로 시작하는 웹사이트를 보여줍니다. Lambda 함수는 트리거되면 StartLabelDetection을 직접 호출하여 업로드된 비디오에서 레이블 감지를 시작합니다. Lambda를 사용하여 Amazon S3 버킷의 이벤트 알림을 처리하는 방법에 대한 자세한 내용은 Amazon S3 이벤트에서 AWS Lambda 사용을 참조하세요.

두 번째 Lambda 함수는 분석 완료 상태가 등록된 Amazon SNS 주제에 전송되면 트리거됩니다. 두 번째 Lambda 함수는 GetLabelDetection을 직접 호출하여 분석 결과를 가져옵니다. 그러면 결과가 데이터베이스에 저장되어 웹 사이트에 표시될 준비가 됩니다. 이 두 번째 Lambda 함수가 이 자습서의 초점입니다.

이 자습서에서는 Amazon Rekognition Video가 등록된 Amazon SNS 주제로 비디오 분석의 완료 상태를 보내면 Lambda 함수가 트리거됩니다. 그런 다음 GetLabelDetection을 직접 호출하여 비디오 분석 결과를 수집합니다. 설명을 위해 이 자습서에서는 레이블 감지 결과를 CloudWatch 로그에 기록합니다. 애플리케이션의 Lambda 함수에서 나중에 사용할 수 있도록 분석 결과를 저장해야 합니다. 예를 들어 Amazon DynamoDB를 사용하여 분석 결과를 저장할 수 있습니다. 자세한 내용은 DynamoDB 사용 단원을 참조하십시오.

다음 절차에서는 이 방법을 보여 줍니다.

  • Amazon SNS 주제를 만들고 권한을 설정합니다.

  • AWS Management Console을 사용하여 Lambda 함수를 만들고 해당 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. 아직 생성하지 않았다면 Amazon Rekognition Video에 Amazon SNS 주제에 대한 액세스 권한을 부여할 IAM 서비스 역할을 생성합니다. Amazon 리소스 이름(ARN)을 적어 둡니다. 자세한 내용은 여러 Amazon SNS 주제에 대한 액세스 권한 부여 섹션을 참조하세요.

  2. Amazon SNS 콘솔을 사용하여 Amazon SNS 주제를 생성합니다. 주제 이름만 지정하면 됩니다. 주제 이름에 AmazonRekognition을 추가합니다. 주제 ARN을 기록합니다.

Lambda 함수 생성

AWS Management Console을 사용하여 Lambda 함수를 생성합니다. 그런 다음 AWS Toolkit for Eclipse 프로젝트를 사용하여 AWS Lambda에 Lambda 함수 패키지를 업로드합니다. AWS Toolkit for Eclipse로 Lambda 함수를 생성할 수도 있습니다. 자세한 내용은 자습서: AWS Lambda 함수 생성, 업로드 및 호출 방법 단원을 참조하십시오.

Lambda 함수를 생성하려면
  1. AWS Management Console에 로그인하여 https://console.aws.amazon.com/lambda/에서 AWS Lambda 콘솔을 엽니다.

  2. 함수 생성을 선택합니다.

  3. 새로 작성을 선택합니다.

  4. 함수 이름에 함수의 이름을 입력합니다.

  5. 런타임에서 Java 8을 선택합니다.

  6. Choose or create an execution role(실행 역할 선택 또는 생성)을 선택합니다.

  7. Execution role(실행 역할)에서 Create a new role with basic Lambda permissions(기본 Lambda 권한을 가진 새 역할 생성)를 선택합니다.

  8. 기본 정보 섹션의 맨 아래에 표시되는 새 역할의 이름을 확인합니다.

  9. 함수 생성(Create function)을 선택합니다.

Lambda 함수 구성

Lambda 함수를 생성한 후 SNS 주제 생성에서 생성하는 Amazon SNS 주제에 의해 트리거되도록 구성합니다. Lambda 함수의 메모리 요구 사항 및 제한 시간도 조정합니다.

Lambda 함수를 구성하려면
  1. 함수 코드핸들러com.amazonaws.lambda.demo.JobCompletionHandler를 입력합니다.

  2. Basic settings(기본 설정)에서 편집을 선택합니다. Edit basic settings(기본 설정 편집) 대화 상자가 표시됩니다.

    1. 메모리1024를 선택합니다.

    2. 제한 시간으로 10초를 선택합니다.

    3. Save를 선택합니다.

  3. Designer에서 +트리거 추가를 선택합니다. 트리거 추가 대화 상자가 표시됩니다.

  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. 정책 연결(Attach policies)을 선택합니다.

  6. 정책 목록에서 AmazonRekognitionFullAccess를 선택합니다.

  7. 정책 연결(Attach policies)을 선택합니다.

  8. 실행 역할을 다시 선택합니다.

  9. 인라인 정책 추가(Add inline policy)를 선택합니다.

  10. JSON 탭을 선택합니다.

  11. 기존 정책을 다음 정책으로 바꿉니다. serviceroleSNS 주제 생성에서 생성한 IAM 서비스 역할로 바꿉니다.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "mysid", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:servicerole" } ] }
  12. Review policy(정책 검토)를 선택합니다.

  13. 이름*에 정책 이름을 입력합니다.

  14. [정책 생성(Create policy)]을 선택합니다.

AWS Toolkit for Eclipse Lambda 프로젝트 생성

Lambda 함수가 트리거되면 다음 코드가 Amazon SNS 주제에서 완료 상태를 가져오고 GetLabelDetection을 직접 호출하여 분석 결과를 가져옵니다. 감지된 레이블 수와 감지된 레이블 목록이 CloudWatch 로그에 기록됩니다. Lambda 함수는 나중에 사용할 수 있도록 비디오 분석 결과를 저장해야 합니다.

AWS Toolkit for Eclipse Lambda 프로젝트를 생성하려면
  1. AWS Toolkit for EclipseAWS Lambda 프로젝트를 생성합니다.

    • 프로젝트 이름:에 선택한 프로젝트 이름을 입력합니다.

    • Class Name(클래스 이름):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; 행의 밑줄이 표시된 부분 위에서 마우스를 멈춥니다.

    • Fix project set up...(프로젝트 설정 수정...)을 선택합니다.

    • Amazon Rekognition 아카이브의 최신 버전을 선택합니다.

    • 확인을 선택하여 프로젝트에 아카이브를 추가합니다.

  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(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 버킷 이름과 레이블을 감지하려는 비디오의 파일 이름으로 변경합니다.

    • TopicARNSNS 주제 생성에서 생성한 Amazon SNS 주제의 ARN으로 바꿉니다.

    • RoleARNSNS 주제 생성에서 생성한 IAM 역할의 ARN으로 바꿉니다.

    • Region을 사용 중인 AWS 리전으로 변경합니다.

  3. 응답의 JobId 값을 기록합니다. 이 응답은 다음 JSON 예제와 비슷해 보입니다.

    { "JobId": "547089ce5b9a8a0e7831afa655f42e5d7b5c838553f1a584bf350ennnnnnnnnn" }
  4. https://console.aws.amazon.com/cloudwatch/ 콘솔을 엽니다.

  5. 분석이 완료되면 Lambda 함수의 로그 항목이 로그 그룹에 표시됩니다.

  6. Lambda 함수를 선택하여 로그 스트림을 봅니다.

  7. 최신 로그 스트림을 선택하여 Lambda 함수가 만든 로그 항목을 봅니다. 작업이 성공하면 다음과 같이 나타납니다.

    작업 id 값은 3단계에서 기록해 둔 JobId의 값과 일치해야 합니다.