Video on Demand on AWS Foundationにキュー・ホッピングを追加する

## 前提

- AWS Elemental MediaConvertで動画の変換処理を実装している
- 以下のような構成

![vod-on-aws-foundations-architecture.182b6790d313c884c84ccbe6d9c3a633da37cdd9 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32289/9d880427-6c95-5a01-4f09-8113c39e6576.png)

https://aws.amazon.com/jp/solutions/implementations/video-on-demand-on-aws


## 経緯

AWS Elemental MediaConvertで動画の変換処理を実装しましたが、通常１分程度で完了するはずの処理が５分以上かかる時がありました。詳細に見ていくと変換処理は１分程度で終わっているのですが、処理開始までの待機時間が長いことがわかりました。


## 原因

処理開始までの待機時間が長いことが原因ですが、その理由についてはサポートに問い合わせても回答が得られませんでした。代わりに以下のページにあるようにキューホッピングの設定をすることで状況を改善できるとのことでした。
https://docs.aws.amazon.com/ja_jp/mediaconvert/latest/ug/setting-up-queue-hopping-to-avoid-long-waits.html

## キューホッピングを設定する

### キューの作成

まずホッピングするためのキューをCloudFormationで作成をします。AWSのページではリザーブドキューを推奨していますが、CloudFormationではON_DEMANDしかサポートしていないようです。利用している状況に合わせて選択してください。

```
  MediaConvertHopDestination:
    Type: 'AWS::MediaConvert::Queue'
    Properties: 
      Name: 'hopDestination'
      PricingPlan: 'ON_DEMAND'
      Status: 'ACTIVE'
```

### MediaConvertの設定ファイルを修正する

Video on Demand on AWS FoundationのCloudFormationを実行するとjob-settings.jsonというファイルが作成されます。こちらにキューホッピングの設定を追加します。

```
{
    "Queue": "Default",
    "Role": "",
    "Settings": {
      "OutputGroups": [
        {

---  省略 ----

    "AccelerationSettings": {
      "Mode": "PREFERRED"
    },
    "StatusUpdateInterval": "SECONDS_60",

---  以下を追記 ----
    "Priority": 0,
    "HopDestinations": [
      {
        "WaitMinutes": 1,
        "Queue": "arn:aws:mediaconvert:ap-northeast-1:XXXXXXXXXX:queues/QueueHopping"
      }
    ]
  }

```
### LambdaFunctionを修正する

``` job-submit/index.js
/**
 * 追記
 */
const hopDestinationArn = `arn:aws:mediaconvert:ap-northeast-1:${accountId}:queues/hopDestination`

/**
 * 修正
 */
job = await utils.updateJobSettings(job,inputPath,outputPath,metaData,MEDIACONVERT_ROLE,hopDestinationArn);
```

``` job-submit/lib/utils.js

        for (let group of outputGroups) {
            switch (group.OutputGroupSettings.Type) {
                case 'FILE_GROUP_SETTINGS':
                    group.OutputGroupSettings.FileGroupSettings.Destination = getPath(group, fileNum++);
                    break;
                case 'HLS_GROUP_SETTINGS':
                    group.OutputGroupSettings.HlsGroupSettings.Destination = getPath(group, hlsNum++);
                    break;
                case 'DASH_ISO_GROUP_SETTINGS':
                    group.OutputGroupSettings.DashIsoGroupSettings.Destination = getPath(group, dashNum++);
                    break;
                case 'MS_SMOOTH_GROUP_SETTINGS':
                    group.OutputGroupSettings.MsSmoothGroupSettings.Destination = getPath(group, mssNum++);
                    break;
                case 'CMAF_GROUP_SETTINGS':
                    group.OutputGroupSettings.CmafGroupSettings.Destination = getPath(group, cmafNum++);
                    break;
                default:
                    throw Error('OutputGroupSettings.Type is not a valid type. Please check your job settings file.');
            }
        }
        /**
         *  追記
         */
        job.HopDestinations[0].Queue = hopDestinationArn;

```


## まとめ

以上でキュー・ホッピングの設定が追加できます。
Video on Demand on AWS FoundationはほぼNode.jsで出来ているのでカスタマイズがしやすくて便利だと感じました。細かいチューニングにも対応できるのでありがたいです。