やりたかったこと
aws Lambda上でdiesel-rsというORMを使いmysqlにアクセスする
前置き
これは以下の記事の一部分に書いてあったことをもうすこしだけ詳しく説明したものです。ちなみにかなり乱文かと思いますがほぼ自分用なのでご容赦ください。
詰まったこと
僕はお試しでこのようなコードを書いたのですが、dieselはそもそもlibmysqlclient.soというダイナミックリンクライブラリに依存しており、これが無い環境では動きません。
またlambdaはシングルバイナリを実行するだけ(多分) + アップロードできるzipのサイズの上限があるので.soファイルを突っ込めません。
そのため、libmysqlclient.soをスタティックリンクする必要がありました。
なので.cargo/config
ファイルを以下のようにしました。
[build]
target = 'x86_64-unknown-linux-musl' # muslでビルドする
rustflags = ["-C", "link-args= -static"] # スタティックリンクする
あとはこのdockerイメージを使えば一応ビルドはできるのですが、それを実行すると
No such file or directory
というエラーが起きました。
実はdiesel-rsが使っているmysqlclient-sysは、libmysqlclient.soをスタティックリンクできないようになっているようです。幸いなことにpzmarzly/mysqlclient-sysというforkを代わりに使えばスタティックリンクできるようになります。
というわけで、Cargo.toml
に以下を書き込んでください。
[patch.crates-io]
mysqlclient-sys = { git = "https://github.com/pzmarzly/mysqlclient-sys", rev = "acd1b2b" }
こうすると、diesel-rsが代わりにpzmarzly/mysqlclient-sysを使うようになるためスタティックリンクが可能になります。
後はビルドすればおしまいです。
ビルドに使ったdockerのコマンド
cargo build以降は好きなように変えてください
docker run -d -it -w /app -v "$(pwd):/app" ekidd/rust-musl-builder bash -c "sudo apt-get update && sudo apt-get install -y libmysqlclient-dev && cargo build --bin read_user_test --release"