概要
2020年7月29日現在、Fargateのver 1.4.0にてpipe周りにおかしな挙動があるっぽい。
おかげでffmpegのpipe芸に詰まってそれなりに時間を溶かしたのでメモっておく。
何をしたかったか?
ECSをTask RunするとRTMPを落としてMP4にパッケージングしつつS3に投げ込むっていう超絶シンプルな行いをしたかった。
原本では無いけど、Dockerfileとか起動時用コマンドはこんな感じ。
Dockerfile
FROM ubuntu:18.04
ENV DEBIAN_FRONTEND=noninteractive
RUN set -x \
&& apt-get update \
&& apt-get install -y \
curl \
wget \
tar \
xz-utils \
liblzma-dev \
ca-certificates \
openssl \
musl-dev \
tzdata \
zlib1g-dev \
libssl-dev \
libreadline-dev \
libsqlite3-dev \
libbz2-dev \
libncurses5-dev \
libgdbm-dev \
liblzma-dev \
tk-dev zlibc \
libffi-dev \
zip \
unzip
RUN set -x \
&& cd /tmp/ \
&& wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-4.3-amd64-static.tar.xz \
&& tar xvf ffmpeg-4.3-amd64-static.tar.xz \
&& cd ffmpeg-4.3-amd64-static \
&& mv ffmpeg /usr/bin/ \
&& mv ffprobe /usr/bin/ \
&& mv model /usr/bin/ \
&& mv qt-faststart /usr/bin/
RUN set -x \
&& apt-get update \
&& apt-get install -y python \
&& apt-get install -y python3-pip \
&& pip3 install awscli --upgrade --user
COPY cmd_in_docker.sh /usr/local/bin
CMD ["/usr/local/bin/cmd_in_docker.sh"]
cmd_in_docker.sh
#!/bin/bash
set -e
set -x \
&& export PATH=~/.local/bin:$PATH \
&& ffmpeg -y -i "rtmp://..." -c copy -f mp4 -movflags frag_keyframe+empty_moov - | aws s3 cp - "s3://バケット名/ファイル名.mp4"
ECS Task Runなコマンド
こんなノリ
aws ecs run-task \
--cluster $CLUSTER_ARN \
--task-definition $ECS_TASK_ARN \
--region "ap-northeast-1" \
--network-configuration "awsvpcConfiguration={subnets=$SUBNETS,securityGroups=$SGS,assignPublicIp=ENABLED}" \
--launch-type "FARGATE" \
--platform-version "1.4.0"
もともとファイルをEFSに書き出そうとしていたので、その遺産として --platform-version "1.4.0"
としていたのがミスでした。
何が起きたのか?
あんまりちゃんとデバックしていないのでなんとも言えませんが、数分経つとffmpegが全く仕事をしなくなります。
そこで落ちてくれればいいのにそれすらしない。厄介ですね。
デバッグ準備
仕方がなく、SSMを仕込みました。余談ですがFargate + TerraformでSSMをやるには下記記事が参考になりました。
SSMで接続してffmpegを手動実行
ffmpeg -y -i "rtmp://..." -c copy -f mp4 -movflags frag_keyframe+empty_moov - | aws s3 cp - "s3://バケット名/ファイル名.mp4"
を手作業で実行した所、まぁ元気に動くんだなぁー
ssmで同様のコマンドを動かしてもちゃんと機嫌よく動いてそうなので、いよいよFargateのバージョンを疑う時か…EFSなんて使わずに素直に1.3で動かすか…
— yanoshi (@yanoshi) July 28, 2020
もしやということで 1.3.0
にしてみた
aws ecs run-task \
--cluster $CLUSTER_ARN \
--task-definition $ECS_TASK_ARN \
--region "ap-northeast-1" \
--network-configuration "awsvpcConfiguration={subnets=$SUBNETS,securityGroups=$SGS,assignPublicIp=ENABLED}" \
--launch-type "FARGATE" \
--platform-version "1.3.0"
元気に動いたんだなぁ…
あーーーーーやっぱりFargate 1.4が原因だったああああああああああああああああああ
— yanoshi (@yanoshi) July 28, 2020
ECS Fargate 1.4.0ではffmpegが現在まともに動かないというどうでもいいナレッジがたまりました…(pipe周りがおかしいっぽい)
— yanoshi (@yanoshi) July 28, 2020
余談
その昔、WSLでのffmpegのpipe芸で詰まったことがあったのですが、それと同じような挙動な気がしています…
Windows10で作るMirakurun + Chinachu Gammaな録画サーバー ~VagrantとPT3(BonDriver)を添えて~ - さわっても熱くない花火
所感
あまりにも悲しい気持ちになったので、すごい勢いで証跡を残してしまいました。悲しいなぁ。
各所で1.4.0の悪い噂を聞いていましたが、自分が被ることになるとは…