LoginSignup
0
0

More than 1 year has passed since last update.

diesel-rs(mysql)をlambda上で動かすときにlibmysqlclientをスタティックリンクする

Posted at

やりたかったこと

aws Lambda上でdiesel-rsというORMを使いmysqlにアクセスする

前置き

これは以下の記事の一部分に書いてあったことをもうすこしだけ詳しく説明したものです。ちなみにかなり乱文かと思いますがほぼ自分用なのでご容赦ください。

詰まったこと

僕はお試しでこのようなコードを書いたのですが、dieselはそもそもlibmysqlclient.soというダイナミックリンクライブラリに依存しており、これが無い環境では動きません。
またlambdaはシングルバイナリを実行するだけ(多分) + アップロードできるzipのサイズの上限があるので.soファイルを突っ込めません。

そのため、libmysqlclient.soをスタティックリンクする必要がありました。
なので.cargo/config ファイルを以下のようにしました。

config.toml
[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 に以下を書き込んでください。

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"
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0