AWS lambdaでPythonカスタムレイヤーを作成する

技術

AWS lambdaのPythonにおいて標準ライブラリ以外のモジュールを使う場合、

・lambdaパッケージ内にライブラリを内包させる
・外部からカスタムレイヤーを含める

というやり方があるが、lambdaを複数登録して運用する場合、都度パッケージ内にライブラリを含めるのは手間である。特にバージョンアップをする際には改修コストが大きい。

そこで、カスタムレイヤーの利用方法を整理する。

サードパーティ製のカスタムレイヤーを使用する

使うモジュールが少ない場合、これが一番楽である。
以下のサイトでは、Pythonのversion/AWSのregionごとにレイヤーをまとめている。
https://github.com/keithrozario/Klayers

例えば、tokyoリージョン(ap-northeast-1)でnumpyを使いたい場合は以下のページからARN
URIを参照すれば良い。
https://api.klayers.cloud//api/v2/p3.9/layers/latest/ap-northeast-1/html

注意点として、レイヤーは最大5つまでしか登録できないので、複数のライブラリを利用する場合が注意が必要。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/invocation-layers.html

カスタムレイヤーを作成する

ここからが本題。
AWS lmabdaではAmazon Linuxを使用するため、手元の環境でパッケージングするとうまく動作しないことがある。
そこで今回はDocker環境を使いながら、パッケージ作成を行う。

仮想環境の構築

Docker環境で全て実施するとネットワークの問題や、環境設定が手間なのと、結局のところPythonにおいては依存関係を解消すれば問題ない想定なので、ローカル(Mac)環境で仮想環境を作成する。

今回は、virtualenvを用いて仮想環境を立てる。

pyenv virtualenv 3.8.10 lambda_sample_job
pyenv local lambda_sample_job

Python3.8.10の仮想環境ができたので、適当に欲しいライブラリを突っ込む。

pip install numpy

必要なライブラリを構築できたら、pip freezeで必要ライブラリを出力する。

pip freeze > requirements.txt

Dockerを用いたパッケージング

requirements.txtを作成できたら、公式のAWS imageを用いてパッケージングを行う。
以下のURLから必要なimageのURIを確認する。
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-image-repositories.html
今回はPython3.8のimageを利用する。

またパッケージングの際のディレクトリ構造は指定があるので注意。
Pythonの場合、pythonディレクトリを起点にパッケージングを行うのが良い。https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html

#imageをpull
docker pull public.ecr.aws/sam/build-python3.8:1.66.0-20221129154604

#currentデイレクトリをマウントしてpythonディレクトリにインストールする
docker run -it -v $(pwd):/var/task public.ecr.aws/sam/build-python3.8:1.66.0-20221129154604  /bin/sh -c "pip install -r requirements.txt -t python; exit"

#zipで固める
zip -r lambda_sample.zip python/.

S3にアップロードしてlambda上で登録

S3にアップロードする、アップロード先はpublicでもprivateでも可。
アップロードしたらS3 URIを取得する。

AWS lambda上でレイヤーを新規追加する。

先ほどのS3のURIとランタイムを選択し登録。

ARN URIが発行されるのでそれをカスタムレイヤーに指定すれば完了。

コメント

タイトルとURLをコピーしました