top

Cartesian Theater

Powered by NotionAPI

20220515

Date: 2022-05-15
Last Edited: 2022-05-15 14:44:00

bandcampの新着を追うのが難しいという問題があった。新着の通知メールは来るのでそれを転送して情報を取り出し、データベースに蓄積して表示するWebアプリを作った。

bandcamp-timeline
https://bandcamptimeline.unronritaro.net/
bandcamp-timeline

メールをAmazon SESに送るとそのファイルをS3に置くことができる。S3に置いたらそれをトリガーにしてLambdaを起動し、転送されたメールをパースして各種情報を取り出す。そのためのコードが以下。

bandcamp-timeline/mailparser/src/main.rs at master · yuki-oshima-revenant/bandcamp-timeline
Contribute to yuki-oshima-revenant/bandcamp-timeline development by creating an account on GitHub.
https://github.com/yuki-oshima-revenant/bandcamp-timeline/blob/master/mailparser/src/main.rs
bandcamp-timeline/mailparser/src/main.rs at master · yuki-oshima-revenant/bandcamp-timeline

Rustで書いている。メールのパースはmail-parserクレート、メール本文のHTMLのパースはscraperクレートを利用した。RustでLambda用のコードを書く場合、Lambda実行環境用のクロスコンパイルさえうまくいけば依存ライブラリのデプロイの問題は解決する(バイナリにコンパイルしてしまうため)。クロスコンパイルの手順は以下のヘルプにある。

https://docs.aws.amazon.com/sdk-for-rust/latest/dg/lambda.html

ヘルプにあるMac用の環境変数やリンクの設定だけではコンパイルがうまくいかないライブラリがあった。以下の記事にあるように.cargo/config.tomlにlinkerの記述をしておくとうまくいった。

Lambda が Custmon Runtimeに対応したのでRustで試してみた
こんにちは、Kaoriです。 WernerからCustmon Runtime for Lambdaの発表がありましたね。 Wernerが着ているのはSkrillexのTシャツなんですが羨ましいですよね。というわけで、新しく発表されたCustom runtimeを使って例のごとくHello Worldを試してみましょう。 今回言語はRustを使ってみました。 Rustのインストール $ curl https://sh.rustup.rs -sSf | sh Current installation options: default host triple: hoge default toolchain: stable modify PATH variable: yes 1) Proceed with installation (default) 2) Customize installation 3) Cancel installation と聞かれるのでよしなに答えてインストールします。基本的には1でいいと思います。 Mac OS Xでのコンパイル
https://tech.bitbank.cc/lambda-custmon-runtime/
Lambda が Custmon Runtimeに対応したのでRustで試してみた
[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を利用してみた。

https://docs.aws.amazon.com/sdk-for-rust/latest/dg/welcome.html

まだdeveloper previewだけど普通に各種操作ができそうな感じだったので、Rustを利用したAWS開発が捗っていきそうな予感がする。

フロントエンドについてはいつものNext.js + Tailwind CSSをVercelに上げただけで特筆すべきことはない。

現状は自分の新着を表示できるだけなので、次の段階としてログインしてbandcampユーザーが誰でも利用できるようにしたい。ただしデータの集め方がメールの自動転送なので、ユーザーに自動転送設定を行ってもらう必要がある。(もちろんログイン機能の実装も必要)

Gmailで自動転送を設定する場合は転送先へと一度メールを送ってそのリンクを踏む必要があった。現状受信用のSESのアドレスに来たメールはS3に生データが置かれるだけで通知も何もないのでなんとかして自動転送を承認できる仕組み作る必要がある。

©︎2021 Yuki Oshima