環境
- Windows 11 Pro
- Windows PowerShell 5.1
- Python 3.13
概要
AWS Lambdaにカスタムレイヤーとして、
Pythonの"mojimoji"ライブラリを登録する際に行ったことを記載します。
事象
Windows環境下で"mojimoji"パッケージをzip化したものを
カスタムレイヤーに登録して実行したところ、動作しなかった。
原因としては"mojimoji"が、CythonとC++による拡張を含んでいるためである。
Windows環境下でビルドしているため、Lambdaの実行環境(Amazon Linux)では
互換性がなく実行できない状態でした。
対応策
Dockerを利用して、Amazon Linux上でパッケージzipを作成します。
利用するのは、Lambda関数の実行用として用意されたDockerイメージです。
想定される用途とは異なりますが、こちらを利用して作業を進めます。
PowerShellでの作業
ターミナルを利用し、任意のフォルダ配下に移動した後で
イメージをダウンロードし、環境を起動してコンテナ内へ移動します。
# 任意のディレクトリ配下に移動
cd working_dir
# Lambda実行環境のDockerイメージを取得
docker pull amazon/aws-lambda-python:3.13-x86_64
# 取得したイメージのコンテナに入る
docker run -v "$(pwd):/var/task" -it --rm --entrypoint /bin/bash amazon/aws-lambda-python:3.13-x86_64
コンテナ内に入る際、カレントディレクトリと/var/taskをマウントしています。
こうすることで、コンテナ内で作成したパッケージzipをホスト側で取得できます。
コンテナ内に入ってからの作業
C++コンパイラのインストールからはじめます。
その後は、"mojimoji"のパッケージを作ってからzip化します。
# c++のコンパイラをインストールする
dnf install gcc-c++ -y
# "mojimoji"を取得し、パッケージ化する
pip install mojimoji -t python/lib/python3.13/site-packages/
# パッケージをzip化する
zip -r layer.zip python
# コンテナ環境から抜ける
exit
途中の、python/lib/python3.x/site-packages/のパッケージ構造は
Lambda Layerの標準的な構造であり変更ができない部分となります。
カスタムレイヤーとしての登録
作成したパッケージzipを、Lambdaのカスタムレイヤーとして登録します。
実行したところ、Lambdaで正常に動作することも確認済みです。
参考
- amazon/aws-lambda-python - Docker Image | Docker Hub
- CDKでPython Lambda Layerを追加する方法をまとめてみた | DevelopersIO
- Lambda|Lambdaレイヤー:Dockerで簡単作成
- 実践編 S3にコードをアップロードして実行|AWSのLambdaってなんやねん