Skip to content

【初心者向け】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
Lambda ランタイム - AWS Lambda docs.aws.amazon.com

最適化手法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.txtpip installコマンドからboto3を削除
  • Lambda環境の標準boto3を使う(特別なバージョン指定がない限り)

AWS Lambda ランタイム – Python

Lambda ランタイム - AWS Lambda docs.aws.amazon.com

2. 依存ライブラリはLambda Layerに分離する

関数コードと依存ライブラリを分けることで、デプロイが圧倒的に速くなります。

チェックポイント:

  • lambda_layer/pythonというディレクトリ構造を守る
  • 不要なファイル(tests、__pycache__など)を削除してサイズ削減
  • Layer を複数の関数で共有できるか検討する

Lambda Layer の作成と共有

レイヤーによる Lambda 依存関係の管理 - AWS Lambda docs.aws.amazon.com

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 デベロッパーガイド

AWS Lambda とは - AWS Lambda docs.aws.amazon.com

Lambda デプロイパッケージのベストプラクティス

AWS Lambda 関数を使用するためのベストプラクティス - AWS Lambda docs.aws.amazon.com

Lambda Layer の作成と共有

レイヤーによる Lambda 依存関係の管理 - AWS Lambda docs.aws.amazon.com

boto3 ドキュメント

Boto3 1.42.33 documentation boto3.amazonaws.com

質問やフィードバック

この記事についての質問や、実際に試してみた結果などあれば、ぜひコメントで教えてください。

最後まで読んでいただき、ありがとうございました!


タグ: #AWS #Lambda #デプロイ最適化 #Lambda Layer #boto3 #初心者向け #サーバーレス

コメントを残す