🏎️

chaliceでlambdaにk-meansを実行する関数をデプロイする

2024/05/27に公開

タイトルだけなら簡単そうな感じがしますがちょっとつまずきます。

pyhtonでk-meansを実行する際にはscikit-learnを使うかと思いますが、これが重くてlambda layerに収まりません

でも、chaliceを使ってロールとかを管理する手間とはおさらばしたい

というときのtipsです

今回、具体的にやることはk-meansを実行するためのlambda layerを作成することです

pythonのバージョン

lambda layerには容量制限があります

scipyについては自分でライブラリの軽量化をしようと思ってもうまくいかなかったので、こちらの情報を参考に、AWSから提供されているlayerを利用する方針で行きます

https://dev.classmethod.jp/articles/check-lambda-python-runtime-packages/

この制約のため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ライフを!

Fusic 技術ブログ

Discussion