AWSを使って HP上でストリーミング再生する環境を構築しました ~続き2/3~

こんにちは。かな~り期間が空いてしまいました...

online劇場の配信構築や、AWSプラクティショナー試験勉強を進めていました。後日それらの件についても記事にしたいと思います。

さて、本記事は前回の記事の続きとなります。

本記事では①MediaConvertの設定 ②MediaConvertをLambdaで呼び出すためのソースコード編集

について触れていきます。

1.MediaConvertの設定

Lambdaのコードを書き換える前に、MediaConvertの設定をします。

awsにログインしコンソール画面を開いた後、サービス → MediaConvertを選択します。続いて、左のメニューからジョブテンプレートを選択。

この画面へ遷移したら、橙色のテンプレートの作成をクリック。

一般設定はお好みで大丈夫です。ここでは名前をsodane_templateとしました。

続いて、入力や出力の設定を変更していきます。設定についてはこちらで紹介されているので、真似してみてください。以下、変更点のポイントを箇条書き

・今回はストリーミング再生をする環境を構築したいので、出力グループの追加はAPPLE HLSとしました。DASH-ISOやCMAFなどの形式も選択できるので、環境に合わせて選んでください。

・出力グループ、Apple HLSの送信先は前記事にて作成したS3バケット、example-bucket-sodane / outputを指定しました。MediaConvertのファイル出力先を指定しています。

・解像度やフレームレート、ビットレート等の映像設定、音声ビットレートやサンプルレートは適宜変更してください。

全ての設定が完了し、作成をすると...

MediaConvertのジョブテンプレートにsodane_templeteができました!

以上で、このジョブテンプレートが実行されると、.mp4ファイルがHLS形式へと変更(.m3u8 & .ts)され、加えてサムネイル(.jpg)が生成される仕組みの完成です。

2.LambdaでMediaConvert起動させ、ジョブテンプレートを実行する

実は、前回作成したLambda関数のIAMロールだと、権限が少ない&好ましくありません。

IAMでは「認証」「認可」を行う、つまり ”誰が” ”何を” ”どこの” ”読み取る/書き込む”、といったような権限を制限しています。

IAMでのセキュリティのベストプラクティスでも、「権限は最小限」を推奨していますので、権限を最小限にかつ、足りない権限を付け加えます。

①MediaConvertとLambdaで使用するIAMを作成、修正する

さきほど、MediaConvertでジョブテンプレートを作成しましたが、そのジョブテンプレートを実行する際に使用するIAMロールの作成と、前記事にてlambdaを作成した際に指定した「lambda-s3-fullaccess」ロールを修正します。理由としては、

①lambdaがs3に存在する全てのバケットに対して、全ての操作権限を持っている(読み込み、書き込み、参照など)

②LambdaがMediaConvertを実行する権限がない。

以上2点が問題点ですので、IAMロールの作成&修正をします。

まず初めにコンソール画面から、サービス→IAMを選択、ポリシーの作成をクリック。lambdaで使用するロールのためのポリシーから作成します。

JSONタブをクリックし、以下の内容に書き換えた後、ポリシーの確認をクリック。ポリシーの名前は sodane-lambda-policyとしました。名前のルールは何もないので、分かりやすい名前にしておくと、後々楽になるかもしれません。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "iam:PassRole", "mediaconvert:CreateJob" ], "Resource": "*" } ] }

続いて、MediaConvertで使用するロールも先に作ってしまいます。同じ要領で、ポリシーの作成をクリックした後、以下のコードに書き換えます。名前はsodane-mediaconvert-policyとしました。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject" ], "Resource": "arn:aws:s3:::example-bucket-sodane/*" } ] }

すると、以下のように、sodane-lambda-policy、sodane-mediaconvert-policy、2つのポリシーが作成されました!

続いて、作成したポリシーを基に、今度はロールを作成します。

コンソール画面からIAM→ロールを選択し、ロールの作成をクリック。始めにlambdaで使用、続いて、mediaconvertで使用するロールの順に作成します。

ユースケースの選択でLambdaを選択した後、次のステップ:アクセス権限をクリック。

ここで、先ほど作成したsodane-lambda-policyをアタッチします。

続いて、次のステップ:タグをクリック、ここでは何も設定せず確認をクリックします。

最後にロール名やロールの説明を加えます。ここでは、ロール名をsodane-lambda-rollとしました。ロールの説明は変更せず、ロールの作成をクリックすると、sodane-lambda-rollが作成されました!

次に、mediaconvertで使用するロールについても同じ要領で作成していきます。

まず、ユースケースでMediaConvertを選択し、sodane-mediaconvert-policyをアタッチしようとしますが、、

アタッチしたいsodane-mediaconvert-policyがでてきてくれません。

1度このまま、次のステップ:タグ をクリック、タグは追加せず最後の確認画面へと進みます。名前はsodane-mediaconvert-rollとし、ロールを作成します。

たった今作成したロールの中身を修正するため、ロールにてsodane-mediaconvert-rollを選択、アクセス権限→ポリシーをアタッチしますをクリック。

ここで、sodane-mediaconvert-policyをsodane-mediaconvert-rollにアタッチします。

最後に、デフォルトでアタッチされていたポリシーを削除します。下の写真のように、アクセス権限にて×をクリックし、削除するだけでOKです。

以上で、lambdaとmediaconvertに関するロールの作成は終了となります。

②Lambdaで使用する関数を修正する

Lambdaのコードについては、https://dev.classmethod.jp/articles/elemental-mediaconvert-mp4-to-hls-lmabda/を参考に作成しました。

lambdaの関数コードで、job.jsonファイルを作成し、以下のコードを貼り付けます。

{ "OutputGroups": [ { "Name": "Apple HLS", "OutputGroupSettings": { "Type": "HLS_GROUP_SETTINGS", "HlsGroupSettings": { "Destination": "" } } }, { "Name": "File Group", "OutputGroupSettings": { "Type": "FILE_GROUP_SETTINGS", "FileGroupSettings": { "Destination": "" } } } ], "Inputs": [ { "FileInput": "" } ] }

続いて、lambda_function.py(ハンドラをセットする関数)に以下のコードを貼り付け。

//lambda_function.py

import json import urllib.parse import boto3 import os print('Loading function') s3 = boto3.client('s3') mediaconvert = boto3.client('mediaconvert', region_name='ap-northeast-1', endpoint_url='https://******.mediaconvert.ap-northeast-1.amazonaws.com') def lambda_handler(event, context): # Get the object from the event and show its content type bucket = event['Records'][0]['s3']['bucket']['name'] key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8') inputFile = "s3://" + bucket + "/" + key outputKey = "s3://example-bucket-sodane/output/" try: # Load job.json from disk and store as Python object: job_object with open("job.json", "r") as jsonfile: job_object = json.load(jsonfile) # Input/Output Setting job_object["OutputGroups"][0]["OutputGroupSettings"]["HlsGroupSettings"]["Destination"] = outputKey job_object["OutputGroups"][1]["OutputGroupSettings"]["FileGroupSettings"]["Destination"] = outputKey job_object["Inputs"][0]["FileInput"] = inputFile # Exec MediaConvert's job response = mediaconvert.create_job( JobTemplate='arn:aws:mediaconvert:ap-northeast-1:^^^^^^^^^^^:jobTemplates/sodane_template', Queue='arn:aws:mediaconvert:ap-northeast-1:^^^^^^^^^^^^:queues/Default', Role='arn:aws:iam::^^^^^^^^^^:role/sodane-mediaconvert-roll', Settings=job_object ) except Exception as e: print(e) print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket)) raise e

region_name='ap-northeast-1'
endpoint_url='https://******.mediaconvert.ap-northeast-1.amazonaws.com')
outputKey = "s3://example-bucket-sodane/output/
JobTemplate='arn:aws:mediaconvert:ap-northeast-1:^^^^^^^^^^^:jobTemplates/sodane_template',
Queue='arn:aws:mediaconvert:ap-northeast-1:^^^^^^^^^^^^:queues/Default',
Role='arn:aws:iam::^^^^^^^^^^:role/s3_mediaconvert',

コードの中で、幾つかの部分はユーザによって異なるので、変更が必要となる可能性があります。
・青字はユーザの使用するリージョンを指します。東京リージョン以外を使用しているのであれば、変更が必要となります。
・赤字はアカウントID(12桁の半角数字)を入力してください。誤って公開してしまうと、、見知らぬ請求がくることもあるので、アカウントIDについては外部に絶対漏らしてはいけません。
・緑字はMediaConvertのAPIエンドポイントを示しています。MediaConvertのアカウントから確認することができます。(下図参照)

lambdaの設定は以上です!

これで、S3のinputフォルダに.mp4ファイルがPUTされると、それをトリガーにlambda関数が立ち上がり、mediaconvertを実行させ、特定のS3バケットにHLS形式で作成された.m3u8 & .tsファイル+サムネイルが、S3のoutputフォルダに格納される仕組みの出来上がりです!

3.デモしてみる

試しに、動かしてみます。

・example-bucket-sodane / input に sample.mp4ファイルをアップロード

・MediaConvertのジョブを確認すると、sample.mp4に対してジョブが実行されていました。COMPLETE。

・S3のoutputを覗いてみると

ファイルが生成されていました!

4.おわりに

任意の.mp4ファイルが特定のバケットへアップロードされると、HLS変換され、任意のバケットのフォルダに出力されるシステムが出来上がりました。

S3はインターネットからの接続が可能です。プレイヤーさえあればHP上などで動画を再生することが可能となります。

次回は、MediaConvertのジョブが実行された後、Chatworkへ完了通知をPOSTする仕組みの解説をしたいと思います。

© HTB北海道テレビ放送株式会社