結論
先人によって既に作られてないか、いったん確認してみましょう。
keithrozario/Klayers
使い方
なぜかAWS公式でLayerが提供されていないライブラリ、pandasを例として使います。
(Numpy + Scipyがあるなら、pandasもあってくれていい気がしています)
0. 前準備
AWS Lambdaにアクセスして、[関数の作成]を押し、適当な名前の関数を作ります。
「ランタイム」はPython3.8を選びます。「アクセス権限」はノータッチでOKです。
1. pandasをインポートし、テストを作成
[テスト]を押し、「イベント名」に適当な名前を入れます。
下のJSONは特にいじらなくてOKです。
この時点でもう一度[テスト]を押すと失敗します。pandasが無いよと言われています。
それはそうという感じですね。
2. pandasのLayerのARNを調べ、Layerを追加
必要な情報は以下の2つです。
- Lambda実行環境のPythonのバージョン
- Lambda関数が所属しているリージョン
いま、自分の実行環境はPython3.8
でリージョンはus-east-1
です。(リージョンが異なる場合は、適宜自分のものに読み替えてください。)
keithrozario/Klayersにアクセスし、[deployments] -> [python3.8] -> [arns] -> [us-east-1.csv]と辿ります。
pandas があるので、該当行のARNをコピーします。pandasのように、複数バージョンのLayerが提供されているライブラリもあります。
ここではpandas1.0.1を選択しました。ほかのバージョンでも特に問題ないです。
Lambdaに戻り、「Designer」の中の[Layers]を選択します。下に「Layers」というカードが出てくるので、[Layerの追加]を押します。
[レイヤーバージョン ARN を提供]を選択し、「レイヤーバージョン ARN」に先ほどのARNを貼り付けます。
[追加]を押して関数の設定ページに戻ります。
きちんと追加されていれば、「Layer」に反映されます。
[保存]を押します。
3. 確認
さて、これでレイヤーの追加ができたので、pandasを使えるようになっているはずです。
先ほど設定したテストを実行してみましょう。
pandasがインポートされている状態で、関数が正常終了したことが分かります。
Layerが用意されているライブラリ一覧
- aiobotocore
- aiohttp
- ansible
- aws-lambda-powertools (Python3.8 only)
- arrow
- aws-xray-sdk
- bcrypt
- beautifulsoup4
- boltons
- boto3
- construct
- dynamodb-encryption-sdk (Python3.8 only)
- elasticsearch
- envelopes
- ffmpeg-python
- flashtext
- google-auth
- google-auth-oauthlib
- grpcio
- gspread
- idna
- itsdangerous
- kafka-python
- nltk
- numpy
- opencv-python-headless
- openpyxl
- pandas
- parliament (Python3.8 only)
- Pillow
- pulp
- pycryptodome (Python3.8 only)
- PyJWT
- pymongo
- PyMUPDF
- PyMySQL
- PyNaCl
- pyOpenSSL
- pyparsing
- pyqldb
- pytesseract
- python-docx
- python-Levenshtein
- pytz
- PyYAML
- reportlab (Python3.8 only)
- requests
- simplejson
- slackclient
- spacy
- SQLAlchemy
- textdistance
- tinydb
- tldextract
- twilio
終わりに
OS依存の関数があったりすると、Lambdaの実行環境と同じOSでzipを作らなければならないのでちょっと面倒です。
外部ライブラリをサクッとLambdaで使いたいだけなら、ありがたく先人が開いてくれた道を通らせていただきましょう。
Lambdaで使える他の言語で、類似のgithubリポジトリ等があれば教えていただければ幸いです。
(ざっと探しましたが見つかりませんでした)