LoginSignup
45
32

More than 5 years have passed since last update.

動画をAWS S3にアップロードしたら自動でAmazon Elastic Transcoderでエンコードしながらサムネイルを作成する

Posted at

S3のバケットの作成

マネジメントコンソールからS3を選択して、未加工状態と変換後の動画を格納するバケットを作成する。

未加工状態の動画用のバケットの作成

1.バケットを作成を選択し、表示されたポップアップで以下のように入力する

バケット名: transcoder-raw-data
リージョン: Oregon

2.作成されたバケットを右クリックからプロパティを選択し、アクセス許可からバケットポリシーの編集を選択する。

3.表示されるポップアップからAWS Policy Generatorを選択し、以下のように入力する。

Step 1: Select Policy Type
Select Type of Policy: S3 Bucket Policy

Step 2: Add Statement(s)
Effect: Allow
Principal: *
AWS Servuce: Amazon S3
Actions: PutObject
Amazon Resource Name(ARN): arn:aws:s3:::transcoder-raw-data/*

Add Statementを選択

Step 3: Generate Policy
Generate Policyを選択して、表示されるJSONデータをコピペする。

元のバケットポリシーエディターのページに貼り付けて保存する。

加工後の動画用のバケットの作成

1.バケットを作成を選択し、表示されたポップアップで以下のように入力する

バケット名: transcoder-processed-data
リージョン: Oregon

Elastic Transcoderの設定

マネジメントコンソールからElastic Transcoderを選択する。
基本的な流れとしては以下の通りとなる。

Pipelines: ElasticTranscoderTestを作成
Jobs: LambdaでLambda関数からcreateJob()を実行する(マネジメントコンソールからは設定をしない)
Presets:予め用意されているものを使用(マネジメントコンソールからは設定をしない)

Pipelineの作成

Create New Pipelineを選択して、以下のように入力する。

Pipeline Name: ElasticTranscoderTest
Input Bucket: transcoder-raw-data
IAM Role: Elastic_Transcoder_Default_Role

変換されたファイルやプレイリスト用のS3バケット
Bucket: transcoder-processed-data
Storage Class: Standard

サムネイル用のS3バケット
Bucket: transcoder-processed-data
Storage Class: Standard

Create Pipelineを選択

Lambdaの操作

Lambdaの設定をするにあたって、予めLambda関数を作成しておく。

Lambda関数の作成

以下、ローカルで作業する。

mkdir transcoderLambda
cd transcoderLambda
curl -sS https://getcomposer.org/installer | sudo php
php composer.phar require aws/aws-sdk-php
vim index.js

例えば、以下のようにindex.jsを作成する。
PipelineIdは、マネジメントコンソール中のElastic TranscoderからPipelinesで作成したPipelineを選択して確認。

Preset IDであるgeneric720pPresentIdとhls2MPresetIdはPresetsで予め用意されているもののPresetのIDに相当するもので、ソースコード中のものと一致するものとなる。

index.js
'use strict';

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

var transcoder = new AWS.ElasticTranscoder({
    apiVersion: '2012-09-25',
    region: 'us-west-2'
});

exports.handler = function(event, context) {
    var bucket = event.Records[0].s3.bucket.name;
    var key = event.Records[0].s3.object.key;
    var pipelineId = '<Pipeline ID>';
    var generic720pPresetId = '1351620000001-000010';//System preset: Generic 720p
    var hls2MPresetId = '1351620000001-200010';//System preset: HLS 2M

    var srcKey =  decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
    var newKey = key.split('.')[0];
    var params = {
        PipelineId: pipelineId,
        OutputKeyPrefix: newKey + '/',
        Input: {
            Key: srcKey,
            FrameRate: 'auto',
            Resolution: 'auto',
            AspectRatio: 'auto',
            Interlaced: 'auto',
            Container: 'auto'
        },
        Outputs: [{
            Key: newKey + '.mp4',
            ThumbnailPattern: 'generic-' + newKey + '-{count}',
            PresetId: generic720pPresetId,
        },{
            Key: newKey + '.ts',
            ThumbnailPattern: 'hls-' + newKey + '-{count}'
            PresetId: hls2MPresetId,
        }]
    };

    transcoder.createJob(params, function(err, data){
        if (err){
            console.log('Error');
        } else {
            console.log('Success');
        }
    });
};

作成したファイルを以下のコマンドでZIPで圧縮する。

zip -r transcoderLambda.zip *

Lambdaの設定

マネジメントコンソールからLambaを選択して、Create a Lambda functionを選択して、以下のように入力する。

Select blueprint

blueprintは何も選ばずにNextを選択する。

Configure triggers

点線上の囲い -> Lambda のように表示されている図の点線で囲われた部分をクリックしてS3を選択する。現れた入力欄に以下のように入力を行う。

Bucket: transcoder-raw-data
Event type: Object Created(All)
Prefix: 空欄
Suffix: 空欄

Enable trigger: チェックを入れる

Nextを選択

Configure function

Name: myTranscoderFunction
Description: Function for forwarding file uploaded to S3 to Elastic Transcoder.
Runtime: Node.js 4.3

Code entry type: Upload a .ZIP file
Function package: Uploadを選択して、作成したZIPファイルをアップロードする

Lambda function handler and role
Handler: index.handler
Role: Create a custom role

IAMロール: 新しいIAMロールの作成
ロール名: lambda_transcoder_execution
ポリシードキュメント:
transcoderのアクションに対するアクセス許可の定義を追加する。例えば、以下のようになる。

{
    "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:*:*:*"
            ]
        }
    ]
}

Nextを選択する。

Review

設定内容を確認してLamba関数の作成が完了する。

以上でS3のtranscoder-raw-dataバケットに動画をアップロードすると、transcoder-processed-dataバケットに変換された動画が保存されるようになる。

参考

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/ElasticTranscoder.html
http://dev.classmethod.jp/cloud/aws/easy-video-transcoding-in-aws/
https://remotestance.com/blog/3044/
http://qiita.com/tjun/items/5ddb8ab7c95be398cfb8

45
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
32