注意点
- LambdaはAmazon Linux(2含む)上で稼働するため、Amazon Linux上でレイヤー用のZipファイルを作成した方が安全
- Lambdaのランタイム(言語)ごとに設定されたPATH変数に合わせて、Zipファイル内のフォルダ構造を定義する
amazon/aws-sam-cli-build-imageのDockerイメージを利用してレイヤー用のZipファイルを作成する
上記Dockerイメージは、AWS SAMで提供されているイメージです。
以下では、Pythonのレイヤーを作成します。
まず、レイヤーを作成する作業用ディレクトリに移動します。
mkdir layer
cd layer
そして、レイヤーにしたいパッケージを requirements.txt に記述します。
touch requirements.txt
requests
AWS SAMで提供されているイメージを利用して、パッケージをインストールします。
作成したいLambda関数のランタイムと同じイメージを選択します。
これにより、Lambda関数利用時にレイヤーが原因の予期せぬエラーに悩まされることはほぼなくなると思われます。
*パッケージによっては、インストール時のPythonのバージョンやOSなどでパッケージの内容が異なる場合があるため、実行するLambdaの環境と同様のDockerイメージなどでレイヤーを作成した方が好ましい。
docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.9" \
/bin/sh -c "pip install -r requirements.txt -t python/lib/python3.9/site-packages/; exit"
カレントディレクトリに python/lib/python3.9/site-packages/ ができたので、それをZipファイルにします。
zip -r layer.zip python > /dev/null
ツリー形式で表示すると、以下のようになります。
layer
├── layer.zip
├── python
│ └── lib
│ └── python3.9
│ └── site-packages(このフォルダ配下にパッケージあり)
└── requirements.txt
Lambdaランタイムのレイヤーパス python/lib/python3.9(3.8なら3.8)/site-packages の構造になっていることがわかります。
レイヤーの作成
今回はコンソールから作成します。
layer.zipをアップロードします。

Lambda関数の実行
レイヤーを使用するLambda関数を、Python3.9でデフォルトで作成します。
まずは、レイヤーを適用しない状態でLambdaを実行してみます。
import requests
def lambda_handler(event, context):
res = requests.get("https://aws.amazon.com/jp/")
print(res)
想定通り、以下のエラーが発生しました。
Unable to import module 'lambda_function': No module named 'requests'
次に、Lambda関数にレイヤーを適用してみます。

再度Lambdaを実行すると、エラーなく成功しました。
参考
Lambda レイヤーの作成と共有 - AWS Lambda
組織内またはパブリックにコードを共有するための Lambda レイヤーを作成します。レイヤーには、ライブラリ、カスタムランタイム、またはその他の依存関係を含めることができます。

Docker でシミュレートされた環境を使用して Lambda レイヤーを作成する