AWS Lambdaでpandasを使えるようにするのに苦労した話
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を取得しようとしました。
しかし、残念ながらお目当てのリージョンがありませんでした(訳あって大阪リージョンを使用しています)。
この方法もダメかと思い、次の手に移ります。
環境の壁
さらに調べると、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を発見しました。
ここに、「LambdaはLinuxで動いていて、パッケージをLambdaで認識させるには専用ファイルをダウンロードしてzip化する必要がある」という旨の回答がありました。
確かに、pipインストール&zip化でうまくいっている記事をいくつか見かけていましたが、どういう環境で行われていたかは不明でしたし、私の使用しているPCはM2チップのMacなので、なにかと開発時に問題が見られる環境ではあります。納得しました。
Issueを残してくれてありがとう!と大感謝しつつ、この方法で解決に向かいます。
壁を乗り越え、ついに解決
Issueの回答にあった専用のファイルは下記リンクにあります。
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