bandcampの新着を追うのが難しいという問題があった。新着の通知メールは来るのでそれを転送して情報を取り出し、データベースに蓄積して表示するWebアプリを作った。
メールをAmazon SESに送るとそのファイルをS3に置くことができる。S3に置いたらそれをトリガーにしてLambdaを起動し、転送されたメールをパースして各種情報を取り出す。そのためのコードが以下。
Rustで書いている。メールのパースはmail-parserクレート、メール本文のHTMLのパースはscraperクレートを利用した。RustでLambda用のコードを書く場合、Lambda実行環境用のクロスコンパイルさえうまくいけば依存ライブラリのデプロイの問題は解決する(バイナリにコンパイルしてしまうため)。クロスコンパイルの手順は以下のヘルプにある。
ヘルプにあるMac用の環境変数やリンクの設定だけではコンパイルがうまくいかないライブラリがあった。以下の記事にあるように.cargo/config.tomlにlinkerの記述をしておくとうまくいった。
[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"
PythonなどでLambdaを実装すると依存ライブラリの配置が面倒くさすぎるのでRustで実装すると開発体験がいい。
データベースにはDynamoDBを初めて利用した。単純なkey-valueストアというだけでなくパーティションキーとソートキーの組み合わせでキーを構成できるのが柔軟性が高いように思った。今回の場合はメールの宛先のアドレスをパーティションキー、通知されてきたリリースのURLをソートキーにしている。こうするとまず宛先アドレス単体で検索することができ、またリリースごとに一意のデータを持つことができる。
またRustからS3やDynamoDBを操作するためにAWS SDK for Rustを利用してみた。
まだdeveloper previewだけど普通に各種操作ができそうな感じだったので、Rustを利用したAWS開発が捗っていきそうな予感がする。
フロントエンドについてはいつものNext.js + Tailwind CSSをVercelに上げただけで特筆すべきことはない。
現状は自分の新着を表示できるだけなので、次の段階としてログインしてbandcampユーザーが誰でも利用できるようにしたい。ただしデータの集め方がメールの自動転送なので、ユーザーに自動転送設定を行ってもらう必要がある。(もちろんログイン機能の実装も必要)
Gmailで自動転送を設定する場合は転送先へと一度メールを送ってそのリンクを踏む必要があった。現状受信用のSESのアドレスに来たメールはS3に生データが置かれるだけで通知も何もないのでなんとかして自動転送を承認できる仕組み作る必要がある。