Amazon Web Services ブログ

S3 バッチオペレーションでビデオファイルをトランスコードする

簡単にペタバイトのデータになりかねない最新のビデオアーカイブの実用的なストレージ管理には、大量に迅速に作業する能力 (ハードではなくスマートに作業する能力) が不可欠です。S3 バッチオペレーションAmazon S3 の機能で、1 回のリクエストまたは S3 コンソールでの数回のクリックで、数百万または数十億のオブジェクト間でオブジェクトをコピーまたはタグ付けするなどのアクションを実行できます。提供するのはオブジェクトのリストのみで、S3 バッチオペレーションは、再試行の管理や進行状況の表示など、残りの作業を処理します。

多くのメディア企業は、大規模なビデオリポジトリを S3 に保存しています。現在のビデオは S3 Standard に保存し、古いビデオは S3 Glacier にアーカイブする方法が一般的です。Lambda の呼び出しは、新しいオブジェクトをバケットに入れるなどの S3 イベントでトリガーできるでしょう。S3 バッチオペレーションは、既存のオブジェクトの Lambda 関数のトリガーや、S3 での他の大規模なタスクの実行を支援する管理ソリューションを提供します。

この投稿では、S3 に保存されたビデオまたは Amazon S3 Glacier からの復元が必要なビデオのいずれかから、AWS Lambda を使用して S3 バッチオペレーションでビデオトランスコーディングジョブをトリガーする方法を確認します。

Lambda トランスコーディングワークフローを作成する

典型的なトランスコーディングワークフローは、既存のビデオファイルを取得し、それをビデオオンデマンド再生用に複数のファイルタイプに変換します。この例では、VOD Automation ワークフローポストを使用して、ファイルのトランスコーディングワークフローを作成します。ここでは S3 に既に保存されているビデオオブジェクト、および S3 Glacier にアーカイブされているビデオオブジェクトをサポートするワークフローに変更を加えます。

最初に、上記のリンクを使用して VOD 自動化ワークフローを設定します。手順 2 に到達し、Lambda 関数を作成したら、この投稿に戻ります。Lambda 関数を変更して、S3 バッチオペレーションで動作するようにする必要があります。Lambda 関数のこの変更は、Lambda に渡されたイベント JSON の新しいフィールドのメタデータを使用し、ジョブレスポンスを S3 バッチオペレーションに送り返します。詳細については、「Amazon S3 バッチオペレーションから Lambda 関数を呼び出す」を参照してください。

VOD Automation ポストは、Lambda の S3 トリガーを使用して、ビデオファイルを取り込むバケットをポイントします。S3 バッチオペレーションのために作成する Lambda 関数では、S3 バッチオペレーションジョブが Lambda 関数を直接トリガーするため、S3 トリガーを設定しないでください。

VOD Automation ポストに対する Lambda での S3 トリガー

convert.py ファイルで、先頭に次のコード行を追加して、S3 バッチオペレーションイベント ID と特定のタスク情報 (S3Bucket や S3Key など) を抽出します。

最初に、S3 バッチオペレーションジョブは、イベント JSON でジョブパラメータを Lambda に送信します。これには、jobIdinvocationId、および invocationSchemaVersion が含まれます。Lambda は、次の 3 行を追加してこれらのパラメータを取得します。

jobId = event[‘job’][‘id’]
invocationId = event[‘invocationId’]
invocationSchemaVersion = event[‘invocationSchemaVersion’]

イベント JSON タスクディクショナリに特定の S3 バケットとキー情報が追加されたため、さらに数行がイベントレコードでこの情報を直接抽出します。次の行を追加します。

task = event[‘tasks’][0]
taskId = task[‘taskId’]
sourceS3BucketArn = task[‘S3BucketArn’]
sourceS3Key = task[‘S3Key’]

S3 バッチオペレーションから正しいパラメータを取得する Lamda のコード

S3 バッチオペレーションから Lambda を呼び出すたびに、taskIdresultCode、および resultString を含む結果ディクショナリも必要です。AWS Elemental MediaConvert ジョブからのレスポンスに応じて、resultCode および resultString を設定しました。たとえば、MediaConvert ジョブの送信時に例外がある場合、例外文字列に対して resultCode = 500 および resultString = e です。次に、MediaConvert ジョブの最後に、結果配列に結果を追加するために次のコードブロックを追加しました。

finally:
   results.append ({
      ‘taskId’: taskId,
      ‘resultCode’: resultCode,
      ‘resultString’: resultString,
   })

S3 バッチオペレーションで Lambda をトリガーする場合、特別なデータフィールドを返す新しいレスポンスを作成する必要があります。これは、Lambda 関数が各タスクを正常に実行したかどうかを S3 バッチオペレーションに伝えます。この特定のケースでは、Lambda は MediaConvert ジョブが正常に送信されたかどうかを返します。

return {
   ‘invocationSchemaVersion’: invocationSchemaVersion,
   ‘treatMissingKeyAs’: ‘Permenant Failure’,
   ‘invocationId’: invocationId,
   ‘results’: results
}

S3 バッチオペレーションで Lambda をトリガーする場合、特別なデータフィールドを返す新しいレスポンスを作成する必要があります。

コンソールを使用して S3 バッチオペレーションジョブを作成する

トランスコードワークフローが完了したので、S3 バッチオペレーションジョブをセットアップします。ジョブは、提供されたオブジェクト、実行された操作、および S3 バッチオペレーションジョブに指定されたパラメータのリスト (マニフェストと呼ばれる) をまとめて参照します。

ビデオオブジェクトのセットをトランスコードするには、AWS Lambda 関数の呼び出し操作を使用し、MediaConvert ジョブを呼び出すために作成した Lambda 関数を指定します。

オブジェクトをトランスコードするジョブの作成を始めましょう。

  1. S3 コンソールで [バケット] を選択し、[バケット] の下の左側のタブで [バッチ処理] をクリックします。
  2. [ジョブの作成] を選択します。
  3. S3 バケットに適切なリージョンを選択します。[マニフェストの選択] の下で、オブジェクトの保存場所と [CSV] ファイルを選択し、S3 バケットへのパスを入力します。マニフェストにバージョン ID が含まれている場合は、そのボックスをオンにして、[次へ] を選択します。 S3 コンソールを使用してバッチオペレーションジョブを作成する
  4. [AWS Lambda 関数の呼び出し] を選択し、作成した Lambda 関数 (この場合は VODLambdaConvertBatch) を選択します。$LATEST とは異なるバージョンが必要な場合は、関数のバージョンを選択します。
  5. [次へ] を選択します。
  6. セットアップウィザードの手順 3 で、ジョブに説明と優先度を指定し、レポートの種類と出力先を選択します。
  7. S3 バッチオペレーションジョブが引き受ける IAM ロールを選択します。S3 で必要なロールと Lambda 関数の呼び出しの詳細については、「Amazon S3 バッチオペレーションからの Lambda 関数の呼び出し」を参照してください。
    • オブジェクトソースバケットとマニフェストファイルを保持するバケットの s3:GetObject および s3:GetObjectVersion に対する権限を持つロールを選択します。
    • ロールには、ジョブ完了レポートの宛先バケットに対する s3:PutObject も必要です。
    • 最後に、ロールには、呼び出す Lambda 関数に対する lambda:InvokeFunction 権限が必要です。この場合、ロール名は S3BatchLambdaRole。S3 バッチオペレーションジョブの IAM ロール - 権限
  8. [次へ] を選択します。
  9. 手順 4 では、[ジョブの作成] を選択する前に、ジョブパラメータを確認および検証します。
  10. S3 はジョブのマニフェストの読み取りが完了すると、ジョブを確認待ちに移動します。ここから、マニフェスト内のオブジェクトの数を確認し、[ジョブの確認] を選択して実行できます。

ジョブの実行開始後、コンソールダッシュボードビューを使用するか、特定のジョブを選択することにより、オブジェクトレベルの進捗を確認できます。各 Lambda 呼び出しが発生すると、S3 はログを CloudWatch Logs に書き込みます。

  1. Lambda コンソールで、Lambda 関数を選択し、[監視] を選択します。CloudWatch でログを表示する簡単なナビゲーションボタンとともに、Lambda Invoke メトリクスを確認できます。
  2. S3 バッチオペレーションジョブが完了したら、Success および Failed オブジェクトカウントを表示して、すべてが期待どおりに実行されたことを確認します。失敗したオブジェクトの詳細については、ジョブレポートを参照してください。
  3. ビデオトランスコードジョブを監視するには、MediaConvert サービスに移動して、各ファイルのトランスコードジョブを監視します。

S3 Glacier Restore の変更

多くの場合、企業は古いビデオオブジェクトを S3 Glacier に保存していますが、同じトランスコードジョブを実行して、ビデオを再生用に準備する必要があります。ワークフローは、いくつかの小さな変更を除いて、上記の手順に似ています。

  1. VOD オートメーションワークフローを使用して Lambda 関数を作成する場合、復元されたビデオを受信する S3 バケットで S3 トリガーを設定します。イベントタイプでは、[完了した Glacier から復元] を選択します。 以前に作成した関数には S3 バッチオペレーションレポート用の特定の追加が必要だったため、S3 でトリガーするための別個の Lambda 関数を作成します。
  2. 次の変更を加えて、以前と同様に S3 バッチオペレーションジョブを作成します。
    1. 手順 2 では、[AWS Lambda 関数の呼び出し] を選択する代わりに、[復元] を選択します。
    2. [復元オプション] の下で、復元されたオブジェクトを使用可能にしておく日数を選択します。元のオブジェクトは S3 Glacier に残ります。選択した日数が経過すると、S3 は復元されたオブジェクトを削除し、S3 Glacier のコピーのみを残します。トランスコーディングジョブでは、トランスコードジョブを完了するのに十分な時間だけオブジェクトを復元する必要があります。この時点で、ユーザーまたは S3 は復元されたオブジェクトを削除できます。
    3. 必要な取得時間を [バルクまたは標準] から選択します。[次へ] をクリックします。
    4. 手順 3 では、IAM ロール以外、前述の同じオプションを使用します。S3 Glacier の復元ジョブの場合、IAM ロールには、S3 Glacier オブジェクトを含むバケットの s3:RestoreObject 権限も必要です。
  3. 前と同様に、ジョブの作成と確認の手順を完了します。
  4. この新しい関数は、クライアントが S3 Glacier 復元ジョブを送信するとアクティブになります。選択した取得時間に基づいて、S3 は S3 Glacier からオブジェクトを復元します。完了した各オブジェクトの復元機能は、VOD オートメーションワークフローをトリガーし、MediaConvert でトランスコードジョブを完了します。

知っておくべきこと

S3 バッチオペレーションの機能を検討する際には、いくつかの重要な情報に留意してください。

Lambda 同時呼び出し:

Lambda 関数で S3 バッチオペレーションを使用する場合、各オブジェクトは個別の Lambda 呼び出しを引き起こします。S3 バッチオペレーションジョブが大きい場合、複数の Lambda 関数を同時に呼び出して、Lambda を同時実行することでスパイクを引き起こす可能性があります。

各 AWS アカウントには、リージョンごとの Lambda 同時実行制限があります。したがって、AWS Lambda 関数スケーリングを確認する必要があります。S3 バッチオペレーションで Lambda 関数を使用するためのベストプラクティスは、Lambda 関数自体に同時実行の制限を設定することです。これにより、バッチジョブが Lambda の同時実行のほとんどを消費し、アカウントの他の機能を潜在的に抑制することを防ぎます。

Lambda イベントトリガーと S3 バッチオペレーションから Lambda を呼び出す:

S3 バッチオペレーションで使用する Lambda 関数を作成する場合、S3 バッチオペレーションが特定のタスクデータを Lambda に送信し、結果データを返すことが予想されるため、新しい Lambda 関数を作成する必要があります。

これは、返される結果データを必要としないイベントトリガーを使用する一般的な Lambda 関数とは異なります。Lambda ルールに対する他の異常な例外の詳細については、「Amazon S3 バッチオペレーションからの Lambda 関数の呼び出し」を参照してください。

S3 イベント通知:

S3 イベント通知を使用する場合、配信は通常数秒以内に行われますが、数分かかる場合もあります。まれに、イベントが失われる場合があります。

アプリが復元および処理されたすべてのオブジェクトが S3 Glacier から復元され、S3 バッチオペレーションを使用して処理されたことを確認するには、インベントリ内のアイテムの数を S3 オペレーションジョブの結果の数と比較します。詳細については、「Amazon S3 イベント通知の設定」を参照してください。

S3 バッチオペレーションの失敗のしきい値:

1000 を超える操作が試行された後、ジョブのオブジェクト操作の 50% 以上が失敗している場合、ジョブは自動的に失敗します。最終レポートを確認して、失敗の原因を特定してください。

S3 バッチオペレーションの費用:

S3 バッチオペレーションには、ジョブごとに 0.25 ドル、100 万のオブジェクト操作を実行するごとに 1 ドルが課金されます。これは、データ転送、リクエストなど、S3 バッチオペレーションがお客様に代わって実行する操作に関連する料金やその他の料金に追加して課金されます。S3 バッチオペレーションジョブに関連する費用をよりよく理解するには、ジョブをオブジェクトの大規模なインベントリにスケールアップする前に少数のオブジェクトに対してワークフローをテストして、予想される費用を確認してください。

まとめ

この投稿では、アーカイブ内の数百、数千、または数百万のファイルにわたってビデオをトランスコードするために繰り返し Lambda 関数をトリガーする S3 バッチオペレーションの設定プロセスをレビューしました。また、この同じプロセスをいくつかの変更を加えて使用して、トランスコーディングのために S3 Glacier から古いアーカイブファイルを引き出す方法も確認しました。

今すぐ利用可能

S3 バッチオペレーションは、アジアパシフィック (大阪) を除くすべての商用 AWS リージョンで利用できます。また、S3 バッチオペレーションは、AWS GovCloud (米国) リージョンのどちらでもご利用いただけます。

この記事が役に立ち、紹介したソリューションが興味深いものであれば幸いです。ご意見やコメントをお待ちしております。