3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【初心者向け】AWS Lambda Layer の基礎と使い方( Python / Windows 対応 )

Last updated at Posted at 2025-07-31

画像1.png

初めに

AWS LambdaでPythonなどのコードを使ってサーバーレスアプリを構築する際、依存ライブラリの管理に困ったことはありませんか?
この記事では、Lambda Layerという機能についてまとめていきます。


Lambda Layerとは

ライブラリ、カスタムランタイム、設定ファイルをパッケージ化共有するための機能です。
実態はそれらをZIPファイルに圧縮したものです。

Layerを使うことで次のような利点があります。

  • 複数のLambda関数で共通のライブラリを一括管理できる
  • 関数のデプロイパッケージを軽量化できる
  • 共通ライブラリやコードのバージョン管理ができる

あらゆるランタイムをサポートしていますがGOやRustでの使用は推奨されません

Go や Rust で Lambda 関数を使用している場合は、レイヤーを使用しないことをお勧めします。Go 関数と Rust 関数の場合、関数コードが実行可能ファイルになります。つまり、コンパイル済みの関数コードがそのすべての依存関係と共に含まれています。レイヤーに依存関係を配置した場合、他に必要なアセンブリがあれば、初期化フェーズ中にいちいちロードされるため、コールドスタート時間が長くなる可能性があります。Go 関数と Rust 関数で最適なパフォーマンスが得られるよう、デプロイパッケージと共に依存関係を含めてください。


ユースケース

ユースケース 説明
共通ライブラリを複数関数で使いたい 例:requestspandasboto3 など
共通ユーティリティ関数をまとめたい 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

サンプルコード

今回試しに使うサンプルコードは以下の通りです。

sampleFunction
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

動作確認

実際に動作確認してみます。テスト実行したところ動作していることが確認できます。
image.png


おわりに

本記事ではLambda Layer について基本からサンプルまでを記事にしました。
Layerを活用することで、開発効率や関数の管理がぐっと楽になります。まずはシンプルなライブラリから試してみてください!


🌟この記事が誰かの役に立てば幸いです!
また、ご質問やフィードバックもお待ちしています。


参考資料

リファレンス

ブログ

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?