概要
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
を入れる。