概要
ServerlessFrameworkにおいて、Lambdaで画像加工をする場合、Imagemagickかgm(GraphicsMagick)を使用することになります。
AWS公式ドキュメントではgmを使用しているので、今回はgmを使用してサムネイル作成処理について、書こうと思います。
ハマりどころ
gmがrequireできなくてハマった
lambdaのコード中に
const async = require('async'); const gm = require('gm').subClass({ imageMagick: true });
といった感じでrequireしなければならないのですが、単純にこのように記述してデプロイしても、
module not found
的な感じでデプロイしてすぐにエラーとなってしまいました。
lambdaをデプロイするとAWSの中で既にmoduleが用意されているものだと勘違いしていました。
改めてAWS公式ドキュメントを読むと.zipを作成しなければならないので、手順に従って回避します。
デプロイパッケージの作成
次にハマったのが、ServerlessFrameworkにおいて、デプロイパッケージの作成です。 AWS公式ドキュメントでは下記の通りにファイルを配置し、.zipを作成せよ。とあります。
CreateThumbnail.js /node_modules/gm /node_modules/async
上記の通り.zipを作るのは良いんですが、ServerlessFrameworkの枠組みからいきなり外れてしまうのが問題でした。*1
ただ、sls deploy
後の.zipはS3の所定のバケットに配置されることに気づきました。
つまり、ServerlessFrameworkも実は単純を.zipを作ってlambdaにデプロイしているのだとわかりました。
そのため、単純にlambdaの処理が記述されているフォルダの直下で下記を実行すれば/node_modules/
が出来上がります。
package.json
を用意yarn add async gm
その後にいつものようにsls deploy
をすれば完了です。
あとは
aws lambda gm
とかで検索するとgmでの処理についての記事が出て来るのでそれを参考に!
まとめ
当たり前ですが、まずは、AWSのドキュメントをしっかり読むこと!!これが重要だと感じました。
他のブログではサムネイル作成処理については書かれているのですが、
ServerlessFrameworkと組み合わせた場合の方法は書かれていない印象だったので、この記事が参考になればと思います。
*1:単純にsls deploy だけで完結しなくなってしまう