AWS Elemental MediaConvertで動画変換が完了した事をSlackに通知する仕組みを作ってみた

Convertできたよ君(安直)
2020.06.05

直近は、スペースXによるクルードラゴンのデモ2の様子を見守る為に夜更かし続きでした。


▲ ブースターの着陸、興奮しましたね!

こんにちは、AWS事業本部のShirotaです。
クルードラゴンの動画の見所は、「ギラギラの恐竜のぬいぐるみが微小重力の中で浮かんでいる」ところだと思いました。そんな可愛い荷物が載っていたなんて。気になった方は是非動画を見返してみて下さい。
さて、今回はAWS Elemental MediaConvertで動画変換をしていた際に「終わったよ通知が欲しいな……」と思って実際にやってみた時の話をしたいと思います。

今回やりたい事

AWS Elemental MediaConvert(以下MediaConvert)は動画ファイルを変換してくれるサービスで、様々な形式への動画変換をサポートしています。
CloudFrontと組み合わせたりすれば、変換した高品質の動画を世界中で配信する為の環境も用意できたりととても便利なサービスとなっています。
高品質な動画変換を実施するとなると、高性能のコンピューティング資源を利用する事となり、それらを用いた上でも時間を有する事があります。

超高精細 (UHD) コンテンツや高ダイナミックレンジ (HDR) コンテンツなどのプレミアムコンテンツを作成する AWS Elemental MediaConvert ジョブでは、高いコンピューティング要件があり、完了までに時間がかかることがあります。

AWS Elemental MediaConvert での 高速トランスコード の使用 - MediaConvert

このような状況下で、ジョブの完了を定期的に確認する事って結構手間がかかるのではないでしょうか。
そこで、今回はタイトルの通り「AWS Elemental MediaConvertで動画変換が完了した事をSlackに通知する仕組み」を作ってみる事にしました。
こちらから確認しに行かなくても、Slackに「動画変換のジョブが完了したよ」と言いに来てくれると便利ですよね。 Convertできたよ君 とかが。
ちょっと聞き慣れない言葉が出て来たかもしれませんが、いずれ嫌でも分かる為このまま進めていきましょう。

さて、「Convertできたよ君」を実現する為に、どのような環境を構築すれば良いのかを考えてみました。

そもそも「Convertできたよ君」に私が望む事を言語化すると、 MediaConvertのジョブステータスが「COMPLETE」になった時に、その旨をSlackに通知して欲しい という事になります。
これを、AWSのサービスを駆使して実現させようと思って構想を練ってみました。

初手、AWS Chatbotに想いを馳せる

まずは、つい先日一般公開となったばかりのAWS Chatbot(以下Chatbot)を使っての連携ができるんじゃないかと考えつきました。

ついに来た! AWS Chatbot が一般公開(GA)になりました! Slack連携が捗ります! | Developers.IO

Slackへの通知を手軽にやりたい、と考えた時に頭に浮かぶサービスとなったChatbotです。

また、今回MediaConvertのジョブステータスが「COMPLETE」になった事はAmazon CloudWatch Events(以下CloudWatch Events)で検知できるのではないかと考えました。
ChatbotはCloudWatch Eventsをサポートしており、以下の公式ドキュメントのようにSNSトピックを用いる事で連携が実現できそうです。

AWS Chatbot supports several AWS services through Amazon CloudWatch Events rules. CloudWatch uses CloudWatch Events rules to help manage AWS service events and how you respond to them. You can use these rules to associate an Amazon SNS topic (or other actions) with an event type from any AWS service.

Using AWS Chatbot with other AWS services - AWS Chatbot

ここから私が初めに考えたConvertできたよ君の構成は以下のようになりました。


▲ コーディング要らずでいける予感

ただ、この後前述した公式ドキュメントを読み進めると、以下のような記載がありました。

AWS Chatbot supports CloudWatch Events for the following AWS services: AWS Config, Amazon GuardDuty, AWS Health, AWS Security Hub, and AWS Systems Manager.

残念ながら2020年6月5日現在、MediaConvertはサポート外です。
いずれ対応してくれる日が来る事を待ちつつ、他の手段を考える事にしました。

二手、Lambdaに戻ってみる

AWSとSlackの連携と言えば、という事で次に考えたのはLambdaを使ってSlackに通知を飛ばす構成でした。
この時のConvertできたよ君の構成は以下のようになりました。


▲ 安定のLambda感

MediaConvertのジョブステータスが「COMPLETE」になった事をCloudWatch Eventsで検知して、それをトリガーにしてLambdaを動かし、Slackへ通知が飛ぶようにしています。
これならやりたかった事ができるConvertできたよ君が実装できそうですね!
今回は、この方法でやってみる事にしました。

やる事を整理する

方針立てもできたので、Convertできたよ君が通知を飛ばせるようにする為にやる事を箇条書きにしてみます。

  • MediaConvertで動画を変換する為のジョブテンプレートを用意する
  • SlackにConvertできたよ君のAppを作成する
  • LambdaにSlack通知をさせるコードを書く
  • LambdaにCloudWatch Eventsをトリガーにする設定をする

今回は主に、Lambda周りでやった事を中心に書いていきます。
その他についても、簡単にですが触れていく予定です。

やった事をまとめてみた

ここからは、先程箇条書きにした事をやってまとめてみました。

MediaConvertで動画を変換する為のジョブテンプレートを用意する

ここについては、以下のブログを参考にしてジョブテンプレートを作成しました。

Elemental MediaConvertを利用してmp4をHLS変換 + サムネイル出力 | Developers.IO

テスト用のmp4ファイルをHLSに変換するジョブを作成する際に、上記を参考にして作成したジョブテンプレートを利用します。

SlackにConvertできたよ君のAppを作成する

今回、Slackへの通知に使うAppを作成します。
作成したAppにIncoming Webhookを設定してあげ、Lambdaで利用するURLを作成します。
ここについては、Slack公式の以下のページを参考にしながらAppを作成して、通知させたいワークスペースと投稿先のチャンネルを登録します。

Slack での Incoming Webhook の利用 | Slack

今回Appを作成しIncoming Webhookをアクティブ化したものの、Appワークスペースに登録する時にエラーが発生してしまいちょっと詰まりました。
原因としては、 Slack上でのAppの名前をつけてあげる必要があったようでした


▲ 鎌倉武士と同じで、名乗る事は大事です

名前をつけてあげると、「Add New Webhook to Workspace」ができるようになりました!


▲ ここで作成できたURLをこれから使います

LambdaにSlack通知をさせるコードを書く

今回は、Python3.8でSlack通知をさせるコードを書きました。


▲ さぁ書くぞ

今回利用するIAMロールは、Lambdaのこの画面から作成する事のできる基本的な権限を持ったロールを利用しています。

今回書いたコードは、以下のようなものです。

import json
import urllib.request

def lambda_handler(event, context):
    slack_post()

def slack_post():
    url = "https://前述したIncoming WebhookのURL" 
    get_header = {"Content-type":"application/json"}
    data = {"text":"MediaConvertのジョブが完了したよ :movie_camera:"}
        
    request = urllib.request.Request(url, json.dumps(data).encode('utf-8'), headers=get_header)
    with urllib.request.urlopen(request) as response:
        post = response.read().decode('utf-8')

これは、Webhook URLを作成するとテスト用に作成されるcurlコマンドでやっている事をPythonにしただけのシンプルなものです。

ここまで来たら、後はトリガーを用意してあげるだけです。

LambdaにCloudWatch Eventsをトリガーにする設定をする

まずは、CloudWatch Eventsでトリガーとなるルールを作成します。


▲ 応用すれば、ERRORが出た時に通知させたりなども出来ます

そして、ターゲットに先程作成したLambda Functionを設定します。


▲ これで、COMPLETE時に作ったLambdaが作動するはず

後はこのルールの名前と説明をつけてあげれば、準備は完了です!


▲ さぁ、早速試しましょう

試してみる

後は、実際に動画をMediaConvertで変換させてみて、完了時に通知が届くかを確かめてみましょう。


先日作成したmp4 がたまたまあったので試します

ジョブを作成して待ちます。


▲ お!できたよ君が来ました!

MediaConvertのコンソールも確認してみます。


▲ ちゃんとCOMPLETEしてました!

これで、動画変換が終わるまでコンソールに張り付いてリロードする必要は無くなりました!ありがとうConvertできたよ君!

色々応用できそうだし、今後のAWSのアップデートにも期待!

当初目論んでいたChatbotを使う手段は断念しましたが、それでもちょっとコードを書いてAWSとSlackで作業しただけでSlack通知の仕組みを実装する事ができました。
今回はジョブ完了を通知するだけのシンプルな仕組みを作りましたが、通知させるものを増やしたりステータス毎に分岐させたりと色々と応用ができそうです。
また、今後MediaConvertがサポートされればノンコーディングでこの仕組みを実装する事もできるようになると思います。今後のアップデートが楽しみですね!

この記事が、動画変換の待ち時間を有効に使いたいと思っている人の助けになれば幸いです。