gRPCのPython版に含まれる共有ライブラリのサイズが大きくなった話

2022.03.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!DA(データアナリティクス)事業本部 サービスソリューション部の大高です。

Lambdaレイヤーを作成する際に、Pythonのパッケージgoogle-cloud-bigqueryを利用しているのですが、最近このレイヤーをデプロイしようとしたときに以下のエラーが発生しました。

Unzipped size must be smaller than 262144000 bytes (Service: AWSLambdaInternal; Status Code: 400; Error Code: InvalidParameterValueException; Request ID: 728eec04-5b94-4cf7-8def-9c914e0f12bd; Proxy: null)

Lambdaレイヤーのサイズが大きすぎる(250MBを超えている)というエラーなのですが、原因調査をしていると想定外の事象で少し解消に手間取ったので、エントリーとして残しておきたいと思います。

前提

  • Lambda関数をPythonで作成している
  • Lambdaレイヤーを利用している
  • Lambdaレイヤーには、パッケージとしてgoogle-cloud-bigqueryを含めている
  • Lambdaレイヤーの作成には「M1 Mac」上のDocker環境を利用している
  • DockerコンテナイメージのCPUアーキテクチャはaarch64

何がおきたか

Lambdaレイヤーのサイズが大きすぎるというエラーが発生したのですが、調査をしてみると特定の共有ライブラリファイルのサイズが極端に大きいことが分かりました。

また、これはgoogle-cloud-bigqueryに含まれるgRPC用のパッケージgrpcioに含まれていました。

具体的には、以下のような手順で確認ができます。

# Lambdaレイヤ作成用に一時利用するフォルダを作成する
$ mkdir /tmp/sample

# grpcioパッケージを配置
$ pip install grpcio --target /tmp/sample/

# ファイルサイズを確認する
$ ls -lh /tmp/sample/grpc/_cython/cygrpc.cpython-37m-aarch64-linux-gnu.so 
-rwxrwxr-x 1 foo-bar foo-bar 155M Mar  2 16:31 /tmp/sample/grpc/_cython/cygrpc.cpython-37m-aarch64-linux-gnu.so

ここで表示されているとおり155MBのサイズであることが分かります。

一方で、EC2上の環境、つまりCPUアーキテクチャがx64の環境で試すと以下のようになりました。

# ファイルサイズを確認する
$ ls -lh /tmp/sample/grpc/_cython/cygrpc.cpython-37m-x86_64-linux-gnu.so
-rwxrwxr-x 1 foo-bar foo-bar 9.1M Mar  2 18:21 cygrpc.cpython-37m-x86_64-linux-gnu.so

なんと9.1MBでした。17倍ぐらいに膨れ上がっていたことが分かりますね。

なお、これは2022/3/4時点の情報ですので将来的には修正されるかもしれません。

参考にした情報

こちらのGoogle Groupに、まったく同じ問題で困っている方がいらっしゃいました。

対応

そもそも、Lambdaの実行環境ではaarch64でビルドしたライブラリは動かないので、x64環境でビルドすべきでした。

ということで、ビルド環境を見直して対応をすることにしました。

まとめ

以上、gRPCのPython版に含まれる共有ライブラリのサイズが大きくなった話でした。

もし想定外に共有ライブラリのサイズが大きくなった場合には、ビルド環境をご確認いただくと良いかもしれません。

どなたかのお役に立てば幸いです。それでは!