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

#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関数の作成
以下、ローカルで作業する。

```bash
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で圧縮する。

```bash
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のアクションに対するアクセス許可の定義を追加する。例えば、以下のようになる。

```json
{
    "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