概要
LambdaにてPythonを使用時、MySQLクライアントとしてmysqlclientを使うもの(SQLAlchemy等)を利用する場合、いろいろ準備が必要。
-
mysqlclientは1.4.6を使う - AmazonLinux2から
libmysqlclient.so.18を拾ってくる -
libmysqlclient.so.18をLambdaへ上げた際に、Lambda上でライブラリ用パスへ配置する
mysqlclient は 1.4.6 を使う
pip install mysqlclient===1.4.6
細かい原理は不明だが 2.0.1 を使おうとすると、'_mysql'がないと怒られる。。
libmysqlclient.so.18を拾ってくる
AmazonLinux2用のlibmysqlclient.so.18が必要になるのでビルドする。
コンテナ起動
docker run -it amazonlinux:2 bash
コンテナ内
libmysqlclient.so.18を入れる。
yum update -y
yum install -y gcc mysql-devel mysql-libs # /lib64/mysql/libmysqlclient.so.18 が入る
ローカルPC
docker cp等でlibmysqlclient.so.18をローカルへコピーする。
docker cp container:/lib64/mysql/libmysqlclient.so.18.0.0 local_path
libmysqlclient.so.18をLambdaに配置する際の注意
Lambdaのコンテナ上のライブラリのパスが、↓になっているので、
LD_LIBRARY_PATH=/var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib
libmysqlclient.so.18 がLambdaコンテナに配置された際に上記のパスに配置されるようにする必要がある。
例:レイヤーとしてアップした場合
レイヤーのファイルは /opt 内に展開されるが、/opt/lib の位置に .so が来る必要がある。
※venv/lib/site-packages 内をレイヤーとして上げる場合、venv/lib/site-packages/lib に .so を入れる。
例:Lambda用のソースに紛れ込ませる場合
/var/task に展開されるので、 libを作って、その中に .so を入れる。