ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

【AWS】Lambda にデプロイしたら容量でエラー

Lambda にデプロイしたら容量関連でエラーが出ました。

エラー

An error occurred (RequestEntityTooLargeException) when calling the UpdateFunctionCode operation: Request must be smaller than 70167211 bytes for the UpdateFunctionCode operation
zsh: exit 1    

原因

このエラーは、AWS Lambda にデプロイしようとしているコードが、UpdateFunctionCode の最大許容サイズ(約70MB)を超えているために発生しています。

解決策

デプロイするパッケージをスリム化

Lambdaのコードサイズを減らすために、不要なファイルを削除したり、軽量なライブラリを使用したりします。

requirements.txt の見直し
  • 使用していないライブラリを削除
  • 軽量版のライブラリに変更(例: numpy → numpy-lite)
「pip install」 の際に 「--no-cache-dir」 を使用

「--no-cache-dir」 オプションで不要なキャッシュを含めないようにします。

pip install -r requirements.txt -t . --no-cache-dir
「.zip」 に含める不要なファイルを削除

例えば、「.git/」 や 「__pycache__/」 などを除外してパッケージングします。

zip -r lambda_function.zip . -x "*.git*" "*__pycache__*"

Lambda レイヤーを活用

ライブラリが大きくなりすぎる場合、Lambda レイヤーを利用して別途管理できます。

Lambdaレイヤーを作成
mkdir python
pip install -r requirements.txt -t python/
zip -r layer.zip python

次に、AWS CLI でレイヤーを作成します。

aws lambda publish-layer-version --layer-name my-layer --zip-file fileb://layer.zip --compatible-runtimes python3.12

Lambda の「レイヤー」セクションでこのレイヤーを追加すれば、デプロイする ZIP サイズを減らせます。
Lambdaレイヤーを作成した後、それを Lambda 関数に紐づけるには以下のコマンドを実行します。

aws lambda update-function-configuration \
    --function-name myFunction \
    --layers arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1

S3 経由でデプロイ

Lambda の直接アップロードの制限(50MBのコード、250MBのデプロイパッケージ)を超える場合、S3 にアップロードしてから Lambda にデプロイできます。

S3 にアップロード
aws s3 cp lambda_function.zip s3://your-bucket-name/
S3 から Lambda へデプロイ
aws lambda update-function-code --function-name myFunction \
    --s3-bucket your-bucket-name --s3-key lambda_function.zip
コンテナ(Docker)を使う

Lambda は コンテナイメージ でもデプロイ可能です。もし、コードが大きくなりすぎるなら、Docker を活用するのも選択肢です。

docker build -t my-lambda .
docker tag my-lambda:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-lambda:latest
docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-lambda:latest

Lambda のランタイムを「コンテナイメージ」に設定して使います。