初めに
AWS LambdaでPythonなどのコードを使ってサーバーレスアプリを構築する際、依存ライブラリの管理に困ったことはありませんか?
この記事では、Lambda Layerという機能についてまとめていきます。
Lambda Layerとは
ライブラリ、カスタムランタイム、設定ファイルをパッケージ化共有するための機能です。
実態はそれらをZIPファイルに圧縮したものです。
Layerを使うことで次のような利点があります。
- 複数のLambda関数で共通のライブラリを一括管理できる
- 関数のデプロイパッケージを軽量化できる
- 共通ライブラリやコードのバージョン管理ができる
あらゆるランタイムをサポートしていますがGOやRustでの使用は推奨されません
Go や Rust で Lambda 関数を使用している場合は、レイヤーを使用しないことをお勧めします。Go 関数と Rust 関数の場合、関数コードが実行可能ファイルになります。つまり、コンパイル済みの関数コードがそのすべての依存関係と共に含まれています。レイヤーに依存関係を配置した場合、他に必要なアセンブリがあれば、初期化フェーズ中にいちいちロードされるため、コールドスタート時間が長くなる可能性があります。Go 関数と Rust 関数で最適なパフォーマンスが得られるよう、デプロイパッケージと共に依存関係を含めてください。
ユースケース
| ユースケース | 説明 |
|---|---|
| 共通ライブラリを複数関数で使いたい | 例:requests、pandas、boto3 など |
| 共通ユーティリティ関数をまとめたい | logging関数、エラー処理関数などを一元管理 |
| 依存関係の分離 | 関数コードのメンテナンス容易性向上 |
仕組み
Lambda関数実行時に、Lambdaの実行環境にLayerが展開されます。ポイントは以下2点です。
-
/optディレクトリ配下に展開される -
/optディレクトリ配下の特定のPATHがランタイムに設定されている
PATHを意識することがとても重要です。各ランタイムで以下のようにPATHが定義されています。
ZIPファイルを作るときはフォルダ名と階層構造を意識してください。
- 複数記載のあるものはどれかを満たせばOKです
- 独自のPATHにしたい場合は、Lambda関数内で定義すれば問題ないと思います
| ランタイム | パス |
|---|---|
| Node.js |
nodejs/node_modules nodejs/node18/node_modules (NODE_PATH) nodejs/node20/node_modules (NODE_PATH) nodejs/node22/node_modules (NODE_PATH)
|
| Python |
python python/lib/python3.x/site-packages (サイトディレクトリ) ※ python3.x はお使いのバージョン番号に合わせます |
| Java | java/lib (CLASSPATH) |
| Ruby |
ruby/gems/3.3.0 (GEM_PATH) ruby/lib (RUBYLIB)
|
| すべてのランタイム |
bin (PATH) lib (LD_LIBRARY_PATH)
|
制約と注意点
- 関数コード+Layerのサイズが展開前:50MB/展開後:250MBの上限有
- Lambda関数1つに対して最大5つのLayerをアタッチ可能
- Layerは読み取り専用(書き込み不可)
- Layerを利用するLambda関数のランタイム/バージョンが一致している必要がある
(例:Python3.11ならLayerもPython3.11で作成) - Lambda関数が実行されるOSと同一の環境でLayerを作成する必要あり
Lambda Layerの使い方(Python / Windows編)
基本的な内容をおさらいしたところで実際に簡単なサンプルで試していきます。
環境
今回Layerを作成する環境は以下の通りです。
- OS:Windows 11
- Python:3.13
- AWS CLI:2.22.19
- GitBash:2.47.1.2
サンプルコード
今回試しに使うサンプルコードは以下の通りです。
import requests
def lambda_handler(event, context):
response = requests.get("https://example.com")
return {
"statusCode": response.status_code,
"body": response.text
}
事前準備①:pyenv-win インストール
本題とそれてしまいますが、Pythonバージョン管理ツールのpyenv をインストールします。Windows では対応していないのでpyenv-win をインストールします。
今回はGitを使ってインストールしていきます。
$ git clone https://github.com/pyenv-win/pyenv-win.git "$HOME\.pyenv"
続いてPATH を通します。
$ echo 'export PATH="$HOME/.pyenv/pyenv-win/shims:$PATH"' >> ~/.bash_profile
$ echo 'export PATH="$HOME/.pyenv/pyenv-win/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
以下コマンドでバージョンが確認されればOKです。
$ pyenv --version
pyenv 3.1.1
バージョン確認時にWindows環境変数への登録を促す文言が表示され気になる方はPowershell で登録してください
$ pyenv --version
PYENV variable is not set, recommended to set the variable.
PYENV_ROOT variable is not set, recommended to set the variable.
PYENV_HOME variable is not set, recommended to set the variable.
pyenv 3.1.1
事前準備②:python3.13 インストール
pyenv を使ってpython 3.13.0 をインストールします。
以下コマンドでインストール可能バージョン一覧を取得できます
$ pyenv install --list
$ pyenv install 3.13.0
インストール完了後以下コマンドから、pyenv でインストール済みの python バージョンが確認できます。
$ pyenv versions
3.13.0
事前準備③:仮想環境作成
続いて仮想環境を作成します。
作成しなくても良いですが、ローカル環境への影響がでないようにしたいので作成します。
まず適当な作業用ディレクトリを作成し移動します。
$ mkdir $HOME/Downloads/work && cd $HOME/Downloads/work
続いてpyenv にて作業ディレクトリ内で使用する python バージョンを設定します。
$ pyenv local 3.13.0
$ pyenv version
3.13.0 (set by $HOME\Downloads\work\.python-version)
$ python -V
Python 3.13.0
- ちなみに作業ディレクトリではなくローカル全体でバージョン指定する場合は以下コマンド設定します
$ pyenv global インストール済みの中から設定したいバージョン
続いて仮想環境を作成します。
$ python -m venv layer_venv
その後、仮想環境をアクティベートします。
$ source $HOME/Downloads/work/layer_venv/Scripts/activate
ディアクティベートは以下のコマンドで実施します
$ deactivate
本題①:Layer作成
それではLayerを作っていきます。
以下コマンドを実行します。
Lambda と互換性のあるホイールをダウンロードするために --platform を指定しています。
$ mkdir layer_venv/python
$ pip install \
--platform manylinux2014_x86_64 \
--target=layer_venv/python/ \
--implementation cp \
--python-version 3.13 \
--only-binary=:all: --upgrade \
requests
$ powershell -c Compress-Archive -Path "./layer_venv/python/" -DestinationPath my-layer.zip
本題②:Layerのアップロード及び関数への紐づけ
まずLayerをアップロードします。
$ aws lambda publish-layer-version \
--layer-name my-python-layer \
--zip-file fileb://my-layer.zip \
--compatible-runtimes python3.13 \
--description "requests library for Lambda"
続いて関数にLayerをアタッチします。
$ aws lambda update-function-configuration \
--function-name sampleFunction \
--layers arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:layer:my-python-layer:1
動作確認
実際に動作確認してみます。テスト実行したところ動作していることが確認できます。

おわりに
本記事ではLambda Layer について基本からサンプルまでを記事にしました。
Layerを活用することで、開発効率や関数の管理がぐっと楽になります。まずはシンプルなライブラリから試してみてください!
🌟この記事が誰かの役に立てば幸いです!
また、ご質問やフィードバックもお待ちしています。
参考資料
リファレンス
- Managing Lambda dependencies with layers - AWS Lambda Developer Guide
- Building Lambda functions with Python - AWS Lambda Developer Guide
