AWS CDK에서 Lambda and FFmpeg 도면층 환경 구축

17489 단어 AWSLambdaCDKtech

개요


람바다로 ffmpeg를 이동할 기회가 있습니다.
AWS 공식은 FFmpeg Lambda 레이어를 수동으로 구축하는 절차를 설명합니다.
https://aws.amazon.com/jp/blogs/media/processing-user-generated-content-using-aws-lambda-and-ffmpeg/
CDK로 이 단계를 정비해 봤기 때문에 소개하려고 합니다.

구축된 대상 이미지

  • 애니메이션 스토리지용 S3 배럴
  • 애니메이션 미리 보기 그림을 만드는 Lambda 함수
  • FFmpeg의 Lambda 레이어

  • 성과물


    이 기사에 설명된 코드는 다음과 같습니다.
    https://github.com/adito0211/lamba-ffmpeg-sample

    컨디션


    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보다 크기 때문에 창고에 포함될지 여부는 별도로 연구해야 한다.

    좋은 웹페이지 즐겨찾기