😫

AWS Lambdaでpandasを使えるようにするのに苦労した話

2024/10/26に公開

AWS Lambdaでpandasを使おうとした際に、いろいろと苦労したので備忘録として残しておきます。

※使用しているPCはMacBook Air M2チップです。

ソースコードアップロードの壁

はじめに、ライブラリやエントリーポイントを含めたzipファイルをLambdaにアップロードしてみました。
エントリーポイントが入っているディレクトリに対して、以下のように必要なライブラリをインストールして

pip3 install --target ./hoge pandas requests ...

以下のようにzip化。

zip -r ./hoge.zip hoge

するとzipファイルの容量が、Lambdaの制限である50MBを超えてしまいました。
これではいけないと思い、次の手に移ります。

リージョンの壁

調べると、LambdaにはLayerという機能があり、ライブラリ等をLayerに入れることでzipファイルの軽量化&複数関数で使い回すことができることがわかりました。
さらにLayerにpandasを入れる方法を調べると、ライブラリのARNが公開されていて、それをLambdaで指定することで使えるようになることがわかりました。

早速、下記場所からARNを取得しようとしました。
https://github.com/keithrozario/Klayers/tree/master/deployments

しかし、残念ながらお目当てのリージョンがありませんでした(訳あって大阪リージョンを使用しています)。

この方法もダメかと思い、次の手に移ります。

環境の壁

さらに調べると、zipファイルのアップロードでLayerを作成する方法があることがわかりました。
このとき、ディレクトリ名は「python」としないとLambda側でエラーになるらしい!ということも知り、意気揚々と以下のようにライブラリをインストールし、

pip3 install --target ./python pandas numpy

zip化しました。

zip -r ./pandas_layer.zip ./python

これをS3経由でアップロードし、Layerを作成しました。
作成したLayerを使用する関数に設定して、いざ、実行!...すると以下のようなエラーが。

[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': Unable to import required dependencies:
numpy: Error importing numpy: you should not try to import numpy from
        its source directory; please exit the numpy source tree, and relaunch
        your python interpreter from there.

勘弁してくれと思いながらエラー文で検索をかけると、似たような困り事が書かれたIssueを発見しました。
https://github.com/numpy/numpy/issues/15669

ここに、「LambdaはLinuxで動いていて、パッケージをLambdaで認識させるには専用ファイルをダウンロードしてzip化する必要がある」という旨の回答がありました。

確かに、pipインストール&zip化でうまくいっている記事をいくつか見かけていましたが、どういう環境で行われていたかは不明でしたし、私の使用しているPCはM2チップのMacなので、なにかと開発時に問題が見られる環境ではあります。納得しました。

Issueを残してくれてありがとう!と大感謝しつつ、この方法で解決に向かいます。

壁を乗り越え、ついに解決

Issueの回答にあった専用のファイルは下記リンクにあります。
https://pypi.org/project/numpy/#files

pandasを使うことが目的ではありますが、pandasにはnumpyも必要なので2種類のファイルをダウンロードします。
作成する関数は「ランタイム:Python 3.12」、「アーキテクチャ:arm64」なので、以下のファイルをダウンロードしました。

pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
numpy-2.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

※cpの後ろがpythonのバージョン(312->3.12)、「aarch64」がarm64を意味します

各ファイルを解凍して

unzip pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
unzip numpy-2.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

出てきたファイルをすべてディレクトリに入れます。
そのディレクトリをzip化・アップロードして、Layerを作成しました。

すると、無事にLambdaでpandasを使用することができました!

さいごに

やりたかったことは単純ですが、開発環境やリージョンによって一筋縄ではいかない場合があると実感しました。あと、技術ブログやIssueは偉大です。誰かを助け得る力を持っています。

私のこの記事が、誰かの助けになれば幸いです。

Discussion