目次

Amazon Elastic Transcoder v2.0 完全ガイド(レガシー・廃止予定)

公式ドキュメント・重要通知


1. 【重要】サービス廃止通知

End of Support: 2025 年 11 月 13 日

警告: Amazon Elastic Transcoder は 2025 年 11 月 13 日に サポート終了。この日付以降は AWS による機能改善・セキュリティパッチ・技術サポートが完全に終了します。現在 Elastic Transcoder をご利用のお客様は、直ちに AWS Elemental MediaConvert への移行を開始すること

タイムライン

2024年10月: AWS、Elastic Transcoder 廃止を発表
           ↓
2025年11月13日: 完全サポート終了
                ├─ API 呼び出し: 継続可能(応答なし)
                ├─ コンソール: アクセス不可
                ├─ 新しいパイプライン: 作成不可
                └─ セキュリティアップデート: 提供なし
                ↓
2026年以降: インシデント時のサポート完全終了

2. Elastic Transcoder(レガシー)の本質と位置付け

Amazon Elastic Transcoder は 「S3 に保存された動画ファイルを別フォーマット・別解像度に変換するマネージド動画トランスコードサービス」。Pipeline(処理キュー)・Job(変換ジョブ)・Preset(出力設定)の 3 つの概念で動作。2010 年代中盤に AWS の標準トランスコード機能として提供開始されたが、2020 年代の高度なビデオ処理ニーズ(4K / HDR / DRM / DASH / CMAF)に対応できず、後継サービス AWS Elemental MediaConvert が 2015 年に登場。以降、Elastic Transcoder は機能追加なし・廃止へ。

Elastic Transcoder が選ばれ続けた理由(歴史的背景)

レガシーシステムの継続運用

  • 2014-2016 年に Elastic Transcoder で構築された既存のトランスコード基盤は、数百万ドルのビジネス依存度が高く、急激な廃止は困難
  • 既存 Pipeline / Job / Preset の設定が固定化され、変更コストが高い

シンプルな MP4 / HLS 変換の慣性

  • シンプルな「MP4 入力 → HLS 出力」ユースケースでは、複雑な MediaConvert 設定より Elastic Transcoder が「分かりやすい」と感じるユーザーが一定数存在

移行コストの遅延

  • 企業の優先順位は「新規開発」> 「レガシー刷新」のため、廃止発表後も移行が遅延

3. Elastic Transcoder vs AWS Elemental MediaConvert(詳細比較)

機能比較表

機能 / 観点 Elastic Transcoder(廃止予定) MediaConvert(推奨)
サービス提供状態 2025/11/13 廃止 ✓ 継続・機能拡張中
対応コーデック H.264, H.265, VP8, VP9, Theora H.264, H.265, AV1, ProRes, DNxHD 等 20+
入力フォーマット MP4, MOV, AVI, FLV, MXF, WebM 等 上記 + DCP, IMF, SMPTE 2110 等
出力フォーマット HLS, MP4, MPEG-TS, WebM 等 HLS, DASH, CMAF, MPEG-TS, MSS 等
DRM サポート ✗ HLS 暗号化のみ ✓ Widevine, FairPlay, PlayReady(SPEKE)
字幕対応 SRT(限定的) SRT, TTML, CEA-608, CEA-708, DVB-Sub, IMSC 等
4K サポート ✓ 4K / 8K対応
HDR サポート ✓ HDR10, HLG, Dolby Vision
QVBR ✗(固定 / VBR のみ) ✓ 品質ベース可変ビットレート
Color Space Convert 限定的 ✓ Rec.709 / Rec.2020 / DCI P3
Watermark ✓ 対応 ✓ 対応(高度)
ライブ配信 ✗ MediaLive を別途使用
API 複雑度 低(シンプル) 中(詳細設定可能)
料金(SD 480p) $0.017/分 $0.0075/分
料金(HD 1080p) $0.034/分 $0.015/分
料金(4K) 非対応 $0.054/分
コスト比較 ベースライン(100%) 削減率: -56%(HD 同等品質)

詳細差分

Elastic Transcoder の制限:
  ✗ 4K / 8K 未対応 → MediaConvert で対応
  ✗ HDR(HDR10 / HLG)未対応 → MediaConvert で対応
  ✗ DRM(Widevine / FairPlay / PlayReady)未対応 → MediaConvert で対応
  ✗ QVBR(品質ベース可変ビットレート)未対応 → MediaConvert で対応
  ✗ DASH / CMAF 出力 → MediaConvert で対応
  ✗ 字幕種別限定(SRT のみ)→ MediaConvert で対応
  ✗ Color Space 管理不足 → MediaConvert で詳細制御
  ✗ 機能追加なし(2015 年以降停止)→ MediaConvert は継続改善

MediaConvert の追加コスト:
  = HD 対応品質: $0.015/分(ET: $0.034 → MC: $0.015)
  = コスト削減率: 56%
  = 1 月 1000 時間処理: $900 削減(ET $2,040 → MC $900)

4. Elastic Transcoder の仕組み(参考・廃止予定)

Pipeline(処理キュー)の構成

┌──────────────────────────────────────────────────────────┐
│  Pipeline: "MyTranscodingPipeline"                       │
│  (複数のジョブを順序立てて処理)                        │
│                                                          │
│  Input Bucket: s3://my-video-input-bucket/               │
│  Output Bucket: s3://my-video-output-bucket/             │
│                                                          │
│  Status Queue(進捗通知):                              │
│  ├─ Progress SNS: arn:aws:sns:us-east-1:xxx:transcoding │
│  ├─ Complete SNS: arn:aws:sns:us-east-1:xxx:transcoding │
│  ├─ Error SNS: arn:aws:sns:us-east-1:xxx:transcoding    │
│  └─ Warning SNS: arn:aws:sns:us-east-1:xxx:transcoding  │
│                                                          │
│  Role: arn:aws:iam::123456789012:role/Transcoder_Role   │
│  Thumbnail Configuration:                               │
│  ├─ Pattern: frame_{count}                              │
│  ├─ Interval: 5 seconds                                 │
│  └─ Max Width: 120px                                    │
│                                                          │
└──────────────────────────────────────────────────────────┘
         │
         │ Job Submission
         ▼
┌──────────────────────────────────────────────────────────┐
│  Job: "Job-20260427-001"                                │
│  Input: s3://input-bucket/video.mp4                     │
│  Output Options:                                        │
│  ├─ Output 1: HLS 400k(Preset: 1351620000001-200045) │
│  ├─ Output 2: HLS 1M(Preset: 1351620000001-200035)   │
│  └─ Output 3: MP4 1080p(Preset: 1351620000001-100010)│
│                                                         │
│  Playlist: output/master.m3u8                          │
│  ├─ Format: HLSv3                                      │
│  └─ OutputKeys:                                        │
│     ├─ output/hls-400k.m3u8                            │
│     ├─ output/hls-1m.m3u8                              │
│     └─ output/mp4-1080p.mp4                            │
│                                                         │
└──────────────────────────────────────────────────────────┘
         │
         │ Transcoding(Elastic Transcoder が処理)
         ▼
┌──────────────────────────────────────────────────────────┐
│  Output Files in S3                                     │
│  ├─ output/hls-400k-00001.ts                           │
│  ├─ output/hls-400k-00002.ts                           │
│  ├─ output/hls-400k.m3u8                               │
│  ├─ output/hls-1m-00001.ts                             │
│  ├─ output/hls-1m.m3u8                                 │
│  ├─ output/mp4-1080p.mp4                               │
│  └─ thumbnails/frame_00000.png                         │
│     frame_00005.png ... frame_00300.png                │
│                                                        │
└──────────────────────────────────────────────────────────┘

Job の実装例(参考)

# Elastic Transcoder - Pipeline 作成(廃止予定)
aws elastictranscoder create-pipeline \
  --name "MyTranscodingPipeline" \
  --input-bucket my-video-input-bucket \
  --output-bucket my-video-output-bucket \
  --role arn:aws:iam::123456789012:role/Elastic_Transcoder_Default_Role \
  --notifications '{
    "Progressing": "arn:aws:sns:us-east-1:123456789012:transcoding",
    "Completed": "arn:aws:sns:us-east-1:123456789012:transcoding",
    "Warning": "arn:aws:sns:us-east-1:123456789012:transcoding",
    "Error": "arn:aws:sns:us-east-1:123456789012:transcoding"
  }' \
  --content-config '{
    "Bucket": "my-video-output-bucket",
    "StorageClass": "Standard",
    "Permissions": [
      {
        "GranteeType": "AllUsers",
        "Access": ["Read"]
      }
    ]
  }' \
  --thumbnail-config '{
    "Bucket": "my-thumbnail-bucket",
    "StorageClass": "ReducedRedundancy",
    "Permissions": [
      {
        "GranteeType": "AllUsers",
        "Access": ["Read"]
      }
    ]
  }'

# Job 作成(廃止予定)
aws elastictranscoder create-job \
  --pipeline-id 1234567890123-abcdef \
  --input '{"Key": "input/sample-video.mp4"}' \
  --outputs '[
    {
      "Key": "output/hls-400k",
      "PresetId": "1351620000001-200045",
      "SegmentDuration": "10",
      "Watermarks": [
        {
          "PresetWatermarkId": "watermark-123"
        }
      ]
    },
    {
      "Key": "output/hls-1m",
      "PresetId": "1351620000001-200035",
      "SegmentDuration": "10"
    }
  ]' \
  --playlist-format HLSv3 \
  --playlist '{
    "Format": "HLSv3",
    "Name": "output/playlist",
    "OutputKeys": ["output/hls-400k", "output/hls-1m"]
  }'

5. MediaConvert への移行(必須)

移行の必要性・利点

項目 Elastic Transcoder MediaConvert
サポート終了 2025/11/13 なし(継続)
コスト削減 ベース -56%(HD)
4K サポート
HDR サポート ✓ DolbyVision
DRM ✓ SPEKE
品質 VBR QVBR(品質保証)
字幕 SRT 10+ フォーマット

移行パスと実装例

Step 1: MediaConvert エンドポイント準備

import boto3

# MediaConvert は Queue / Endpoint を使用する設計
mediaconvert = boto3.client('mediaconvert', region_name='us-east-1')

# エンドポイント取得(必須)
endpoints = mediaconvert.describe_endpoints()
endpoint_url = endpoints['Endpoints'][0]['Url']

# エンドポイント指定クライアント生成
mc = boto3.client(
    'mediaconvert',
    region_name='us-east-1',
    endpoint_url=endpoint_url
)

print(f"MediaConvert Endpoint: {endpoint_url}")

Step 2: 既存 Elastic Transcoder Job → MediaConvert Job への変換

def migrate_preset_to_mediaconvert(et_preset):
    """
    Elastic Transcoder Preset → MediaConvert Settings に変換
    
    ET Preset Example:
    {
        "Name": "HLS 400k",
        "Container": "hls",
        "Video": {
            "Codec": "H.264",
            "CodecOptions": {},
            "BitRate": "400",
            "FrameRate": "30",
            "Resolution": "480x270"
        },
        "Audio": {
            "Codec": "AAC",
            "BitRate": "96",
            "SampleRate": "44100"
        }
    }
    """
    
    # Codec マッピング
    codec_map = {
        'H.264': 'H_264',
        'H.265': 'H_265',
        'VP8': 'VP8',
        'VP9': 'VP9',
        'MPEG2': 'MPEG2',
        'AV1': 'AV1'  # ET では非対応だが MC で追加可能
    }
    
    # MediaConvert Job Settings に変換
    mc_settings = {
        "Inputs": [{
            "FileInput": "s3://my-bucket/input.mp4",
            "VideoSelector": {},
            "AudioSelectors": {
                "Audio Selector 1": {
                    "DefaultSelection": "DEFAULT"
                }
            }
        }],
        "OutputGroups": [
            {
                "Name": "Apple HLS",
                "OutputGroupSettings": {
                    "Type": "HLS_GROUP_SETTINGS",
                    "HlsGroupSettings": {
                        "Destination": "s3://my-bucket/output/",
                        "SegmentLength": 10,
                        "MinSegmentLength": 0
                    }
                },
                "Outputs": [
                    {
                        "NameModifier": "_400k",
                        "VideoDescription": {
                            "CodecSettings": {
                                "Codec": codec_map.get(
                                    et_preset['Video']['Codec'], 
                                    'H_264'
                                ),
                                "H264Settings": {
                                    "RateControlMode": "QVBR",  # ET では VBR
                                    "QvbrSettings": {
                                        "QvbrQualityLevel": 7
                                    },
                                    "MaxBitrate": int(et_preset['Video']['BitRate']) * 1000,
                                    "FramerateNumerator": 30,
                                    "FramerateDenominator": 1
                                }
                            },
                            "Width": int(et_preset['Video']['Resolution'].split('x')[0]),
                            "Height": int(et_preset['Video']['Resolution'].split('x')[1])
                        },
                        "AudioDescriptions": [
                            {
                                "CodecSettings": {
                                    "Codec": "AAC",
                                    "AacSettings": {
                                        "Bitrate": int(et_preset['Audio']['BitRate']) * 1000,
                                        "SampleRate": int(et_preset['Audio']['SampleRate'])
                                    }
                                }
                            }
                        ],
                        "ContainerSettings": {
                            "Container": "M3U8"
                        }
                    }
                ]
            }
        ]
    }
    
    return mc_settings

# ET Preset
et_preset = {
    "Name": "HLS 400k",
    "Container": "hls",
    "Video": {
        "Codec": "H.264",
        "BitRate": "400",
        "FrameRate": "30",
        "Resolution": "480x270"
    },
    "Audio": {
        "Codec": "AAC",
        "BitRate": "96",
        "SampleRate": "44100"
    }
}

# 変換実行
mc_settings = migrate_preset_to_mediaconvert(et_preset)
print(json.dumps(mc_settings, indent=2))

Step 3: MediaConvert ジョブ投入

import boto3
import json

class MediaConvertMigration:
    def __init__(self, region='us-east-1'):
        self.mc_client = boto3.client('mediaconvert', region_name=region)
        self.endpoints = self.mc_client.describe_endpoints()
        self.endpoint_url = self.endpoints['Endpoints'][0]['Url']
        self.mc = boto3.client(
            'mediaconvert',
            region_name=region,
            endpoint_url=self.endpoint_url
        )
    
    def create_hls_job_from_et_preset(self, input_s3, output_bucket, 
                                      preset_name='standard'):
        """
        ET Preset 相当の MediaConvert HLS ジョブ作成
        """
        
        presets = {
            'hls-400k': {
                'bitrate': 400000,
                'width': 480,
                'height': 270,
                'audio_bitrate': 96000
            },
            'hls-1m': {
                'bitrate': 1000000,
                'width': 854,
                'height': 480,
                'audio_bitrate': 128000
            },
            'standard': {
                'bitrate': 5000000,
                'width': 1920,
                'height': 1080,
                'audio_bitrate': 192000
            }
        }
        
        preset = presets.get(preset_name, presets['standard'])
        
        job_settings = {
            "Inputs": [{
                "FileInput": input_s3,
                "AudioSelectors": {
                    "Audio Selector 1": {
                        "DefaultSelection": "DEFAULT"
                    }
                },
                "VideoSelector": {}
            }],
            "OutputGroups": [{
                "Name": "Apple HLS",
                "OutputGroupSettings": {
                    "Type": "HLS_GROUP_SETTINGS",
                    "HlsGroupSettings": {
                        "Destination": output_bucket,
                        "SegmentLength": 10,
                        "MinSegmentLength": 0,
                        "HlsVersion": "HLS_VERSION_3"
                    }
                },
                "Outputs": [
                    {
                        "NameModifier": f"_{preset_name}",
                        "VideoDescription": {
                            "CodecSettings": {
                                "Codec": "H_264",
                                "H264Settings": {
                                    "RateControlMode": "QVBR",  # 品質ベース(ET では VBR)
                                    "QvbrSettings": {
                                        "QvbrQualityLevel": 7  # 品質スコア 1-10
                                    },
                                    "MaxBitrate": preset['bitrate'],
                                    "FramerateNumerator": 30,
                                    "FramerateDenominator": 1
                                }
                            },
                            "Width": preset['width'],
                            "Height": preset['height']
                        },
                        "AudioDescriptions": [{
                            "CodecSettings": {
                                "Codec": "AAC",
                                "AacSettings": {
                                    "Bitrate": preset['audio_bitrate'],
                                    "SampleRate": 44100
                                }
                            }
                        }],
                        "ContainerSettings": {
                            "Container": "M3U8"
                        }
                    }
                ]
            }],
            "TimecodeConfig": {
                "Source": "ZEROBASED"
            }
        }
        
        # ジョブ作成
        response = self.mc.create_job(
            Role='arn:aws:iam::123456789012:role/MediaConvert_Default_Role',
            Settings=job_settings
        )
        
        job_id = response['Job']['Id']
        print(f"✓ MediaConvert Job created: {job_id}")
        print(f"  Status: {response['Job']['Status']}")
        
        return job_id
    
    def monitor_job_progress(self, job_id):
        """Job の進捗監視"""
        
        response = self.mc.get_job(Id=job_id)
        job = response['Job']
        
        return {
            'JobId': job['Id'],
            'Status': job['Status'],
            'Progress': {
                'JobPercentComplete': job.get('JobPercentComplete', 0),
                'OutputGroupDetails': job.get('OutputGroupDetails', [])
            },
            'Timing': {
                'SubmitTime': job['SubmitTime'],
                'StartTime': job.get('StartTime'),
                'EndTime': job.get('EndTime')
            }
        }
    
    def batch_migrate_et_jobs(self, job_list, output_bucket):
        """複数の ET ジョブを MediaConvert に一括移行"""
        
        migration_results = []
        
        for et_job in job_list:
            try:
                mc_job_id = self.create_hls_job_from_et_preset(
                    input_s3=et_job['input_s3'],
                    output_bucket=output_bucket,
                    preset_name=et_job.get('preset', 'standard')
                )
                
                migration_results.append({
                    'et_job_id': et_job['job_id'],
                    'mc_job_id': mc_job_id,
                    'status': 'MIGRATED'
                })
                
            except Exception as e:
                migration_results.append({
                    'et_job_id': et_job['job_id'],
                    'mc_job_id': None,
                    'status': 'FAILED',
                    'error': str(e)
                })
        
        return migration_results

# 使用例
migration = MediaConvertMigration(region='us-east-1')

# ET から想定される既存ジョブ群
et_jobs = [
    {
        'job_id': 'et-job-001',
        'input_s3': 's3://my-bucket/video1.mp4',
        'preset': 'hls-400k'
    },
    {
        'job_id': 'et-job-002',
        'input_s3': 's3://my-bucket/video2.mp4',
        'preset': 'hls-1m'
    },
    {
        'job_id': 'et-job-003',
        'input_s3': 's3://my-bucket/video3.mp4',
        'preset': 'standard'
    }
]

# 一括移行実行
results = migration.batch_migrate_et_jobs(
    job_list=et_jobs,
    output_bucket='s3://my-output-bucket/transcoded/'
)

print("\n=== Migration Results ===")
for result in results:
    print(json.dumps(result, indent=2))

6. 移行リスクと対応

移行前の検証項目

リスク 対応
出力品質低下 MediaConvert QVBR でテスト・同等品質確認
字幕処理変更 SRT 以外の字幕形式対応確認(TTML / CEA-608 等)
HLS フォーマット互換性 HLS_VERSION_3 → HLS_VERSION_4・5 への段階的更新
処理時間増加 複雑な変換では遅くなる可能性 → テスト測定
コスト増(一時的) ET + MC 並行運用 → 段階的切り替え
API 差分 ET Pipeline / Job / Preset → MC Job / Queue

段階的移行計画

Phase 1: 準備・テスト(1-2 ヶ月)
├─ MediaConvert 環境構築
├─ 既存 ET Preset を MC Settings に変換
├─ テスト動画でトランスコード実行
├─ 出力品質・処理時間比較
└─ IT / 品質確認承認

Phase 2: パイロット・低リスク案件(2-3 ヶ月)
├─ 非クリティカルなビデオのみ MC に切り替え
├─ 運用ナレッジ蓄積
├─ トラブルシューティング手順整備
└─ 本番環境での安定性確認

Phase 3: 本格移行(3-6 ヶ月)
├─ 主要案件を MC に切り替え
├─ ET のバックアップ並行運用継続
├─ 監視・アラート設定
└─ ロールバック計画を常時維持

Phase 4: ET 廃止(2025/11/13 まで)
├─ 全案件を MC に完全移行
├─ ET パイプライン / ジョブ削除
└─ ET IAM ロール削除・クリーンアップ

7. コスト比較・削減効果

料金一覧

Elastic Transcoder(廃止予定):
  SD (≤ 480p):   $0.017/分
  HD (≤ 1080p):  $0.034/分
  3D:            $0.068/分
  
MediaConvert(推奨):
  SD (≤ 480p):   $0.0075/分 → 削減率: 56%
  HD (≤ 1080p):  $0.015/分  → 削減率: 56%
  4K (≤ 4K):     $0.054/分  → ET では未対応
  UHD (8K):      $0.080/分  → ET では未対応

TCO 計算例

Scenario: 動画配信プラットフォーム
  ├─ 1 日の処理: 100 時間
  ├─ 1 日の処理構成:
  │  ├─ 60 時間 HD 処理
  │  ├─ 30 時間 SD 処理
  │  └─ 10 時間 4K 処理

ET での年間コスト:
  = (60 × 60 × 24 × 365) × $0.034/分 + (30 × 60 × 24 × 365) × $0.017/分
  = 31,536,000 分 × $0.034 + 15,768,000 分 × $0.017
  = $1,072,224 + $268,056
  = $1,340,280/年

MC での年間コスト:
  = (60 × 60 × 24 × 365) × $0.015/分 + (30 × 60 × 24 × 365) × $0.0075/分 + (10 × 60 × 24 × 365) × $0.054/分
  = 31,536,000 分 × $0.015 + 15,768,000 分 × $0.0075 + 5,256,000 分 × $0.054
  = $473,040 + $118,260 + $283,824
  = $875,124/年

年間削減額:
  = $1,340,280 - $875,124
  = $465,156 削減(34.7% コスト削減)

+ 新規 4K 対応で追加売上機会
  = 4K オプション月額 $10/ユーザー
  = 既存ユーザー 5% が 4K アップグレード
  = 追加売上: $10 × 月間ユーザー数 × 5%

8. まとめ・推奨アクション

【重要】 Elastic Transcoder は廃止予定

┌────────────────────────────────────────────────────────────┐
│  Service Status: END OF SUPPORT = 2025 年 11 月 13 日     │
│                                                            │
│  現状: Legacy Service(機能追加なし)                     │
│  ↓                                                        │
│  推奨: AWS Elemental MediaConvert に移行                  │
│                                                            │
│  利点:                                                    │
│  ✓ コスト 56% 削減(同等品質比較)                        │
│  ✓ 4K / 8K / HDR / DRM 対応                              │
│  ✓ 継続的な機能改善                                      │
│  ✓ AWS のサポート継続                                    │
│                                                            │
│  移行タイムライン:                                        │
│  Phase 1: 2026/04-06 準備・テスト                        │
│  Phase 2: 2026/07-09 パイロット移行                      │
│  Phase 3: 2026/09-11 本格移行                            │
│  Phase 4: 2025/11/13 ET 完全廃止                         │
└────────────────────────────────────────────────────────────┘

推奨アクション(即座に実施)

  1. 環境調査(2026/05 まで)

    • [ ] 現在の ET Pipeline / Job 数の把握
    • [ ] 処理内容・出力形式の分類
    • [ ] コスト分析・削減効果の試算
  2. MediaConvert 検証(2026/06-08)

    • [ ] Preset 変換ツール検証
    • [ ] テスト動画でのトランスコード実行
    • [ ] 品質比較・パフォーマンス測定
  3. 移行計画策定(2026/08)

    • [ ] Wave 計画・段階化スケジュール
    • [ ] ロールバック手順整備
    • [ ] 監視・アラート設定
  4. 実装・テスト(2026/09-11)

    • [ ] 本格移行実施
    • [ ] ET パイプライン段階的廃止
    • [ ] 最終検証・ローンチ

参考資料