Dockerを使用してAWS Lambda Layerを作成する方法
AWS Lambdaで使用するライブラリを簡単にLayerとして作成する方法をご紹介します。この手順では、Dockerを使用してPythonライブラリをインストールし、それをLayerとしてパッケージ化します。
前提条件
そもそも自作しなくてもlayerがAWS公式から準備されてないか確認します。
また有志の方がまとめてくれてる
https://github.com/keithrozario/Klayers/tree/master
このリポジトリで自分の環境にあったlayerがあればそれを使うのが手っ取り早いです。
上記でもないマイナーなライブラリなどをlayerにしたい時、以下の手順で簡単にできるように
シェルスクリプトを作りました。
※pythonにしか対応してません。
Dockerがインストールされていることが前提です!
手順
1. 必要なフォルダとファイルの準備
まず、任意のフォルダに移動し、Layerに含めたいライブラリ名をrequirements.txt
ファイルに記述します。
requests_toolbelt
次に、以下のシェルスクリプトをcreate_layer.sh
として保存します。
pythonバージョンは各自の環境に合わせて編集してください。
#!/bin/bash
# シェルスクリプトの実行を中止するためのエラーハンドリング
set -e
# Pythonバージョンを変数として定義
PYTHON_VERSION="3.12"
# 必要なフォルダ構成を作成
mkdir -p python/lib/python${PYTHON_VERSION}/site-packages
# Dockerコンテナを使用してライブラリをインストール
docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python${PYTHON_VERSION}" /bin/sh -c "pip install -r requirements.txt -t python/lib/python${PYTHON_VERSION}/site-packages/; exit"
# ライブラリを含むフォルダをZIPアーカイブに圧縮
zip -r lambda_layer.zip python > /dev/null
# pythonフォルダを消去
rm -rf python
# 完了メッセージ
echo "Lambda Layer ZIP file has been created successfully: lambda_layer.zip"
2. シェルスクリプトに実行権限を付与
次に、ターミナルで以下を実行しシェルスクリプトに実行権限を付与します。
chmod +x create_layer.sh
3. シェルスクリプトを実行
シェルスクリプトを実行して、Layerを作成します。
./create_layer.sh
実行が成功すると、現在のディレクトリにlambda_layer.zip
ファイルが作成されます。これをAWS LambdaのLayerとしてアップロードして使用します。
ちなみにrequests_toolbeltライブラリの動作確認用のlambda関数は以下みたいな感じです。
from requests_toolbelt.multipart import decoder
import json
def lambda_handler(event, context):
try:
# デコーダを使用してみる(例として空のバイト列を渡す)
multipart_data = decoder.MultipartDecoder(b'', 'multipart/form-data; boundary=---BOUNDARY')
# インポートとデコーダの使用が成功した場合
return {
'statusCode': 200,
'body': json.dumps('requests_toolbelt is successfully imported and used.')
}
except Exception as e:
# エラーが発生した場合
return {
'statusCode': 500,
'body': json.dumps(f'Failed to import or use requests_toolbelt: {str(e)}')
}
うまくlayerが作れていたら
ログにrequests_toolbelt is successfully imported and used. が表示されるはずです。
まとめ
以上の手順で、必要なPythonライブラリをLambda Layerとしてパッケージ化することができます。
Dockerを使用することで、ローカル環境に依存せずにライブラリをインストールできるのでおすすめです。
ぜひ試してみてください!