AWS Lambdaで画像アップロードにトリガーでサムネイルを作ろうとしたら色々詰まった。
AWS Lambdaでサムネイルを作る
LINE Botを通して、S3に画像をアップロードし、後から特定ワードで引っ掛けて表示する感じの仕組みを作ってました。
アップロードは良いのですが、どうも検索ワードで引っ掛けてきてLINEに表示する部分が重い。
一番の原因はUS-EASTリージョンに置いてあるせいで、これを東京リージョンにすればましになるはず。
ただ、この画像はAWS Rekognitionに投げるので、S3をUS-EASTリージョンから動かすことができない。
Rekognitionは特定リージョンにしかなく、Lambdaを通してS3からRekognitionに投げるにはS3もUS-EASTに無いと駄目(なはず)。
そんなわけで、アップロードされた画像をサムネイル化して別バケットに置いておき、表示するときはそっちから画像を拾うようにしました。
1/10になるので割と軽くなるかな、と。
以下詰まったことリスト
- S3にアップロードは何も指定しないと、application/octet-stream形式でアップロードされる。
"image/png"形式じゃ無いと、サムネイル化ができない。
解決策 putObjectの段階でContent-Typeを指定しておく
- S3のイベントに複数のLambdaをフックできない
ふーん、って感じだった。本当はアップロードのタイミングで画像認識とサムネイル化両方が走って欲しかった。
- S3のバケットをコピーして作成しても、バケットポリシーまではコピーされない
何のためのコピーやねん、って思ったけどそういう仕様らしい……。
とりあえず、大体動いたので良し。