Passion make things more better

Ruby on Rails / React.js / Swift / AWS / Docker

S3 + Lambda + Transcoderを使用したサーバーレスな動画変換

AWSのS3, Lambda, Transcoderを使用したサーバーレスな動画変換の仕組みの作り方を紹介します。 処理の流れとしては以下のようになります。

  1. S3のBucketに動画ファイルをアップロード
  2. S3に設定したイベントからLambda関数を実行する
  3. Lambda関数内でTranscoderが実行され、動画をMP4形式に変換およびサムネイル画像の作成
  4. 変換した動画および作成されたサムネイル画像を別のS3のBucketにアップロード

Transcoderの設定

基本情報

  • Pipeline Name
    • XXXXXVideoTranscoding
  • Input Bucket
    • 元ファイルをアップする用のS3 Bucketを選択
  • IAM Role
    • Create console default roleを選択
      • すでにElastic_Transcoder_Default_Roleがあればそれを選択

Configuration for Amazon S3 Bucket for Transcoded Files and Playlists

  • Bucket
    • 変換したファイルをアップする用のS3 Bucketを選択
  • Storage Class
    • Standardを選択

Configuration for Amazon S3 Bucket for Thumbnails

  • Bucket
    • 変換したファイルをアップする用のS3 Bucketを選択
  • Storage Class
    • Standardを選択

Lambdaの設定

関数の作成を押して、「一から作成」を選択してください。

ポリシーおよびロールの作成

Lambda関数を作成する際に、Roleを指定する必要があります。事前に必要なポリシーおよびロールを作成しておきます。

ポリシーの作成

以下のJSONを入力して「LambdaElasticTranscoder」という名前でポリシーを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "elastictranscoder:Read*",
                "elastictranscoder:List*",
                "elastictranscoder:*Job",
                "elastictranscoder:*Preset"
            ],
            "Resource": [
                "arn:aws:elastictranscoder:*:*:*"
            ]
        }
    ]
}

ロールの作成

先ほど作成したLambdaElasticTranscoderのポリシーを選択し、「lambda_elastictranscoder_exec_role」という名前のロールを作成します。

基本的な情報

  • 関数名
    • XXXXXVideoTranscoding
  • ランタイム
    • Node.js 12.x
  • 実行ロール
    • 既存のロールより「lambda_elastictranscoder_exec_role」を選択

これらを入力して、「関数の作成」をクリックしてください。そうすると関数が作成されます。

コード

実行するコードは以下を参考にしてください。以下を実行すると、指定したS3 Bucketに「MP4形式に変換された動画」と「サムネイル画像」がアップされます。

'use strict';

var AWS = require('aws-sdk');
var s3 = new AWS.S3({
    apiVersion: '2012-09-25'
});

var eltr = new AWS.ElasticTranscoder({
    apiVersion: '2012-09-25',
    region: 'ap-northeast-1'
});

exports.handler = function(event, context) {
    console.log('Executing Elastic Transcoder Orchestrator');
    var bucket = event.Records[0].s3.bucket.name;
    var key = event.Records[0].s3.object.key;
    var pipelineId = '<PipelineのIDを入力してください>';
    if (bucket !== '<元のファイルをアップするS3のBucket名を入力してください>') {
        context.fail('Incorrect Video Input Bucket');
        return;
    }
    var srcKey =  decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " ")); //the object may have spaces
    var newKey = key.split('.')[0];
    var params = {
        PipelineId: pipelineId,
        Input: {
            Key: srcKey,
            FrameRate: 'auto',
            Resolution: 'auto',
            AspectRatio: 'auto',
            Interlaced: 'auto',
            Container: 'auto'
        },
        Outputs: [{
            Key: newKey + '.mp4',
            ThumbnailPattern: newKey + '-{count}',
            PresetId: '1351620000001-000010',
            Watermarks: [{
                InputKey: 'watermarks/logo.png',
                PresetWatermarkId: 'BottomRight'
            }],
        }]
    };

    console.log('Starting Job');
    eltr.createJob(params, function(err, data){
        if (err){
            console.log(err);
        } else {
            console.log(data);
        }
        context.succeed('Job well done');
    });
};

S3の設定

  1. 元ファイル
  2. 変換したファイル

を保存するために、2つのBucketを作成します。作成時に特殊な設定は必要ありません。

ウォーターマーク用の画像

動画を変換する際に、動画自体にウォーターマークを入れることができます。 ウォーターマークに使用したい画像を、元ファイルのBucket内にwatermarks/logo.pngという名前でアップをしてください。

イベントの追加

元ファイルをアップするS3のBucketのプロパティからイベントの設定を行います。

  • 名前
    • VideoTranscoding
  • イベント
    • 「すべてのオブジェクト作成イベント」を選択
  • 送信先
    • 「Lambda関数」を選択
  • Lambda
    • 先ほど作成したLambda関数名を選択

以上の設定を終えて、S3のBucketに動画ファイルをアップロードすると処理が実行され、変換された動画およびサムネイル画像が作成されるのが確認できるようになります。


参考