250MB の壁:デプロイが失敗する理由AWS Lambda にはデプロイパッケージに関する厳格な制限があります。ZIP 圧縮されたアップロードで 50 MB、展開後のコンテンツで 250 MB です。この制限を超える関数をデプロイしようとすると、AWS API は次のエラーを返します。
An error occurred (InvalidParameterValueException) when calling the UpdateFunctionCode operation: Code uncompressed size is greater than 262144000 bytes
これは通常、プロジェクトに重い依存関係(NumPy、Pandas、または大容量の Node モジュールなど)、巨大なバイナリファイル、または本番用バンドルに含めるべきではないローカルのドキュメントフォルダが含まれている場合に発生します。
根本原因の分析エラーに記載されている 262,144,000 バイトは、正確に 250 MB です。AWS は、Lambda 実行環境で解凍された後のパッケージ内のすべてのファイルの合計を計算します。AWS CLI や Serverless Framework などのツールを使用する場合、パッケージはローカルで ZIP 圧縮されますが、AWS は最終的な展開後のサイズをチェックします。
主な原因は以下の通りです。
- node_modules: 誤って
devDependenciesを含めている。- Python site-packages: 大規模なデータサイエンスライブラリ。- 一時ファイル:.gitフォルダ、キャッシュファイル、またはテストデータ。- バイナリ: ffmpeg やヘッドレスブラウザなどを直接 ZIP に含めている。### クイックフィックス:パッケージの最適化アーキテクチャを変更する前に、現在のデプロイパッケージを軽量化することを試みてください。
1. 依存関係の削減本番環境用の依存関係のみをパッケージ化していることを確認してください。Node.js の場合は、以下を実行します。
npm prune --production
For Python, use a virtual environment and only install what's in requirements.txt, avoiding global system packages.
2. Lambda 用の無視(Ignore)設定を使用するServerless Framework や AWS SAM を使用している場合は、設定で除外パターン(exclude pattern)を使用します。serverless.yml を作成または更新してください。
package:
patterns:
- '!node_modules/aws-sdk/**' # すでに Lambda ランタイムによって提供されています
- '!.git/**'
- '!tests/**'
- '!docs/**'
恒久的な対策 1:依存関係を Lambda Layers に移動するコード自体は小さいが依存関係が大きい場合は、ライブラリを Lambda Layer に移動してください。これにより、関数のコードと重いライブラリを分離できます。
node_modulesまたはpythonフォルダのみを含むレイヤーを作成します。- レイヤーを関数にアタッチします。- 関数とすべてのレイヤーの合計に対して引き続き 250MB の制限が適用されますが、レイヤーを使用することでコードの管理と共有が容易になります。### 恒久的な対策 2:コンテナイメージへの切り替え(推奨)パッケージを 250 MB 未満に抑えることができない場合(機械学習や重い Java アプリで一般的です)、最適な解決策は Lambda を Docker コンテナイメージ としてパッケージ化することです。 Lambda コンテナイメージの制限は大幅に緩和され、10 GB まで可能です。 移行手順:- AWS Lambda ベースイメージを使用して
Dockerfileを作成します。- イメージ内にコードをコピーし、依存関係をインストールします。- イメージを Amazon ECR (Elastic Container Registry) にプッシュします。- Lambda 関数を更新して、.zip ファイルの代わりにコンテナイメージを使用するように設定します。Python 関数の Dockerfile の例:
FROM public.ecr.aws/lambda/python:3.9
# 依存関係のインストール
COPY requirements.txt .
RUN pip install -r requirements.txt
# 関数のコードをコピー
COPY app.py .
# ハンドラーを指定
CMD [ "app.lambda_handler" ]
検証:修正を確認する方法上記の修正を適用した後、新しいデプロイを実行してください。AWS CLI を使用して現在のサイズを確認できます。
aws lambda get-function --function-name your-function-name --query 'Configuration.CodeSize'
コンテナイメージに切り替えた場合、CodeSize 属性はメタデータを反映しますが、展開後 250MB の制限エラーは発生しなくなります。

