AWS에서 서버리스 동영상 분석(Amazon Rekognition)

안녕하세요.
일상 업무에서는 인프라 엔지니어를 하고 있습니다. @ 하야오사토 입니다.

최근에는 동영상 해석 등의 기술도 유행하고 있고 그 SaaS도 제공되고 있군요.
AWS는 Amazon Rekognition(이하 Rekognition)이라는 서비스를 제공합니다.
이 기사에서는이 Rekognition을 사용하기위한 서버리스 아키텍처를 구축하고 싶습니다.

구성



구성도는 다음과 같습니다.

Rekognition으로 동영상 해석을 실시하면, 동영상의 길이에 의합니다만 해석 시간이 걸려 버립니다.
Rekognition은 분석 시간이 완료되었음을 Amazon SNS(이하 SNS) 주제를 게시하여 알려줍니다.
이번에는 S3에 동영상이 업로드된 것을 트리거로 AWS Lambda(이하, Lambda)에서 Rekogniton의 동영상 해석 개시
Rekognition의 동영상 분석 완료 후 SNS 주제에서 Lambda를 호출하고 Lambda에서 Rekogniton의 분석 결과를 얻습니다.
라는 아키텍처를 만들어 보겠습니다.

S3 -> 람다



Lambda 함수를 만들고 트리거를 설정합니다.
이 때 주의해야 할 동영상은 파일 크기가 커지기 쉽기 때문에,
멀티 파트 업로드 완료시 제대로 트리거가 날 수 있도록 해 둡시다.

Lambda -> Rekognition -> SNS



Rekognition에서 분석을 시작하는 Lambda 함수를 만듭니다.
언어는 파이썬으로 만들었습니다. 문서는 여기 .
이번에는 얼굴 인식을 사용해보기로 했으므로 start_face_detection 를 사용합니다.
response = client.start_face_detection(
    Video={
        'S3Object': {
            'Bucket': 'your-bucket-name',
            'Name': 'your-video-name'
        }
    },
    ClientRequestToken='string',
    NotificationChannel={
        'SNSTopicArn': 'your-sns-topic-arn',
        'RoleArn': 'your-role-arn-for-rekognition'
    }
)

여기서 NotificationChannel 에 SNS와 ROLE의 ARN을 지정하고 있습니다.SNSTopicArn 는 그대로 Rekognition 가 해석 완료했을 때에 통지를 날리기 위한 SNS 주제의 ARN 입니다.RoleArn는 Rekognition이 SNS 주제를 날리는 역할을 제공해야합니다.

SNS -> Lambda -> Rekognition



Rekognition에서 발행한 SNS 주제에서 Lambda가 호출되도록 구독을 만들면,
마지막으로 Lambda에서 Rekognition으로 동영상 분석 결과를 얻습니다.

Lambda에 도착하는 이벤트의 'Sns'키의 Value는 다음과 같습니다.

event['Records'][0]['Sns'].py
{
    'Type': 'Notification',
    'MessageId': 'xxxxxxxx',
    'TopicArn': 'arn:aws:sns:your-region:your-account-id:your-topic-arn',
    'Subject': None,
    'Message': '{"JobId":"xxxxxxxxxx","Status":"SUCCEEDED","API":"APINAME","Timestamp":1571799891913,"Video":{"S3ObjectName":"your-video.mp4","S3Bucket":"your-video-bucket"}}',
    'Timestamp': '2019-10-23T03:04:52.660Z',
    'SignatureVersion': '1',
    'Signature': 'xxxxxxxxx'
    'SigningCertUrl': 'https://sns.ap-northeast-1.amazonaws.com/SimpleNotificationService-xxxx.pem',
    'UnsubscribeUrl': 'https://sns.ap-northeast-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:xxxxxx',
    'MessageAttributes': {}
}

이런 식으로 Message를 검색하여 Rekognition에서 결과를 추출하는 정보를 갖습니다.
Message에서 JobId를 꺼내고,

(NextToken은 생략되었습니다.)
response = client.get_face_detection(
    JobId='xxxxxx'
)

Rekognition에서 분석 결과의 JSON을 받을 수 있습니다.

요약



이런 식으로 Rekognition을 사용하여 서버리스 아키텍처를 만들려고했습니다.
서버리스 이벤트 드리븐은 역시 좋다.
코드는 여기

좋은 웹페이지 즐겨찾기