虎の穴ラボ技術ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

【AWS】Elastic TranscoderからMediaConvertへ乗り換えよう!

こんにちは!虎の穴ラボの鷺山です。

AWSの動画・音声変換サービス「Amazon Elastic Transcoder」2025年11月13日サービス終了します。
この日以降、当サービスは利用できなくなる予定です。
後継サービスとして「AWS Elemental MediaConvert」への移行がAWSから案内されています。

この記事ではElastic Transcoderを利用しているシステムをMediaConvertに移行するための方法を、サンプルコードを交えてご紹介します。

前提環境

環境情報 バージョン・値
Node.js 22.17.1
Node.jsライブラリ
@aws-sdk/client-elastic-transcoder
および
@aws-sdk/client-mediaconvert
いずれも
3.846.0
AWS CLI 2.27.52
AWSアカウントID 111111111111
リージョン ap-northeast-1
S3バケット名 example-bucket

この記事では、Node.jsを使ったサンプルコードを記載しています。
他のプログラミング言語でもAWS APIに渡す設定値などは共通しているため、移行時の参考になれば幸いです。

Elastic TranscoderとMediaConvertの差異

どちらも動画変換サービスとして以下の機能を備えており、大まかな仕様は共通しています。

  • 変換ジョブはパイプラインやキューに追加されて処理される。
  • Amazon S3を利用してファイルの入出力を行う。変換ジョブの実行時にS3のパスを指定する。
  • 変換のための各種設定のプリセットやテンプレートを登録・利用できる。
  • ジョブの完了時に通知を送信でき、他のサービスと連携できる。

ただし、以下の点が異なります。

項目 Elastic Transcoder MediaConvert
変換ジョブの割り当て先 パイプライン キュー
入出力S3パスの指定方法 パイプラインにバケット s3://example-bucket を指定し、ジョブ実行時に子パス path/to/the/file を指定する。 ジョブ実行時にS3のフルパス s3://example-bucket/path/to/the/file を指定する。
プリセット、テンプレート プリセットが用意されている。 プリセットが用意されている。
さらに、ジョブテンプレートという仕組みが追加されている。
通知の設定方法 通知先のAmazon SNSトピックをパイプラインに直接指定する Amazon EventBridgeでジョブ完了時に通知を送信するように設定する。
送信先はAmazon SNSを含め幅広く選択できる。

ジョブテンプレート

MediaConvertから追加された機能で、出力設定(プリセット)だけでなく、入力設定を含むジョブ全体の設定を保存して再利用できます。

設定内容の変換スクリプト

AWS公式より、Elastic Transcoderの設定内容をMediaConvertの設定内容に変換するスクリプトが提供されています。

このスクリプトを使うと、Elastic Transcoderの「プリセット」や「完了済みジョブの情報」をもとに、MediaConvert向けの「プリセット」や「ジョブテンプレート」の設定ファイル (JSON) を生成できます。

なお、スクリプトの実行には以下の前提条件を満たす必要があります:

  • Node.js 14以上インストール済み
  • AWS CLI認証設定済み

変換スクリプトの実行方法

今回はElastic Transcoderの「完了済みジョブの情報」をもとに、MediaConvertの「ジョブテンプレート」の設定ファイルを生成する例をご紹介します。

まず、AWSマネジメントコンソールでElastic Transcoderのジョブ一覧画面を開き、変換元のジョブのJob IDを確認します。(今回は例としてJob IDは 1700000000000-zzzzzz とします。)

Elastic TranscoderのJob IDを確認
Elastic TranscoderのJob IDを確認

次に、変換スクリプト(convert-job.js)があるディレクトリに移動し、以下のように実行します。

$ node convert-job.js --job-id 1700000000000-zzzzzz > template.json

このコマンドを実行すると、Elastic Transcoderのジョブ 1700000000000-zzzzzz の設定がMediaConvertのジョブテンプレート形式のJSONファイル(template.json)として出力されます。

出力したジョブテンプレートのインポート方法

上記のステップで出力したJSONファイルを、MediaConvertのジョブテンプレートとしてインポートできます。

まず、AWSマネジメントコンソールでMediaConvertのジョブテンプレート一覧画面を開き、「テンプレートをインポート」をクリックします。

MediaConvertジョブテンプレートをインポート
MediaConvertジョブテンプレートをインポート

そして、前のステップで出力したJSONファイル(template.json)を指定します。

すると、JSONファイルの内容が設定画面に反映されます。内容を確認し(必要があれば修正し)、「作成」をクリックするとジョブテンプレートが作成されます。

MediaConvertはElastic Transcoderよりも詳細な設定が可能なため、インポート後に内容をよく確認し、必要に応じて調整することをおすすめします。

AWSクライアントの記述方法の違い

Elastic TranscoderとMediaConvertのAWSクライアントの記述方法の違いを、簡単なサンプルコードでご紹介します。
既存のElastic Transcoder向けのコードをMediaConvert向けに置き換える際の参考にしてください。

今回は例として動画ファイルをストリーミング (HLS) 形式に変換するコードを扱います。 入出力のS3パスはどちらも以下の前提とします。

項目 パス
入力ファイル s3://example-bucket/path/to/入力ファイル.mp4
出力先フォルダ s3://example-bucket/path/to/converted/

Elastic Transcoder

まず、Elastic Transcoderにおける変換ジョブの実行例を示します。

  • パイプラインID 1700000000000-xxxxxx に向けて変換ジョブを作成します。
  • パイプラインの入出力先にはS3バケット s3://example-bucket が割り当て済みとします。
  • プリセットには、システムプリセット HLS 1M (プリセットID 1351620000001-200030) を使用します。
import { ElasticTranscoderClient, CreateJobCommand } from "@aws-sdk/client-elastic-transcoder";

const pipelineId = "1700000000000-xxxxxx";
const presetId = "1351620000001-200030"; // HLS 1M
const baseKey = "path/to/";
const inputKey = baseKey + "入力ファイル.mp4";
const outputKey = "converted/hls_";

const client = new ElasticTranscoderClient();

async function createTranscodeJob() {
  const command = new CreateJobCommand({
    PipelineId: pipelineId,
    Input: {
      Key: inputKey,
    },
    OutputKeyPrefix: baseKey,
    Outputs: [{
      Key: outputKey,
      PresetId: presetId,
      SegmentDuration: "5",
    }],
    Playlists: [{
      Name: "playlist",
      Format: "HLSv3",
      OutputKeys: [outputKey],
    }],
  });

  const response = await client.send(command);
  return response.Job;
}

async function main() {
  try {
    const job = await createTranscodeJob();
    console.log("ジョブの作成に成功:", JSON.stringify(job, null, 2));
  } catch (error) {
    console.error("ジョブの作成に失敗:", error.message);
  }
}

main();

変換ジョブが完了すると、S3に以下のようにファイルが出力されます:

s3://example-bucket/path/to/playlist.m3u8           # マスタープレイリスト
s3://example-bucket/path/to/converted/hls_.m3u8     # メディアプレイリスト
s3://example-bucket/path/to/converted/hls_00000.ts  # 以下はセグメントファイル
s3://example-bucket/path/to/converted/hls_00001.ts
s3://example-bucket/path/to/converted/hls_00002.ts
...

MediaConvert

次に、MediaConvertにおける変換ジョブの実行例を示します。

import { MediaConvertClient, CreateJobCommand } from "@aws-sdk/client-mediaconvert";

const roleArn = "arn:aws:iam::111111111111:role/MediaConvert_Default_Role";
const jobTemplateArn =
  "arn:aws:mediaconvert:ap-northeast-1:111111111111:jobTemplates/template-1";

const s3UriPrefix = "s3://example-bucket/path/to/";
const inputKey = s3UriPrefix + "入力ファイル.mp4";
const outputKey = s3UriPrefix + "converted/out";

const client = new MediaConvertClient();

async function createTranscodeJob() {
  const command = new CreateJobCommand({
    Role: roleArn,
    JobTemplate: jobTemplateArn,
    Settings: {
      Inputs: [{
        FileInput: inputKey
      }],
      OutputGroups: [{
        Name: "Apple HLS",
        OutputGroupSettings: {
          Type: "HLS_GROUP_SETTINGS",
          HlsGroupSettings: {
            Destination: outputKey
          }
        },
        Outputs: [{
          NameModifier: "_hls",
        }]
      }]
    }
  });

  const response = await client.send(command);
  return response.Job;
}

async function main() {
  try {
    const job = await createTranscodeJob();
    console.log("ジョブの作成に成功:", JSON.stringify(job, null, 2));
  } catch (error) {
    console.error("ジョブの作成に失敗:", error.message);
  }
}

main();

ここで、IAMロール MediaConvert_Default_Role のポリシーは以下の設定になっています:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*",
                "s3:Put*"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket/*"
            ]
        }
    ]
}

変換ジョブが完了すると、S3に以下のようにファイルが出力されます:

s3://example-bucket/path/to/converted/out.m3u8          # マスタープレイリスト
s3://example-bucket/path/to/converted/out_hls.m3u8      # メディアプレイリスト
s3://example-bucket/path/to/converted/out_hls_00001.ts  # 以下はセグメントファイル
s3://example-bucket/path/to/converted/out_hls_00002.ts
s3://example-bucket/path/to/converted/out_hls_00003.ts
...

MediaConvertジョブの完了通知の設定

最後に、MediaConvertの変換ジョブ完了時にAmazon SNSトピックに通知を送信するための設定方法をご紹介します。

  1. AWSマネジメントコンソールからAmazon EventBridgeのルール一覧画面を開き、「ルールを作成」をクリックします。
  2. 「ルールタイプ」に「イベントパターンを持つルール」を選択します。
  3. 「イベントパターン」を以下のように設定します:
    • 「イベントソース」に「AWSのサービス」
    • 「AWS のサービス」に「MediaConvert」
    • 「イベントタイプ」に「MediaConvert Job State Change」
    • 「イベントタイプの仕様 1」に「COMPLETE」(必要に応じて「ERROR」も)

      イベントパターンの設定 (EventBridge)
      イベントパターンの設定 (EventBridge)

  4. 「ターゲットタイプ」に「AWS のサービス」を、「ターゲットを選択」から「SNSトピック」を選択し、「トピック」から送信先のトピックを選択します。

    ターゲットの設定 (EventBridge)
    ターゲットの設定 (EventBridge)

  5. 設定内容を確認して「ルールを作成」をクリックします。

以上の設定で、MediaConvertの変換ジョブ完了時にSNSトピックに通知が送信されるようになります。

まとめ

本記事では、Amazon Elastic TranscoderからAWS Elemental MediaConvertへの移行方法をご紹介しました。

現在Elastic Transcoderを使用していて、MediaConvertへの移行を検討中の方のお役に立てれば幸いです!

Fantia開発採用情報

虎の穴ラボでは現在、一緒にFantiaを開発していく仲間を積極募集中です!
多くのユーザーに使っていただけるtoCサービスの開発をやってみたい方は、ぜひ弊社の採用情報をご覧ください。
toranoana-lab.co.jp