chaliceでlambdaにk-meansを実行する関数をデプロイする
タイトルだけなら簡単そうな感じがしますがちょっとつまずきます。
pyhtonでk-meansを実行する際にはscikit-learnを使うかと思いますが、これが重くてlambda layerに収まりません
でも、chaliceを使ってロールとかを管理する手間とはおさらばしたい
というときのtipsです
今回、具体的にやることはk-meansを実行するためのlambda layerを作成することです
pythonのバージョン
lambda layerには容量制限があります
scipyについては自分でライブラリの軽量化をしようと思ってもうまくいかなかったので、こちらの情報を参考に、AWSから提供されているlayerを利用する方針で行きます
この制約のためpythonのバージョンは
3.7か3.8となります
今回はPython 3.8.19で進めます
lambdaレイヤの作成
k-meansを実行するために必要なライブラリは
- sklearn
- numpy
- scipy
となります。厳密にいうとsklearnの依存関係として、numpy, scipyが含まれています
pip install -t python/ scikit-learn
を実行した後にpythonディレクトリの中を確認するとわかりますが、numpy, scipyが含まれています。
これによってlambda layerの容量制限を超えてしまうので軽量化のために削除します
方針として
- sklearnからnumpy, scipyを削除して軽量化したsklearnレイヤの作成
- numpyレイヤの作成
- scipyはaws提供のものをそのまま使う
という感じで行きます
mkdir lambda_layer_libs && cd $_
mkdir python
# sklearnを軽量化後zip化
pip install -t python/ scikit-learn==1.3.2
rm -r python/numpy* python/scipy*
zip -r sklearn.zip python/
rm -r python/*
# numpyのzip化
pip install -t python/ numpy==1.24.4
zip -r numpy.zip python/
rm -r python/*
その後、S3に各zipファイルをアップロードし
AWSのコンソールからlayerを作成後layerのarnをコピーして
.chalice/config.json
を編集します
{
"version": "2.0",
"app_name": "hogehoge-app",
"stages": {
"dev": {
"api_gateway_stage": "api",
"layers": [
"arn:aws:lambda:hogehoge:layer:numpy:1",
"arn:aws:lambda:hogehoge:layer:scikit-learn:1",
"arn:aws:lambda:ap-northeast-1:249908578461:layer:AWSLambda-Python38-SciPy1x:109"
]
},
}
}
このように、lambda layerのarnを指定します
この時、numpy, scikit-learnは自分で作成、アップロードしたものを使用しますが、scipyについてはawsで提供されているものを使います
python3.8の場合は
arn:aws:lambda:ap-northeast-1:249908578461:layer:AWSLambda-Python38-SciPy1x:109
が使えるはずです
準備はできた!
これで晴れて、app.pyとかに
from chalice import Chalice
import numpy as np
from sklearn.cluster import KMeans
みたいなことを書いてもエラーが起きず、実行できるようになります
では、良いlambdaライフを!
Discussion