Lineトークにアップした画像をS3に保存する

先日はRekognitionを利用して飯テロ禁止botを作成しましたが、
今回はLINEにアップした画像をS3に保存するbotを作ってみました。

Lineトークにアップされた画像は2週間でLineサーバから削除されるため、
後でダウンロードしようと思った時に有効期限が切れてしまってもう1度アップし直してもらう…
なんてことがありました。
アルバムに置いてれば保存期間は無期限なんですが
やはりトーク内に画像貼り付ける方が楽ですからね。
そんなこんなで、S3に置いて永続化できるといいなぁと思った次第です。

アーキテクチャ

基本構成は前回のものと同じですが、RekognitionがS3に置き換わっています。

linebot-s3

実際に作ってみた

コードはGithubに置いてます。

serverless.yml

LambdaにはS3の書き込み権限を付与します。(めんどくさいのでフルアクセスにしてるのは申し訳ない)
環境変数はLine developerからとってくる

handler.js

保存するファイル名をどうしようかなぁちょっとばかり悩んでたんですが
画像をMD5関数に突っ込んでハッシュ値を得る。そのハッシュ値をファイル名として利用する。
としました。

メリットとして 同じ画像が既に上がっていた場合は上書き保存される。 同じ画像はリストに出てこなくなるので一種の重複排除機能として利用できる。

もちろん問題点はあって
ハッシュ値は衝突する可能性がある」 ということで
この辺りを改善するには

  1. ハッシュ値 + タイムスタンプ でファイル名とする
  2. 既に同じファイル名のものがS3上にあるか検索し、あればMD5とは別のもので再計算する

くらいでしょうか。
実際に大量のファイルを保存する場合にはこの辺りも考慮にいれないといけなかったり。

あとは他のアルゴリズムを使うと計算量が多くなる可能性があったり
その分Lambdaの実行時間が長くなってしまう可能性もある(要検証)。
個人で利用する分にはこれくらいのもので良いし、
違う画像でMD5が一致した場合には画像が消えてしまいますが、
その辺は許容します。


という感じでLinebotを作ってみました。
先日のRekognitionと組み合わせれば画像を仕分けしつつ保存できそうですね。
もう少し時間を作って他のLINE APIも触ってみようかなと思います。