Hugo用にGo, Lambdaで画像を自動的にリサイズしてS3に保存するやつを作った
とりあえずソースコード
あと補助ツールも。
なぜ作ったか
Hugoで書いてるこのブログに画像を貼りたいことがたまにあるのだけれど、元となるmarkdownはgitで管理しているのでリポジトリに画像を入れたくないなぁと思ったことがきっかけ。あとは単純に自分の勉強を兼ねて作った。
なお作り終わったあとに Cloudinary という無料枠のあるCDNサービスがあることを知って「作った意味…」 となったけどまぁいいか。
動作の流れ
かなりシンプルなので図に書く必要もないかなと思ったけどGopher君の画像使いたかった。
stp
S3の org
フォルダ配下に画像ファイル(今のところ png, jpg, gifのみ対応)を配置すると自動的にLambdaが起動して、勝手に縮小してS3の resize
配下に設置してくれるという仕組み。
縮小したファイルと元のファイルの紐付けを取っておく必要があるので、それはDynamoDBに保存することに。
で、これを作ったあとに管理するツールがほしいなと思い以下のstphを作ることに。
stph
単純にWebサーバとして動くツールで、機能は画像の表示と削除のみ。
画像の表示をしてくれる。
↑Hugoで使えるshortcodeを表示してくれる。 なお今日気付いたけどshortcode自作しなくてもfigureという組み込みのshortcodeがあるようなので、そちらに変更する予定。
画像の削除もしてくれる。
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のローカルでのテスト方法も勉強したいな。