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


前提

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

経緯

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

原因

処理開始までの待機時間が長いことが原因ですが、その理由についてはサポートに問い合わせても回答が得られませんでした。代わりに以下のページにあるようにキューホッピングの設定をすることで状況を改善できるとのことでした。
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で出来ているのでカスタマイズがしやすくて便利だと感じました。細かいチューニングにも対応できるのでありがたいです。