目次

ElasticTranscoderでメディアファイルを自動変換

はじめに

ElasticTranscoder/基本的な使い方で手動で変換する手順を説明しましたが
より実践的なところで、S3にアップロードされたファイルが自動で変換される仕組みを作っていきたいと思います。

事前準備

① ElasticTranscoderの環境を整える

上記ページを見て、S3バケットとパイプラインの設定が済んだ状態にします。

② Lambda関数の作成

1.Lambda関数の作成

以下の画像のように、Python3.8でLambda関数を作成します。

2.トリガーの追加

以下の画像のように、トリガーを追加します。

3.Lambdaのロールの権限追加

以下の画像のように、アクセス権限からロールに「ElasticTranscoder」の権限を追加します。

4.非同期呼び出しの設定

s3のイベントは非同期呼び出し且つ、ファイル名をuuidで作成しているので再試行を0回にしています。
実際サービスで使う場合は、デッドレターキューを用いたLambda関数のコントロールが必要かと思います。

5.関数コードを設定します。

from datetime import datetime
import logging
import uuid
import boto3
from botocore.client import ClientError

REGION_NAME = 'ap-northeast-1'                             #リージョン名
PIPELINE_ID = '123456789-XXXXXXXXXX'                       #パイプラインID
OUTPUT_KEY = str(uuid.uuid4()) + '.mp4'                    #アウトプットファイル名
PRESET_ID = '1351620000001-000061'                         #プリセットID(今回はSystem preset: Generic 320x240)

logging.basicConfig()  # http://stackoverflow.com/questions/27411778/no-handlers-found-for-logger-main
logger = logging.getLogger(__name__)

def lambda_handler(event, context):
    transcoder = boto3.client('elastictranscoder', REGION_NAME)
    s3 = boto3.resource('s3')
    iam = boto3.resource('iam')

    # インプットバケットにアップロードされたKEY名の取得
    INPUT_KEY = event['Records'][0]['s3']['object']['key']
    # ジョブの作成
    job = transcoder.create_job(
        PipelineId=PIPELINE_ID,
        Input={
            'Key': INPUT_KEY,
            'FrameRate': 'auto',
            'Resolution': 'auto',
            'AspectRatio': 'auto',
            'Interlaced': 'auto',
            'Container': 'auto',
        },
        Outputs=[
            {
                'Key': OUTPUT_KEY,
                'PresetId': PRESET_ID,
                'Rotate': 'auto',
            },
        ],
    )
    print("start time={}".format(datetime.now().strftime("%H:%M:%S.%f")[:-3]))
    print("job={}".format(job))
    job_id = job['Job']['Id']

    # Wait the job completed
    waiter = transcoder.get_waiter('job_complete')
    waiter.wait(Id=job_id)
    print("end time={}".format(datetime.now().strftime("%H:%M:%S.%f")[:-3]))


if __name__ == '__main__':
    lambda_handler()

さいごに

以上のLambda関数の設定後、インプットバケットにメディアファイルをアップロードすると
自動でアウトプットバケットにファイルが作成されます。