ECS Fargate(Version 1.4.0)にてffmpegなpipe芸をしようとしたら見事に動かなかったので証跡を書いておく

# 概要

2020年7月29日現在、Fargateのver 1.4.0にてpipe周りにおかしな挙動があるっぽい。

おかげでffmpegのpipe芸に詰まってそれなりに時間を溶かしたのでメモっておく。


# 何をしたかったか？

ECSをTask RunするとRTMPを落としてMP4にパッケージングしつつS3に投げ込むっていう超絶シンプルな行いをしたかった。

原本では無いけど、Dockerfileとか起動時用コマンドはこんな感じ。

## 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をやるには下記記事が参考になりました。

[FargateとSSMでssh(ぽい)環境を構築してみた](https://qiita.com/fnaoto/items/c980efa39c2b1597331e)

## SSMで接続してffmpegを手動実行

`ffmpeg -y -i "rtmp://..." -c copy -f mp4 -movflags frag_keyframe+empty_moov - | aws s3 cp - "s3://バケット名/ファイル名.mp4"` を手作業で実行した所、まぁ元気に動くんだなぁー

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ssmで同様のコマンドを動かしてもちゃんと機嫌よく動いてそうなので、いよいよFargateのバージョンを疑う時か…EFSなんて使わずに素直に1.3で動かすか…</p>&mdash; yanoshi (@yanoshi) <a href="https://twitter.com/yanoshi/status/1288132374639702016?ref_src=twsrc%5Etfw">July 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# もしやということで `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"
```

元気に動いたんだなぁ…

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">あーーーーーやっぱりFargate 1.4が原因だったああああああああああああああああああ</p>&mdash; yanoshi (@yanoshi) <a href="https://twitter.com/yanoshi/status/1288160638447964160?ref_src=twsrc%5Etfw">July 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ECS Fargate 1.4.0ではffmpegが現在まともに動かないというどうでもいいナレッジがたまりました…(pipe周りがおかしいっぽい)</p>&mdash; yanoshi (@yanoshi) <a href="https://twitter.com/yanoshi/status/1288160838252077058?ref_src=twsrc%5Etfw">July 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 余談

その昔、WSLでのffmpegのpipe芸で詰まったことがあったのですが、それと同じような挙動な気がしています…

[Windows10で作るMirakurun + Chinachu Gammaな録画サーバー ～VagrantとPT3(BonDriver)を添えて～ - さわっても熱くない花火](https://yanoshi.hatenablog.jp/entry/2017/07/10/022843#%E4%BD%99%E8%AB%873-%E3%81%A9%E3%81%86%E3%81%97%E3%81%A6WSL%E3%81%98%E3%82%83%E3%81%AA%E3%81%84%E3%81%AE%E3%81%8B)


# 所感

あまりにも悲しい気持ちになったので、すごい勢いで証跡を残してしまいました。悲しいなぁ。

各所で1.4.0の悪い噂を聞いていましたが、自分が被ることになるとは…