【初心者向け】Lambda デプロイで数MBは大きすぎるかも!?
はじめに
AWS Lambda関数を作って、いざデプロイしたらコードサイズ予想以上に大きくて驚いたことはありませんか?
私は初めてLambda関数をデプロイしようとしたとき、パッケージサイズが18MBになってしまい、「なんでこんなに大きいの?」と困惑しました。調べてみると、他のLambda関数は1MB以下なのに、自分のだけ異常に大きい…。
この記事では、Lambda関数のデプロイパッケージを18MBから16KBへと99.9%削減した最適化プロセスを、実際の試行錯誤も含めて解説します。同じ悩みを持つ初心者エンジニアの方に、少しでも参考になれば幸いです。
この記事で学べること
- Lambdaデプロイパッケージが大きくなる原因
- boto3を除外すべき理由と方法
- Lambda Layerの基本的な使い方
- 実際のビルドスクリプトの書き方
- デプロイ手順の全ステップ
想定読者
- Lambda関数を作ったことがある(1~2年程度の経験)
- デプロイパッケージが大きくて困っている
- Lambda Layerを使ったことがない
- 「なんで自分のパッケージだけこんなに大きいの?」と思っている方
Lambda デプロイパッケージが18MBになった理由
デプロイしようと思った瞬間の状況
私が作ったLambda関数は、Google Cloud BigQueryとGemini APIを使う機能でした。必要なPythonライブラリは以下の通り:
# requirements.txt
boto3>=1.34.0
google-cloud-bigquery>=3.0.0
google-genai>=0.1.0
google-auth>=2.0.0
普通にpip installしてZIPにまとめたら、こうなりました:
$ du -h lambda_deployment.zip
18M lambda_deployment.zip
「え、18MB?」と思いました。他の人が作ったLambda関数を確認すると、どれも1MB以下です。何かがおかしいとここで感じました。
パッケージの中身を調査
まず、何がサイズを占めているのか調べました:
$ cd lambda_package
$ du -sh *
17.82M botocore
0.93M boto3
5.75M google
1.67M pydantic
16K src # 自分のソースコード
boto3とbotocoreで合計18.75MBを占めていることが判明しました。
ここで気づいたのは、「Lambdaランタイムにboto3は標準搭載されているのでは?」ということです。
AWS公式ドキュメントを確認すると、確かにboto3はプリインストールされています。
> Lambda Python ランタイムには、AWS SDK for Python (boto3) が含まれています。
つまり、わざわざパッケージに含める必要はなかったのです。
graph LR
A[pip install boto3] --> B[パッケージに含める]
B --> C[18MB]
style C fill:#ff6b6b
D[boto3を除外] --> E[Lambdaの標準boto3を使う]
E --> F[3.7MB]
style F fill:#51cf66
最適化手法1: boto3の除外で18MB → 3.7MBに削減
ビルドスクリプトからboto3を削除
最初のビルドスクリプト(build_lambda_package.sh)を修正しました:
変更前:
python3 -m pip install \
--target $BUILD_DIR \
--platform manylinux2014_x86_64 \
--only-binary=:all: \
boto3>=1.34.0 \
google-cloud-bigquery>=3.0.0 \
google-genai>=0.1.0 \
google-auth>=2.0.0
変更後(boto3を除外):
python3 -m pip install \
--target $BUILD_DIR \
--platform manylinux2014_x86_64 \
--only-binary=:all: \
google-cloud-bigquery>=3.0.0 \
google-genai>=0.1.0 \
google-auth>=2.0.0
再ビルドして確認:
$ ./build_lambda_package.sh
✓ デプロイパッケージ作成完了: lambda_deployment.zip (サイズ: 3.7M)
18MB → 3.7MBに削減(約80%削減)しました!
それでも大きすぎる問題
しかし、まだ3.7MBもあります。他のLambda関数が1MB以下なのに、これでは不十分です。
「他の依存ライブラリ(Google系)をどうにかできないか?」と考え、次の手法に進みました。
最適化手法2: Lambda Layerで3.7MB → 16KBに削減
Lambda Layerとは?
Lambda Layerは、複数のLambda関数で共有できるライブラリをパッケージ化する機能です。
graph TB
subgraph "従来のデプロイ"
A1[Lambda関数コード
+ 依存ライブラリ]
A2[18MB]
end
subgraph "Lambda Layer活用"
B1[Lambda関数コード
16KB]
B2[Lambda Layer
依存ライブラリ 13MB]
B1 --> B2
end
style A2 fill:#ff6b6b
style B1 fill:#51cf66
Lambda Layerを使うメリット
1. 関数コードと依存ライブラリを分離できる
– 関数コードだけを更新するときは16KBのZIPをアップロードするだけ
– 依存ライブラリは変更しない限り再アップロード不要
2. デプロイが高速化される
– 16KBなら数秒でアップロード完了
– 18MBだと数十秒かかる
3. 複数の関数で同じLayerを共有できる
– Google系ライブラリを使う関数が複数あっても、Layer は1つだけ
4. コールドスタートが高速化される
– パッケージサイズが小さいほど起動が速い
Lambda Layer用ビルドスクリプトの作成
build_lambda_layer.shを新規作成しました↓
※ 動かすことを優先していますので、細かい箇所は気にしていません。
#!/bin/bash
set -e
echo "Lambda Layer用パッケージを作成します..."
# 一時ディレクトリを作成
LAYER_DIR="lambda_layer"
rm -rf $LAYER_DIR
mkdir -p $LAYER_DIR/python
# 依存関係をインストール
echo "依存関係をインストール中..."
python3 -m pip install \
--target $LAYER_DIR/python \
--platform manylinux2014_x86_64 \
--only-binary=:all: \
google-cloud-bigquery>=3.0.0 \
google-genai>=0.1.0 \
google-auth>=2.0.0
# 不要なファイルを削除
echo "不要なファイルを削除中..."
cd $LAYER_DIR/python
find . -type d -name "tests" -exec rm -rf {} + 2>/dev/null || true
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
find . -type d -name "*.dist-info" -exec rm -rf {} + 2>/dev/null || true
find . -type d -name "*.egg-info" -exec rm -rf {} + 2>/dev/null || true
find . -type f -name "*.pyc" -delete
find . -type f -name "*.pyo" -delete
find . -type f -name "*.md" -delete
find . -type f -name "LICENSE*" -delete
find . -type f -name "NOTICE*" -delete
cd ../..
# ZIPファイルを作成
echo "ZIPファイルを作成中..."
cd $LAYER_DIR
zip -r9 ../lambda_layer.zip . -q
cd ..
# サイズを確認
SIZE=$(du -h lambda_layer.zip | cut -f1)
echo "✓ Lambda Layer作成完了: lambda_layer.zip (サイズ: $SIZE)"
# クリーンアップ
rm -rf $LAYER_DIR
echo "✓ 完了"
ポイント:
$LAYER_DIR/pythonというディレクトリ構造にする必要があります(Lambda Layerの仕様)findコマンドで不要なファイル(テスト、キャッシュ、ドキュメントなど)を削除してサイズ削減
実行結果:
$ ./build_lambda_layer.sh
Lambda Layer用パッケージを作成します...
依存関係をインストール中...
不要なファイルを削除中...
ZIPファイルを作成中...
✓ Lambda Layer作成完了: lambda_layer.zip (サイズ: 13M)
✓ 完了
Lambda関数用ビルドスクリプトの修正
次に、関数パッケージには依存ライブラリを含めず、ソースコードのみをパッケージ化するようにbuild_lambda_package.shを修正しました:
#!/bin/bash
set -e
echo "Lambda デプロイパッケージを作成します..."
# 一時ディレクトリを作成
BUILD_DIR="lambda_package"
rm -rf $BUILD_DIR
mkdir -p $BUILD_DIR
# ソースコードをコピー
echo "ソースコードをコピー中..."
cp -r src/* $BUILD_DIR/
# 依存関係はLambda Layerに含めるため、ここではインストールしない
# boto3もLambda環境に標準搭載されている
echo "依存関係はLambda Layerを使用します(スキップ)..."
# 不要なファイルを削除してサイズを削減
echo "不要なファイルを削除中..."
cd $BUILD_DIR
# テストファイル、キャッシュ、開発ファイルを削除
find . -type d -name "tests" -exec rm -rf {} + 2>/dev/null || true
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
find . -type d -name "*.dist-info" -exec rm -rf {} + 2>/dev/null || true
find . -type d -name "*.egg-info" -exec rm -rf {} + 2>/dev/null || true
find . -type f -name "*.pyc" -delete
find . -type f -name "*.pyo" -delete
find . -type f -name "*.so" -delete
find . -type f -name "*.md" -delete
find . -type f -name "LICENSE*" -delete
find . -type f -name "NOTICE*" -delete
cd ..
# ZIPファイルを作成
echo "ZIPファイルを作成中..."
cd $BUILD_DIR
zip -r9 ../lambda_deployment.zip . -q
cd ..
# サイズを確認
SIZE=$(du -h lambda_deployment.zip | cut -f1)
echo "✓ デプロイパッケージ作成完了: lambda_deployment.zip (サイズ: $SIZE)"
# クリーンアップ
rm -rf $BUILD_DIR
echo "✓ 完了: lambda_deployment.zip をLambdaにアップロードできます"
実行結果:
$ ./build_lambda_package.sh
Lambda デプロイパッケージを作成します...
ソースコードをコピー中...
依存関係はLambda Layerを使用します(スキップ)...
不要なファイルを削除中...
ZIPファイルを作成中...
✓ デプロイパッケージ作成完了: lambda_deployment.zip (サイズ: 16K)
✓ 完了: lambda_deployment.zip をLambdaにアップロードできます
3.7MB → 16KBに削減(99.6%削減)しました!
最初失敗したこと
実は最初、古いビルド結果がキャッシュに残っていて、うまく削減できませんでした:
$ ./build_lambda_package.sh
✓ デプロイパッケージ作成完了: lambda_deployment.zip (サイズ: 3.7M) # まだ大きい...
原因は、lambda_packageディレクトリに前回の依存ライブラリが残っていたこと。そこで、スクリプトの最初にrm -rf $BUILD_DIRを追加して、毎回クリーンな状態から始めるようにしました。
学び: ビルドスクリプトは必ずクリーンアップから始める!
AWS CLIでのデプロイ手順
前提条件
- AWS CLIがインストール済み
- AWS認証情報が設定済み
- Lambda関数が作成済み
手順1: Lambda Layerのデプロイ
まず、依存ライブラリをLambda Layerとしてデプロイします:
aws lambda publish-layer-version \
--layer-name your-dependencies-layer \
--description "Google Cloud BigQuery, Gemini API dependencies" \
--zip-file fileb://lambda_layer.zip \
--compatible-runtimes python3.13 \
--region your-region
実行結果:
{
"LayerArn": "arn:aws:lambda:your-region:xxxxxxxxxxxx:layer:your-dependencies-layer",
"LayerVersionArn": "arn:aws:lambda:your-region:xxxxxxxxxxxx:layer:your-dependencies-layer:1",
"Version": 1,
"Description": "Google Cloud BigQuery, Gemini API dependencies",
"CreatedDate": "2025-12-09T12:34:56.789Z",
"CompatibleRuntimes": ["python3.13"]
}
LayerVersionArnをメモしておきます(次のステップで使用)。
sequenceDiagram
participant Dev as 開発者
participant CLI as AWS CLI
participant Lambda as AWS Lambda
Dev->>CLI: publish-layer-version
CLI->>Lambda: lambda_layer.zip (13MB)をアップロード
Lambda-->>CLI: LayerVersionArn を返却
CLI-->>Dev: Layer作成完了
手順2: Lambda関数へのLayer関連付け
作成したLayerをLambda関数に関連付けます:
aws lambda update-function-configuration \
--function-name your-function-name \
--layers arn:aws:lambda:your-region:xxxxxxxxxxxx:layer:your-dependencies-layer:1 \
--region your-region
実行結果:
{
"FunctionName": "your-function-name",
"Layers": [
{
"Arn": "arn:aws:lambda:your-region:xxxxxxxxxxxx:layer:your-dependencies-layer:1",
"CodeSize": 13631488
}
],
"State": "Active"
}
手順3: Lambda関数コードのデプロイ
最後に、関数コード(16KB)をデプロイします:
aws lambda update-function-code \
--function-name your-function-name \
--zip-file fileb://lambda_deployment.zip \
--region your-region
実行結果:
{
"FunctionName": "your-function-name",
"CodeSize": 16384,
"State": "Active",
"LastUpdateStatus": "Successful"
}
完了! わずか16KBのアップロードで済みました。
graph LR
A[build_lambda_layer.sh] --> B[lambda_layer.zip
13MB]
C[build_lambda_package.sh] --> D[lambda_deployment.zip
16KB]
B --> E[Lambda Layer作成]
E --> F[Lambda関数に紐付け]
D --> G[Lambda関数コードをアップロード]
style D fill:#51cf66
style G fill:#51cf66
最適化の結果とパフォーマンス改善
サイズ削減の成果
| 項目 | サイズ | 削減率 |
| 従来のデプロイパッケージ | 18 MB | – |
| boto3除外後 | 3.7 MB | 79.4% |
| Lambda Layer活用後(関数コード) | 16 KB | 99.9% |
| Lambda Layer(依存ライブラリ) | 13 MB | – |
| 合計 | 約13 MB | 27.8% |
関数コード自体は99.9%の削減を実現し、全体でも約28%の削減になりました。
デプロイ速度の改善
- 従来: 18MBのアップロードに約30秒
- 最適化後: 16KBのアップロードに約2秒
まとめ
Lambda関数のデプロイパッケージを最適化するには、以下の3つを押さえましょう:
1. boto3は除外する
Lambda ランタイムには boto3 などよく使用されるライブラリが標準搭載されています。パッケージに含める前に一度確認しましょう。
チェックポイント:
requirements.txtやpip installコマンドからboto3を削除- Lambda環境の標準boto3を使う(特別なバージョン指定がない限り)
AWS Lambda ランタイム – Python
2. 依存ライブラリはLambda Layerに分離する
関数コードと依存ライブラリを分けることで、デプロイが圧倒的に速くなります。
チェックポイント:
lambda_layer/pythonというディレクトリ構造を守る- 不要なファイル(tests、__pycache__など)を削除してサイズ削減
- Layer を複数の関数で共有できるか検討する
Lambda Layer の作成と共有
3. ビルドスクリプトで不要なファイルを削除する
テストファイル、ドキュメント、キャッシュなど、実行に不要なファイルは必ず削除しましょう。
削除対象の例:
find . -type d -name "tests" -exec rm -rf {} + 2>/dev/null || true
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
find . -type f -name "*.pyc" -delete
find . -type f -name "*.md" -delete
find . -type f -name "LICENSE*" -delete
終わりに
初めてLambdaをデプロイしようとしたとき、18MBのパッケージサイズに戸惑いました。しかし、boto3の除外とLambda Layerの活用により、16KBまで削減することができました。
この最適化により、デプロイ時間が大幅に短縮され、開発効率が向上しました。また、Lambda Layerを使うことで、依存ライブラリの管理も楽になりました。
もし同じような状況で困っている方がいれば、ぜひこの手法を試してみてください。
参考文献
AWS Lambda デベロッパーガイド
Lambda デプロイパッケージのベストプラクティス
Lambda Layer の作成と共有
boto3 ドキュメント
質問やフィードバック
この記事についての質問や、実際に試してみた結果などあれば、ぜひコメントで教えてください。
最後まで読んでいただき、ありがとうございました!
タグ: #AWS #Lambda #デプロイ最適化 #Lambda Layer #boto3 #初心者向け #サーバーレス
コメントを残す