AWS Lambdaでpandasを利用する(Lambda Layers編)
概要
AWSのlambda関数で、外部のライブラリを実行したい場合、昔は、デプロイパッケージに、利用するコードを全て含めてやる必要がありました。
ただ、pandasやscikit-learnなどの重量級のライブラリの場合、毎回アップロードするのは、きついものがあります。
例えば、pandas(依存関係のあるnumpyなども含む)だと、圧縮状態で35Mbyteほどあります。
そこで、AWS Lambda layersの出番です。
これを使うことで、外部ライブラリのアップロードは、1回で済む様になり、自分で書いた部分のみを更新していけば良いことになります。
また、他のlambda関数でも使い回し可能です。
docs.aws.amazon.com
手順
以下、pandasを例にした手順です。
- とりあえず、lambda関数の実行環境を確認します。
- 19年2月現在は、以下の通りでした。
- Python 3.7.2
- 19年2月現在は、以下の通りでした。
- lambdaと実行環境を合わせたEC2を作成します。
- EC2へログインして、調べておいたlambdaで実行されるバージョンのpython(今回は、3.7.2)をインストールします。
- python.orgからソースを取得します。
- 解凍して、解凍した先のフォルダへ移動します。
- 必要なライブラリをインストールします。
- コンパイルしてインストールします。
- ./configure --enable-optimizations
- sudo make altinstall
- pandasをインストールするディレクトリ「python/lib/python3.7/site-packages/」を作成します。
- 利用したいライブラリ (この場合は、pandas)を上で作ったディレクトリへインストールします。
- pip3.7 install pandas -t ./python/lib/python3.7/site-packages/
- 「-t」オプションで、書き出し先を指定しています。
- pip3.7 install pandas -t ./python/lib/python3.7/site-packages/
- zipで固めます。
- これをLambda layersとして、publishしておきます (が、上のAMIのawsコマンドは古いのでアップデートが必要です。)
- 利用したいlambda関数と紐つけます。
以上で、lambdaでpandasを利用する準備が整いました。
最後に、pandasの使用例と実行結果を貼り付けておきます。
import sys; import json; import pandas as pd; def lambda_handler(event,context): df = pd.DataFrame([[1,2,3],[4,5,6]]); print(df); return { "statusCode": 200, "body": json.dumps('Hello pandas!'), "version": sys.version, "path": sys.path };