初めに
Webアプリケーションから画像をアップロードする際にS3にファイルをputし、Lambdaでサムネイルを生成して公開用のバケットに保存する処理を構築していました。(前任者が・・・)
新たに同じようなシステムを構築するのに参考にしようとLambdaの関数のコンソールにアクセスすると以下のメッセージが表示されていました。
Node.js 8.10を使っているので変更しないといけないよう。(把握しとけよ)
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtime-support-policy.html
対応内容
まずは新しい関数を作り、ランタイムをNode.js 12.xにしてindex.jsに保存。
index.jsの内容はAWSのサンプルを参考にしています。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-s3-example-deployment-pkg.html
いざ実行
特に内容を変えずに実行すると以下のエラーが発生しました。
Error: write EPIPE 2020-01-29T11:33:50.941Z a84631dc-38d7-4b16-958c-8c88a85535c0
INFO In transform::: Error: write EPIPE
at afterWriteDispatched (internal/stream_base_commons.js:150:25)
at writeGeneric (internal/stream_base_commons.js:141:3)
at Socket._writeGeneric (net.js:770:11)
at Socket._write (net.js:782:8)
at doWrite (_stream_writable.js:431:12)
at writeOrBuffer (_stream_writable.js:415:5)
at Socket.Writable.write (_stream_writable.js:305:11)
at gm._spawn (/var/task/node_modules/gm/lib/command.js:253:18)
at gm._exec (/var/task/node_modules/gm/lib/command.js:190:17)
at gm.proto. [as size] (/var/task/node_modules/gm/lib/getters.js:68:12) {
errno: 'EPIPE',
code: 'EPIPE',
syscall: 'write'
}
AWSのフォーラムに同じような投稿があり、内容をみると、どうやらNode 12.xではimage Magickがそのままでは使えないみたいです。
https://forums.aws.amazon.com/thread.jspa?threadID=314320
write EPIPE
でググってもヒットしなかったのですがat afterWriteDispatched~でググると全部英語の記事の中、上記のフォーラムがヒットしました。
なかなかややこしそうな内容が書いてあるのでNode.jsをあきらめてJAVAかPythonで書き直そうかと思ったのですがぺちぱーの僕には時間がかかりそうだったのでどうにかこのまま使える方法を探し続けた結果、以下の記事を発見。
AWS lambda(Python 3.8)でimagemagickを使う
無事解決
上記の記事のあるようにimage-magick-lambda-layer
をdeployしてLambdaのLayersに設定することでコードを何も変えずに実行できた。
LambdaのLayersってのを初めて使ったんでこれきかっけにもうちょっと勉強しないと
参考
ここに行き着くまでに色々紆余曲折しました。
http://aws-mobile-development.hatenablog.com/entry/2016/11/25/152052