AWS Lambdaを使ったサムネール作成処理においてNode.jsとPythonのどちらのフレームワークがよいかを調べてみた。
TL;DR
- サムネール作成するならNode.jsよりもPythonのほうが数段性能良さそう
- サンプルコードはこちら
実験シナリオ
- S3から写真をダウンロード
- ExifのOrientationの値を見て回転補正する
- 回転補正後のwidth, heightの値を取得する
- 50%にリサイズしS3にアップロードする
入力画像
- 3264 x 2448
- ファイルサイズ: 約5.5M
- Orientation: Rotate 90 CW
出力画像
- 1224 x 1632
- 50%にリサイズ
- ExifのOrientationを見て回転補正
- ファイルサイズ: 約730-750KB(圧縮quality=95)
Lambdaファンクションスペック
- メモリ256M
実験結果
AWSのコンソール上で5回ずつ実行した結果
Node.js | Python | |
---|---|---|
処理時間(ms) | 10500 - 12375 | 3214 - 3727 |
Pythonのほうが圧倒的に処理時間が短いという結果に。
最大使用メモリサイズもPythonのほうが小さかったです。
ということで、AWS Lambdaでサムネール生成をするならNode.js使うよりPython使うほうが良さそうです。
Pythonでのサムネール作成
Node.jsはImageMagick(GraphicMagicks)が最初から使えるようになっていてサンプルプログラムや記事もたくさんありますがPythonはあまり情報がありません。以下を参考にPythonでの画像処理ライブラリPillowをEC2上でビルドしたら意外とすんなりサムネール作成がLambdaを使って動きました。
今回実験で使用したコードはここに置いてあります。ビルド済みのPillowもレポジトリに含まれているのでAWS Lambda x Pythonですぐにサムネール作成してみたいときに役立つと思います。