AWS Lambda OpenCV 라이브러리 빌드 video processing 오늘은 비디오 프로세싱을 위해 Lambda와 S3를 이용한 프로젝트를 진행해보겠습니다. S3에 비디오를 올리면 다른 버킷(bucket)에 Video processing의 결과의 이미지들이 저장됩니다. Lambda에는 open-cv 라이브러리를 빌드해 처리할 것입니다. https://opencv-python.readthedocs.io/en/latest/doc/02.videoStart/videoStart.html 자세한 이전 과정은 다음의 글을 확인해주세요. AWS Lambda Python 라이브러리 numpy 배포 패키지 만들기 matmul 실행 AWS Lambda PIL 라이브러리 빌드 image data augmentation 처음해야 할 작업은 Lambda 함수를 생성하는 일입니다. video_processing 함수명으로 작성하고, Python 2.7 버전을 선택합니다. role도 설정해야 하는데 Lambda, S3에 Full Access를 주셔도 무방합니다. 생성된 ARN 주소를 기억해주세요. AWS EC2에서 빌드할 때 update-code를 실행하기 위해 Function ARN이 필요합니다. 충분한 메모리 설정이 필요합니다! 메모리와 TimeOut을 설정해주세요. 다음은 이미지를 업로드할 버킷과 데이터 확대를 하고 나서 저장될 버킷 2개를 생성해야 합니다. 웹사이트에서 사용자에 의해 업로드되거나 테스트할 이미지를 업로드할 버킷은 video-pre-store 이라고 하겠습니다. 비디오 프로세싱(processing)으로 생성된 결과 이미지를 저장할 버킷은 result-video-processing 이라고 하겠습니다. https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/current-supported-versions.html Lambda 전용 AMI 이미지를 선택하고 인스턴스를 시작합니다. 저는 t2.medium을 사용하였습니다. 자동화 스크립트 다음과 같습니다. #!/bin/bash 우선 설치해야 할 것은 다음의 패키지입니다. $ sudo yum -y upgrade $ sudo yum -y groupinstall "Development Tools" pip install을 진행할 가상 환경을 생성합니다. $ virtualenv --python=python2.7 opencv $ source ~/opencv/bin/activate $ pip install opencv-python $ cd opencv/lib64/python2.7/dist-packages/ $ ls numpy도 자동으로 설치된 모습이 보입니다. https://opencv-python.readthedocs.io/en/latest/doc/02.videoStart/videoStart.html 코드는 GitHub에 올려 놓았습니다. $ mkdir ~/video-processing $ cp OpenCV.zip ~/video-processing/VideoProcessing.zip $ cd ~/video-processing $ vi lambda_function.py import boto3 Video Processing 함수입니다. Video를 읽어와 프레임 단위의 이미지로 나누고 이미지를 Resize하여 저장합니다. Lambda Handler에서는 S3에 업로드된 비디오의 이벤트에서 이름과 key를 받아 /tmp/에 다운을 받고 video_processing 결과의 이미지 파일을 S3 버킷에 업로드합니다. $ zip -g VideoProcessing.zip lambda_function.py aws cli를 사용하기 이전에 user의 secret key와 access key를 등록하고 사용하려는 region을 지정해야 사용 가능합니다. $ aws configure AWS EC2에서 aws cli를 이용해 Lambda에 함수를 업데이트 합니다. 이 때 update-function-code를 이용합니다. $ aws lambda update-function-code --function-name arn:aws:lambda:us-east-1:741926482963:function:video_processing --zip-file fileb://VideoProcessing.zip Lambda 콘솔로 이동해서 S3를 Trigger로 설정합니다. 밑에서 Trigger를 발생할 Bucket을 고르고 Event type으로 ‘All object create events’를 설정합니다. 자 연동 작업도 마무리를 지었으니 테스트를 진행해봅시다. 실제로 vido-pre-store 버킷에 비디오를 업로드 해봅시다. 업로드를 완료했습니다. CloudWatch에서 Lambda 함수의 로그를 확인하여 진행 사항을 볼 수 있습니다. 결과는 result-video-processing에서 확인할 수 있습니다.Lambda 함수 생성
S3 Bucket 생성
AWS EC2 OpenCV 라이브러리 빌드
development_install () {
sudo yum -y upgrade
sudo yum -y groupinstall "Development Tools"
}
create_virtualenv () {
cd ~
virtualenv --python=python2.7 opencv
source ~/opencv/bin/activate
}
pip_install () {
pip install opencv-python
}
zip_library () {
cd ~/opencv/lib64/python2.7/dist-packages/
zip -r9 ~/OpenCV.zip .
}
main () {
development_install
create_virtualenv
pip_install
zip_library
}
mainPython 코드 작성
import os
import sys
import uuid
import cv2
s3_client = boto3.client('s3')
TMP = "/tmp/"
FILE_PATH_INDEX = 0
FILE_NAME_INDEX = 2
def video_processing(file_name, video_path):
result_file_path = []
video = cv2.VideoCapture(video_path)
idx = 0
print "Video Processing Start ..."
while(video.isOpened()):
ret, frame = video.read()
width = video.get(3)
height = video.get(4)
if idx == 100:
break
if ret < 0:
break
frame = cv2.resize(frame, (720, 480))
result_path = video_path.split(".")[FILE_PATH_INDEX]+str(idx)+".jpg"
result_file_path.append(result_path)
cv2.imwrite(result_path, frame)
idx += 1
vido.release()
print "Video Processing Done ..."
return result_file_path
def lambda_handler(event, context):
for record in event['Records']:
bucket = record['s3']['bucket']['name']
key = record['s3']['object']['key']
download_path = '/tmp/{}{}'.format(uuid.uuid4(), key)
s3_client.download_file(bucket, key, download_path)
file_name = key
result_path = video_processing(file_name, download_path)
for upload_path in result_path:
s3_client.upload_file(upload_path, 'result-video-processing', upload_path.split("/")[FILE_NAME_INDEX])
print "S3 Upload Done ..."AWS Lambda Function deploy
S3 - Lambda
테스트
CloudWatch
결과
'AWS' 카테고리의 다른 글
AWS EC2와 Lambda iPerf3 네트워크 성능 측정 (0) | 2019.01.09 |
---|---|
AWS EC2 Ubuntu1804에 GitLab 서버 설치 (0) | 2019.01.07 |
AWS Lambda PIL 라이브러리 빌드 image data augmentation (1) | 2018.12.05 |
AWS Lambda, Google Cloud Functions, Azure Function 비교 논문 Peeking Behind the Curtains of Serverless Platforms (0) | 2018.12.04 |
AWS Lambda Python 라이브러리 numpy 배포 패키지 만들기 matmul 실행 (0) | 2018.11.14 |