Photo by ERIK Miheyeu from Shutterstock
本記事では、AWS LambdaとAWS Elemental MediaConvertを組み合わせた動画エンコードの自動化パイプラインをご紹介します。Amazon S3バケットに新しいメディアファイルがアップロードされると、Lambda関数が自動的に起動し、MediaConvertがそのファイルのエンコード処理を開始します。
このソリューションのデプロイと運用を効率化するため、Infrastructure as Code(IaC)の考え方を採り入れ、Terraformで構成しています。GitHubリポジトリこちらのTerraform設定を使えば、必要なAWSリソースをコードで一括プロビジョニングおよび管理できます。(注:参考コードはご自身の環境や動画エンコードの要件に合わせて調整してください。VPC設定など他のインフラ要素を追加するためのTerraformモジュールを組み込むことも可能です。)
基本アーキテクチャ図
ステップ1. ソースおよび出力先のS3バケットを作成する
- 入力メディアファイル用のプライベートS3バケットを作成します。
例:my-mediaconvert-src-bucket 2. 変換後のメディアファイル用のプライベートS3バケットを作成します。
例:my-mediaconvert-dst-bucket
ステップ1
ステップ2. MediaConvert用のサービスロールを作成する
- IAM/rolesに移動し、Trusted Entity Type で AWS service を選択、MediaConvertを検索して選択し、「Next」をクリックします。
ステップ2.1
- デフォルトのポリシーをそのままにして、「Next」をクリックします。
ステップ2.2
- ロール名、説明、タグ(任意)を入力し、「Create Role」をクリックします。
例:mediaconvert_role

ステップ2.3
ステップ3. Lambda用のサービスロールを作成する
- ステップ2と同じ手順で、今回はサービスとしてlambdaを選び、AWS管理ポリシーAWSLambdaBasicExecutionRoleをアタッチします。
ロールを作成します。
例:lambda_convert_role
- ロールを作成したら、以下のJSONを使ってLambdaロールにインラインポリシー(例:lambda_convert_inline_policy)をアタッチします。(AWSアカウント番号 XXXXXXXXX はご自身の値に置き換えてください)
{
"Version": "2012-10-17",
"Statement": [\
{\
"Sid": "VisualEditor0",\
"Effect": "Allow",\
"Action": "iam:PassRole",\
"Resource": "arn:aws:iam::XXXXXXXXX:role/*"\
},\
{\
"Sid": "VisualEditor1",\
"Effect": "Allow",\
"Action": [\
"mediaconvert:*",\
"logs:CreateLogStream",\
"logs:CreateLogGroup",\
"logs:PutLogEvents"\
],\
"Resource": "*"\
}\
]
}
注:作成済みのすべてのロールではなく、MediaConvertロールのみに権限を限定したい場合は、上記ポリシーの該当箇所をARNforMediaConvertRoleに書き換えてください。
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": ["iam:PassRole"],
"Resource": ["ARNforMediaConvertRole"],
}
- 最終的に以下のような形になります。
{
"Version": "2012-10-17",
"Statement": [\
{\
"Sid": "VisualEditor0",\
"Effect": "Allow",\
"Action": "iam:PassRole",\
"Resource": "arn:aws:iam::XXXXXXXXXX:role/lambda_convert_role"\
},\
{\
"Sid": "VisualEditor1",\
"Effect": "Allow",\
"Action": [\
"mediaconvert:*",\
"logs:CreateLogStream",\
"logs:CreateLogGroup",\
"logs:PutLogEvents"\
],\
"Resource": "*"\
}\
]
}
- Lambdaロール:例:lambda_convert_role

ステップ3
ステップ4. Lambda関数を作成する — ソースS3バケットへのオブジェクト作成イベント(メディアファイルのアップロード)に応じて、対象ファイルのMediaConvertジョブを起動するLambda関数を作成します。
- Lambda関数を「一から作成」で新規作成し、ステップ3で作成したLambdaロール(lambda_convert_role)を指定して「Create function」をクリックします。
例:mediaconvert_lambda

ステップ4.1
- lambda.zipをLambda関数にアップロードしてデプロイします。(参考用のlambda_zipはGitHubリポジトリこちらから入手できます)

ステップ4.2
- Lambdaハンドラーを確認します。

ステップ4.3
- 設定画面の「environment variables」をご自身の値に書き換えます。

ステップ4.4

ステップ4.5
ステップ5. Lambda関数を起動するためのS3イベント通知を作成する
- ソースバケット(例:my-mediaconvert-src-bucket)を開き、「プロパティ」を選択します。

ステップ5.1
- 下にスクロールし、Event Notification セクションで Create event notification をクリックします。

ステップ5.2
- 「all objects create events」を選択し、Event Name などの基本項目を入力します。

ステップ5.3
- 送信先としてLambda Functionを選び、ステップ4で作成したmediaconvert_lambda関数を指定して保存します。

ステップ5.4
ステップ6. ジョブの成功・失敗を通知するSNSを設定する(任意 — 不要であればステップ8に進んでテストしてください)
- SNSトピックとサブスクリプション(メールやメッセージなど)を作成し、サブスクリプションを承認します。

ステップ6.1
ステップ7(任意):MediaConvertジョブのステータスを監視して通知するCloudWatchイベントルールを作成する
- 名前と説明を付けて新しいルールを作成し、Event source として AWS events or EventBridge partner events を選択、Selection Creation Method と Event Pattern を以下のように指定します。

ステップ7.1
ステップ7.2
- ターゲットにSNSトピックを指定します。

ステップ7.3
ステップ8:動作確認(通知を設定した場合はその確認も)
ソースS3バケットにメディアファイルをいくつかアップロードし、各ファイルに対してLambdaがMediaConvertジョブを起動すること、出力先バケットに変換済みファイルが生成されることを確認します。
- ソースS3バケットにメディアファイルをアップロードします。

ステップ8.1
- Lambda関数がMediaConvertジョブを起動します。

ステップ8.2
- メディアファイルは指定したjob.jsonの内容に従って変換されます。変換後のファイルは出力先バケットで確認できます。

ステップ8.3
- 通知(設定した場合)
ステップ8.4
まとめ— 本記事では、AWS LambdaでAWS Elemental MediaConvertのジョブを自動化する方法をご紹介しました。今回のソリューションは、S3バケットに新しい動画がアップロードされたタイミングでMediaConvertのトランスコード処理をシームレスに開始し、メディア処理のワークフロー全体を効率化します。