Hugo用にGo, Lambdaで画像を自動的にリサイズしてS3に保存するやつを作った

とりあえずソースコード

github.com/zono-dev/stp

あと補助ツールも。

github.com/zono-dev/stph

なぜ作ったか

Hugoで書いてるこのブログに画像を貼りたいことがたまにあるのだけれど、元となるmarkdownはgitで管理しているのでリポジトリに画像を入れたくないなぁと思ったことがきっかけ。あとは単純に自分の勉強を兼ねて作った。

なお作り終わったあとに Cloudinary という無料枠のあるCDNサービスがあることを知って「作った意味…」 となったけどまぁいいか。

動作の流れ

かなりシンプルなので図に書く必要もないかなと思ったけどGopher君の画像使いたかった。

stp

resized-PsUlGNRRiTxekoVe.png

S3の org フォルダ配下に画像ファイル(今のところ png, jpg, gifのみ対応)を配置すると自動的にLambdaが起動して、勝手に縮小してS3の resize 配下に設置してくれるという仕組み。 縮小したファイルと元のファイルの紐付けを取っておく必要があるので、それはDynamoDBに保存することに。

で、これを作ったあとに管理するツールがほしいなと思い以下のstphを作ることに。

stph

単純にWebサーバとして動くツールで、機能は画像の表示と削除のみ。

resized-aQvBviQosvCaBspp.png

画像の表示をしてくれる。

resized-McVQwWESLPherFVk.jpg

↑Hugoで使えるshortcodeを表示してくれる。 なお今日気付いたけどshortcode自作しなくてもfigureという組み込みのshortcodeがあるようなので、そちらに変更する予定。

resized-sbsXvoZMaacKiila.png

画像の削除もしてくれる。

HTML/CSS/JavaScript力がゼロなので取ってつけたような一枚っぺらのHTMLファイルを利用している…必要最低限だし常に起動しておくようなものでもないのでいいかなと思う。しかしせめて時系列順に並べ替えるボタンくらいは付けたいな。

その他特徴

CDNとして

S3+CloudFrontで組んであるので、CDNとして最低限の動作はする。

S3に画像置けば勝手に縮小してくれる

まぁAWS自体の利便性が高いという話なのだけれど、とにかくS3に置けばいいだけなので夢は広がる(?)

例えばニンテンドースイッチで撮った画像はtwitterかFacebookくらいにしか送ることができないんだけど、twitterのAPI使って自分のアカウントから画像を持ってきてS3に配置すればブログやら何やら他のところでも使いまわしできるなぁと。

terraformで全体管理

AWSのリソースはすべてterraformで管理できるようににしてあるので、applyしてあげれば動く。

今後

Cloudinary使った方が便利やん、っていう話はあるのだけれどもうちょっと機能追加はしたいなと。 オリジナル画像からEXIF削除するとか、webp対応とか。stphのUIをもうすこしまともにするとか。 画像からHugoのページ逆引きできるとかも面白いかも?

あとLambdaのローカルでのテスト方法も勉強したいな。