ElasticTranscoder/基本的な使い方で手動で変換する手順を説明しましたが
より実践的なところで、S3にアップロードされたファイルが自動で変換される仕組みを作っていきたいと思います。
上記ページを見て、S3バケットとパイプラインの設定が済んだ状態にします。
以下の画像のように、Python3.8でLambda関数を作成します。
以下の画像のように、トリガーを追加します。
以下の画像のように、アクセス権限からロールに「ElasticTranscoder」の権限を追加します。
s3のイベントは非同期呼び出し且つ、ファイル名をuuidで作成しているので再試行を0回にしています。
実際サービスで使う場合は、デッドレターキューを用いたLambda関数のコントロールが必要かと思います。
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関数の設定後、インプットバケットにメディアファイルをアップロードすると
自動でアウトプットバケットにファイルが作成されます。