AWS Lambda layer 作成方法

Lambdaには予めpip installインストールされているライブラリがある。 しかしインストールされておらずimportでエラーになるライブラリもある。 それらを入れる簡単な方法。

Lambda layer

  • Uploadしただけでは使えない。
  • 各Lambda Functionに使用するLambda layerを紐付ける必要がある。 最大5個/Function。
  • Deploy package全体として解凍後250MBを超えれない。(ハードリミットでService quotaを引き上げれない)

Lambda layerでよく使われるLibrariesトップ10

ライブラリ名分野解凍後の容量(目安)容量に関する注意点
SciPy数値計算100 MB 超最も大容量。複雑な数値計算用。NumPyとの合計で簡単に250MB制限に近づく。
pandasデータ処理数十 MB (NumPy+10~30MB)データ分析に必須だが、NumPyに依存し大容量。
NumPy (Np)数値計算数十 MB (40~50MB以上)ネイティブコードを含むため、Layer容量圧迫の主因。
Pillow (PIL)画像処理10 MB 程度画像処理のデファクトスタンダード。ネイティブコードを含みやや重い。
BeautifulSoup / lxmlスクレイピング数 MBHTML/XML解析。lxmlのバイナリの有無でサイズが変動。
SQLAlchemyデータベース数 MBORM(オブジェクトリレーショナルマッピング)。
PDFminer.sixドキュメント処理数 MBPDFからのテキスト抽出。
RequestsHTTP通信1 MB 未満外部API連携のデファクトスタンダード。非常に軽量。
OpenAILLM API1 MB 未満LLMクライアントSDK。軽量。
markdown-it-pyMarkdown処理1 MB 台Markdown処理。軽量。
PyYAML設定/処理1 MB 未満YAML設定ファイルの読み書き。軽量。
Psycopg2 / PyMySQLデータベース1 MB 未満RDB接続用ドライバ。
SlackClient / tweepy外部連携1 MB 未満各サービスSDK。軽量。

Lambda layer作成手順

  1. Lambda layerを使用するLambda functionのPythonバージョンを確認
  2. ローカルPCでLambda functionが使っているバージョンのPythonをインストールする
  3. Lambda layer用のzipを作るためのDirectoryを作る
  4. そのDirectoryに対象ライブラリをpipでインストール
  5. zipにする
  6. Lambda layerを作成する。 この時そのzipをアップロードする
  7. そのLambda layerを使用するLambda functionに、そのLambda layerを追加する

Lambda functionのPythonバージョン確認

Lambda functionで使っているPythonバージョンと同じバージョン環境で作成したzipで作ったLambda layerしか使えません。 Lambdaでは、まだPython3.14や3.15は使えません。 なので必ずLambdaで使えるバージョン を確認すること。

  1. AWSコンソールで、Lambda ==> Functions =>対象のFunctionをクリック
  2. Codeタブクリック
  3. スクロールダウンするとRuntime settingsがある。
  4. Runtimeの下に、私の場合、 Python3.13とあったので、最新のPython3.13.9をインストールする事にする。

ローカルPCにPython3.13.9インストール

pyenvを使うこと。 pyenvがなければここを参照にインストールすることをおすすめします。 私も以前入れてなくて苦労しました。『pyenv インストール Windows&uBuntu 使い方一覧

  1. pyenv install 3.13.9
  2. 私の場合、会社の共同開発PCなので、lambda layerのzipを作るためのディレクトリに移動して、localを指定して、そのディレクトリだけ、新しいPythonバージョンになるように切り替えました。(Pyenvは超便利です)
  3. pyenv local 3.13.9

zip作成

私は将来、PyYAML、makdown-it-py、OpenAI、Request、BeautifulSoupを入れておこう。多分10MBくらいと思う。 今回はAIエージェント用にMarkdownでのPromptにRAGから取り出した情報を、YAMLとして追記するので2つだけにしよう。(JSONよりYAMLのほうが見やすい。 自分で書くと間違えそうだが、ライブラリにYAML化してもらうと便利。)

# 1. 作業ディレクトリの作成と移動
mkdir lambda_python_dependencies
cd lambda_python_dependencies

# 2. Pythonランタイムの規定に合わせ、"python"ディレクトリを作成
#    Lambdaは、このディレクトリを探します
mkdir python

# 3. pythonディレクトリにPyYAMLとmarkdown-it-pyをインストール
pip install PyYAML markdown-it-py --target python

# 4. pythonディレクトリをルートとしてzipファイルを作成
zip -r spec_processor_layer.zip python

以下エラーが表示される。 

競合の原因: これは、私が使っているローカル環境(~/aws/lambda/layers/stchat)に、SageMakerのライブラリ(sagemaker 2.235.1)がインストールされており、そのsagemakerが古いバージョンのprotobufを要求している一方、システムには新しいprotobuf 5.29.1がインストールされているために発生しています。

Lambda Layerへの影響: この競合はローカル環境で起きているものであり、Lambda LayerにインストールしたPyYAMLやmarkdown-it-py自体には影響はありません。Lambda環境では、sagemakerやprotobufのバージョンはローカルとは関係なく実行されるため、この警告は無視して大丈夫です。

ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
sagemaker 2.235.1 requires protobuf<5.0,>=3.12, but you have protobuf 5.29.1 which is incompatible.

Lambda layer作成

  1. Lambda==>左のメニューLayers
  2. Create layer
  3. 名前を入れて、Descriptionsを記入して、x86_64などのArchitectureを入れて
    • 本来はLambdaのRuntimeと同じRuntimeでローカル環境で構築しないといけない。
    • 名前の最後に_3_13と入れた。(『.』は使えない)
  4. Compatible runtimesでPython3.13を選択
  5. Create

これでLambda layerが出来ました。

Lambda functionに関連付ける

  1. Lambda==> Lambda layerを追加するfunctionを選択する
  2. Codeタブをクリック
  3. スクロールダウンするとLayersがある
  4. Add layerする(AddしたいLayerを選択する)

1つのFunctionには5個のLayerまでAddでます。 しかしそのfunctionと、Lambda layerが解凍された状態で最大250MB以下である必要があります。

Lambda functionのバージョン変更方法

作ったLambda layerと、そのLambda layerを使いたい(関連付けたい)functionのPythonバージョンが違っていたら正常に動作しない可能性もあるので、Lambda functionのバージョンが違っていたら、Lambda layerを作り直すか、Lambda functionのPythonバージョンを変更しなければならない。

  • Lambda==> Lambda layerを追加するfunctionを選択する
  • Codeタブをクリック
  • スクロールダウンすると、Runtime settingsがある。
  • Editをクリック
  • Runtimeの下のプルダウンから、Lambda layerと同じバージョンを選択する。
  • Save

これでLambda layerとLambda functionが同じバージョンになり、バージョン不一致エラーにならない。

コメント