armのECS Fargate上で mysql-connector-python をuse_pure=Falseで動かす

AWS,お役立ち情報

ものレボの 森松です。poetry にて、 mysql-connector-python の最新バージョンをインストールしていましたが、arm64 環境のFargateで動かしたとき、mysql-connector-python をuser_pure=False つまり、CEXT環境にて動かすことが出来ませんでした。目下パフォーマンス改善対応中の弊社の状況の中、不安要素を一切削るために対応しました。

結論

  • 公式にArm64環境でコンパイルしたバイナリパッケージがないので、作って直接インストールしました。
  • 画面によっては、20%ほどパフォーマンスが改善しました。
  • バグのいくつかが、直りました。(予想外)

実行/ビルド環境

実行環境

  • Docker Image – arm64v8/python:3.10-bullseye
  • ECS Fargate Arm64

ビルド環境

  • Docker Image – arm64v8/python:3.10-bullseye
  • ECS EC2 c6g
    • 平時動かしていませんが、EC2とFargate両方ともすぐ動くようにデプロイしています。立上げ楽なので、Dockerコンテナ内で作業しました。

mysql-connector-python のパッケージを作る手順

ビルドの準備します。コンテナに入って初めて知ったのですが、CEXTのライブラリはmariadbのシンボリックリンクでした。今回は、CEXTもMySQLからビルドして、一切の不安を除去するようにします。

apt-get update
apt-get remove default-libmysqlclient-dev  libmariadb-dev libmariadb-dev-compat libmariadb3 mariadb-common mysql-common -y
apt-get install cmake -y
cd ~/

最新のMySQLをビルドするために、C++開発者おなじみのライブラリ、boostをビルドします。バージョンは、MySQLのリリースノートを見て合わせました。

wget https://boostorg.jfrog.io/artifactory/main/release/1.77.0/source/boost_1_77_0.tar.gz
tar xvf boost_1_77_0.tar.gz
cd boost_1_77_0
./bootstrap.sh
./b2
cp -fr ./boost /usr/include/
cp -fr ./stage/lib/* /usr/lib/
cd ~/

最新のMySQL (2022/7/29時点)をビルドします。

wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.30.tar.gz
tar xvf mysql-8.0.30.tar.gz
cd mysql-8.0.30
mkdir bld
cd bld
cmake ..
make
make install
cd ~/

Mysql Xを動かすために、Protocol Buffers もビルドします。弊社では使ってませんが、ついでなので

wget https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protobuf-cpp-3.19.4.tar.gz
tar xvf protobuf-cpp-3.19.4.tar.gz
cd protobuf-3.19.4
CXXFLAGS="-g -std=c++11 -DNDEBUG -fPIC" ./configure --prefix=/usr/local/protobuf
make
make install
cd ~/

目的の、mysql-connector-python をビルドします。

wget https://dev.mysql.com/get/Downloads/Connector-Python/mysql-connector-python-8.0.30-src.tar.gz
tar xvf mysql-connector-python-8.0.30-src.tar.gz
cd mysql-connector-python-8.0.30-src
python setup.py install --with-mysql-capi=/usr/local/mysql/bin/mysql_config --with-protoc=/usr/local/protobuf/bin/protoc --with-protobuf-include-dir=/usr/local/protobuf/include --with-protobuf-lib-dir=/usr/local/protobuf/lib --record file.txt
cd ~/

ここからはDebianのインストールパッケージを作ります。配布するわけではないので簡易的に作ります。
まずは準備から。INPUT_NAMEとINPUT_EMAILは、ご自身の情報を入れてください。

apt-get install -y dh-make fakeroot
export DEBFULLNAME="INPUT_NAME"
export DEBEMAIL="INPUT_EMAIL"

パッケージを作るため、必要なライブラリ [libmysqlclient.so]と[mysql-connector-python]をまとめます。

mkdir -p ~/packages/mysql-connector-python-cext/mysql-connector-python-cext-8.0.30
cd mysql-connector-python-8.0.30-src
cat file.txt | xargs -I {} dirname {} | xargs -I {} mkdir -p ~/packages/mysql-connector-python-cext/mysql-connector-python-cext-8.0.30{}
cat file.txt | xargs -I {} cp -f {} ~/packages/mysql-connector-python-cext/mysql-connector-python-cext-8.0.30{}
cd ~/packages/mysql-connector-python-cext/mysql-connector-python-cext-8.0.30
mkdir ./usr/lib
cp -fr /usr/local/mysql/lib/libmysqlclient* ./usr/lib/

debパッケージを作ります。色んな方法ありますが、私が普段やってる方法を載せておきます。

dh_make --createorig --library
(選択肢は y と答える)
* 少し時間かかります。止まってません。
mkdir DEBIAN
cp debian/control DEBIAN/
rm -fr debian
(編集 DEBIAN/control)
* Homepage を書き換える
* コメントアウトされてる行はいらないので消す
* mysql-connector-python-cext-dev セクションは丸ごと消す
* 空改行は消す
* mysql-connector-python-cextBROKEN の BROKENは消す
* Packageの下の行に、Version: 8.0.30 を挿入
* Architecture は any から arm64 へ変更
* Dependsの行は消す
* Description を適当に書き換える。
cd ../
fakeroot dpkg-deb --build mysql-connector-python-cext-8.0.30 .
(カレントディレクトリにdebが作成される)
cd ~/

後は、作られたパッケージをデプロイ時にインストールすればいいだけです。

dpkg -i mysql-connector-python-cext_8.0.30_arm64.deb

最後に

バージョン管理が自前になるデメリットはありますが、結果的にパフォーマンス改善とバグ改善に繋がりました。

スタートアップのCTOは、インフラ構築もしたりします。MonoRevoのECSインフラは私1人で開発しています。
個人的には、コーディングもインフラも大好きですが、誰か代わってくれたらリソース的に助かります。

興味がある方は、ご連絡を。

MonoRevoジョブボード

Facebook

AWS,お役立ち情報aws,Python,インフラ

Posted by MorimatsuShunsuke