AWS CDK에서 Lambda and FFmpeg 도면층 환경 구축
개요
람바다로 ffmpeg를 이동할 기회가 있습니다.
AWS 공식은 FFmpeg Lambda 레이어를 수동으로 구축하는 절차를 설명합니다.
CDK로 이 단계를 정비해 봤기 때문에 소개하려고 합니다.
구축된 대상 이미지
성과물
이 기사에 설명된 코드는 다음과 같습니다.
컨디션
terminal
$ sw_vers
ProductName: macOS
ProductVersion: 11.4
BuildVersion: 20F71
$ cdk --version
1.121.0 (build 026cb8f)
CDK 프로젝트 만들기
프로젝트 디렉토리를 만들고 CDK 프로젝트를 만듭니다.
terminal
mkdir lamba-ffmpeg-sample && cd lamba-ffmpeg-sample
cdk init app --language typescript
필요한 패키지 설치
terminal
npm install \
@aws-cdk/aws-s3 \
@aws-cdk/aws-lambda \
@aws-cdk/aws-s3-notifications
FFmpeg 바이너리 준비
AWS 공식 안내 프로그램과 마찬가지로 https://johnvansickle.com/ffmpeg/에서 다운로드합니다.
terminal
mkdir -p lambda_layer/ffmpeg && cd lambda_layer/ffmpeg
# download
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
tar xvf ffmpeg-release-amd64-static.tar.xz
# 必要ファイルだけ取り出す
mkdir bin
cp ffmpeg-*-static/ffmpeg bin/
# 不要ファイル削除
rm -rf ffmpeg-*
작업을 확인하는 데 사용되는 Lamda Function 만들기
ffmpeg의 동작을 검증하기 위해 lambda 함수를 만듭니다.
terminal
cd (PROJECT_ROOT)
mkdir lambda_function
위 디렉토리에서 다음 파일을 구성합니다.function.py
import json
import os
import subprocess
import shlex
import boto3
SIGNED_URL_TIMEOUT = 60
def lambda_handler(event, context):
s3_source_bucket = event['Records'][0]['s3']['bucket']['name']
s3_source_key = event['Records'][0]['s3']['object']['key']
s3_source_basename = os.path.splitext(os.path.basename(s3_source_key))[0]
s3_destination_filename = s3_source_basename + "_thumbnail.jpg"
s3_client = boto3.client('s3')
s3_source_signed_url = s3_client.generate_presigned_url('get_object',
Params={'Bucket': s3_source_bucket, 'Key': s3_source_key},
ExpiresIn=SIGNED_URL_TIMEOUT)
ffmpeg_cmd = "/opt/bin/ffmpeg -i \"" + s3_source_signed_url + "\" -f image2 -ss 1 -vframes 1 -vf scale=400:400:force_original_aspect_ratio=decrease -y -"
command1 = shlex.split(ffmpeg_cmd)
p1 = subprocess.run(command1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
resp = s3_client.put_object(Body=p1.stdout, Bucket=s3_source_bucket, Key=s3_destination_filename)
return {
'statusCode': 200,
'body': json.dumps('Processing complete successfully')
}
Stack 작성
lib/lamba-ffmpeg-sample-stack.ts
는 다음과 같이 수정되었다.lib/lamba-ffmpeg-sample-stack.ts
import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';
import * as lambda from '@aws-cdk/aws-lambda'
import * as notifications from '@aws-cdk/aws-s3-notifications';
export class LambaFfmpegSampleStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// 動作検証用のS3を作成
const videoBucket = new s3.Bucket(this, 'video-bucket');
// FFmpegのLambdaレイヤーを作成
const ffmegLayer = new lambda.LayerVersion(this, 'ffmpeg-layer', {
layerVersionName: 'ffmpeg',
compatibleRuntimes: [lambda.Runtime.PYTHON_3_8],
code: lambda.AssetCode.fromAsset('lambda_layer/ffmpeg')
});
// Lambda関数を作成
const videoHandler = new lambda.Function(this, 'video-handler', {
functionName: 'video-handler',
runtime: lambda.Runtime.PYTHON_3_8,
handler: 'function.lambda_handler',
code: lambda.AssetCode.fromAsset('lambda_function'),
layers: [ffmegLayer],
timeout: cdk.Duration.seconds(60),
});
// Lambda関数にS3の権限を付与
videoBucket.grantReadWrite(videoHandler);
// S3トリガーでLambdaを起動
videoBucket.addObjectCreatedNotification(
new notifications.LambdaDestination(videoHandler),
{ suffix: '.mp4' }
)
}
}
Deploy
이렇게 하면 준비가 다 되었으니 프로그램을 실행해라.
terminal
cdk deploy
동작 확인
적절한 영상을 CDK가 제작한 S3의 통에 올린다.
1분 정도면 썸네일 제작을 확인할 수 있다.
총결산
CDK를 사용하여 Lambda 및 d FFmpeg 레이어 환경을 구축할 수 있습니다.
주의점은 FFmpeg의 이진법이 73Mbite보다 크기 때문에 창고에 포함될지 여부는 별도로 연구해야 한다.
Reference
이 문제에 관하여(AWS CDK에서 Lambda and FFmpeg 도면층 환경 구축), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/adito/articles/3a8496fc9be650텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)