概要
AWS lambdaでは初期状態でpandasやnumpyなどの外部ライブラリを読み込むことはできません.読み込ませる方法は二つあって,一つ目はインストール済みのライブラリと実行ファイルをまるっとzipファイルにまとめてlambdaにアップロードする方法,二つ目はlambdaでLayerとして読み込ませる方法です.後者の方法がおすすめですが,本記事ではこれらの方法をコード管理の面と合わせてTipsとしてまとめました.
環境
MacOS Catalina
docker 導入済み
AWS CLI 導入済み
はじめに
lambda開発をブラウザ上で行うのはコード管理の面でよろしくないのでローカルで開発できるようにします.つまりgitHub管理できるようにローカルで作業を行いコードの変更を随時lambdaにアップロードするという形を取ります.
ということでdocker-lambdaを使用してデプロイ環境つくりました.(使用する場合はcloneしてください)
https://github.com/shoda888/local2lambda
まずdockerイメージが必要なので作ります.(初回のみ)
$ docker build -t shoda888/local2pylambda .
その後,予め作ってあるlambda関数名をdeploy.sh
のfuncname変数に与えてを以下を実行すれば自動でアップロードが行われます.
$ sh deploy.sh
lambda_function.py
を書き換えて再度deploy.shして変更されているか確認してください.
ライブラリをzipファイルにまとめてlambdaにアップロードする方法
requirements.txtにライブラリ名を与えてdeploy.shするだけです(pandas, numpy, requests など).作業ディレクトリ内にライブラリディレクトリが大量に生成されます.Pandasだと重すぎてアップロードに5分ほどかかってしまいます.lambda上で確認してみるとアップロード成功してますが,警告が出ます.
Lambda 関数「*******」のデプロイパッケージが大きすぎて、インラインコード編集を有効にできません。ただし、関数を呼び出すことはできます。
一応これでも関数の呼び出しはできるようです.
ライブラリをLayerにまとめる方法
毎回ライブラリをzip化してアップロードするのがだるいので,requirements.txtは空にしておくのがお勧めです.ライブラリをLayerにまとめれば使い回し可能で便利かと思います.(ただし将来的にライブラリのバージョン管理がめんどくさいかもしれません)
ライブラリをLayerにまとめる方法を確認しましょう.
Pure Pythonなライブラリの場合
純Pythonなライブラリの場合,たとえば画像のようにPython100%で構成されているライブラリはEC2でAmazonLinuxやubuntu環境を用意しなくてもお手持ちのMacでlayer用のzipファイルを簡単に作れます.
例としてask_sdk_coreをインストールしたい場合, これだけです.(python3.7の例)
$ mkdir -p build/python/lib/python3.7/site-packages
$ pip3 install ask_sdk_core -t build/python/lib/python3.7/site-packages/
$ cd build
$ zip -r ask_sdk.zip .
生成されたask_sdk.zipをlayerに追加し,lambda内でlayerを適応させればライブラリが読み込まれます.
PureじゃないPythonのライブラリの場合
numpyやpandasなどがそれにあたります.EC2でAmazonLinux環境を作りzip化するのが良いみたいです.(以前Layerをubuntuで作った気がしましたが,ubuntuでも可??)
これに関しては既に多くの方がやられているので他の方の記事がとても参考になります.
[pandasをLambdaのLayerとして追加する]
(https://qiita.com/thimi0412/items/4c725ec2b26aef59e5bd)
AWS Lambda Layersでライブラリを共通化
以下はyoutubeですがubuntuを使用してLayerを作られてます.(わかりやすい)
[AWS Lambda Layers for Pandas library]
(https://youtu.be/zrrH9nbSPhQ)
まとめ
ローカルでコード管理しながらLambda開発が行えるようにした上で,外部ライブラリの読み込み方法をTipsとしてまとめました.