エンジニアレポート

AWS Fargate + ffmpegイメージで格安動画トランスコーダー構築 Part2

2020年06月30日 AWSFargateECSDockerffmpeg

データスタジアムのエンジニア片岡です。

ffmpegをAWS ECS + Fargateで動かしてサーバレスで格安な動画トランスコーダーを作る話のPart 2です。

Part 1ではローカル環境のDockerで動かすまでを書きました。
このPart 2ではAWS(ECS + Fargate)で動かす所を書いていきます。

全体構成

改めて、構成はこちらになります。

ECS用Dockerビルド

DockerfileのAWSのクレデンシャルファイル(conifg、credentials)をCOPYしている所は、ECSでは不要なためコメントアウトして再度ビルドしておきます。

ECRのリポジトリを作成+イメージをプッシュ

まずはECR(Elastic Container Registry)にリポジトリを作成します。
名前は ffmpeg-transcoding としておきます。

リポジトリにプッシュするのための認証を以下のコマンドで行います。
この時awsコマンドがAWS CLI v2である必要があります。v1では失敗します(私の環境ではv2は/usr/local/bin/awsにあるので下記のようにしています)。
************.dkr.ecr.ap-northeast-1.amazonaws.com/ffmpeg-transcoding の部分はリポジトリのURIです。

次に先程ビルドしたイメージ(ffmpeg-transcoding)をECRにプッシュできるようにタグを付けます。ここではタグを1としておきます。

そしてプッシュします。

ECRリポジトリにプッシュされました。

IAMロール作成

今回、ECSタスクにてS3から変換元ファイルをGETして変換後ファイルをPUTするので、S3FullAccessポリシーを付与したロールを作成しておきます。

ECSのタスク定義を作成

次はタスク定義を作成します。ECSのメニューから”タスク定義”へ行き、”新しいタスク定義の作成“ボタンを押して作成していきます。
起動タイプはFARGATEを選択します。

タスクロール”には先ほど作成したIAMロールを設定し、
タスクメモリ“は4GB、“タスク CPU“は2vCPUとしておきます。

コンテナの追加“ボタンを押して、
コンテナ名”には ffmpeg-transcoding、”コンテナイメージ“には先程プッシュしたイメージのURIである ************.dkr.ecr.ap-northeast-1.amazonaws.com/ffmpeg-transcoding:1 を入力して追加します。
最後に“作成”ボタンを押すとタスク定義が作成されます。

ECSのクラスターとサービス作成

タスクを実行するためにはクラスターとサービスを作成する必要があります。
コンソールの”クラスター”で、”クラスターの作成“ボタンを押します。
クラスターテンプレート“は”ネットワーキングのみ“を選択。

そして次の画面で”クラスター名“にはffmpeg-transcodingと入れて”作成“ボタンで作成します。

次に作成されたクラスターの画面を開き、サービスの”作成“を押します。
起動タイプ“はFARGATE、”タスク定義“は先ほど作成したffmpeg-transcodingを選択し、”サービス名“はffmpeg-transcoding、”タスクの数“は1、クラスターVPCとサブネットを任意に選択して最後に”サービスの作成“ボタンで作成します。

ECS(Fargate)でタスク実行

タスク“タブに移動し、”新しいタスクの実行“ボタンを押します。

以下のように”クラスター VPC“と”サブネット“を選択し、”パブリック IP の自動割り当て“をENABLEDにして(ECRからイメージ取得できるようにするため)、右下の”タスクの実行“を押します。

しばらく待つと実行開始され、終了すると画面の一覧から消えます。

S3にHLSファイルが出力されました。

注意点

2020.5.31現在、Fargate 1.4.0で上記タスクを実行した際、S3からダウンロードするファイル(input.mp4)のサイズが大きいとAWS CLI v2でのダウンロード処理が進まず、待ちの状態のままになってしまいます。
10MBでは問題なく、1.7GBでは上記の状態となりました。

1.4.0はすでに正式リリース済みのものですが、ネット上では他にも不具合が報告されています。
そういう事もあり、まだLATESTタグは1.3.0を指しています。

1.3.0では使用できるディスク容量が10GB+4GBなのに対し、1.4.0では20GBになっているので、大きいファイルをトランスコードする際にはこちらの方が良いでしょう。解決が待たれます。

なお、AWS CLI v2ではなくAWS SDK for Pythonでダウンロードするように変更すると正常に動作しました。
ただイメージサイズも大きくなり複雑度が増すので、できればAWS CLI v2で済ませたいところです。

まとめ

という事で、Fargateとffmpegを使うことでサーバレスでマネージド、かつ金額も安い動画トランスコーダーを構築することができました。

今回の例では入力ファイルや出力先が固定になっていますが、実行時パラメータとして渡せるようにすれば実案件で使えるようになるでしょう。

以上です。

Part1はこちらから

AWS Fargate + ffmpegイメージで格安動画トランスコーダー構築 Part 1

参考記事

動画変換用のコンテナイメージ(ffmpeg)をECRに登録する
AWS Fargate/Batchでスケールするなるはや動画エンコード

こちらもおすすめ

AWS メディアサービスで動画変換のフローを構築する
CloudFront+S3+Video.js+ 署名付きCookieでクローズドな動画配信
HTML5 動画プレイヤー 8選 / CMAF再生にトライ

エンジニア募集中

データスタジアムでは一緒に働いていただけるエンジニアを絶賛募集中です!

野球、サッカー、バスケをはじめとして色々なスポーツの仕事があります。

AWSやAzure、動画やAIなど技術的にもチャレンジできる職場です。

テクノロジーの力で、日本のスポーツを一緒に発展させていきましょう!

<募集中のポジション(2020年6月1日現在)>

開発エンジニア(速報サービス)

開発エンジニア(スポーツチーム向けサービス)

インフラエンジニア

最新記事

エンジニアトップ エンジニアインタビュー エンジニアレポート

  • 採用情報
  • おしらせ
  • 掲載事例

ページトップヘ