~~NOCACHE~~ ## ElasticTranscoderでメディアファイルを自動変換 ### はじめに [[Aws:ElasticTranscoder:BasicUsage|ElasticTranscoder/基本的な使い方]]で手動で変換する手順を説明しましたが より実践的なところで、S3にアップロードされたファイルが自動で変換される仕組みを作っていきたいと思います。 ### 事前準備 #### ① ElasticTranscoderの環境を整える 上記ページを見て、S3バケットとパイプラインの設定が済んだ状態にします。 #### ② Lambda関数の作成 ##### 1.Lambda関数の作成 以下の画像のように、Python3.8でLambda関数を作成します。 {{:Aws:Lambda:pasted:20200605-230851.png?nolink}} ##### 2.トリガーの追加 以下の画像のように、トリガーを追加します。 {{:Aws:Lambda:pasted:20200605-231626.png?nolink}} ##### 3.Lambdaのロールの権限追加 以下の画像のように、アクセス権限からロールに「ElasticTranscoder」の権限を追加します。 {{:Aws:Lambda:pasted:20200605-232134.png?nolink}} ##### 4.非同期呼び出しの設定 s3のイベントは非同期呼び出し且つ、ファイル名をuuidで作成しているので再試行を0回にしています。 実際サービスで使う場合は、デッドレターキューを用いたLambda関数のコントロールが必要かと思います。 {{:Aws:Lambda:pasted:20200605-235943.png?nolink}} ##### 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関数の設定後、インプットバケットにメディアファイルをアップロードすると 自動でアウトプットバケットにファイルが作成されます。 {{tag>AWS Lambda ElasticTranscoder 実践的}}